1;!function(){try { var e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof global?global:"undefined"!=typeof window?window:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&((e._debugIds|| (e._debugIds={}))[n]="a8795eda-1169-ad41-8b9e-d0f246524b9c")}catch(e){}}(); 2(globalThis["TURBOPACK"] || (globalThis["TURBOPACK"] = [])).push([typeof document === "object" ? document.currentScript : undefined, 3423755, ((__turbopack_context__, module, exports) => { 4"use strict"; 5 6Object.defineProperty(exports, "__esModule", { 7 value: true 8}); 9const _deploymentid = __turbopack_context__.r(543369); 10const deploymentId = (0, _deploymentid.getDeploymentId)(); 11globalThis.NEXT_DEPLOYMENT_ID = deploymentId; 12if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { 13 Object.defineProperty(exports.default, '__esModule', { 14 value: true 15 }); 16 Object.assign(exports.default, exports); 17 module.exports = exports.default; 18} 19}), 20974575, ((__turbopack_context__, module, exports) => { 21"use strict"; 22 23Object.defineProperty(exports, "__esModule", { 24 value: true 25}); 26Object.defineProperty(exports, "getAssetPrefix", { 27 enumerable: true, 28 get: function() { 29 return getAssetPrefix; 30 } 31}); 32const _invarianterror = __turbopack_context__.r(312718); 33function getAssetPrefix() { 34 const currentScript = document.currentScript; 35 if (!(currentScript instanceof HTMLScriptElement)) { 36 throw Object.defineProperty(new _invarianterror.InvariantError("Expected document.currentScript to be a <script> element. Received ".concat(currentScript, " instead.")), "__NEXT_ERROR_CODE", { 37 value: "E783", 38 enumerable: false, 39 configurable: true 40 }); 41 } 42 const { pathname } = new URL(currentScript.src); 43 const nextIndex = pathname.indexOf('/_next/'); 44 if (nextIndex === -1) { 45 throw Object.defineProperty(new _invarianterror.InvariantError("Expected document.currentScript src to contain '/_next/'. Received ".concat(currentScript.src, " instead.")), "__NEXT_ERROR_CODE", { 46 value: "E784", 47 enumerable: false, 48 configurable: true 49 }); 50 } 51 return pathname.slice(0, nextIndex); 52} 53if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { 54 Object.defineProperty(exports.default, '__esModule', { 55 value: true 56 }); 57 Object.assign(exports.default, exports); 58 module.exports = exports.default; 59} 60}), 61396517, ((__turbopack_context__, module, exports) => { 62"use strict"; 63 64var __TURBOPACK__imported__module__247167__ = /*#__PURE__*/ __turbopack_context__.i(247167); 65/** 66 * Before starting the Next.js runtime and requiring any module, we need to make 67 * sure the following scripts are executed in the correct order: 68 * - Polyfills 69 * - next/script with `beforeInteractive` strategy 70 */ "use strict"; 71Object.defineProperty(exports, "__esModule", { 72 value: true 73}); 74Object.defineProperty(exports, "appBootstrap", { 75 enumerable: true, 76 get: function() { 77 return appBootstrap; 78 } 79}); 80const _assetprefix = __turbopack_context__.r(974575); 81const _setattributesfromprops = __turbopack_context__.r(922737); 82const version = "16.2.12"; 83window.next = { 84 version, 85 appDir: true 86}; 87function loadScriptsInSequence(scripts, hydrate) { 88 if (!scripts || !scripts.length) { 89 return hydrate(); 90 } 91 return scripts.reduce((promise, param)=>{ 92 let [src, props] = param; 93 return promise.then(()=>{ 94 return new Promise((resolve, reject)=>{ 95 const el = document.createElement('script'); 96 if (props) { 97 (0, _setattributesfromprops.setAttributesFromProps)(el, props); 98 } 99 if (src) { 100 el.src = src; 101 el.onload = ()=>resolve(); 102 el.onerror = reject; 103 } else if (props) { 104 el.innerHTML = props.children; 105 setTimeout(resolve); 106 } 107 document.head.appendChild(el); 108 }); 109 }); 110 }, Promise.resolve()).catch((err)=>{ 111 console.error(err); 112 // Still try to hydrate even if there's an error. 113 }).then(()=>{ 114 hydrate(); 115 }); 116} 117function appBootstrap(hydrate) { 118 const assetPrefix = (0, _assetprefix.getAssetPrefix)(); 119 loadScriptsInSequence(self.__next_s, ()=>{ 120 // If the static shell is being debugged, skip hydration if the 121 // `__nextppronly` query is present. This is only enabled when the 122 // environment variable `__NEXT_EXPERIMENTAL_STATIC_SHELL_DEBUGGING` is 123 // set to `1`. Otherwise the following is optimized out. 124 if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable 125 ; 126 hydrate(assetPrefix); 127 }); 128} 129if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { 130 Object.defineProperty(exports.default, '__esModule', { 131 value: true 132 });
133 Object.assign(exports.default, exports); 134 module.exports = exports.default; 135} 136}), 137816565, ((__turbopack_context__, module, exports) => { 138"use strict"; 139 140Object.defineProperty(exports, "__esModule", { 141 value: true 142}); 1430 && (module.exports = { 144 getObjectClassLabel: null, 145 isPlainObject: null 146}); 147function _export(target, all) { 148 for(var name in all)Object.defineProperty(target, name, { 149 enumerable: true, 150 get: all[name] 151 }); 152} 153_export(exports, { 154 getObjectClassLabel: function() { 155 return getObjectClassLabel; 156 }, 157 isPlainObject: function() { 158 return isPlainObject; 159 } 160}); 161function getObjectClassLabel(value) { 162 return Object.prototype.toString.call(value); 163} 164function isPlainObject(value) { 165 if (getObjectClassLabel(value) !== '[object Object]') { 166 return false; 167 } 168 const prototype = Object.getPrototypeOf(value); 169 /** 170 * this used to be previously: 171 * 172 * `return prototype === null || prototype === Object.prototype` 173 * 174 * but Edge Runtime expose Object from vm, being that kind of type-checking wrongly fail. 175 * 176 * It was changed to the current implementation since it's resilient to serialization. 177 */ return prototype === null || prototype.hasOwnProperty('isPrototypeOf'); 178} 179}), 180302023, ((__turbopack_context__, module, exports) => { 181"use strict"; 182 183var __TURBOPACK__imported__module__247167__ = /*#__PURE__*/ __turbopack_context__.i(247167); 184"use strict"; 185Object.defineProperty(exports, "__esModule", { 186 value: true 187}); 1880 && (module.exports = { 189 default: null, 190 getProperError: null 191}); 192function _export(target, all) { 193 for(var name in all)Object.defineProperty(target, name, { 194 enumerable: true, 195 get: all[name] 196 }); 197} 198_export(exports, { 199 /** 200 * Checks whether the given value is a NextError. 201 * This can be used to print a more detailed error message with properties like `code` & `digest`. 202 */ default: function() { 203 return isError; 204 }, 205 getProperError: function() { 206 return getProperError; 207 } 208}); 209const _isplainobject = __turbopack_context__.r(816565); 210/** 211 * This is a safe stringify function that handles circular references. 212 * We're using a simpler version here to avoid introducing 213 * the dependency `safe-stable-stringify` into production bundle. 214 * 215 * This helper is used both in development and production. 216 */ function safeStringifyLite(obj) { 217 const seen = new WeakSet(); 218 return JSON.stringify(obj, (_key, value)=>{ 219 // If value is an object and already seen, replace with "[Circular]" 220 if (typeof value === 'object' && value !== null) { 221 if (seen.has(value)) { 222 return '[Circular]'; 223 } 224 seen.add(value); 225 } 226 return value; 227 }); 228} 229function isError(err) { 230 return typeof err === 'object' && err !== null && 'name' in err && 'message' in err; 231} 232function getProperError(err) { 233 if (isError(err)) { 234 return err; 235 } 236 if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable 237 ; 238 return Object.defineProperty(new Error((0, _isplainobject.isPlainObject)(err) ? safeStringifyLite(err) : err + ''), "__NEXT_ERROR_CODE", { 239 value: "E394", 240 enumerable: false, 241 configurable: true 242 }); 243} 244}), 245528279, ((__turbopack_context__, module, exports) => { 246"use strict"; 247 248Object.defineProperty(exports, "__esModule", { 249 value: true 250}); 251Object.defineProperty(exports, "reportGlobalError", { 252 enumerable: true, 253 get: function() { 254 return reportGlobalError; 255 } 256}); 257const reportGlobalError = typeof reportError === 'function' ? reportError : (error)=>{ 258 // TODO: Dispatch error event 259 globalThis.console.error(error); 260}; 261if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { 262 Object.defineProperty(exports.default, '__esModule', { 263 value: true 264 }); 265 Object.assign(exports.default, exports); 266 module.exports = exports.default; 267} 268}),
269597238, ((__turbopack_context__, module, exports) => { 270"use strict"; 271 272var __TURBOPACK__imported__module__247167__ = /*#__PURE__*/ __turbopack_context__.i(247167); 273// This module can be shared between both pages router and app router 274"use strict"; 275Object.defineProperty(exports, "__esModule", { 276 value: true 277}); 2780 && (module.exports = { 279 isRecoverableError: null, 280 onRecoverableError: null 281}); 282function _export(target, all) { 283 for(var name in all)Object.defineProperty(target, name, { 284 enumerable: true, 285 get: all[name] 286 }); 287} 288_export(exports, { 289 isRecoverableError: function() { 290 return isRecoverableError; 291 }, 292 onRecoverableError: function() { 293 return onRecoverableError; 294 } 295}); 296const _interop_require_default = __turbopack_context__.r(563141); 297const _bailouttocsr = __turbopack_context__.r(132061); 298const _iserror = /*#__PURE__*/ _interop_require_default._(__turbopack_context__.r(302023)); 299const _reportglobalerror = __turbopack_context__.r(528279); 300const recoverableErrors = new WeakSet(); 301const isInstantTest = ("TURBOPACK compile-time value", false) && typeof self !== 'undefined' && !!self.__next_instant_test; 302function isRecoverableError(error) { 303 return recoverableErrors.has(error); 304} 305const onRecoverableError = (error)=>{ 306 // x-ref: https://github.com/facebook/react/pull/28736 307 let cause = (0, _iserror.default)(error) && 'cause' in error ? error.cause : error; 308 // Skip certain custom errors which are not expected to be reported on client 309 if ((0, _bailouttocsr.isBailoutToCSRError)(cause)) return; 310 // Instant Navigation Testing API: suppress "server could not finish this 311 // Suspense boundary" errors (React error #419) during instant test mode. 312 // The static shell intentionally has incomplete Suspense boundaries â React 313 // correctly falls back to client rendering, which is expected. 314 if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable 315 ; 316 if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable 317 ; 318 (0, _reportglobalerror.reportGlobalError)(cause); 319}; 320if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { 321 Object.defineProperty(exports.default, '__esModule', { 322 value: true 323 }); 324 Object.assign(exports.default, exports); 325 module.exports = exports.default; 326} 327}), 328471217, ((__turbopack_context__) => { 329"use strict"; 330 331// MERGED MODULE: [project]/instrumentation-client.ts [app-client] (ecmascript) 332; 333var __TURBOPACK__imported__module__247167__ = __turbopack_context__.i(247167); 334// MERGED MODULE: [project]/node_modules/@sentry/nextjs/build/esm/client/routing/appRouterRoutingInstrumentation.js [app-client] (ecmascript) 335; 336var __TURBOPACK__imported__module__247167__1 = __TURBOPACK__imported__module__247167__; 337var __TURBOPACK__imported__module__519988__ = __turbopack_context__.i(519988); 338var __TURBOPACK__imported__module__225304__ = __turbopack_context__.i(225304); 339var __TURBOPACK__imported__module__605394__ = __turbopack_context__.i(605394); 340// MERGED MODULE: [project]/node_modules/@sentry/browser/build/npm/esm/prod/helpers.js [app-client] (ecmascript) 341; 342var __TURBOPACK__imported__module__225304__1 = __TURBOPACK__imported__module__225304__; 343var __TURBOPACK__imported__module__951497__ = __turbopack_context__.i(951497); 344var __TURBOPACK__imported__module__250804__ = __turbopack_context__.i(250804); 345var __TURBOPACK__imported__module__682564__ = __turbopack_context__.i(682564); 346var __TURBOPACK__imported__module__662537__ = __turbopack_context__.i(662537); 347// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/utils/browser.js [app-client] (ecmascript) 348; 349var __TURBOPACK__imported__module__453288__ = __turbopack_context__.i(453288); 350var __TURBOPACK__imported__module__225304__2 = __TURBOPACK__imported__module__225304__; 351; 352; 353const WINDOW = __TURBOPACK__imported__module__225304__2["GLOBAL_OBJ"]; 354const DEFAULT_MAX_STRING_LENGTH = 80; 355function htmlTreeAsString(elem) { 356 let options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}; 357 if (!elem) { 358 return "<unknown>"; 359 } 360 try { 361 let currentElem = elem; 362 const MAX_TRAVERSE_HEIGHT = 5; 363 const out = []; 364 let height = 0; 365 let len = 0; 366 const separator = " > "; 367 const sepLength = separator.length; 368 let nextStr;
369 const keyAttrs = Array.isArray(options) ? options : options.keyAttrs; 370 const maxStringLength = !Array.isArray(options) && options.maxStringLength || DEFAULT_MAX_STRING_LENGTH; 371 while(currentElem && height++ < MAX_TRAVERSE_HEIGHT){ 372 nextStr = _htmlElementAsString(currentElem, keyAttrs); 373 if (nextStr === "html" || height > 1 && len + out.length * sepLength + nextStr.length >= maxStringLength) { 374 break; 375 } 376 out.push(nextStr); 377 len += nextStr.length; 378 currentElem = currentElem.parentNode; 379 } 380 return out.reverse().join(separator); 381 } catch (unused) { 382 return "<unknown>"; 383 } 384} 385function _htmlElementAsString(el, keyAttrs) { 386 const elem = el; 387 const out = []; 388 if (!(elem === null || elem === void 0 ? void 0 : elem.tagName)) { 389 return ""; 390 } 391 if (WINDOW.HTMLElement) { 392 if (elem instanceof HTMLElement && elem.dataset) { 393 if (elem.dataset["sentryComponent"]) { 394 return elem.dataset["sentryComponent"]; 395 } 396 if (elem.dataset["sentryElement"]) { 397 return elem.dataset["sentryElement"]; 398 } 399 } 400 } 401 out.push(elem.tagName.toLowerCase()); 402 const keyAttrPairs = (keyAttrs === null || keyAttrs === void 0 ? void 0 : keyAttrs.length) ? keyAttrs.filter((keyAttr)=>elem.getAttribute(keyAttr)).map((keyAttr)=>[ 403 keyAttr, 404 elem.getAttribute(keyAttr) 405 ]) : null; 406 if (keyAttrPairs === null || keyAttrPairs === void 0 ? void 0 : keyAttrPairs.length) { 407 keyAttrPairs.forEach((keyAttrPair)=>{ 408 out.push("[".concat(keyAttrPair[0], '="').concat(keyAttrPair[1], '"]')); 409 }); 410 } else { 411 if (elem.id) { 412 out.push("#".concat(elem.id)); 413 } 414 const className = elem.className; 415 if (className && (0, __TURBOPACK__imported__module__453288__["isString"])(className)) { 416 const classes = className.split(/\s+/); 417 for (const c of classes){ 418 out.push(".".concat(c)); 419 } 420 } 421 } 422 for (const k of [ 423 "aria-label", 424 "type", 425 "name", 426 "title", 427 "alt" 428 ]){ 429 const attr = elem.getAttribute(k); 430 if (attr) { 431 out.push("[".concat(k, '="').concat(attr, '"]')); 432 } 433 } 434 return out.join(""); 435} 436function getLocationHref() { 437 try { 438 return WINDOW.document.location.href; 439 } catch (unused) { 440 return ""; 441 } 442} 443function getComponentName(elem) { 444 let maxTraverseHeight = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 5; 445 if (!WINDOW.HTMLElement) { 446 return null; 447 } 448 let currentElem = elem; 449 for(let i = 0; i < maxTraverseHeight; i++){ 450 if (!currentElem) { 451 return null; 452 } 453 if (currentElem instanceof HTMLElement) { 454 if (currentElem.dataset["sentryComponent"]) { 455 return currentElem.dataset["sentryComponent"]; 456 } 457 if (currentElem.dataset["sentryElement"]) { 458 return currentElem.dataset["sentryElement"]; 459 } 460 } 461 currentElem = currentElem.parentNode; 462 } 463 return null; 464} 465; 466; 467const WINDOW1 = __TURBOPACK__imported__module__225304__1["GLOBAL_OBJ"]; 468let ignoreOnError = 0; 469function shouldIgnoreOnError() { 470 return ignoreOnError > 0; 471} 472function ignoreNextOnError() { 473 ignoreOnError++; 474 setTimeout(()=>{ 475 ignoreOnError--; 476 }); 477} 478function wrap(fn) { 479 let options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}; 480 function isFunction(fn2) { 481 return typeof fn2 === "function"; 482 } 483 if (!isFunction(fn)) { 484 return fn; 485 } 486 try { 487 const hasOwnWrapper = Object.prototype.hasOwnProperty.call(fn, "__sentry_wrapped__"); 488 if (hasOwnWrapper) { 489 const wrapper = fn.__sentry_wrapped__; 490 if (typeof wrapper === "function") { 491 return wrapper; 492 } else { 493 return fn; 494 } 495 } 496 if ((0, __TURBOPACK__imported__module__951497__["getOriginalFunction"])(fn)) { 497 return fn; 498 } 499 } catch (unused) { 500 return fn; 501 } 502 const sentryWrapped = function() { 503 for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++){ 504 args[_key] = arguments[_key]; 505 } 506 __TURBOPACK__imported__module__225304__1["GLOBAL_OBJ"]._sentryWrappedDepth = (__TURBOPACK__imported__module__225304__1["GLOBAL_OBJ"]._sentryWrappedDepth || 0) + 1; 507 try { 508 const wrappedArguments = args.map((arg)=>wrap(arg, options)); 509 return fn.apply(this, wrappedArguments); 510 } catch (ex) { 511 ignoreNextOnError(); 512 (0, __TURBOPACK__imported__module__250804__["withScope"])((scope)=>{ 513 scope.addEventProcessor((event)=>{ 514 if (options.mechanism) { 515 (0, __TURBOPACK__imported__module__682564__["addExceptionTypeValue"])(event, void 0, void 0); 516 (0, __TURBOPACK__imported__module__682564__["addExceptionMechanism"])(event, options.mechanism); 517 } 518 event.extra = { 519 ...event.extra, 520 arguments: args 521 }; 522 return event; 523 }); 524 (0, __TURBOPACK__imported__module__662537__["captureException"])(ex); 525 }); 526 throw ex; 527 } finally{ 528 __TURBOPACK__imported__module__225304__1["GLOBAL_OBJ"]._sentryWrappedDepth = (__TURBOPACK__imported__module__225304__1["GLOBAL_OBJ"]._sentryWrappedDepth || 0) - 1; 529 } 530 }; 531 try { 532 for(const property in fn){ 533 if (Object.prototype.hasOwnProperty.call(fn, property)) { 534 sentryWrapped[property] = fn[property]; 535 } 536 } 537 } catch (unused) {} 538 (0, __TURBOPACK__imported__module__951497__["markFunctionWrapped"])(sentryWrapped, fn); 539 (0, __TURBOPACK__imported__module__951497__["addNonEnumerableProperty"])(fn, "__sentry_wrapped__", sentryWrapped); 540 try { 541 const descriptor = Object.getOwnPropertyDescriptor(sentryWrapped, "name"); 542 if (descriptor.configurable) { 543 Object.defineProperty(sentryWrapped, "name", { 544 get () { 545 return fn.name; 546 } 547 }); 548 } 549 } catch (unused) {} 550 return sentryWrapped; 551} 552function getHttpRequestData() { 553 const url = getLocationHref(); 554 const { referrer } = WINDOW1.document || {}; 555 const { userAgent } = WINDOW1.navigator || {}; 556 const headers = { 557 ...referrer && { 558 Referer: referrer 559 }, 560 ...userAgent && { 561 "User-Agent": userAgent 562 } 563 }; 564 const request = { 565 url, 566 headers 567 }; 568 return request; 569} 570; 571// MERGED MODULE: [project]/node_modules/@sentry/browser/build/npm/esm/prod/tracing/browserTracingIntegration.js [app-client] (ecmascript) 572; 573// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/tracing/idleSpan.js [app-client] (ecmascript) 574; 575var __TURBOPACK__imported__module__250804__1 = __TURBOPACK__imported__module__250804__; 576var __TURBOPACK__imported__module__901020__ = __turbopack_context__.i(901020
576); 577var __TURBOPACK__imported__module__519988__1 = __TURBOPACK__imported__module__519988__; 578var __TURBOPACK__imported__module__272598__ = __turbopack_context__.i(272598); 579var __TURBOPACK__imported__module__10008__ = __turbopack_context__.i(10008); 580// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/utils/should-ignore-span.js [app-client] (ecmascript) 581; 582var __TURBOPACK__imported__module__901020__1 = __TURBOPACK__imported__module__901020__; 583var __TURBOPACK__imported__module__272598__1 = __TURBOPACK__imported__module__272598__; 584var __TURBOPACK__imported__module__821593__ = __turbopack_context__.i(821593); 585; 586; 587; 588function logIgnoredSpan(droppedSpan) { 589 __TURBOPACK__imported__module__272598__1["debug"].log("Ignoring span ".concat(droppedSpan.op, " - ").concat(droppedSpan.description, " because it matches `ignoreSpans`.")); 590} 591function shouldIgnoreSpan(span, ignoreSpans) { 592 if (!(ignoreSpans === null || ignoreSpans === void 0 ? void 0 : ignoreSpans.length)) { 593 return false; 594 } 595 for (const pattern of ignoreSpans){ 596 if (isStringOrRegExp(pattern)) { 597 if (span.description && (0, __TURBOPACK__imported__module__821593__["isMatchingPattern"])(span.description, pattern)) { 598 __TURBOPACK__imported__module__901020__1["DEBUG_BUILD"] && logIgnoredSpan(span); 599 return true; 600 } 601 continue; 602 } 603 const hasAttributes = !!pattern.attributes && Object.keys(pattern.attributes).length > 0; 604 if (!pattern.name && !pattern.op && !hasAttributes) { 605 continue; 606 } 607 const nameMatches = pattern.name ? span.description && (0, __TURBOPACK__imported__module__821593__["isMatchingPattern"])(span.description, pattern.name) : true; 608 const opMatches = pattern.op ? span.op && (0, __TURBOPACK__imported__module__821593__["isMatchingPattern"])(span.op, pattern.op) : true; 609 const attrsMatch = pattern.attributes ? Object.entries(pattern.attributes).every((param)=>{ 610 let [key, valuePattern] = param; 611 var _span_attributes; 612 return _matchesAttributeValue((_span_attributes = span.attributes) === null || _span_attributes === void 0 ? void 0 : _span_attributes[key], valuePattern); 613 }) : true; 614 if (nameMatches && opMatches && attrsMatch) { 615 __TURBOPACK__imported__module__901020__1["DEBUG_BUILD"] && logIgnoredSpan(span); 616 return true; 617 } 618 } 619 return false; 620} 621function _matchesAttributeValue(actual, pat) { 622 if (typeof actual === "string" && (typeof pat === "string" || pat instanceof RegExp)) { 623 return (0, __TURBOPACK__imported__module__821593__["isMatchingPattern"])(actual, pat); 624 } 625 if (Array.isArray(actual) && Array.isArray(pat)) { 626 return actual.length === pat.length && actual.every((v, i)=>v === pat[i]); 627 } 628 return actual === pat; 629} 630function reparentChildSpans(spans, dropSpan) { 631 const droppedSpanParentId = dropSpan.parent_span_id; 632 const droppedSpanId = dropSpan.span_id; 633 if (!droppedSpanParentId) { 634 return; 635 } 636 for (const span of spans){ 637 if (span.parent_span_id === droppedSpanId) { 638 span.parent_span_id = droppedSpanParentId; 639 } 640 } 641} 642function isStringOrRegExp(value) { 643 return typeof value === "string" || value instanceof RegExp; 644} 645; 646var __TURBOPACK__imported__module__821061__ = __turbopack_context__.i(821061); 647var __TURBOPACK__imported__module__304661__ = __turbopack_context__.i(304661); 648var __TURBOPACK__imported__module__605394__1 = __TURBOPACK__imported__module__605394__; 649var __TURBOPACK__imported__module__728469__ = __turbopack_context__.i(728469); 650// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/tracing/sentrySpan.js [app-client] (ecmascript) 651; 652var __TURBOPACK__imported__module__250804__2 = __TURBOPACK__imported__module__250804__; 653var __TURBOPACK__imported__module__901020__2 = __TURBOPACK__imported__module__901020__; 654// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/envelope.js [app-client] (ecmascript) 655; 656var __TURBOPACK__imported__module__473753__ = __turbopack_context__.i(473753); 657// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/tracing/spans/beforeSendSpan.js [app-client] (ecmascript) 658; 659var __TURBOPACK__imported__module__951497__1 = __TURBOPACK__imported__module__951497__; 660; 661function withStreamedSpan(callback) { 662 (0, __TURBOPACK__imported__module__951497__1["addNonEnumerableProperty"])(callback, "_streamed", true); 663 return callback; 664} 665function isStreamedBeforeSendSpanCallback(callback) { 666 return !!callback && typeof callback === "function" && "_streamed" in callback && !!callback._streamed; 667} 668; 669var __TURBOPACK__imported__module__339435__ = __turbopack_context__.i(339435); 670var __TURBOPACK__imported__module__67486__ = __turbopack_context__.i(67486); 671var __TURBOPACK__imported__module__111139__ = __turbopack_context__.i(111139); 672var __TURBOPACK__imported__module__304661__1 = __TURBOPACK__imported__module__304661__; 673; 674; 675; 676; 677; 678; 679; 680function _enhanceEventWithSdkInfo(event, newSdkInfo) { 681 var _event_sdk, _event_sdk1, _event_sdk2, _event_sdk3; 682 if (!newSdkInfo) { 683 return event; 684 } 685 const eventSdkInfo = event.sdk || {}; 686 event.sdk = { 687 ...eventSdkInfo, 688 name: eventSdkInfo.name || newSdkInfo.name, 689 version: eventSdkInfo.version || newSdkInfo.version, 690 integrations: [ 691 ...((_event_sdk = event.sdk) === null || _event_sdk === void 0 ? void 0 : _event_sdk.integrations) || [], 692 ...newSdkInfo.integrations || [] 693 ], 694 packages: [ 695 ...((_event_sdk1 = event.sdk) === null || _event_sdk1 === void 0 ? void 0 : _event_sdk1.packages) || [], 696 ...newSdkInfo.packages || [] 697 ], 698 settings: ((_event_sdk2 = event.sdk) === null || _event_sdk2 === void 0 ? void 0 : _event_sdk2.settings) || newSdkInfo.settings ? { 699 ...(_event_sdk3 = event.sdk) === null || _event_sdk3 === void 0 ? void 0 : _event_sdk3.settings, 700 ...newSdkInfo.settings 701 } : void 0 702 }; 703 return event; 704} 705function createSessionEnvelope(session, dsn, metadata, tunnel) { 706 const sdkInfo = (0, __TURBOPACK__imported__module__67486__["getSdkMetadataForEnvelopeHeader"])(metadata); 707 const envelopeHeaders = { 708 sent_at: new Date((0, __TURBOPACK__imported__module__111139__["safeDateNow"])()).toISOString(), 709 ...sdkInfo && {
710 sdk: sdkInfo 711 }, 712 ...!!tunnel && dsn && { 713 dsn: (0, __TURBOPACK__imported__module__339435__["dsnToString"])(dsn) 714 } 715 }; 716 const envelopeItem = "aggregates" in session ? [ 717 { 718 type: "sessions" 719 }, 720 session 721 ] : [ 722 { 723 type: "session" 724 }, 725 session.toJSON() 726 ]; 727 return (0, __TURBOPACK__imported__module__67486__["createEnvelope"])(envelopeHeaders, [ 728 envelopeItem 729 ]); 730} 731function createEventEnvelope(event, dsn, metadata, tunnel) { 732 const sdkInfo = (0, __TURBOPACK__imported__module__67486__["getSdkMetadataForEnvelopeHeader"])(metadata); 733 const eventType = event.type && event.type !== "replay_event" ? event.type : "event"; 734 _enhanceEventWithSdkInfo(event, metadata === null || metadata === void 0 ? void 0 : metadata.sdk); 735 const envelopeHeaders = (0, __TURBOPACK__imported__module__67486__["createEventEnvelopeHeaders"])(event, sdkInfo, tunnel, dsn); 736 delete event.sdkProcessingMetadata; 737 const eventItem = [ 738 { 739 type: eventType 740 }, 741 event 742 ]; 743 return (0, __TURBOPACK__imported__module__67486__["createEnvelope"])(envelopeHeaders, [ 744 eventItem 745 ]); 746} 747function createSpanEnvelope(spans, client) { 748 function dscHasRequiredProps(dsc2) { 749 return !!dsc2.trace_id && !!dsc2.public_key; 750 } 751 const dsc = (0, __TURBOPACK__imported__module__473753__["getDynamicSamplingContextFromSpan"])(spans[0]); 752 const dsn = client === null || client === void 0 ? void 0 : client.getDsn(); 753 const tunnel = client === null || client === void 0 ? void 0 : client.getOptions().tunnel; 754 const headers = { 755 sent_at: new Date((0, __TURBOPACK__imported__module__111139__["safeDateNow"])()).toISOString(), 756 ...dscHasRequiredProps(dsc) && { 757 trace: dsc 758 }, 759 ...!!tunnel && dsn && { 760 dsn: (0, __TURBOPACK__imported__module__339435__["dsnToString"])(dsn) 761 } 762 }; 763 const { beforeSendSpan, ignoreSpans } = (client === null || client === void 0 ? void 0 : client.getOptions()) || {}; 764 const filteredSpans = (ignoreSpans === null || ignoreSpans === void 0 ? void 0 : ignoreSpans.length) ? spans.filter((span)=>{ 765 const json = (0, __TURBOPACK__imported__module__304661__1["spanToJSON"])(span); 766 return !shouldIgnoreSpan({ 767 description: json.description, 768 op: json.op, 769 attributes: json.data 770 }, ignoreSpans); 771 }) : spans; 772 const droppedSpans = spans.length - filteredSpans.length; 773 if (droppedSpans) { 774 client === null || client === void 0 ? void 0 : client.recordDroppedEvent("before_send", "span", droppedSpans); 775 } 776 const convertToSpanJSON = beforeSendSpan ? (span)=>{ 777 const spanJson = (0, __TURBOPACK__imported__module__304661__1["spanToJSON"])(span); 778 const processedSpan = !isStreamedBeforeSendSpanCallback(beforeSendSpan) ? beforeSendSpan(spanJson) : spanJson; 779 if (!processedSpan) { 780 (0, __TURBOPACK__imported__module__304661__1["showSpanDropWarning"])();
781 return spanJson; 782 } 783 return processedSpan; 784 } : __TURBOPACK__imported__module__304661__1["spanToJSON"]; 785 const items = []; 786 for (const span of filteredSpans){ 787 const spanJson = convertToSpanJSON(span); 788 if (spanJson) { 789 items.push((0, __TURBOPACK__imported__module__67486__["createSpanEnvelopeItem"])(spanJson)); 790 } 791 } 792 return (0, __TURBOPACK__imported__module__67486__["createEnvelope"])(headers, items); 793} 794; 795var __TURBOPACK__imported__module__519988__2 = __TURBOPACK__imported__module__519988__; 796var __TURBOPACK__imported__module__272598__2 = __TURBOPACK__imported__module__272598__; 797var __TURBOPACK__imported__module__373382__ = __turbopack_context__.i(373382); 798var __TURBOPACK__imported__module__304661__2 = __TURBOPACK__imported__module__304661__; 799var __TURBOPACK__imported__module__605394__2 = __TURBOPACK__imported__module__605394__; 800var __TURBOPACK__imported__module__473753__1 = __TURBOPACK__imported__module__473753__; 801// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/tracing/logSpans.js [app-client] (ecmascript) 802; 803var __TURBOPACK__imported__module__901020__3 = __TURBOPACK__imported__module__901020__; 804var __TURBOPACK__imported__module__272598__3 = __TURBOPACK__imported__module__272598__; 805var __TURBOPACK__imported__module__304661__3 = __TURBOPACK__imported__module__304661__; 806; 807; 808; 809function logSpanStart(span) { 810 if (!__TURBOPACK__imported__module__901020__3["DEBUG_BUILD"]) return; 811 const { description = "< unknown name >", op = "< unknown op >", parent_span_id: parentSpanId } = (0, __TURBOPACK__imported__module__304661__3["spanToJSON"])(span); 812 const { spanId } = span.spanContext(); 813 const sampled = (0, __TURBOPACK__imported__module__304661__3["spanIsSampled"])(span); 814 const rootSpan = (0, __TURBOPACK__imported__module__304661__3["getRootSpan"])(span); 815 const isRootSpan = rootSpan === span; 816 const header = "[Tracing] Starting ".concat(sampled ? "sampled" : "unsampled", " ").concat(isRootSpan ? "root " : "", "span"); 817 const infoParts = [ 818 "op: ".concat(op), 819 "name: ".concat(description), 820 "ID: ".concat(spanId) 821 ]; 822 if (parentSpanId) { 823 infoParts.push("parent ID: ".concat(parentSpanId)); 824 } 825 if (!isRootSpan) { 826 const { op: op2, description: description2 } = (0, __TURBOPACK__imported__module__304661__3["spanToJSON"])(rootSpan); 827 infoParts.push("root ID: ".concat(rootSpan.spanContext().spanId)); 828 if (op2) { 829 infoParts.push("root op: ".concat(op2)); 830 } 831 if (description2) { 832 infoParts.push("root description: ".concat(description2)); 833 } 834 } 835 __TURBOPACK__imported__module__272598__3["debug"].log("".concat(header, "\n ").concat(infoParts.join("\n "))); 836} 837function logSpanEnd(span) { 838 if (!__TURBOPACK__imported__module__901020__3["DEBUG_BUILD"]) return; 839 const { description = "< unknown name >", op = "< unknown op >" } = (0, __TURBOPACK__imported__module__304661__3["spanToJSON"])(span); 840 const { spanId } = span.spanContext(); 841 const rootSpan = (0, __TURBOPACK__imported__module__304661__3["getRootSpan"])(span); 842 const isRootSpan = rootSpan === span; 843 const msg = '[Tracing] Finishing "'.concat(op, '" ').concat(isRootSpan ? "root " : "", 'span "').concat(description, '" with ID ').concat(spanId); 844 __TURBOPACK__imported__module__272598__3["debug"].log(msg); 845} 846; 847// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/tracing/measurement.js [app-client] (ecmascript) 848; 849var __TURBOPACK__imported__module__901020__4 = __TURBOPACK__imported__module__901020__; 850var __TURBOPACK__imported__module__519988__3 = __TURBOPACK__imported__module__519988__; 851var __TURBOPACK__imported__module__272598__4 = __TURBOPACK__imported__module__272598__; 852var __TURBOPACK__imported__module__304661__4 = __TURBOPACK__imported__module__304661__; 853; 854; 855; 856; 857function setMeasurement(name, value, unit) { 858 let activeSpan = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : (0, __TURBOPACK__imported__module__304661__4["getActiveSpan"])(); 859 const rootSpan = activeSpan && (0, __TURBOPACK__imported__module__304661__4["getRootSpan"])(activeSpan); 860 if (rootSpan) { 861 __TURBOPACK__imported__module__901020__4["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__4["debug"].log("[Measurement] Setting measurement on root span: ".concat(name, " = ").concat(value, " ").concat(unit)); 862 rootSpan.addEvent(name, { 863 [__TURBOPACK__imported__module__519988__3["SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_VALUE"]]: value, 864 [__TURBOPACK__imported__module__519988__3["SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_UNIT"]]: unit 865 }); 866 } 867} 868function timedEventsToMeasurements(events) { 869 if (!events || events.length === 0) { 870 return void 0; 871 } 872 const measurements = {};
873 events.forEach((event)=>{ 874 const attributes = event.attributes || {}; 875 const unit = attributes[__TURBOPACK__imported__module__519988__3["SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_UNIT"]]; 876 const value = attributes[__TURBOPACK__imported__module__519988__3["SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_VALUE"]]; 877 if (typeof unit === "string" && typeof value === "number") { 878 measurements[event.name] = { 879 value, 880 unit 881 }; 882 } 883 }); 884 return measurements; 885} 886; 887// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/tracing/segmentSpanCaptureStrategy.js [app-client] (ecmascript) 888; 889var __TURBOPACK__imported__module__923288__ = __turbopack_context__.i(923288); 890; 891function setSegmentSpanCaptureStrategy(strategy) { 892 (0, __TURBOPACK__imported__module__923288__["getSentryCarrier"])((0, __TURBOPACK__imported__module__923288__["getMainCarrier"])()).segmentSpanCaptureStrategy = strategy; 893} 894function getSegmentSpanCaptureStrategy() { 895 return (0, __TURBOPACK__imported__module__923288__["getSentryCarrier"])((0, __TURBOPACK__imported__module__923288__["getMainCarrier"])()).segmentSpanCaptureStrategy; 896} 897; 898// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/tracing/spans/hasSpanStreamingEnabled.js [app-client] (ecmascript) 899; 900function hasSpanStreamingEnabled(client) { 901 return client.getOptions().traceLifecycle === "stream"; 902} 903; 904var __TURBOPACK__imported__module__242222__ = __turbopack_context__.i(242222); 905; 906; 907; 908; 909; 910; 911; 912; 913; 914; 915; 916; 917; 918; 919const MAX_SPAN_COUNT = 1e3; 920class SentrySpan { 921 /** @inheritDoc */ addLink(link) { 922 if (this._frozen) { 923 return this; 924 } 925 if (this._links) { 926 this._links.push(link); 927 } else { 928 this._links = [ 929 link 930 ]; 931 } 932 return this; 933 } 934 /** @inheritDoc */ addLinks(links) { 935 if (this._frozen) { 936 return this; 937 } 938 if (this._links) { 939 this._links.push(...links); 940 } else { 941 this._links = links; 942 } 943 return this; 944 } 945 /** 946 * This should generally not be used, 947 * but it is needed for being compliant with the OTEL Span interface. 948 * 949 * @hidden 950 * @internal 951 */ recordException(_exception, _time) {} 952 /** @inheritdoc */ spanContext() { 953 const { _spanId: spanId, _traceId: traceId, _sampled: sampled } = this; 954 return { 955 spanId, 956 traceId, 957 traceFlags: sampled ? __TURBOPACK__imported__module__304661__2["TRACE_FLAG_SAMPLED"] : __TURBOPACK__imported__module__304661__2["TRACE_FLAG_NONE"] 958 }; 959 } 960 /** @inheritdoc */ setAttribute(key, value) { 961 if (this._frozen) { 962 return this; 963 } 964 if (value === void 0) { 965 delete this._attributes[key]; 966 } else { 967 this._attributes[key] = value; 968 } 969 if (key === __TURBOPACK__imported__module__519988__2["SEMANTIC_ATTRIBUTE_SENTRY_SOURCE"] && value !== void 0 && (0, __TURBOPACK__imported__module__242222__["spanShouldInferOtelSource"])(this)) { 970 (0, __TURBOPACK__imported__module__242222__["markSpanSourceAsExplicit"])(this); 971 } 972 return this; 973 } 974 /** @inheritdoc */ setAttributes(attributes) { 975 Object.keys(attributes).forEach((key)=>this.setAttribute(key, attributes[key])); 976 return this; 977 } 978 /** 979 * This should generally not be used, 980 * but we need it for browser tracing where we want to adjust the start time afterwards. 981 * USE THIS WITH CAUTION! 982 * 983 * @hidden 984 * @internal 985 */ updateStartTime(timeInput) { 986 if (this._frozen) { 987 return; 988 } 989 this._startTime = (0, __TURBOPACK__imported__module__304661__2["spanTimeInputToSeconds"])(timeInput); 990 } 991 /** 992 * @inheritDoc 993 */ setStatus(value) { 994 if (this._frozen) { 995 return this; 996 } 997 this._status = value; 998 return this; 999 } 1000 /** 1001 * @inheritDoc 1002 */ updateName(name) { 1003 if (this._frozen) { 1004 return this; 1005 } 1006 this._name = name; 1007 if (!(0, __TURBOPACK__imported__module__242222__["spanShouldInferOtelSource"])(this)) { 1008 this.setAttribute(__TURBOPACK__imported__module__519988__2["SEMANTIC_ATTRIBUTE_SENTRY_SOURCE"], "custom"); 1009 } 1010 return this; 1011 } 1012 /** @inheritdoc */ end(endTimestamp) { 1013 if (this._endTime) { 1014 this._frozen = (0, __TURBOPACK__imported__module__242222__["spanIsTracerProviderSpan"])(this); 1015 return; 1016 } 1017 this._endTime = (0, __TURBOPACK__imported__module__304661__2["spanTimeInputToSeconds"])(endTimestamp); 1018 logSpanEnd(this); 1019 this._onSpanEnded(); 1020 this._frozen = (0, __TURBOPACK__imported__module__242222__["spanIsTracerProviderSpan"])(this); 1021 } 1022 /** 1023 * Get JSON representation of this span. 1024 * 1025 * @hidden 1026 * @internal This method is purely for internal purposes and should not be used outside 1027 * of SDK code. If you need to get a JSON representation of a span, 1028 * use `spanToJSON(span)` instead. 1029 */ getSpanJSON() { 1030 return { 1031 data: this._attributes, 1032 description: this._name, 1033 op: this._attributes[__TURBOPACK__imported__module__519988__2["SEMANTIC_ATTRIBUTE_SENTRY_OP"]], 1034 parent_span_id: this._parentSpanId, 1035 span_id: this._spanId, 1036 start_timestamp: this._startTime, 1037 status: (0, __TURBOPACK__imported__module__304661__2["getStatusMessage"])(this._status), 1038 timestamp: this._endTime, 1039 trace_id: this._traceId, 1040 origin: this._attributes[__TURBOPACK__imported__module__519988__2["SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN"]], 1041 profile_id: this._attributes[__TURBOPACK__imported__module__519988__2["SEMANTIC_ATTRIBUTE_PROFILE_ID"]], 1042 exclusive_time: this._attributes[__TURBOPACK__imported__module__519988__2["SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME"]], 1043 measurements: timedEventsToMeasurements(this._events), 1044 is_segment: this._isStandaloneSpan && (0, __TURBOPACK__imported__module__304661__2["getRootSpan"])(this) === this || void 0, 1045 segment_id: this._isStandaloneSpan ? (0, __TURBOPACK__imported__module__304661__2["getRootSpan"])(this).spanContext().spanId : void 0, 1046 links: (0, __TURBOPACK__imported__module__304661__2["convertSpanLinksForEnvelope"])(this._links) 1047 }; 1048 } 1049 /** 1050 * Get {@link StreamedSpanJSON} representation of this span. 1051 * 1052 * @hidden 1053 * @internal This method is purely for internal purposes and should not be used outside 1054 * of SDK code. If you need to get a JSON representation of a span, 1055 * use `spanToStreamedSpanJSON(span)` instead. 1056 */ getStreamedSpanJSON() { 1057 var _this__name, _this__endTime; 1058 return { 1059 name: (_this__name = this._name) !== null && _this__name !== void 0 ? _this__name : "", 1060 span_id: this._spanId, 1061 trace_id: this._traceId, 1062 parent_span_id: this._parentSpanId, 1063 start_timestamp: this._startTime, 1064 // just in case _endTime is not set, we use the start time (i.e. duration 0) 1065 end_timestamp: (_this__endTime = this._endTime) !== null && _this__endTime !== void 0 ? _this__endTime : this._startTime, 1066 is_segment: this._isStandaloneSpan || this === (0, __TURBOPACK__imported__module__304661__2["getRootSpan"])(this), 1067 status: (0, __TURBOPACK__imported__module__304661__2["getSimpleStatus"])(this._status), 1068 attributes: (0, __TURBOPACK__imported__module__304661__2["addStatusMessageAttribute"])(this._attributes, this._status), 1069 links: (0, __TURBOPACK__imported__module__304661__2["getStreamedSpanLinks"])(this._links) 1070 }; 1071 } 1072 /** @inheritdoc */ isRecording() { 1073 return !this._endTime && !!this._sampled; 1074 } 1075 /** 1076 * @inheritdoc 1077 */ addEvent(name, attributesOrStartTime, startTime) { 1078 if (this._frozen) { 1079 return this; 1080 } 1081 __TURBOPACK__imported__module__901020__2["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__2["debug"].log("[Tracing] Adding an event to span:", name); 1082 const time = isSpanTimeInput(attributesOrStartTime) ? attributesOrStartTime : startTime || (0, __TURBOPACK__imported__module__605394__2["timestampInSeconds"])(); 1083 const attributes = isSpanTimeInput(attributesOrStartTime) ? {} : attributesOrStartTime || {}; 1084 const event = { 1085 name, 1086 time: (0, __TURBOPACK__imported__module__304661__2["spanTimeInputToSeconds"])(time), 1087 attributes 1088 }; 1089 this._events.push(event); 1090 return this; 1091 } 1092 /** 1093 * This method should generally not be used, 1094 * but for now we need a way to publicly check if the `_isStandaloneSpan` flag is set. 1095 * USE THIS WITH CAUTION! 1096 * @internal 1097 * @hidden 1098 * @experimental 1099 */ isStandaloneSpan() { 1100 return !!this._isStandaloneSpan; 1101 } 1102 /** Emit `spanEnd` when the span is ended. */ _onSpanEnded() { 1103 const client = (0, __TURBOPACK__imported__module__250804__2["getClient"])(); 1104 if (client) { 1105 client.emit("spanEnd", this); 1106 if (!this._isStandaloneSpan) { 1107 client.emit("afterSpanEnd", this); 1108 } 1109 } 1110 const rootSpan = (0, __TURBOPACK__imported__module__304661__2["getRootSpan"])(this); 1111 const isSegmentSpan = this._isStandaloneSpan || this === rootSpan; 1112 if (this._isStandaloneSpan) { 1113 if (this._sampled) { 1114 sendSpanEnvelope(createSpanEnvelope([ 1115 this 1116 ], client)); 1117 } else { 1118 __TURBOPACK__imported__module__901020__2["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__2["debug"].log("[Tracing] Discarding standalone span because its trace was not chosen to be sampled."); 1119 if (client) {
1120 client.recordDroppedEvent("sample_rate", "span"); 1121 } 1122 } 1123 return; 1124 } 1125 if (!isSegmentSpan) { 1126 const strategy2 = getSegmentSpanCaptureStrategy(); 1127 if (strategy2) { 1128 const scope2 = (0, __TURBOPACK__imported__module__242222__["getCapturedScopesOnSpan"])(this).scope || (0, __TURBOPACK__imported__module__250804__2["getCurrentScope"])(); 1129 strategy2.onChildSpanEnded(this, rootSpan, (options)=>this._convertSpanToTransaction(options), scope2); 1130 } 1131 return; 1132 } 1133 if (client && hasSpanStreamingEnabled(client)) { 1134 client.emit("afterSegmentSpanEnd", this); 1135 return; 1136 } 1137 const scope = (0, __TURBOPACK__imported__module__242222__["getCapturedScopesOnSpan"])(this).scope || (0, __TURBOPACK__imported__module__250804__2["getCurrentScope"])(); 1138 const strategy = getSegmentSpanCaptureStrategy(); 1139 if (strategy) { 1140 strategy.onSegmentSpanEnded((options)=>this._convertSpanToTransaction(options), scope); 1141 } else { 1142 const transactionEvent = this._convertSpanToTransaction(); 1143 if (transactionEvent) { 1144 scope.captureEvent(transactionEvent); 1145 } 1146 } 1147 } 1148 /** 1149 * Finish the transaction & prepare the event to send to Sentry. 1150 */ _convertSpanToTransaction() { 1151 let options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}; 1152 var _capturedSpanScope_getScopeData_sdkProcessingMetadata, _options_onSpanCaptured; 1153 if (!isFullFinishedSpan((0, __TURBOPACK__imported__module__304661__2["spanToJSON"])(this))) { 1154 return void 0; 1155 } 1156 if (!this._name) { 1157 __TURBOPACK__imported__module__901020__2["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__2["debug"].warn("Transaction has no name, falling back to `<unlabeled transaction>`."); 1158 this._name = "<unlabeled transaction>"; 1159 } 1160 const { scope: capturedSpanScope, isolationScope: capturedSpanIsolationScope } = (0, __TURBOPACK__imported__module__242222__["getCapturedScopesOnSpan"])(this); 1161 const normalizedRequest = capturedSpanScope === null || capturedSpanScope === void 0 ? void 0 : (_capturedSpanScope_getScopeData_sdkProcessingMetadata = capturedSpanScope.getScopeData().sdkProcessingMetadata) === null || _capturedSpanScope_getScopeData_sdkProcessingMetadata === void 0 ? void 0 : _capturedSpanScope_getScopeData_sdkProcessingMetadata.normalizedRequest; 1162 if (this._sampled !== true) { 1163 return void 0; 1164 } 1165 (_options_onSpanCaptured = options.onSpanCaptured) === null || _options_onSpanCaptured === void 0 ? void 0 : _options_onSpanCaptured.call(options, this); 1166 const spans = []; 1167 for (const descendant of (0, __TURBOPACK__imported__module__304661__2["getSpanDescendants"])(this)){ 1168 var _options_isSpanAlreadyCaptured, _options_onSpanCaptured1; 1169 if (descendant === this || isStandaloneSpan(descendant) || ((_options_isSpanAlreadyCaptured = options.isSpanAlreadyCaptured) === null || _options_isSpanAlreadyCaptured === void 0 ? void 0 : _options_isSpanAlreadyCaptured.call(options, descendant))) { 1170 continue; 1171 } 1172 const spanJSON = (0, __TURBOPACK__imported__module__304661__2["spanToJSON"])(descendant); 1173 if (!isFullFinishedSpan(spanJSON)) { 1174 continue; 1175 } 1176 (_options_onSpanCaptured1 = options.onSpanCaptured) === null || _options_onSpanCaptured1 === void 0 ? void 0 : _options_onSpanCaptured1.call(options, descendant); 1177 spans.push(spanJSON); 1178 } 1179 const source = this._attributes[__TURBOPACK__imported__module__519988__2["SEMANTIC_ATTRIBUTE_SENTRY_SOURCE"]]; 1180 delete this._attributes[__TURBOPACK__imported__module__519988__2["SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME"]]; 1181 let hasGenAiSpans = false; 1182 spans.forEach((span)=>{ 1183 var _span_op; 1184 delete span.data[__TURBOPACK__imported__module__519988__2["SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME"]]; 1185 if ((_span_op = span.op) === null || _span_op === void 0 ? void 0 : _span_op.startsWith("gen_ai.")) { 1186 hasGenAiSpans = true; 1187 } 1188 }); 1189 const transaction = { 1190 contexts: { 1191 trace: (0, __TURBOPACK__imported__module__304661__2["spanToTransactionTraceContext"])(this) 1192 }, 1193 spans: // spans.sort() mutates the array, but `spans` is already a copy so we can safely do this here 1194 // we do not use spans anymore after this point 1195 spans.length > MAX_SPAN_COUNT ? spans.sort((a, b)=>a.start_timestamp - b.start_timestamp).slice(0, MAX_SPAN_COUNT) : spans, 1196 start_timestamp: this._startTime, 1197 timestamp: this._endTime, 1198 transaction: this._name, 1199 type: "transaction", 1200 sdkProcessingMetadata: { 1201 capturedSpanScope, 1202 capturedSpanIsolationScope, 1203 dynamicSamplingContext: (0, __TURBOPACK__imported__module__473753__1["getDynamicSamplingContextFromSpan"])(this), 1204 hasGenAiSpans 1205 }, 1206 request: normalizedRequest, 1207 ...source && { 1208 transaction_info: { 1209 source 1210 } 1211 } 1212 }; 1213 const measurements = timedEventsToMeasurements(this._events); 1214 const hasMeasurements = measurements && Object.keys(measurements).length; 1215 if (hasMeasurements) { 1216 __TURBOPACK__imported__module__901020__2["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__2["debug"].log("[Measurements] Adding measurements to transaction event", JSON.stringify(measurements, void 0, 2)); 1217 transaction.measurements = measurements; 1218 } 1219 return transaction; 1220 } 1221 /** 1222 * You should never call the constructor manually, always use `Sentry.startSpan()` 1223 * or other span methods. 1224 * @internal 1225 * @hideconstructor 1226 * @hidden 1227 */ constructor(spanContext = {}){ 1228 this._traceId = spanContext.traceId || (0, __TURBOPACK__imported__module__373382__["generateTraceId"])(); 1229 this._spanId = spanContext.spanId || (0, __TURBOPACK__imported__module__373382__["generateSpanId"])(); 1230 this._startTime = spanContext.startTimestamp || (0, __TURBOPACK__imported__module__605394__2["timestampInSeconds"])(); 1231 this._links = spanContext.links; 1232 this._attributes = {}; 1233 this.setAttributes({ 1234 [__TURBOPACK__imported__module__519988__2["SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN"]]: "manual", 1235 [__TURBOPACK__imported__module__519988__2["SEMANTIC_ATTRIBUTE_SENTRY_OP"]]: spanContext.op, 1236 ...spanContext.attributes 1237 }); 1238 this._name = spanContext.name; 1239 if (spanContext.parentSpanId) { 1240 this._parentSpanId = spanContext.parentSpanId; 1241 } 1242 if ("sampled" in spanContext) { 1243 this._sampled = spanContext.sampled; 1244 } 1245 if (spanContext.endTimestamp) { 1246 this._endTime = spanContext.endTimestamp; 1247 } 1248 this._events = []; 1249 this._isStandaloneSpan = spanContext.isStandalone; 1250 if (this._endTime) { 1251 this._onSpanEnded(); 1252 } 1253 } 1254} 1255function isSpanTimeInput(value) { 1256 return value && typeof value === "number" || value instanceof Date || Array.isArray(value); 1257} 1258function isFullFinishedSpan(input) { 1259 return !!input.start_timestamp && !!input.timestamp && !!input.span_id && !!input.trace_id; 1260} 1261function isStandaloneSpan(span) { 1262 return span instanceof SentrySpan && span.isStandaloneSpan(); 1263} 1264function sendSpanEnvelope(envelope) { 1265 const client = (0, __TURBOPACK__imported__module__250804__2["getClient"])(); 1266 if (!client) { 1267 return; 1268 } 1269 const spanItems = envelope[1]; 1270 if (!spanItems || spanItems.length === 0) {
1271 client.recordDroppedEvent("before_send", "span"); 1272 return; 1273 } 1274 client.sendEnvelope(envelope); 1275} 1276; 1277var __TURBOPACK__imported__module__776710__ = __turbopack_context__.i(776710); 1278// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/tracing/trace.js [app-client] (ecmascript) 1279; 1280var __TURBOPACK__imported__module__301263__ = __turbopack_context__.i(301263); 1281var __TURBOPACK__imported__module__923288__1 = __TURBOPACK__imported__module__923288__; 1282var __TURBOPACK__imported__module__250804__3 = __TURBOPACK__imported__module__250804__; 1283var __TURBOPACK__imported__module__901020__5 = __TURBOPACK__imported__module__901020__; 1284var __TURBOPACK__imported__module__519988__4 = __TURBOPACK__imported__module__519988__; 1285var __TURBOPACK__imported__module__602309__ = __turbopack_context__.i(602309); 1286var __TURBOPACK__imported__module__272598__5 = __TURBOPACK__imported__module__272598__; 1287// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/utils/handleCallbackErrors.js [app-client] (ecmascript) 1288; 1289var __TURBOPACK__imported__module__450574__ = __turbopack_context__.i(450574); 1290var __TURBOPACK__imported__module__453288__1 = __TURBOPACK__imported__module__453288__; 1291; 1292; 1293function handleCallbackErrors(fn, onError) { 1294 let onFinally = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : ()=>{}, onSuccess = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : ()=>{}; 1295 let maybePromiseResult; 1296 try { 1297 maybePromiseResult = fn(); 1298 } catch (e) { 1299 onError(e); 1300 onFinally(); 1301 throw e; 1302 } 1303 return maybeHandlePromiseRejection(maybePromiseResult, onError, onFinally, onSuccess); 1304} 1305function maybeHandlePromiseRejection(value, onError, onFinally, onSuccess) { 1306 if ((0, __TURBOPACK__imported__module__453288__1["isThenable"])(value)) { 1307 return (0, __TURBOPACK__imported__module__450574__["chainAndCopyPromiseLike"])(value, (result)=>{ 1308 onFinally(); 1309 onSuccess(result); 1310 }, (err)=>{ 1311 onError(err); 1312 onFinally(); 1313 }); 1314 } 1315 onFinally(); 1316 onSuccess(value); 1317 return value; 1318} 1319; 1320var __TURBOPACK__imported__module__10008__1 = __TURBOPACK__imported__module__10008__; 1321var __TURBOPACK__imported__module__170637__ = __turbopack_context__.i(170637); 1322var __TURBOPACK__imported__module__373382__1 = __TURBOPACK__imported__module__373382__; 1323var __TURBOPACK__imported__module__111139__1 = __TURBOPACK__imported__module__111139__; 1324var __TURBOPACK__imported__module__821061__1 = __TURBOPACK__imported__module__821061__; 1325var __TURBOPACK__imported__module__304661__5 = __TURBOPACK__imported__module__304661__; 1326var __TURBOPACK__imported__module__132584__ = __turbopack_context__.i(132584); 1327var __TURBOPACK__imported__module__473753__2 = __TURBOPACK__imported__module__473753__; 1328// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/tracing/sampling.js [app-client] (ecmascript) 1329; 1330var __TURBOPACK__imported__module__901020__6 = __TURBOPACK__imported__module__901020__; 1331var __TURBOPACK__imported__module__272598__6 = __TURBOPACK__imported__module__272598__; 1332var __TURBOPACK__imported__module__10008__2 = __TURBOPACK__imported__module__10008__; 1333var __TURBOPACK__imported__module__170637__1 = __TURBOPACK__imported__module__170637__; 1334; 1335; 1336; 1337; 1338function sampleSpan(options, samplingContext, sampleRand) { 1339 if (!(0, __TURBOPACK__imported__module__10008__2["hasSpansEnabled"])(options)) { 1340 return [ 1341 false 1342 ]; 1343 } 1344 let localSampleRateWasApplied = void 0; 1345 let sampleRate; 1346 if (typeof options.tracesSampler === "function") { 1347 sampleRate = options.tracesSampler({ 1348 ...samplingContext, 1349 inheritOrSampleWith: (fallbackSampleRate)=>{ 1350 if (typeof samplingContext.parentSampleRate === "number") { 1351 return samplingContext.parentSampleRate; 1352 } 1353 if (typeof samplingContext.parentSampled === "boolean") { 1354 return Number(samplingContext.parentSampled); 1355 } 1356 return fallbackSampleRate; 1357 } 1358 }); 1359 localSampleRateWasApplied = true; 1360 } else if (samplingContext.parentSampled !== void 0) { 1361 sampleRate = samplingContext.parentSampled; 1362 } else if (typeof options.tracesSampleRate !== "undefined") { 1363 sampleRate = options.tracesSampleRate; 1364 localSampleRateWasApplied = true; 1365 } 1366 const parsedSampleRate = (0, __TURBOPACK__imported__module__170637__1["parseSampleRate"])(sampleRate); 1367 if (parsedSampleRate === void 0) { 1368 __TURBOPACK__imported__module__901020__6["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__6["debug"].warn("[Tracing] Discarding root span because of invalid sample rate. Sample rate must be a boolean or a number between 0 and 1. Got ".concat(JSON.stringify(sampleRate), " of type ").concat(JSON.stringify(typeof sampleRate), ".")); 1369 return [ 1370 false 1371 ]; 1372 } 1373 if (!parsedSampleRate) { 1374 __TURBOPACK__imported__module__901020__6["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__6["debug"].log("[Tracing] Discarding transaction because ".concat(typeof options.tracesSampler === "function" ? "tracesSampler returned 0 or false" : "a negative sampling decision was inherited or tracesSampleRate is set to 0")); 1375 return [ 1376 false, 1377 parsedSampleRate, 1378 localSampleRateWasApplied 1379 ]; 1380 } 1381 const shouldSample = sampleRand < parsedSampleRate; 1382 if (!shouldSample) { 1383 __TURBOPACK__imported__module__901020__6["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__6["debug"].log("[Tracing] Discarding transaction because it's not included in the random sample (sampling rate = ".concat(Number(sampleRate), ")")); 1384 } 1385 return [ 1386 shouldSample, 1387 parsedSampleRate, 1388 localSampleRateWasApplied 1389 ]; 1390} 1391; 1392var __TURBOPACK__imported__module__728469__1 = __TURBOPACK__imported__module__728469__;
1393var __TURBOPACK__imported__module__776710__1 = __TURBOPACK__imported__module__776710__; 1394var __TURBOPACK__imported__module__242222__1 = __TURBOPACK__imported__module__242222__; 1395; 1396; 1397; 1398; 1399; 1400; 1401; 1402; 1403; 1404; 1405; 1406; 1407; 1408; 1409; 1410; 1411; 1412; 1413; 1414; 1415; 1416; 1417; 1418; 1419const SUPPRESS_TRACING_KEY = "__SENTRY_SUPPRESS_TRACING__"; 1420function startSpan(options, callback) { 1421 const acs = getAcs(); 1422 if (acs.startSpan) { 1423 return acs.startSpan(options, callback); 1424 } 1425 const spanArguments = parseSentrySpanArguments(options); 1426 const { forceTransaction, parentSpan: customParentSpan, scope: customScope } = options; 1427 const customForkedScope = customScope === null || customScope === void 0 ? void 0 : customScope.clone(); 1428 return (0, __TURBOPACK__imported__module__250804__3["withScope"])(customForkedScope, ()=>{ 1429 const wrapper = getActiveSpanWrapper(customParentSpan); 1430 return wrapper(()=>{ 1431 const scope = (0, __TURBOPACK__imported__module__250804__3["getCurrentScope"])(); 1432 const parentSpan = getParentSpan(scope, customParentSpan); 1433 const client = (0, __TURBOPACK__imported__module__250804__3["getClient"])(); 1434 const missingRequiredParent = options.onlyIfParent && !parentSpan; 1435 const activeSpan = missingRequiredParent ? startMissingRequiredParentSpan(scope, client) : createChildOrRootSpan({ 1436 parentSpan, 1437 spanArguments, 1438 forceTransaction, 1439 scope 1440 }); 1441 if (!spanIsIgnored(activeSpan) || !parentSpan) { 1442 (0, __TURBOPACK__imported__module__821061__1["_setSpanForScope"])(scope, activeSpan); 1443 } 1444 return handleCallbackErrors(()=>callback(activeSpan), ()=>{ 1445 const { status } = (0, __TURBOPACK__imported__module__304661__5["spanToJSON"])(activeSpan); 1446 if (activeSpan.isRecording() && (!status || status === "ok")) { 1447 activeSpan.setStatus({ 1448 code: __TURBOPACK__imported__module__776710__1["SPAN_STATUS_ERROR"], 1449 message: "internal_error" 1450 }); 1451 } 1452 }, ()=>{ 1453 activeSpan.end(); 1454 }); 1455 }); 1456 }); 1457} 1458function startSpanManual(options, callback) { 1459 const acs = getAcs(); 1460 if (acs.startSpanManual) { 1461 return acs.startSpanManual(options, callback); 1462 } 1463 const spanArguments = parseSentrySpanArguments(options); 1464 const { forceTransaction, parentSpan: customParentSpan, scope: customScope } = options; 1465 const customForkedScope = customScope === null || customScope === void 0 ? void 0 : customScope.clone(); 1466 return (0, __TURBOPACK__imported__module__250804__3["withScope"])(customForkedScope, ()=>{ 1467 const wrapper = getActiveSpanWrapper(customParentSpan); 1468 return wrapper(()=>{ 1469 const scope = (0, __TURBOPACK__imported__module__250804__3["getCurrentScope"])(); 1470 const parentSpan = getParentSpan(scope, customParentSpan); 1471 const missingRequiredParent = options.onlyIfParent && !parentSpan; 1472 const activeSpan = missingRequiredParent ? startMissingRequiredParentSpan(scope, (0, __TURBOPACK__imported__module__250804__3["getClient"])()) : createChildOrRootSpan({ 1473 parentSpan, 1474 spanArguments, 1475 forceTransaction, 1476 scope 1477 }); 1478 if (!spanIsIgnored(activeSpan) || !parentSpan) { 1479 (0, __TURBOPACK__imported__module__821061__1["_setSpanForScope"])(scope, activeSpan); 1480 } 1481 return handleCallbackErrors(// We pass the `finish` function to the callback, so the user can finish the span manually 1482 // this is mainly here for historic purposes because previously, we instructed users to call 1483 // `finish` instead of `span.end()` to also clean up the scope. Nowadays, calling `span.end()` 1484 // or `finish` has the same effect and we simply leave it here to avoid breaking user code. 1485 ()=>callback(activeSpan, ()=>activeSpan.end()), ()=>{ 1486 const { status } = (0, __TURBOPACK__imported__module__304661__5["spanToJSON"])(activeSpan); 1487 if (activeSpan.isRecording() && (!status || status === "ok")) { 1488 activeSpan.setStatus({
1489 code: __TURBOPACK__imported__module__776710__1["SPAN_STATUS_ERROR"], 1490 message: "internal_error" 1491 }); 1492 } 1493 }); 1494 }); 1495 }); 1496} 1497function startInactiveSpan(options) { 1498 const acs = getAcs(); 1499 if (acs.startInactiveSpan) { 1500 return acs.startInactiveSpan(options); 1501 } 1502 return _startInactiveSpanImpl(options); 1503} 1504function _INTERNAL_startInactiveSpan(options) { 1505 return _startInactiveSpanImpl(options); 1506} 1507function _startInactiveSpanImpl(options) { 1508 const spanArguments = parseSentrySpanArguments(options); 1509 const { forceTransaction, parentSpan: customParentSpan } = options; 1510 const wrapper = options.scope ? (callback)=>(0, __TURBOPACK__imported__module__250804__3["withScope"])(options.scope, callback) : customParentSpan !== void 0 ? (callback)=>withActiveSpan(customParentSpan, callback) : (callback)=>callback(); 1511 return wrapper(()=>{ 1512 const scope = (0, __TURBOPACK__imported__module__250804__3["getCurrentScope"])(); 1513 const parentSpan = getParentSpan(scope, customParentSpan); 1514 const client = (0, __TURBOPACK__imported__module__250804__3["getClient"])(); 1515 const missingRequiredParent = options.onlyIfParent && !parentSpan; 1516 if (missingRequiredParent) { 1517 return startMissingRequiredParentSpan(scope, client); 1518 } 1519 return createChildOrRootSpan({ 1520 parentSpan, 1521 spanArguments, 1522 forceTransaction, 1523 scope 1524 }); 1525 }); 1526} 1527const continueTrace = (options, callback)=>{ 1528 const carrier = (0, __TURBOPACK__imported__module__923288__1["getMainCarrier"])(); 1529 const acs = (0, __TURBOPACK__imported__module__301263__["getAsyncContextStrategy"])(carrier); 1530 if (acs.continueTrace) { 1531 return acs.continueTrace(options, callback); 1532 } 1533 const { sentryTrace, baggage } = options; 1534 const client = (0, __TURBOPACK__imported__module__250804__3["getClient"])(); 1535 const incomingDsc = (0, __TURBOPACK__imported__module__602309__["baggageHeaderToDynamicSamplingContext"])(baggage); 1536 if (client && !(0, __TURBOPACK__imported__module__132584__["shouldContinueTrace"])(client, incomingDsc === null || incomingDsc === void 0 ? void 0 : incomingDsc.org_id)) { 1537 return startNewTrace(callback); 1538 } 1539 return (0, __TURBOPACK__imported__module__250804__3["withScope"])((scope)=>{ 1540 const propagationContext = (0, __TURBOPACK__imported__module__132584__["propagationContextFromHeaders"])(sentryTrace, baggage); 1541 scope.setPropagationContext(propagationContext); 1542 (0, __TURBOPACK__imported__module__821061__1["_setSpanForScope"])(scope, void 0); 1543 return callback(); 1544 }); 1545}; 1546function withActiveSpan(span, callback) { 1547 const acs = getAcs(); 1548 if (acs.withActiveSpan) { 1549 return acs.withActiveSpan(span, callback); 1550 } 1551 return (0, __TURBOPACK__imported__module__250804__3["withScope"])((scope)=>{ 1552 (0, __TURBOPACK__imported__module__821061__1["_setSpanForScope"])(scope, span || void 0); 1553 return callback(scope); 1554 }); 1555} 1556function suppressTracing(callback) { 1557 const acs = getAcs(); 1558 if (acs.suppressTracing) { 1559 return acs.suppressTracing(callback); 1560 } 1561 return (0, __TURBOPACK__imported__module__250804__3["withScope"])((scope)=>{ 1562 scope.setSDKProcessingMetadata({ 1563 [SUPPRESS_TRACING_KEY]: true 1564 }); 1565 const res = callback(); 1566 scope.setSDKProcessingMetadata({ 1567 [SUPPRESS_TRACING_KEY]: void 0 1568 }); 1569 return res; 1570 }); 1571} 1572function isTracingSuppressed() { 1573 let scope = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : (0, __TURBOPACK__imported__module__250804__3["getCurrentScope"])(); 1574 const acs = getAcs(); 1575 if (acs.isTracingSuppressed) { 1576 return acs.isTracingSuppressed(scope); 1577 } 1578 return scope.getScopeData().sdkProcessingMetadata[SUPPRESS_TRACING_KEY] === true; 1579} 1580function startNewTrace(callback) { 1581 const acs = getAcs(); 1582 if (acs.startNewTrace) { 1583 return acs.startNewTrace(callback); 1584 } 1585 return (0, __TURBOPACK__imported__module__250804__3["withScope"])((scope)=>{ 1586 scope.setPropagationContext({ 1587 traceId: (0, __TURBOPACK__imported__module__373382__1["generateTraceId"])(), 1588 sampleRand: (0, __TURBOPACK__imported__module__111139__1["s
1588afeMathRandom"])() 1589 }); 1590 __TURBOPACK__imported__module__901020__5["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__5["debug"].log("Starting a new trace with id ".concat(scope.getPropagationContext().traceId)); 1591 return withActiveSpan(null, callback); 1592 }); 1593} 1594function startMissingRequiredParentSpan(scope, client) { 1595 client === null || client === void 0 ? void 0 : client.recordDroppedEvent("no_parent_span", "span"); 1596 const span = new __TURBOPACK__imported__module__728469__1["SentryNonRecordingSpan"]({ 1597 traceId: scope.getPropagationContext().traceId 1598 }); 1599 (0, __TURBOPACK__imported__module__242222__1["setCapturedScopesOnSpan"])(span, scope, (0, __TURBOPACK__imported__module__250804__3["getIsolationScope"])()); 1600 return span; 1601} 1602function createChildOrRootSpan(param) { 1603 let { parentSpan, spanArguments, forceTransaction, scope } = param; 1604 const isolationScope = (0, __TURBOPACK__imported__module__250804__3["getIsolationScope"])(); 1605 if (!(0, __TURBOPACK__imported__module__10008__1["hasSpansEnabled"])()) { 1606 const scopePropagationContext = scope.getPropagationContext(); 1607 const traceId = parentSpan ? parentSpan.spanContext().traceId : scopePropagationContext.traceId; 1608 const span2 = new __TURBOPACK__imported__module__728469__1["SentryNonRecordingSpan"]({ 1609 traceId 1610 }); 1611 if (parentSpan && !forceTransaction) { 1612 (0, __TURBOPACK__imported__module__304661__5["addChildSpanToSpan"])(parentSpan, span2); 1613 } 1614 (0, __TURBOPACK__imported__module__242222__1["setCapturedScopesOnSpan"])(span2, scope, isolationScope); 1615 return span2; 1616 } 1617 const client = (0, __TURBOPACK__imported__module__250804__3["getClient"])(); 1618 if (_shouldIgnoreStreamedSpan(client, spanArguments)) { 1619 var _ref; 1620 if (!isTracingSuppressed(scope)) { 1621 client === null || client === void 0 ? void 0 : client.recordDroppedEvent("ignored", "span"); 1622 } 1623 const ignoredSpan = new __TURBOPACK__imported__module__728469__1["SentryNonRecordingSpan"]({ 1624 dropReason: "ignored", 1625 traceId: (_ref = parentSpan === null || parentSpan === void 0 ? void 0 : parentSpan.spanContext().traceId) !== null && _ref !== void 0 ? _ref : scope.getPropagationContext().traceId 1626 }); 1627 if (parentSpan && !forceTransaction) { 1628 (0, __TURBOPACK__imported__module__304661__5["addChildSpanToSpan"])(parentSpan, ignoredSpan); 1629 } 1630 (0, __TURBOPACK__imported__module__242222__1["setCapturedScopesOnSpan"])(ignoredSpan, scope, isolationScope); 1631 return ignoredSpan; 1632 } 1633 let span; 1634 if (parentSpan && !forceTransaction) { 1635 span = _startChildSpan(parentSpan, scope, spanArguments, isolationScope); 1636 (0, __TURBOPACK__imported__module__304661__5["addChildSpanToSpan"])(parentSpan, span); 1637 } else if (parentSpan) { 1638 const dsc = (0, __TURBOPACK__imported__module__473753__2["getDynamicSamplingContextFromSpan"])(parentSpan); 1639 const { traceId, spanId: parentSpanId } = parentSpan.spanContext(); 1640 const parentSampled = (0, __TURBOPACK__imported__module__304661__5["spanIsSampled"])(parentSpan); 1641 span = _startRootSpan({ 1642 traceId, 1643 parentSpanId, 1644 ...spanArguments 1645 }, scope, isolationScope, parentSampled); 1646 (0, __TURBOPACK__imported__module__473753__2["freezeDscOnSpan"])(span, dsc); 1647 } else { 1648 const { traceId, dsc, parentSpanId, sampled: parentSampled } = scope.getPropagationContext(); 1649 span = _startRootSpan({ 1650 traceId, 1651 parentSpanId, 1652 ...spanArguments 1653 }, scope, isolationScope, parentSampled); 1654 if (dsc) { 1655 (0, __TURBOPACK__imported__module__473753__2["freezeDscOnSpan"])(span, dsc); 1656 } 1657 } 1658 logSpanStart(span); 1659 return span; 1660} 1661function parseSentrySpanArguments(options) { 1662 const exp = options.experimental || {}; 1663 const initialCtx = { 1664 isStandalone: exp.standalone, 1665 ...options 1666 }; 1667 if (options.startTime) { 1668 const ctx = { 1669 ...initialCtx 1670 }; 1671 ctx.startTimestamp = (0, __TURBOPACK__imported__module__304661__5["spanTimeInputToSeconds"])(options.startTime); 1672 delete ctx.startTime; 1673 return ctx; 1674 } 1675 return initialCtx; 1676} 1677function getAcs() { 1678 const carrier = (0, __TURBOPACK__imported__module__923288__1["getMainCarrier"])(); 1679 return (0, __TURBOPACK__imported__module__301263__["getAsyncContextStrategy"])(carrier); 1680} 1681function _startRootSpan(spanArguments, scope, isolationScope, parentSampled) { 1682 var _mutableSpanSamplingData_parentSampled; 1683 var _currentPropagationContext_dsc; 1684 const client = (0, __TURBOPACK__imported__module__250804__3["getClient"])(); 1685 const options = (client === null || client === void 0 ? void 0 : client.getOptions()) || {}; 1686 const { name = "" } = spanArguments; 1687 const mutableSpanSamplingData = { 1688 spanAttributes: { 1689 ...spanArguments.attributes 1690 }, 1691 spanName: name, 1692 parentSampled 1693 }; 1694 client === null || client === void 0 ? void 0 : client.emit("beforeSampling", mutableSpanSamplingData, { 1695 decision: false 1696 }); 1697 const finalParentSampled = (_mutableSpanSamplingData_parentSampled = mutableSpanSamplingData.parentSampled) !== null && _mutableSpanSamplingData_parentSampled !== void 0 ? _mutableSpanSamplingData_parentSampled : parentSampled; 1698 const finalAttributes = mutableSpanSamplingData.spanAttributes; 1699 const currentPropagationContext = scope.getPropagationContext(); 1700 const _isTracingSuppressed = isTracingSuppressed(scope); 1701 const [sampled, sampleRate, localSampleRateWasApplied] = _isTracingSuppressed ? [ 1702 false 1703 ] : sampleSpan(options, { 1704 name, 1705 parentSampled: finalParentSampled, 1706 attributes: finalAttributes, 1707 normalizedRequest: isolationScope.getScopeData().sdkProcessingMetadata.normalizedRequest, 1708 parentSampleRate: (0, __TURBOPACK__imported__module__170637__["parseSampleRate"])((_currentPropagationContext_dsc = currentPropagationContext.dsc) === null || _currentPropagationContext_dsc === void 0 ? void 0 : _currentPropagationContext_dsc.sample_rate) 1709 }, currentPropagationContext.sampleRand); 1710 const rootSpan = new SentrySpan({ 1711 ...spanArguments, 1712 attributes: { 1713 [__TURBOPACK__imported__module__519988__4["SEMANTIC_ATTRIBUTE_SENTRY_SOURCE"]]: "custom", 1714 [__TURBOPACK__imported__module__519988__4["SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE"]]: sampleRate !== void 0 && localSampleRateWasApplied ? sampleRate : void 0, 1715 ...finalAttributes 1716 }, 1717 sampled 1718 }); 1719 if (!sampled && client && !_isTracingSuppressed) { 1720 __TURBOPACK__imported__module__901020__5["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__5["debug"].log("[Tracing] Discarding root span because its trace was not chosen to be sampled.");
1721 client.recordDroppedEvent("sample_rate", hasSpanStreamingEnabled(client) ? "span" : "transaction"); 1722 } 1723 (0, __TURBOPACK__imported__module__242222__1["setCapturedScopesOnSpan"])(rootSpan, scope, isolationScope); 1724 if (client) { 1725 client.emit("spanStart", rootSpan); 1726 } 1727 return rootSpan; 1728} 1729function _startChildSpan(parentSpan, scope, spanArguments, isolationScope) { 1730 const { spanId, traceId } = parentSpan.spanContext(); 1731 const _isTracingSuppressed = isTracingSuppressed(scope); 1732 const sampled = _isTracingSuppressed ? false : (0, __TURBOPACK__imported__module__304661__5["spanIsSampled"])(parentSpan); 1733 const childSpan = sampled ? new SentrySpan({ 1734 ...spanArguments, 1735 parentSpanId: spanId, 1736 traceId, 1737 sampled 1738 }) : new __TURBOPACK__imported__module__728469__1["SentryNonRecordingSpan"]({ 1739 traceId 1740 }); 1741 (0, __TURBOPACK__imported__module__304661__5["addChildSpanToSpan"])(parentSpan, childSpan); 1742 (0, __TURBOPACK__imported__module__242222__1["setCapturedScopesOnSpan"])(childSpan, scope, isolationScope); 1743 const client = (0, __TURBOPACK__imported__module__250804__3["getClient"])(); 1744 if (!client) { 1745 return childSpan; 1746 } 1747 if (hasSpanStreamingEnabled(client) && (0, __TURBOPACK__imported__module__728469__1["spanIsNonRecordingSpan"])(childSpan)) { 1748 if ((0, __TURBOPACK__imported__module__728469__1["spanIsNonRecordingSpan"])(parentSpan) && parentSpan.dropReason) { 1749 childSpan.dropReason = parentSpan.dropReason; 1750 client.recordDroppedEvent(parentSpan.dropReason, "span"); 1751 } else if (!_isTracingSuppressed) { 1752 childSpan.dropReason = "sample_rate"; 1753 client.recordDroppedEvent("sample_rate", "span"); 1754 } 1755 } 1756 client.emit("spanStart", childSpan); 1757 if (spanArguments.endTimestamp) { 1758 client.emit("spanEnd", childSpan); 1759 client.emit("afterSpanEnd", childSpan); 1760 } 1761 return childSpan; 1762} 1763function getParentSpan(scope, customParentSpan) { 1764 if (customParentSpan) { 1765 return customParentSpan; 1766 } 1767 if (customParentSpan === null) { 1768 return void 0; 1769 } 1770 const span = (0, __TURBOPACK__imported__module__821061__1["_getSpanForScope"])(scope); 1771 if (!span) { 1772 return void 0; 1773 } 1774 const client = (0, __TURBOPACK__imported__module__250804__3["getClient"])(); 1775 const options = client ? client.getOptions() : {}; 1776 if (options.parentSpanIsAlwaysRootSpan) { 1777 return (0, __TURBOPACK__imported__module__304661__5["getRootSpan"])(span); 1778 } 1779 return span; 1780} 1781function getActiveSpanWrapper(parentSpan) { 1782 return parentSpan !== void 0 ? (callback)=>{ 1783 return withActiveSpan(parentSpan, callback); 1784 } : (callback)=>callback(); 1785} 1786function _shouldIgnoreStreamedSpan(client, spanArguments) { 1787 var _spanArguments_attributes; 1788 const ignoreSpans = client === null || client === void 0 ? void 0 : client.getOptions().ignoreSpans; 1789 if (!client || !hasSpanStreamingEnabled(client) || !(ignoreSpans === null || ignoreSpans === void 0 ? void 0 : ignoreSpans.length)) { 1790 return false; 1791 } 1792 return shouldIgnoreSpan({ 1793 description: spanArguments.name || "", 1794 op: ((_spanArguments_attributes = spanArguments.attributes) === null || _spanArguments_attributes === void 0 ? void 0 : _spanArguments_attributes[__TURBOPACK__imported__module__519988__4["SEMANTIC_ATTRIBUTE_SENTRY_OP"]]) || spanArguments.op, 1795 attributes: spanArguments.attributes 1796 }, ignoreSpans); 1797} 1798function spanIsIgnored(span) { 1799 return (0, __TURBOPACK__imported__module__728469__1["spanIsNonRecordingSpan"])(span) && span.dropReason === "ignored"; 1800} 1801; 1802var __TURBOPACK__imported__module__242222__2 = __TURBOPACK__imported__module__242222__; 1803; 1804; 1805; 1806; 1807; 1808; 1809; 1810; 1811; 1812; 1813; 1814; 1815; 1816; 1817const TRACING_DEFAULTS = { 1818 idleTimeout: 1e3, 1819 finalTimeout: 3e4, 1820 childSpanTimeout: 15e3 1821}; 1822const FINISH_REASON_HEARTBEAT_FAILED = "heartbeatFailed"; 1823const FINISH_REASON_IDLE_TIMEOUT = "idleTimeout"; 1824const FINISH_REASON_FINAL_TIMEOUT = "finalTimeout"; 1825const FINISH_REASON_EXTERNAL_FINISH = "externalFinish";
1826function startIdleSpan(startSpanOptions) { 1827 let options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}; 1828 const activities = /* @__PURE__ */ new Map(); 1829 let _finished = false; 1830 let _idleTimeoutID; 1831 let _childSpanTimeoutID; 1832 let _finishReason = FINISH_REASON_EXTERNAL_FINISH; 1833 let _autoFinishAllowed = !options.disableAutoFinish; 1834 const _cleanupHooks = []; 1835 const { idleTimeout = TRACING_DEFAULTS.idleTimeout, finalTimeout = TRACING_DEFAULTS.finalTimeout, childSpanTimeout = TRACING_DEFAULTS.childSpanTimeout, beforeSpanEnd, trimIdleSpanEndTimestamp = true } = options; 1836 const client = (0, __TURBOPACK__imported__module__250804__1["getClient"])(); 1837 const scope = (0, __TURBOPACK__imported__module__250804__1["getCurrentScope"])(); 1838 if (!client || !(0, __TURBOPACK__imported__module__10008__["hasSpansEnabled"])()) { 1839 const span2 = new __TURBOPACK__imported__module__728469__["SentryNonRecordingSpan"]({ 1840 traceId: scope.getPropagationContext().traceId 1841 }); 1842 (0, __TURBOPACK__imported__module__242222__2["setCapturedScopesOnSpan"])(span2, scope, (0, __TURBOPACK__imported__module__250804__1["getIsolationScope"])()); 1843 return span2; 1844 } 1845 const previousActiveSpan = (0, __TURBOPACK__imported__module__304661__["getActiveSpan"])(); 1846 const span = _startIdleSpan(startSpanOptions); 1847 span.end = new Proxy(span.end, { 1848 apply (target, thisArg, args) { 1849 if (beforeSpanEnd) { 1850 beforeSpanEnd(span); 1851 } 1852 if ((0, __TURBOPACK__imported__module__728469__["spanIsNonRecordingSpan"])(thisArg)) { 1853 return; 1854 } 1855 const [definedEndTimestamp, ...rest] = args; 1856 const timestamp = definedEndTimestamp || (0, __TURBOPACK__imported__module__605394__1["timestampInSeconds"])(); 1857 const spanEndTimestamp = (0, __TURBOPACK__imported__module__304661__["spanTimeInputToSeconds"])(timestamp); 1858 const spans = (0, __TURBOPACK__imported__module__304661__["getSpanDescendants"])(span).filter((child)=>child !== span); 1859 const spanJson = (0, __TURBOPACK__imported__module__304661__["spanToJSON"])(span); 1860 if (!spans.length || !trimIdleSpanEndTimestamp) { 1861 onIdleSpanEnded(spanEndTimestamp); 1862 return Reflect.apply(target, thisArg, [ 1863 spanEndTimestamp, 1864 ...rest 1865 ]); 1866 } 1867 const ignoreSpans = client.getOptions().ignoreSpans; 1868 const latestSpanEndTimestamp = spans === null || spans === void 0 ? void 0 : spans.reduce((acc, current)=>{ 1869 const currentSpanJson = (0, __TURBOPACK__imported__module__304661__["spanToJSON"])(current); 1870 if (!currentSpanJson.timestamp) { 1871 return acc; 1872 } 1873 if (ignoreSpans && shouldIgnoreSpan({ 1874 description: currentSpanJson.description, 1875 op: currentSpanJson.op, 1876 attributes: currentSpanJson.data 1877 }, ignoreSpans)) { 1878 return acc; 1879 } 1880 return acc ? Math.max(acc, currentSpanJson.timestamp) : currentSpanJson.timestamp; 1881 }, void 0); 1882 const spanStartTimestamp = spanJson.start_timestamp; 1883 const endTimestamp = Math.min(spanStartTimestamp ? spanStartTimestamp + finalTimeout / 1e3 : Infinity, Math.max(spanStartTimestamp || -Infinity, Math.min(spanEndTimestamp, latestSpanEndTimestamp || Infinity))); 1884 onIdleSpanEnded(endTimestamp); 1885 return Reflect.apply(target, thisArg, [ 1886 endTimestamp, 1887 ...rest 1888 ]); 1889 } 1890 }); 1891 function _cancelIdleTimeout() { 1892 if (_idleTimeoutID) { 1893 clearTimeout(_idleTimeoutID); 1894 _idleTimeoutID = void 0; 1895 } 1896 } 1897 function _cancelChildSpanTimeout() { 1898 if (_childSpanTimeoutID) { 1899 clearTimeout(_childSpanTimeoutID); 1900 _childSpanTimeoutID = void 0; 1901 } 1902 } 1903 function _restartIdleTimeout(endTimestamp) { 1904 _cancelIdleTimeout(); 1905 _idleTimeoutID = setTimeout(()=>{ 1906 if (!_finished && activities.size === 0 && _autoFinishAllowed) { 1907 _finishReason = FINISH_REASON_IDLE_TIMEOUT;
1908 span.end(endTimestamp); 1909 } 1910 }, idleTimeout); 1911 } 1912 function _restartChildSpanTimeout(endTimestamp) { 1913 _cancelChildSpanTimeout(); 1914 _childSpanTimeoutID = setTimeout(()=>{ 1915 if (!_finished && _autoFinishAllowed) { 1916 _finishReason = FINISH_REASON_HEARTBEAT_FAILED; 1917 span.end(endTimestamp); 1918 } 1919 }, childSpanTimeout); 1920 } 1921 function _pushActivity(spanId) { 1922 _cancelIdleTimeout(); 1923 activities.set(spanId, true); 1924 const endTimestamp = (0, __TURBOPACK__imported__module__605394__1["timestampInSeconds"])(); 1925 _restartChildSpanTimeout(endTimestamp + childSpanTimeout / 1e3); 1926 } 1927 function _popActivity(spanId) { 1928 if (activities.has(spanId)) { 1929 activities.delete(spanId); 1930 } 1931 if (activities.size === 0) { 1932 const endTimestamp = (0, __TURBOPACK__imported__module__605394__1["timestampInSeconds"])(); 1933 _restartIdleTimeout(endTimestamp + idleTimeout / 1e3); 1934 _cancelChildSpanTimeout(); 1935 } 1936 } 1937 function onIdleSpanEnded(endTimestamp) { 1938 _finished = true; 1939 activities.clear(); 1940 _cleanupHooks.forEach((cleanup)=>cleanup()); 1941 (0, __TURBOPACK__imported__module__821061__["_setSpanForScope"])(scope, previousActiveSpan); 1942 const spanJSON = (0, __TURBOPACK__imported__module__304661__["spanToJSON"])(span); 1943 const { start_timestamp: startTimestamp } = spanJSON; 1944 if (!startTimestamp) { 1945 return; 1946 } 1947 const attributes = spanJSON.data; 1948 if (!attributes[__TURBOPACK__imported__module__519988__1["SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON"]]) { 1949 span.setAttribute(__TURBOPACK__imported__module__519988__1["SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON"], _finishReason); 1950 } 1951 const currentStatus = spanJSON.status; 1952 if (!currentStatus || currentStatus === "unknown") { 1953 span.setStatus({ 1954 code: __TURBOPACK__imported__module__776710__["SPAN_STATUS_OK"] 1955 }); 1956 } 1957 __TURBOPACK__imported__module__272598__["debug"].log('[Tracing] Idle span "'.concat(spanJSON.op, '" finished')); 1958 const childSpans = (0, __TURBOPACK__imported__module__304661__["getSpanDescendants"])(span).filter((child)=>child !== span); 1959 let discardedSpans = 0; 1960 childSpans.forEach((childSpan)=>{ 1961 if (childSpan.isRecording()) { 1962 childSpan.setStatus({ 1963 code: __TURBOPACK__imported__module__776710__["SPAN_STATUS_ERROR"], 1964 message: "cancelled" 1965 }); 1966 childSpan.end(endTimestamp); 1967 __TURBOPACK__imported__module__901020__["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__["debug"].log("[Tracing] Cancelling span since span ended early", JSON.stringify(childSpan, void 0, 2)); 1968 } 1969 const childSpanJSON = (0, __TURBOPACK__imported__module__304661__["spanToJSON"])(childSpan); 1970 const { timestamp: childEndTimestamp = 0, start_timestamp: childStartTimestamp = 0 } = childSpanJSON; 1971 const spanStartedBeforeIdleSpanEnd = childStartTimestamp <= endTimestamp; 1972 const timeoutWithMarginOfError = (finalTimeout + idleTimeout) / 1e3; 1973 const spanEndedBeforeFinalTimeout = childEndTimestamp - childStartTimestamp <= timeoutWithMarginOfError; 1974 if (__TURBOPACK__imported__module__901020__["DEBUG_BUILD"]) { 1975 const stringifiedSpan = JSON.stringify(childSpan, void 0, 2); 1976 if (!spanStartedBeforeIdleSpanEnd) { 1977 __TURBOPACK__imported__module__272598__["debug"].log("[Tracing] Discarding span since it happened after idle span was finished", stringifiedSpan); 1978 } else if (!spanEndedBeforeFinalTimeout) { 1979 __TURBOPACK__imported__module__272598__["debug"].log("[Tracing] Discarding span since it finished after idle span final timeout", stringifiedSpan); 1980 } 1981 } 1982 if (!spanEndedBeforeFinalTimeout || !spanStartedBeforeIdleSpanEnd) { 1983 (0, __TURBOPACK__imported__module__304661__["removeChildSpanFromSpan"])(span, childSpan); 1984 discardedSpans++; 1985 } 1986 }); 1987 if (discardedSpans > 0) { 1988 span.setAttribute("sentry.idle_span_discarded_spans", discardedSpans); 1989 } 1990 } 1991 _cleanupHooks.push(client.on("spanStart", (startedSpan)=>{ 1992 if (_finished || startedSpan === span || !!(0, __TURBOPACK__imported__module__304661__["spanToJSON"])(startedSpan).timestamp || startedSpan instanceof SentrySpan && startedSpan.isStandaloneSpan()) { 1993 return; 1994 } 1995 const allSpans = (0, __TURBOPACK__imported__module__304661__["getSpanDescendants"])(span); 1996 if (allSpans.includes(startedSpan)) { 1997 _pushActivity(startedSpan.spanContext().spanId); 1998 } 1999 })); 2000 _cleanupHooks.push(client.on("spanEnd", (endedSpan)=>{ 2001 if (_finished) { 2002 return; 2003 } 2004 _popActivity(endedSpan.spanContext().spanId); 2005 })); 2006 _cleanupHooks.push(client.on("idleSpanEnableAutoFinish", (spanToAllowAutoFinish)=>{ 2007 if (spanToAllowAutoFinish === span) { 2008 _autoFinishAllowed = true; 2009 _restartIdleTimeout(); 2010 if (activities.size) { 2011 _restartChildSpanTimeout(); 2012 } 2013 } 2014 })); 2015 if (!options.disableAutoFinish) { 2016 _restartIdleTimeout(); 2017 } 2018 setTimeout(()=>{ 2019 if (!_finished) { 2020 span.setStatus({
2021 code: __TURBOPACK__imported__module__776710__["SPAN_STATUS_ERROR"], 2022 message: "deadline_exceeded" 2023 }); 2024 _finishReason = FINISH_REASON_FINAL_TIMEOUT; 2025 span.end(); 2026 } 2027 }, finalTimeout); 2028 return span; 2029} 2030function _startIdleSpan(options) { 2031 const span = startInactiveSpan(options); 2032 (0, __TURBOPACK__imported__module__821061__["_setSpanForScope"])((0, __TURBOPACK__imported__module__250804__1["getCurrentScope"])(), span); 2033 __TURBOPACK__imported__module__901020__["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__["debug"].log("[Tracing] Started span is an idle span"); 2034 return span; 2035} 2036; 2037var __TURBOPACK__imported__module__272598__7 = __TURBOPACK__imported__module__272598__; 2038var __TURBOPACK__imported__module__605394__3 = __TURBOPACK__imported__module__605394__; 2039// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/utils/url.js [app-client] (ecmascript) 2040; 2041// MERGED MODULE: [project]/node_modules/@sentry/conventions/dist/attributes.mjs [app-client] (ecmascript) 2042; 2043const e = "ai.citations", i = "ai.completion_tokens.used", t = "ai.documents", n = "ai.finish_reason", r = "ai.frequency_penalty", a = "ai.function_call", s = "ai.generation_id", o = "ai.input_messages", l = "ai.is_search_required", p = "ai.metadata", c = "ai.model_id", u = "ai.model.provider", b = "ai.pipeline.name", g = "ai.preamble", d = "ai.presence_penalty", m = "ai.prompt_tokens.used", y = "ai.raw_prompting", _ = "ai.responses", h = "ai.response_format", v = "ai.search_queries", f = "ai.search_results", S = "ai.seed", E = "ai.streaming", T = "ai.tags", I = "ai.temperature", O = "ai.texts", k = "ai.tools", A = "ai.tool_calls", x = "ai.top_k", w = "ai.top_p", R = "ai.total_cost", N = "ai.total_tokens.used", C = "ai.warnings", P = "angular.version", D = "app.app_build", L = "app.app_identifier", U = "app.app_name", M = "app.app_start_time", q = "app.app_version", G = "app.build", Y = "app.identifier", V = "app.in_foreground", W = "app.name", F = "app_start_cold", B = "app.start_time", H = "app_start_type", z = "app_start_warm", K = "app.version", j = "app.vitals.frames.delay.value", Q = "app.vitals.frames.frozen.count", X = "app.vitals.frames.slow.count", J = "app.vitals.frames.total.count", Z = "app.vitals.start.cold.value", $ = "app.vitals.start.prewarmed", ee = "app.vitals.start.reason", ie = "app.vitals.start.screen", te = "app.vitals.start.type", ne = "app.vitals.start.warm.value", re = "app.vitals.ttfd.value", ae = "app.vitals.ttid.value", se = "art.gc.blocking_count", oe = "art.gc.blocking_time", le = "art.gc.pre_oome_count", pe = "art.gc.total_count", ce = "art.gc.total_time", ue = "art.gc.waiting_time", be = "art.memory.free", ge = "art.memory.free_until_gc", de = "art.memory.free_until_oome", me = "art.memory.max", ye = "art.memory.total", _e = "aws.cloudwatch.logs.log_group", he = "aws.cloudwatch.logs.log_stream", ve = "aws.cloudwatch.logs.url", fe = "aws.dynamodb.attribute_definitions", Se = "aws.dynamodb.consistent_read", Ee = "aws.dynamodb.consumed_capacity", Te = "aws.dynamodb.count", Ie = "aws.dynamodb.exclusive_start_table", Oe = "aws.dynamodb.global_secondary_indexes", ke = "aws.dynamodb.global_secondary_index_updates", Ae = "aws.dynamodb.index_name", xe = "aws.dynamodb.item_collection_metrics", we = "aws.dynamodb.limit", Re = "aws.dynamodb.local_secondary_indexes", Ne = "aws.dynamodb.projection", Ce = "aws.dynamodb.provisioned_read_capacity", Pe = "aws.dynamodb.provisioned_write_capacity", De = "aws.dynamodb.scanned_count", Le = "aws.dynamodb.scan_forward", Ue = "aws.dynamodb.segment", Me = "aws.dynamodb.select", qe = "aws.dynamodb.table_count", Ge = "aws.dynamodb.table_names", Ye = "aws.dynamodb.total_segments", Ve = "aws.extended_request_id", We = "aws.kinesis.stream_name", Fe = "aws.kinesis.stream.name", Be = "aws.lambda.aws_request_id", He = "aws.lambda.execution_duration_in_millis", ze = "aws.lambda.function_name", Ke = "aws.lambda.function_version", je = "aws.lambda.invoked_arn", Qe = "aws.lambda.invoked_function_arn", Xe = "aws.lambda.remaining_time_in_millis", Je = "aws.log.group.names", Ze = "aws.log.stream.names", $e = "aws.request.extended_id", ei = "aws.request_id", ii = "aws.request.id", ti = "aws.s3.bucket", ni = "aws.secretsmanager.secret.arn", ri = "aws.sns.topic.arn", ai = "aws.step_functions.activity.arn", si = "aws.step_functions.state_machine.arn", oi = "blocked_main_thread", li = "browser.name", pi = "browser.performance.navigation.activation_start", ci = "browser.performance.time_origin", ui = "browser.report.type", bi = "browser.script.invoker", gi = "browser.script.invoker_type", di = "browser.script.source_char_position", mi = "browser.version", yi = "browser.web_vital.cls.report_event", _i = "browser.web_vital.cls.source.<key>", hi = "browser.web_vital.cls.source", vi = "browser.web_vital.cls.value", fi = "browser.web_vital.fcp.value", Si = "browser.web_vital.fp.value", Ei = "browser.web_vital.inp.value", Ti = "browser.web_vital.lcp.element", Ii = "browser.web_vital.lcp.id", Oi = "browser.web_vital.lcp.load_time", ki = "browser.web_vital.lcp.render_time", Ai = "browser.web_vital.lcp.report_event", xi = "browser.web_vital.lcp.size", wi = "browser.web_vital.lcp.url", Ri = "browser.web_vital.lcp.value", Ni = "browser.web_vital.ttfb.request_time", Ci = "browser.web_vital.ttfb.value", Pi = "cache.hit", Di = "cache.item_size", Li = "cache.key", Ui = "cache.operation", Mi = "cache.ttl", qi = "cache.write", Gi = "channel", Yi = "client.address", Vi = "client.port", Wi = "cloudflare.d1.duration", Fi = "cloudflare.d1.query_type", Bi = "cloudflare.d1.rows_read", Hi = "cloudflare.d1.rows_written", zi = "cloudflare.durable_object.query.bindings", Ki = "cloudflare.durable_object.response.rows_read", ji = "cloudflare.durable_object.response.rows_written", Qi = "cloudflare.r2.bucket", Xi = "cloudflare.r2.operation", Ji = "cloudflare.r2.request.delimiter", Zi = "cloudflare.r2.request.key", $i = "cloudflare.r2.request.part_number", et = "cloudflare.r2.request.prefix", it = "cloudflare.workflow.attempt", tt = "cloudflare.workflow.retries.backoff", nt = "cloudflare.workflow.retries.delay", rt = "cloudflare.workflow.retries.limit", at = "cloudflare.workflow.timeout", st = "cloud.account.id", ot = "cloud.availability_zone", lt = "cloud.platform", pt = "cloud.provider", ct = "cloud.region", ut = "cloud.resource_id", bt = "cls", gt = "cls.source.<key>", dt = "cls.source", mt = "code.filepath", yt = "code.file.path", _t = "code.function", ht = "code.function.name", vt = "code.lineno", ft = "code.line.number", St = "code.namespace", Et = "connectionType", Tt = "connection.rtt", It = "culture.calendar", Ot = "culture.display_name", kt = "culture.is_24_hour_format", At = "culture.locale", xt = "culture.timezone", wt = "db.collection.name", Rt = "db.driver.name", Nt = "db.name", Ct = "db.namespace", Pt = "db.operation", Dt = "db.operation.batch.size", Lt = "db.operation.name", Ut = "db.query.parameter.<key>", Mt = "db.query.parameter", qt = "db.query.summary", Gt = "db.query.text", Yt = "db.redis.connection", Vt = "db.redis.key", Wt = "db.redis.parameters", Ft = "db.response.status_code", Bt = "db.sql.bindings", Ht = "db.statement", zt = "db.stored_procedure.name", Kt = "db.system", jt = "db.system.name", Qt = "db.user", Xt = "deviceMemory", Jt = "device.archs", Zt = "device.battery_level", $t = "device.battery_temperature", en = "device.boot_time", tn = "device.brand", nn = "device.charging", rn = "device.chipset", an = "device.class", sn = "device.connection_type", on = "device.cpu_description", ln = "device.external_free_storage", pn
2043= "device.external_storage_size", cn = "device.family", un = "device.free_memory", bn = "device.free_storage", gn = "device.id", dn = "device.locale", mn = "device.low_memory", yn = "device.low_power_mode", _n = "device.manufacturer", hn = "device.memory.estimated_capacity", vn = "device.memory_size", fn = "device.model", Sn = "device.model_id", En = "device.name", Tn = "device.online", In = "device.orientation", On = "device.processor_count", kn = "device.processor_frequency", An = "device.screen_density", xn = "device.screen_dpi", wn = "device.screen_height_pixels", Rn = "device.screen_width_pixels", Nn = "device.simulator", Cn = "device.storage_size", Pn = "device.thermal_state", Dn = "device.timezone", Ln = "device.usable_memory", Un = "dist", Mn = "effectiveConnectionType", qn = "environment", Gn = "error.type", Yn = "event.id", Vn = "event.name", Wn = "exception.escaped", Fn = "exception.message", Bn = "exception.stacktrace", Hn = "exception.type", zn = "faas.coldstart", Kn = "faas.cron", jn = "faas.duration_in_ms", Qn = "faas.entry_point", Xn = "faas.execution", Jn = "faas.id", Zn = "faas.identity", $n = "faas.invocation_id", er = "faas.invoked_name", ir = "faas.invoked_provider", tr = "faas.invoked_region", nr = "faas.name", rr = "faas.time", ar = "faas.trigger", sr = "faas.version", or = "fcp", lr = "flag.evaluation.<key>", pr = "flag.evaluation", cr = "fp", ur = "frames.delay", br = "frames.frozen", gr = "frames_frozen_rate", dr = "frames.slow", mr = "frames_slow_rate", yr = "frames.total", _r = "fs_error", hr = "gcp.function.context.event_id", vr = "gcp.function.context.event_type", fr = "gcp.function.context.id", Sr = "gcp.function.context.resource", Er = "gcp.function.context.source", Tr = "gcp.function.context.specversion", Ir = "gcp.function.context.time", Or = "gcp.function.context.timestamp", kr = "gcp.function.context.type", Ar = "gcp.project.id", xr = "gen_ai.agent.name", wr = "gen_ai.context.utilization", Rr = "gen_ai.context.window_size", Nr = "gen_ai.conversation.id", Cr = "gen_ai.cost.cache_creation.input_tokens", Pr = "gen_ai.cost.cache_read.input_tokens", Dr = "gen_ai.cost.input_tokens", Lr = "gen_ai.cost.output_tokens", Ur = "gen_ai.cost.reasoning.output_tokens", Mr = "gen_ai.cost.total_tokens", qr = "gen_ai.embeddings.input", Gr = "gen_ai.function_id", Yr = "gen_ai.input.messages", Vr = "gen_ai.operation.name", Wr = "gen_ai.operation.type", Fr = "gen_ai.output.messages", Br = "gen_ai.pipeline.name", Hr = "gen_ai.prompt", zr = "gen_ai.prompt.name", Kr = "gen_ai.provider.name", jr = "gen_ai.request.available_tools", Qr = "gen_ai.request.frequency_penalty", Xr = "gen_ai.request.max_tokens", Jr = "gen_ai.request.messages", Zr = "gen_ai.request.model", $r = "gen_ai.request.presence_penalty", ea = "gen_ai.request.reasoning_effort", ia = "gen_ai.request.seed", ta = "gen_ai.request.stop_sequences", na = "gen_ai.request.temperature", ra = "gen_ai.request.top_k", aa = "gen_ai.request.top_p", sa = "gen_ai.response.finish_reasons", oa = "gen_ai.response.id", la = "gen_ai.response.model", pa = "gen_ai.response.streaming", ca = "gen_ai.response.text", ua = "gen_ai.response.time_to_first_chunk", ba = "gen_ai.response.time_to_first_token", ga = "gen_ai.response.tokens_per_second", da = "gen_ai.response.tool_calls", ma = "gen_ai.system", ya = "gen_ai.system_instructions", _a = "gen_ai.system.message", ha = "gen_ai.tool.call.arguments", va = "gen_ai.tool.call.result", fa = "gen_ai.tool.definitions", Sa = "gen_ai.tool.description", Ea = "gen_ai.tool.input", Ta = "gen_ai.tool.message", Ia = "gen_ai.tool.name", Oa = "gen_ai.tool.output", ka = "gen_ai.tool.type", Aa = "gen_ai.usage.cache_creation.input_tokens", xa = "gen_ai.usage.cache_read.input_tokens", wa = "gen_ai.usage.completion_tokens", Ra = "gen_ai.usage.input_tokens", Na = "gen_ai.usage.input_tokens.cached", Ca = "gen_ai.usage.input_tokens.cache_write", Pa = "gen_ai.usage.output_tokens", Da = "gen_ai.usage.output_tokens.reasoning", La = "gen_ai.usage.prompt_tokens", Ua = "gen_ai.usage.reasoning.output_tokens", Ma = "gen_ai.usage.total_tokens", qa = "graphql.document", Ga = "graphql.operation.name", Ya = "graphql.operation.type", Va = "hardwareConcurrency", Wa = "http.client_ip", Fa = "http.decoded_response_content_length", Ba = "http.flavor", Ha = "http.fragment", za = "http.host", Ka = "http.method", ja = "http.query", Qa = "http.request.body.data", Xa = "http.request.connection_end", Ja = "http.request.connect_start", Za = "http.request.domain_lookup_end", $a = "http.request.domain_lookup_start", es = "http.request.fetch_start", is = "http.request.header.<key>", ts = "http.request.header", ns = "http.request.method", rs = "http.request_method", as = "http.request.redirect_end", ss = "http.request.redirect_start", os = "http.request.request_start", ls = "http.request.resend_count", ps = "http.request.response_end", cs = "http.request.response_start", us = "http.request.same_origin", bs = "http.request.secure_connection_start", gs = "http.request.time_to_first_byte", ds = "http.request.worker_start", ms = "http.response.body.size", ys = "http.response_content_length", _s = "http.response.header.content-length", hs = "http.response.header.<key>", vs = "http.response.header", fs = "http.response.size", Ss = "http.response.status_code", Es = "http.response_transfer_size", Ts = "http.route", Is = "http.scheme", Os = "http.server_name", ks = "http.server.request.time_in_queue", As = "http.status_code", xs = "http.target", ws = "http.url", Rs = "http.user_agent", Ns = "id", Cs = "inp", Ps = "jsonrpc.protocol.version", Ds = "jsonrpc.request.id", Ls = "jvm.gc.action", Us = "jvm.gc.name", Ms = "jvm.memory.pool.name", qs = "jvm.memory.type", Gs = "jvm.thread.daemon", Ys = "jvm.thread.state", Vs = "koa.name", Ws = "koa.type", Fs = "lcp", Bs = "lcp.element", Hs = "lcp.id", zs = "lcp.loadTime", Ks = "lcp.renderTime", js = "lcp.size", Qs = "lcp.url", Xs = "logger.name", Js = "mcp.cancelled.reason", Zs = "mcp.cancelled.request_id", $s = "mcp.client.name", eo = "m
2043cp.client.title", io = "mcp.client.version", to = "mcp.lifecycle.phase", no = "mcp.logging.data_type", ro = "mcp.logging.level", ao = "mcp.logging.logger", so = "mcp.logging.message", oo = "mcp.method.name", lo = "mcp.progress.current", po = "mcp.progress.message", co = "mcp.progress.percentage", uo = "mcp.progress.token", bo = "mcp.progress.total", go = "mcp.prompt.name", mo = "mcp.prompt.result.description", yo = "mcp.prompt.result.message_content", _o = "mcp.prompt.result.message_count", ho = "mcp.prompt.result.message_role", vo = "mcp.protocol.ready", fo = "mcp.protocol.version", So = "mcp.request.argument.<key>", Eo = "mcp.request.argument", To = "mcp.request.argument.name", Io = "mcp.request.argument.uri", Oo = "mcp.request.id", ko = "mcp.resource.protocol", Ao = "mcp.resource.uri", xo = "mcp.server.name", wo = "mcp.server.title", Ro = "mcp.server.version", No = "mcp.session.id", Co = "mcp.tool.name", Po = "mcp.tool.result.content", Do = "mcp.tool.result.content_count", Lo = "mcp.tool.result.is_error", Uo = "mcp.transport", Mo = "mdc.<key>", qo = "mdc", Go = "messaging.batch.message_count", Yo = "messaging.destination", Vo = "messaging.destination.connection", Wo = "messaging.destination.name", Fo = "messaging.message.body.size", Bo = "messaging.message.conversation_id", Ho = "messaging.message.envelope.size", zo = "messaging.message.id", Ko = "messaging.message.receive.latency", jo = "messaging.message.retry.count", Qo = "messaging.operation.name", Xo = "messaging.operation.type", Jo = "messaging.rabbitmq.destination.routing_key", Zo = "messaging.system", $o = "method", el = "middleware.name", il = "navigation.origin", tl = "navigation.route.id", nl = "navigation.type", rl = "nel.elapsed_time", al = "nel.phase", sl = "nel.referrer", ol = "nel.sampling_function", ll = "nel.type", pl = "network.connection.effective_type", cl = "network.connection.rtt", ul = "network.connection.type", bl = "network.local.address", gl = "network.local.port", dl = "network.peer.address", ml = "network.peer.port", yl = "network.protocol.name", _l = "network.protocol.version", hl = "network.transport", vl = "network.type", fl = "net.host.ip", Sl = "net.host.name", El = "net.host.port", Tl = "net.peer.ip", Il = "net.peer.name", Ol = "net.peer.port", kl = "net.protocol.name", Al = "net.protocol.version", xl = "net.sock.family", wl = "net.sock.host.addr", Rl = "net.sock.host.port", Nl = "net.sock.peer.addr", Cl = "net.sock.peer.name", Pl = "net.sock.peer.port", Dl = "net.transport", Ll = "os.build", Ul = "os.build_id", Ml = "os.description", ql = "os.kernel_version", Gl = "os.name", Yl = "os.raw_description", Vl = "os.rooted", Wl = "os.theme", Fl = "os.type", Bl = "os.version", Hl = "otel.kind", zl = "otel.scope.name", Kl = "otel.scope.version", jl = "otel.status_code", Ql = "otel.status_description", Xl = "params.<key>", Jl = "params", Zl = "performance.activationStart", $l = "performance.timeOrigin", ep = "previous_route", ip = "process.command_args", tp = "process.executable.name", np = "process.pid", rp = "process.runtime.description", ap = "process.runtime.engine.name", sp = "process.runtime.engine.version", op = "process.runtime.name", lp = "process.runtime.version", pp = "query.<key>", cp = "query", up = "react.version", bp = "release", gp = "remix.action_form_data.<key>", dp = "remix.action_form_data", mp = "replay_id", yp = "resource.deployment.environment", _p = "resource.deployment.environment.name", hp = "resource.render_blocking_status", vp = "route", fp = "rpc.grpc.status_code", Sp = "rpc.method", Ep = "rpc.response.status_code", Tp = "rpc.service", Ip = "rpc.system", Op = "rpc.system.name", kp = "runtime.build", Ap = "runtime.name", xp = "runtime.raw_description", wp = "runtime.version", Rp = "score.<key>", Np = "score", Cp = "score.ratio.<key>", Pp = "score.ratio", Dp = "score.total", Lp = "score.weight.<key>", Up = "score.weight", Mp = "sentry.action", qp = "sentry.browser.name", Gp = "sentry.browser.version", Yp = "sentry.cancellation_reason", Vp = "sentry.category", Wp = "sentry.client_sample_rate", Fp = "sentry.description", Bp = "sentry.dist", Hp = "sentry.domain", zp = "sentry.dsc.environment", Kp = "sentry.dsc.project_id", jp = "sentry.dsc.public_key", Qp = "sentry.dsc.release", Xp = "sentry.dsc.sampled", Jp = "sentry.dsc.sample_rate", Zp = "sentry.dsc.trace_id", $p = "sentry.dsc.transaction", ec = "sentry.environment", ic = "sentry.exclusive_time", tc = "sentry.graphql.operation", nc = "sentry.group", rc = "sentry.http.prefetch", ac = "sentry.idle_span_finish_reason", sc = "sentry.is_remote", oc = "sentry.kind", lc = "sentry.main_thread", pc = "sentry.message.parameter.<key>", cc = "sentry.message.template", uc = "sentry.metric.source", bc = "sentry.mobile", gc = "sentry.module.<key>", dc = "sentry.module", mc = "sentry.nextjs.ssr.function.route", yc = "sentry.nextjs.ssr.function.type", _c = "sentry.normalized_db_query", hc = "sentry.normalized_db_query.hash", vc = "sentry.normalized_description", fc = "sentry.observed_timestamp_nanos", Sc = "sentry.op", Ec = "sentry.origin", Tc = "sentry.platform", Ic = "sentry.profiler_id", Oc = "sentry.profile_id", kc = "sentry.release", Ac = "sentry.replay_id", xc = "sentry.replay_is_buffering", wc = "sentry.report_event", Rc = "sentry.sdk.integrations", Nc = "sentry.sdk.name", Cc = "sentry.sdk.version", Pc = "sentry.segment.id", Dc = "sentry.segment_id", Lc = "sentry.segment.name", Uc = "sentry.server_sample_rate", Mc = "sentry.source", qc = "sentry.span.source", Gc = "sentry.status", Yc = "sentry.status_code", Vc = "sentry.status.message", Wc = "sentry.sveltekit.navigation.from", Fc = "sentry.sveltekit.navigation.to", Bc = "sentry.sveltekit.navigation.type", Hc = "sentry.thread.id", zc = "sentry.timestamp.sequence", Kc = "sentry.trace_lifecycle", jc = "sentry.trace.parent_span_id", Qc = "sentry.trace.status", Xc = "sentry.transaction", Jc = "sentry.user.email", Zc = "sentry.user.geo.city", $c = "sentry.user.geo.country_code", eu = "sentry.user.geo.region", iu = "sentry.user.geo.subdivision", tu = "sentry.user.id", nu = "sentry.user.ip", ru = "sentry.user.username", au = "server.address", su = "server_name", ou = "server.port", lu = "service.name", pu = "service.version", cu = "session.id", uu = "stall_percentage", bu = "stall_total_time", gu = "state.type", du = "thread.id", mu = "thread.name", yu = "timber.tag", _u = "time_to_full_display", hu = "t
2043ime_to_initial_display", vu = "transaction", fu = "trpc.procedure_path", Su = "trpc.procedure_type", Eu = "ttfb", Tu = "ttfb.requestTime", Iu = "type", Ou = "ui.component_name", ku = "ui.contributes_to_ttfd", Au = "ui.contributes_to_ttid", xu = "ui.element.height", wu = "ui.element.id", Ru = "ui.element.identifier", Nu = "ui.element.load_time", Cu = "ui.element.paint_type", Pu = "ui.element.render_time", Du = "ui.element.type", Lu = "ui.element.url", Uu = "ui.element.width", Mu = "url", qu = "url.domain", Gu = "url.fragment", Yu = "url.full", Vu = "url.path", Wu = "url.path.parameter.<key>", Fu = "url.path.parameter", Bu = "url.port", Hu = "url.query", zu = "url.same_origin", Ku = "url.scheme", ju = "url.template", Qu = "user_agent.original", Xu = "user.email", Ju = "user.full_name", Zu = "user.geo.city", $u = "user.geo.country_code", eb = "user.geo.region", ib = "user.geo.subdivision", tb = "user.hash", nb = "user.id", rb = "user.ip_address", ab = "user.name", sb = "user.roles", ob = "vercel.branch", lb = "vercel.build_id", pb = "vercel.deployment_id", cb = "vercel.destination", ub = "vercel.edge_type", bb = "vercel.entrypoint", gb = "vercel.execution_region", db = "vercel.id", mb = "vercel.ja3_digest", yb = "vercel.ja4_digest", _b = "vercel.log_type", hb = "vercel.path", vb = "vercel.project_id", fb = "vercel.project_name", Sb = "vercel.proxy.cache_id", Eb = "vercel.proxy.client_ip", Tb = "vercel.proxy.host", Ib = "vercel.proxy.lambda_region", Ob = "vercel.proxy.method", kb = "vercel.proxy.path", Ab = "vercel.proxy.path_type", xb = "vercel.proxy.path_type_variant", wb = "vercel.proxy.referer", Rb = "vercel.proxy.region", Nb = "vercel.proxy.response_byte_size", Cb = "vercel.proxy.scheme", Pb = "vercel.proxy.status_code", Db = "vercel.proxy.timestamp", Lb = "vercel.proxy.user_agent", Ub = "vercel.proxy.vercel_cache", Mb = "vercel.proxy.vercel_id", qb = "vercel.proxy.waf_action", Gb = "vercel.proxy.waf_rule_id", Yb = "vercel.request_id", Vb = "vercel.source", Wb = "vercel.status_code", Fb = { 2044 "ai.citations": "string[]", 2045 "ai.completion_tokens.used": "integer", 2046 "ai.documents": "string[]", 2047 "ai.finish_reason": "string", 2048 "ai.frequency_penalty": "double", 2049 "ai.function_call": "string", 2050 "ai.generation_id": "string", 2051 "ai.input_messages": "string", 2052 "ai.is_search_required": "boolean", 2053 "ai.metadata": "string", 2054 "ai.model_id": "string", 2055 "ai.model.provider": "string", 2056 "ai.pipeline.name": "string", 2057 "ai.preamble": "string", 2058 "ai.presence_penalty": "double", 2059 "ai.prompt_tokens.used": "integer", 2060 "ai.raw_prompting": "boolean", 2061 "ai.responses": "string[]", 2062 "ai.response_format": "string", 2063 "ai.search_queries": "string[]", 2064 "ai.search_results": "string[]", 2065 "ai.seed": "string", 2066 "ai.streaming": "boolean", 2067 "ai.tags": "string", 2068 "ai.temperature": "double", 2069 "ai.texts": "string[]", 2070 "ai.tools": "string[]", 2071 "ai.tool_calls": "string[]", 2072 "ai.top_k": "integer", 2073 "ai.top_p": "double", 2074 "ai.total_cost": "double", 2075 "ai.total_tokens.used": "integer", 2076 "ai.warnings": "string[]", 2077 "angular.version": "string", 2078 "app.app_build": "string", 2079 "app.app_identifier": "string", 2080 "app.app_name": "string", 2081 "app.app_start_time": "string", 2082 "app.app_version": "string", 2083 "app.build": "string", 2084 "app.identifier": "string", 2085 "app.in_foreground": "boolean", 2086 "app.name": "string", 2087 app_start_cold: "double", 2088 "app.start_time": "string", 2089 app_start_type: "string", 2090 app_start_warm: "double", 2091 "app.version": "string", 2092 "app.vitals.frames.delay.value": "integer", 2093 "app.vitals.frames.frozen.count": "integer", 2094 "app.vitals.frames.slow.count": "integer", 2095 "app.vitals.frames.total.count": "integer", 2096 "app.vitals.start.cold.value": "double", 2097 "app.vitals.start.prewarmed": "boolean", 2098 "app.vitals.start.reason": "string", 2099 "app.vitals.start.screen": "string", 2100 "app.vitals.start.type": "string", 2101 "app.vitals.start.warm.value": "double", 2102 "app.vitals.ttfd.value": "double", 2103 "app.vitals.ttid.value": "double", 2104 "art.gc.blocking_count": "integer", 2105 "art.gc.blocking_time": "double", 2106 "art.gc.pre_oome_count": "integer", 2107 "art.gc.total_count": "integer", 2108 "art.gc.total_time": "double", 2109 "art.gc.waiting_time": "double", 2110 "art.memory.free": "integer", 2111 "art.memory.free_until_gc": "integer", 2112 "art.memory.free_until_oome": "integer", 2113 "art.memory.max": "integer", 2114 "art.memory.total": "integer", 2115 "aws.cloudwatch.logs.log_group": "string", 2116 "aws.cloudwatch.logs.log_stream": "string", 2117 "aws.cloudwatch.logs.url": "string", 2118 "aws.dynamodb.attribute_definitions": "string[]", 2119 "aws.dynamodb.consistent_read": "boolean", 2120 "aws.dynamodb.consumed_capacity": "string[]", 2121 "aws.dynamodb.count": "integer", 2122 "aws.dynamodb.exclusive_start_table": "string", 2123 "aws.dynamodb.global_secondary_indexes": "string[]", 2124 "aws.dynamodb.global_secondary_index_updates": "string[]", 2125 "aws.dynamodb.index_name": "string", 2126 "aws.dynamodb.item_collection_metrics": "string", 2127 "aws.dynamodb.limit": "integer", 2128 "aws.dynamodb.local_secondary_indexes": "string[]", 2129 "aws.dynamodb.projection": "string", 2130 "aws.dynamodb.provisioned_read_capacity": "double", 2131 "aws.dynamodb.provisioned_write_capacity": "double", 2132 "aws.dynamodb.scanned_count": "integer", 2133 "aws.dynamodb.scan_forward": "boolean", 2134 "aws.dynamodb.segment": "integer", 2135 "aws.dynamodb.select": "string", 2136 "aws.dynamodb.table_count": "integer", 2137 "aws.dynamodb.table_names": "string[]", 2138 "aws.dynamodb.total_segments": "integer", 2139 "aws.extended_request_id": "string", 2140 "aws.kinesis.stream_name": "string", 2141 "aws.kinesis.stream.name": "string", 2142 "aws.lambda.aws_request_id": "string", 2143 "aws.lambda.execution_duration_in_millis": "double", 2144 "aws.lambda.function_name": "string", 2145 "aws.lambda.function_version": "string", 2146 "aws.lambda.invoked_arn": "string", 2147 "aws.lambda.invoked_function_arn": "string", 2148 "aws.lambda.remaining_time_in_millis": "double", 2149 "aws.log.group.names": "string[]", 2150 "aws.log.stream.names": "string[]", 2151 "aws.request.extended_id": "string", 2152 "aws.request_id": "string", 2153 "aws.request.id": "string", 2154 "aws.s3.bucket": "string", 2155 "aws.secretsmanager.secret.arn": "string", 2156 "aws.sns.topic.arn": "string", 2157 "aws.step_functions.activity.arn": "string", 2158 "aws.step_functions.state_machine.arn": "string", 2159 blocked_main_thread: "boolean", 2160 "browser.name": "string", 2161 "browser.performance.navigation.activation_start": "double", 2162 "browser.performance.time_origin": "double", 2163 "browser.report.type": "string", 2164 "browser.script.invoker": "string", 2165 "browser.script.invoker_type": "string", 2166 "browser.script.source_char_position": "integer", 2167 "browser.version": "string", 2168 "browser.web_vital.cls.report_event": "string", 2169 "browser.web_vital.cls.source.<key>": "string", 2170 "browser.web_vital.cls.value": "double", 2171 "browser.web_vital.fcp.value": "double", 2172 "browser.web_vital.fp.value": "double", 2173 "browser.web_vital.inp.value": "double", 2174 "browser.web_vital.lcp.element": "string", 2175 "browser.web_vital.lcp.id": "string", 2176 "browser.web_vital.lcp.load_time": "integer", 2177 "browser.web_vital.lcp.render_time": "integer", 2178 "browser.web_vital.lcp.report_event": "string", 2179 "browser.web_vital.lcp.size": "integer", 2180 "browser.web_vital.lcp.url": "string", 2181 "browser.web_vital.lcp.value": "double", 2182 "browser.web_vital.ttfb.request_time": "double", 2183 "browser.web_vital.ttfb.value": "double", 2184 "cache.hit": "boolean", 2185 "cache.item_size": "integer", 2186 "cache.key": "string[]", 2187 "cache.operation": "string", 2188 "cache.ttl": "integer", 2189 "cache.write": "boolean", 2190 channel: "string", 2191 "client.address": "string", 2192 "client.port": "integer", 2193 "cloudflare.d1.duration": "integer", 2194 "cloudflare.d1.query_type": "string", 2195 "cloudflare.d1.rows_read": "integer", 2196 "cloudflare.d1.rows_written": "integer", 2197 "cloudflare.durable_object.query.bindings": "integer", 2198 "cloudflare.durable_object.response.rows_read": "integer", 2199 "cloudflare.durable_object.response.rows_written": "integer", 2200 "cloudflare.r2.bucket": "string", 2201 "cloudflare.r2.operation": "string", 2202 "cloudflare.r2.request.delimiter": "string", 2203 "cloudflare.r2.request.key": "string", 2204 "cloudflare.r2.request.part_number": "integer", 2205 "cloudflare.r2.request.prefix": "string", 2206 "cloudflare.workflow.attempt": "integer", 2207 "cloudflare.workflow.retries.backoff": "string", 2208 "cloudflare.workflow.retries.delay": "string", 2209 "cloudflare.workflow.retries.limit": "integer", 2210 "cloudflare.workflow.timeout": "string", 2211 "cloud.account.id": "string", 2212 "cloud.availability_zone": "string", 2213 "cloud.platform": "string", 2214 "cloud.provider": "string", 2215 "cloud.region": "string", 2216 "cloud.resource_id": "string", 2217 cls: "double", 2218 "cls.source.<key>": "string", 2219 "code.filepath": "string", 2220 "code.file.path": "string", 2221 "code.function": "string", 2222 "code.function.name": "string", 2223 "code.lineno": "integer", 2224 "code.line.number": "integer", 2225 "code.namespace": "string", 2226 connectionType: "string", 2227 "connection.rtt": "integer", 2228 "culture.calendar": "string", 2229 "culture.display_name": "string", 2230 "culture.is_24_hour_format": "boolean", 2231 "culture.locale": "string", 2232 "culture.timezone": "string", 2233 "db.collection.name": "string", 2234 "db.driver.name": "string", 2235 "db.name": "string", 2236 "db.namespace": "string", 2237 "db.operation": "string", 2238 "db.operation.batch.size": "integer", 2239 "db.operation.name": "string", 2240 "db.query.parameter.<key>": "string", 2241 "db.query.summary": "string", 2242 "db.query.text": "string", 2243 "db.redis.connection": "string", 2244 "db.redis.key": "string", 2245 "db.redis.parameters": "string[]", 2246 "db.response.status_code": "string", 2247 "db.sql.bindings": "string[]", 2248 "db.statement": "string", 2249 "db.stored_procedure.name": "string", 2250 "db.system": "string", 2251 "db.system.name": "string", 2252 "db.user": "string", 2253 deviceMemory: "string", 2254 "device.archs": "string[]", 2255 "device.battery_level": "double", 2256 "device.battery_temperature": "double", 2257 "device.boot_time": "string", 2258 "device.brand": "string", 2259 "device.charging": "boolean", 2260 "device.chipset": "string", 2261 "device.class": "string", 2262 "device.connection_type": "string", 2263 "device.cpu_description": "string", 2264 "device.external_free_storage": "integer", 2265 "device.external_storage_size": "integer", 2266 "device.family": "string", 2267 "device.free_memory": "integer", 2268 "device.free_storage": "integer", 2269 "device.id": "string", 2270 "device.locale": "string", 2271 "device.low_memory": "boolean", 2272 "device.low_power_mode": "boolean", 2273 "device.manufacturer": "string", 2274 "device.memory.estimated_capacity": "integer", 2275 "device.memory_size": "integer", 2276 "device.model": "string", 2277 "device.model_id": "string", 2278 "device.name": "string", 2279 "device.online": "boolean", 2280 "device.orientation": "string", 2281 "device.processor_count": "integer", 2282 "device.processor_frequency": "double", 2283 "device.screen_density": "double", 2284 "device.screen_dpi": "integer", 2285 "device.screen_height_pixels": "integer", 2286 "device.screen_width_pixels": "integer", 2287 "device.simulator": "boolean", 2288 "device.storage_size": "integer", 2289 "device.thermal_state": "string", 2290 "device.timezone": "string", 2291 "device.usable_memory": "integer", 2292 dist: "string", 2293 effectiveConnectionType: "string", 2294 environment: "string", 2295 "error.type": "string",
2296 "event.id": "integer", 2297 "event.name": "string", 2298 "exception.escaped": "boolean", 2299 "exception.message": "string", 2300 "exception.stacktrace": "string", 2301 "exception.type": "string", 2302 "faas.coldstart": "boolean", 2303 "faas.cron": "string", 2304 "faas.duration_in_ms": "integer", 2305 "faas.entry_point": "string", 2306 "faas.execution": "string", 2307 "faas.id": "string", 2308 "faas.identity": "string", 2309 "faas.invocation_id": "string", 2310 "faas.invoked_name": "string", 2311 "faas.invoked_provider": "string", 2312 "faas.invoked_region": "string", 2313 "faas.name": "string", 2314 "faas.time": "string", 2315 "faas.trigger": "string", 2316 "faas.version": "string", 2317 fcp: "double", 2318 "flag.evaluation.<key>": "boolean", 2319 fp: "double", 2320 "frames.delay": "integer", 2321 "frames.frozen": "integer", 2322 frames_frozen_rate: "double", 2323 "frames.slow": "integer", 2324 frames_slow_rate: "double", 2325 "frames.total": "integer", 2326 fs_error: "string", 2327 "gcp.function.context.event_id": "string", 2328 "gcp.function.context.event_type": "string", 2329 "gcp.function.context.id": "string", 2330 "gcp.function.context.resource": "string", 2331 "gcp.function.context.source": "string", 2332 "gcp.function.context.specversion": "string", 2333 "gcp.function.context.time": "string", 2334 "gcp.function.context.timestamp": "string", 2335 "gcp.function.context.type": "string", 2336 "gcp.project.id": "string", 2337 "gen_ai.agent.name": "string", 2338 "gen_ai.context.utilization": "double", 2339 "gen_ai.context.window_size": "integer", 2340 "gen_ai.conversation.id": "string", 2341 "gen_ai.cost.cache_creation.input_tokens": "double", 2342 "gen_ai.cost.cache_read.input_tokens": "double", 2343 "gen_ai.cost.input_tokens": "double", 2344 "gen_ai.cost.output_tokens": "double", 2345 "gen_ai.cost.reasoning.output_tokens": "double", 2346 "gen_ai.cost.total_tokens": "double", 2347 "gen_ai.embeddings.input": "string", 2348 "gen_ai.function_id": "string", 2349 "gen_ai.input.messages": "string", 2350 "gen_ai.operation.name": "string", 2351 "gen_ai.operation.type": "string", 2352 "gen_ai.output.messages": "string", 2353 "gen_ai.pipeline.name": "string", 2354 "gen_ai.prompt": "string", 2355 "gen_ai.prompt.name": "string", 2356 "gen_ai.provider.name": "string", 2357 "gen_ai.request.available_tools": "string", 2358 "gen_ai.request.frequency_penalty": "double", 2359 "gen_ai.request.max_tokens": "integer", 2360 "gen_ai.request.messages": "string", 2361 "gen_ai.request.model": "string", 2362 "gen_ai.request.presence_penalty": "double", 2363 "gen_ai.request.reasoning_effort": "string", 2364 "gen_ai.request.seed": "string", 2365 "gen_ai.request.stop_sequences": "string[]", 2366 "gen_ai.request.temperature": "double", 2367 "gen_ai.request.top_k": "integer", 2368 "gen_ai.request.top_p": "double", 2369 "gen_ai.response.finish_reasons": "string", 2370 "gen_ai.response.id": "string", 2371 "gen_ai.response.model": "string", 2372 "gen_ai.response.streaming": "boolean", 2373 "gen_ai.response.text": "string", 2374 "gen_ai.response.time_to_first_chunk": "double", 2375 "gen_ai.response.time_to_first_token": "double", 2376 "gen_ai.response.tokens_per_second": "double", 2377 "gen_ai.response.tool_calls": "string", 2378 "gen_ai.system": "string", 2379 "gen_ai.system_instructions": "string", 2380 "gen_ai.system.message": "string", 2381 "gen_ai.tool.call.arguments": "string", 2382 "gen_ai.tool.call.result": "string", 2383 "gen_ai.tool.definitions": "string", 2384 "gen_ai.tool.description": "string", 2385 "gen_ai.tool.input": "string", 2386 "gen_ai.tool.message": "string", 2387 "gen_ai.tool.name": "string", 2388 "gen_ai.tool.output": "string", 2389 "gen_ai.tool.type": "string", 2390 "gen_ai.usage.cache_creation.input_tokens": "integer", 2391 "gen_ai.usage.cache_read.input_tokens": "integer", 2392 "gen_ai.usage.completion_tokens": "integer", 2393 "gen_ai.usage.input_tokens": "integer", 2394 "gen_ai.usage.input_tokens.cached": "integer", 2395 "gen_ai.usage.input_tokens.cache_write": "integer", 2396 "gen_ai.usage.output_tokens": "integer", 2397 "gen_ai.usage.output_tokens.reasoning": "integer", 2398 "gen_ai.usage.prompt_tokens": "integer", 2399 "gen_ai.usage.reasoning.output_tokens": "integer", 2400 "gen_ai.usage.total_tokens": "integer", 2401 "graphql.document": "string", 2402 "graphql.operation.name": "string", 2403 "graphql.operation.type": "string", 2404 hardwareConcurrency: "string", 2405 "http.client_ip": "string", 2406 "http.decoded_response_content_length": "integer", 2407 "http.flavor": "string", 2408 "http.fragment": "string", 2409 "http.host": "string", 2410 "http.method": "string", 2411 "http.query": "string", 2412 "http.request.body.data": "string", 2413 "http.request.connection_end": "double", 2414 "http.request.connect_start": "double", 2415 "http.request.domain_lookup_end": "double", 2416 "http.request.domain_lookup_start": "double", 2417 "http.request.fetch_start": "double", 2418 "http.request.header.<key>": "string[]", 2419 "http.request.method": "string", 2420 "http.request_method": "string", 2421 "http.request.redirect_end": "double", 2422 "http.request.redirect_start": "double", 2423 "http.request.request_start": "double", 2424 "http.request.resend_count": "integer", 2425 "http.request.response_end": "double", 2426 "http.request.response_start": "double", 2427 "http.request.same_origin": "boolean", 2428 "http.request.secure_connection_start": "double", 2429 "http.request.time_to_first_byte": "double", 2430 "http.request.worker_start": "double", 2431 "http.response.body.size": "integer", 2432 "http.response_content_length": "integer", 2433 "http.response.header.content-length": "string", 2434 "http.response.header.<key>": "string[]", 2435 "http.response.size": "integer", 2436 "http.response.status_code": "integer", 2437 "http.response_transfer_size": "integer", 2438 "http.route": "string", 2439 "http.scheme": "string", 2440 "http.server_name": "string", 2441 "http.server.request.time_in_queue": "double", 2442 "http.status_code": "integer", 2443 "http.target": "string", 2444 "http.url": "string", 2445 "http.user_agent": "string", 2446 id: "string", 2447 inp: "double", 2448 "jsonrpc.protocol.version": "string", 2449 "jsonrpc.request.id": "string", 2450 "jvm.gc.action": "string", 2451 "jvm.gc.name": "string", 2452 "jvm.memory.pool.name": "string", 2453 "jvm.memory.type": "string", 2454 "jvm.thread.daemon": "boolean", 2455 "jvm.thread.state": "string", 2456 "koa.name": "string", 2457 "koa.type": "string", 2458 lcp: "double", 2459 "lcp.element": "string", 2460 "lcp.id": "string", 2461 "lcp.loadTime": "integer", 2462 "lcp.renderTime": "integer", 2463 "lcp.size": "integer", 2464 "lcp.url": "string", 2465 "logger.name": "string", 2466 "mcp.cancelled.reason": "string", 2467 "mcp.cancelled.request_id": "string", 2468 "mcp.client.name": "string", 2469 "mcp.client.title": "string", 2470 "mcp.client.version": "string", 2471 "mcp.lifecycle.phase": "string", 2472 "mcp.logging.data_type": "string", 2473 "mcp.logging.level": "string", 2474 "mcp.logging.logger": "string", 2475 "mcp.logging.message": "string", 2476 "mcp.method.name": "string", 2477 "mcp.progress.current": "integer", 2478 "mcp.progress.message": "string", 2479 "mcp.progress.percentage": "double", 2480 "mcp.progress.token": "string", 2481 "mcp.progress.total": "integer", 2482 "mcp.prompt.name": "string", 2483 "mcp.prompt.result.description": "string", 2484 "mcp.prompt.result.message_content": "string", 2485 "mcp.prompt.result.message_count": "integer", 2486 "mcp.prompt.result.message_role": "string", 2487 "mcp.protocol.ready": "integer", 2488 "mcp.protocol.version": "string", 2489 "mcp.request.argument.<key>": "string", 2490 "mcp.request.argument.name": "string", 2491 "mcp.request.argument.uri": "string", 2492 "mcp.request.id": "string", 2493 "mcp.resource.protocol": "string", 2494 "mcp.resource.uri": "string", 2495 "mcp.server.name": "string", 2496 "mcp.server.title": "string", 2497 "mcp.server.version": "string", 2498 "mcp.session.id": "string", 2499 "mcp.tool.name": "string", 2500 "mcp.tool.result.content": "string", 2501 "mcp.tool.result.content_count": "integer", 2502 "mcp.tool.result.is_error": "boolean", 2503 "mcp.transport": "string", 2504 "mdc.<key>": "string", 2505 "messaging.batch.message_count": "integer", 2506 "messaging.destination": "string", 2507 "messaging.destination.connection": "string", 2508 "messaging.destination.name": "string", 2509 "messaging.message.body.size": "integer", 2510 "messaging.message.conversation_id": "string", 2511 "messaging.message.envelope.size": "integer", 2512 "messaging.message.id": "string", 2513 "messaging.message.receive.latency": "integer", 2514 "messaging.message.retry.count": "integer", 2515 "messaging.operation.name": "string", 2516 "messaging.operation.type": "string",
2517 "messaging.rabbitmq.destination.routing_key": "string", 2518 "messaging.system": "string", 2519 method: "string", 2520 "middleware.name": "string", 2521 "navigation.origin": "string", 2522 "navigation.route.id": "string", 2523 "navigation.type": "string", 2524 "nel.elapsed_time": "integer", 2525 "nel.phase": "string", 2526 "nel.referrer": "string", 2527 "nel.sampling_function": "double", 2528 "nel.type": "string", 2529 "network.connection.effective_type": "string", 2530 "network.connection.rtt": "integer", 2531 "network.connection.type": "string", 2532 "network.local.address": "string", 2533 "network.local.port": "integer", 2534 "network.peer.address": "string", 2535 "network.peer.port": "integer", 2536 "network.protocol.name": "string", 2537 "network.protocol.version": "string", 2538 "network.transport": "string", 2539 "network.type": "string", 2540 "net.host.ip": "string", 2541 "net.host.name": "string", 2542 "net.host.port": "integer", 2543 "net.peer.ip": "string", 2544 "net.peer.name": "string", 2545 "net.peer.port": "integer", 2546 "net.protocol.name": "string", 2547 "net.protocol.version": "string", 2548 "net.sock.family": "string", 2549 "net.sock.host.addr": "string", 2550 "net.sock.host.port": "integer", 2551 "net.sock.peer.addr": "string", 2552 "net.sock.peer.name": "string", 2553 "net.sock.peer.port": "integer", 2554 "net.transport": "string", 2555 "os.build": "string", 2556 "os.build_id": "string", 2557 "os.description": "string", 2558 "os.kernel_version": "string", 2559 "os.name": "string", 2560 "os.raw_description": "string", 2561 "os.rooted": "boolean", 2562 "os.theme": "string", 2563 "os.type": "string", 2564 "os.version": "string", 2565 "otel.kind": "string", 2566 "otel.scope.name": "string", 2567 "otel.scope.version": "string", 2568 "otel.status_code": "string", 2569 "otel.status_description": "string", 2570 "params.<key>": "string", 2571 "performance.activationStart": "double", 2572 "performance.timeOrigin": "double", 2573 previous_route: "string", 2574 "process.command_args": "string[]", 2575 "process.executable.name": "string", 2576 "process.pid": "integer", 2577 "process.runtime.description": "string", 2578 "process.runtime.engine.name": "string", 2579 "process.runtime.engine.version": "string", 2580 "process.runtime.name": "string", 2581 "process.runtime.version": "string", 2582 "query.<key>": "string", 2583 "react.version": "string", 2584 release: "string", 2585 "remix.action_form_data.<key>": "string", 2586 replay_id: "string", 2587 "resource.deployment.environment": "string", 2588 "resource.deployment.environment.name": "string", 2589 "resource.render_blocking_status": "string", 2590 route: "string", 2591 "rpc.grpc.status_code": "integer", 2592 "rpc.method": "string", 2593 "rpc.response.status_code": "string", 2594 "rpc.service": "string", 2595 "rpc.system": "string", 2596 "rpc.system.name": "string", 2597 "runtime.build": "string", 2598 "runtime.name": "string", 2599 "runtime.raw_description": "string", 2600 "runtime.version": "string", 2601 "score.<key>": "double", 2602 "score.ratio.<key>": "double", 2603 "score.total": "double", 2604 "score.weight.<key>": "double", 2605 "sentry.action": "string", 2606 "sentry.browser.name": "string", 2607 "sentry.browser.version": "string", 2608 "sentry.cancellation_reason": "string", 2609 "sentry.category": "string", 2610 "sentry.client_sample_rate": "double", 2611 "sentry.description": "string", 2612 "sentry.dist": "string", 2613 "sentry.domain": "string", 2614 "sentry.dsc.environment": "string", 2615 "sentry.dsc.project_id": "string", 2616 "sentry.dsc.public_key": "string", 2617 "sentry.dsc.release": "string", 2618 "sentry.dsc.sampled": "boolean", 2619 "sentry.dsc.sample_rate": "string", 2620 "sentry.dsc.trace_id": "string", 2621 "sentry.dsc.transaction": "string", 2622 "sentry.environment": "string", 2623 "sentry.exclusive_time": "double", 2624 "sentry.graphql.operation": "string", 2625 "sentry.group": "string", 2626 "sentry.http.prefetch": "boolean", 2627 "sentry.idle_span_finish_reason": "string", 2628 "sentry.is_remote": "boolean", 2629 "sentry.kind": "string", 2630 "sentry.main_thread": "boolean", 2631 "sentry.message.parameter.<key>": "string", 2632 "sentry.message.template": "string", 2633 "sentry.metric.source": "string", 2634 "sentry.mobile": "boolean", 2635 "sentry.module.<key>": "string", 2636 "sentry.nextjs.ssr.function.route": "string", 2637 "sentry.nextjs.ssr.function.type": "string", 2638 "sentry.normalized_db_query": "string", 2639 "sentry.normalized_db_query.hash": "string", 2640 "sentry.normalized_description": "string", 2641 "sentry.observed_timestamp_nanos": "string", 2642 "sentry.op": "string", 2643 "sentry.origin": "string", 2644 "sentry.platform": "string", 2645 "sentry.profiler_id": "string", 2646 "sentry.profile_id": "string", 2647 "sentry.release": "string", 2648 "sentry.replay_id": "string", 2649 "sentry.replay_is_buffering": "boolean", 2650 "sentry.report_event": "string", 2651 "sentry.sdk.integrations": "string[]", 2652 "sentry.sdk.name": "string", 2653 "sentry.sdk.version": "string", 2654 "sentry.segment.id": "string", 2655 "sentry.segment_id": "string", 2656 "sentry.segment.name": "string", 2657 "sentry.server_sample_rate": "double", 2658 "sentry.source": "string", 2659 "sentry.span.source": "string", 2660 "sentry.status": "string", 2661 "sentry.status_code": "integer", 2662 "sentry.status.message": "string", 2663 "sentry.sveltekit.navigation.from": "string", 2664 "sentry.sveltekit.navigation.to": "string", 2665 "sentry.sveltekit.navigation.type": "string", 2666 "sentry.thread.id": "integer", 2667 "sentry.timestamp.sequence": "integer", 2668 "sentry.trace_lifecycle": "string", 2669 "sentry.trace.parent_span_id": "string", 2670 "sentry.trace.status": "string", 2671 "sentry.transaction": "string", 2672 "sentry.user.email": "string", 2673 "sentry.user.geo.city": "string", 2674 "sentry.user.geo.country_code": "string", 2675 "sentry.user.geo.region": "string", 2676 "sentry.user.geo.subdivision": "string", 2677 "sentry.user.id": "string", 2678 "sentry.user.ip": "string", 2679 "sentry.user.username": "string", 2680 "server.address": "string", 2681 server_name: "string", 2682 "server.port": "integer", 2683 "service.name": "string", 2684 "service.version": "string", 2685 "session.id": "string", 2686 stall_percentage: "double", 2687 stall_total_time: "double", 2688 "state.type": "string", 2689 "thread.id": "integer", 2690 "thread.name": "string", 2691 "timber.tag": "string", 2692 time_to_full_display: "double", 2693 time_to_initial_display: "double", 2694 transaction: "string", 2695 "trpc.procedure_path": "string", 2696 "trpc.procedure_type": "string", 2697 ttfb: "double", 2698 "ttfb.requestTime": "double", 2699 type: "string",
2700 "ui.component_name": "string", 2701 "ui.contributes_to_ttfd": "boolean", 2702 "ui.contributes_to_ttid": "boolean", 2703 "ui.element.height": "integer", 2704 "ui.element.id": "string", 2705 "ui.element.identifier": "string", 2706 "ui.element.load_time": "double", 2707 "ui.element.paint_type": "string", 2708 "ui.element.render_time": "double", 2709 "ui.element.type": "string", 2710 "ui.element.url": "string", 2711 "ui.element.width": "integer", 2712 url: "string", 2713 "url.domain": "string", 2714 "url.fragment": "string", 2715 "url.full": "string", 2716 "url.path": "string", 2717 "url.path.parameter.<key>": "string", 2718 "url.port": "integer", 2719 "url.query": "string", 2720 "url.same_origin": "boolean", 2721 "url.scheme": "string", 2722 "url.template": "string", 2723 "user_agent.original": "string", 2724 "user.email": "string", 2725 "user.full_name": "string", 2726 "user.geo.city": "string", 2727 "user.geo.country_code": "string", 2728 "user.geo.region": "string", 2729 "user.geo.subdivision": "string", 2730 "user.hash": "string", 2731 "user.id": "string", 2732 "user.ip_address": "string", 2733 "user.name": "string", 2734 "user.roles": "string[]", 2735 "vercel.branch": "string", 2736 "vercel.build_id": "string", 2737 "vercel.deployment_id": "string", 2738 "vercel.destination": "string", 2739 "vercel.edge_type": "string", 2740 "vercel.entrypoint": "string", 2741 "vercel.execution_region": "string", 2742 "vercel.id": "string", 2743 "vercel.ja3_digest": "string", 2744 "vercel.ja4_digest": "string", 2745 "vercel.log_type": "string", 2746 "vercel.path": "string", 2747 "vercel.project_id": "string", 2748 "vercel.project_name": "string", 2749 "vercel.proxy.cache_id": "string", 2750 "vercel.proxy.client_ip": "string", 2751 "vercel.proxy.host": "string", 2752 "vercel.proxy.lambda_region": "string", 2753 "vercel.proxy.method": "string", 2754 "vercel.proxy.path": "string", 2755 "vercel.proxy.path_type": "string", 2756 "vercel.proxy.path_type_variant": "string", 2757 "vercel.proxy.referer": "string", 2758 "vercel.proxy.region": "string", 2759 "vercel.proxy.response_byte_size": "integer", 2760 "vercel.proxy.scheme": "string", 2761 "vercel.proxy.status_code": "integer", 2762 "vercel.proxy.timestamp": "integer", 2763 "vercel.proxy.user_agent": "string[]", 2764 "vercel.proxy.vercel_cache": "string", 2765 "vercel.proxy.vercel_id": "string", 2766 "vercel.proxy.waf_action": "string", 2767 "vercel.proxy.waf_rule_id": "string", 2768 "vercel.request_id": "string", 2769 "vercel.source": "string", 2770 "vercel.status_code": "integer" 2771}, Bb = { 2772 "ai.citations": { 2773 brief: "References or sources cited by the AI model in its response.", 2774 type: "string[]", 2775 applyScrubbing: { 2776 key: "auto" 2777 }, 2778 isInOtel: !1, 2779 visibility: "public", 2780 example: [ 2781 "Citation 1", 2782 "Citation 2" 2783 ], 2784 deprecation: {}, 2785 changelog: [ 2786 { 2787 version: "0.5.0", 2788 prs: [ 2789 264 2790 ] 2791 }, 2792 { 2793 version: "0.1.0", 2794 prs: [ 2795 55 2796 ] 2797 } 2798 ] 2799 }, 2800 "ai.completion_tokens.used": { 2801 brief: "The number of tokens used to respond to the message.", 2802 type: "integer", 2803 applyScrubbing: { 2804 key: "manual" 2805 }, 2806 isInOtel: !1, 2807 visibility: "public", 2808 example: 10, 2809 deprecation: { 2810 replacement: "gen_ai.usage.output_tokens" 2811 }, 2812 aliases: [ 2813 "gen_ai.usage.output_tokens", 2814 "gen_ai.usage.completion_tokens" 2815 ], 2816 changelog: [ 2817 { 2818 version: "0.4.0", 2819 prs: [ 2820 228 2821 ] 2822 }, 2823 { 2824 version: "0.1.0", 2825 prs: [ 2826 57, 2827 61 2828 ] 2829 }, 2830 { 2831 version: "0.0.0" 2832 } 2833 ] 2834 }, 2835 "ai.documents": { 2836 brief: "Documents or content chunks used as context for the AI model.", 2837 type: "string[]", 2838 applyScrubbing: { 2839 key: "auto" 2840 }, 2841 isInOtel: !1, 2842 visibility: "public", 2843 example: [ 2844 "document1.txt", 2845 "document2.pdf" 2846 ], 2847 deprecation: {}, 2848 changelog: [ 2849 { 2850 version: "0.5.0", 2851 prs: [ 2852 264 2853 ] 2854 }, 2855 { 2856 version: "0.1.0", 2857 prs: [ 2858 55 2859 ] 2860 } 2861 ] 2862 }, 2863 "ai.finish_reason": { 2864 brief: "The reason why the model stopped generating.", 2865 type: "string", 2866 applyScrubbing: { 2867 key: "manual" 2868 }, 2869 isInOtel: !1, 2870 visibility: "public", 2871 example: "COMPLETE", 2872 deprecation: { 2873 replacement: "gen_ai.response.finish_reasons" 2874 }, 2875 aliases: [ 2876 "gen_ai.response.finish_reasons" 2877 ], 2878 changelog: [ 2879 { 2880 version: "0.1.0", 2881 prs: [ 2882 55, 2883 57, 2884 61, 2885 108, 2886 127 2887 ] 2888 } 2889 ] 2890 }, 2891 "ai.frequency_penalty": { 2892 brief: "Used to reduce repetitiveness of generated tokens. The higher the value, the stronger a penalty is a
2892pplied to previously present tokens, proportional to how many times they have already appeared in the prompt or prior generation.", 2893 type: "double", 2894 applyScrubbing: { 2895 key: "manual" 2896 }, 2897 isInOtel: !1, 2898 visibility: "public", 2899 example: .5, 2900 deprecation: { 2901 replacement: "gen_ai.request.frequency_penalty" 2902 }, 2903 aliases: [ 2904 "gen_ai.request.frequency_penalty" 2905 ], 2906 changelog: [ 2907 { 2908 version: "0.4.0", 2909 prs: [ 2910 228 2911 ] 2912 }, 2913 { 2914 version: "0.1.0", 2915 prs: [ 2916 55, 2917 57, 2918 61, 2919 108 2920 ] 2921 } 2922 ] 2923 }, 2924 "ai.function_call": { 2925 brief: "For an AI model call, the function that was called. This is deprecated for OpenAI, and replaced by tool_calls", 2926 type: "string", 2927 applyScrubbing: { 2928 key: "auto" 2929 }, 2930 isInOtel: !1, 2931 visibility: "public", 2932 example: "function_name", 2933 deprecation: { 2934 replacement: "gen_ai.tool.name" 2935 }, 2936 aliases: [ 2937 "gen_ai.tool.name", 2938 "mcp.tool.name" 2939 ], 2940 changelog: [ 2941 { 2942 version: "0.1.0", 2943 prs: [ 2944 55, 2945 57, 2946 61, 2947 108 2948 ] 2949 } 2950 ] 2951 }, 2952 "ai.generation_id": { 2953 brief: "Unique identifier for the completion.", 2954 type: "string", 2955 applyScrubbing: { 2956 key: "manual" 2957 }, 2958 isInOtel: !1, 2959 visibility: "public", 2960 example: "gen_123abc", 2961 deprecation: { 2962 replacement: "gen_ai.response.id" 2963 }, 2964 aliases: [ 2965 "gen_ai.response.id" 2966 ], 2967 changelog: [ 2968 { 2969 version: "0.1.0", 2970 prs: [ 2971 55, 2972 57, 2973 61, 2974 108, 2975 127 2976 ] 2977 } 2978 ] 2979 }, 2980 "ai.input_messages": { 2981 brief: "The input messages sent to the model", 2982 type: "string", 2983 applyScrubbing: { 2984 key: "manual" 2985 }, 2986 isInOtel: !1, 2987 visibility: "public", 2988 example: '[{"role": "user", "message": "hello"}]', 2989 deprecation: { 2990 replacement: "gen_ai.input.messages" 2991 }, 2992 aliases: [ 2993 "gen_ai.request.messages" 2994 ], 2995 changelog: [ 2996 { 2997 version: "0.1.0", 2998 prs: [ 2999 65, 3000 119 3001 ] 3002 }, 3003 { 3004 version: "0.0.0" 3005 } 3006 ] 3007 }, 3008 "ai.is_search_required": { 3009 brief: "Boolean indicating if the model needs to perform a search.", 3010 type: "boolean", 3011 applyScrubbing: { 3012 key: "manual" 3013 }, 3014 isInOtel: !1, 3015 visibility: "public", 3016 example: !1, 3017 deprecation: {}, 3018 changelog: [ 3019 { 3020 version: "0.5.0", 3021 prs: [ 3022 264 3023 ] 3024 }, 3025 { 3026 version: "0.1.0", 3027 prs: [ 3028 55 3029 ] 3030 } 3031 ] 3032 }, 3033 "ai.metadata": { 3034 brief: "Extra metadata passed to an AI pipeline step.", 3035 type: "string", 3036 applyScrubbing: { 3037 key: "manual" 3038 }, 3039 isInOtel: !1, 3040 visibility: "public", 3041 example: '{"user_id": 123, "session_id": "abc123"}', 3042 deprecation: {}, 3043 changelog: [ 3044 { 3045 version: "0.5.0", 3046 prs: [ 3047 264 3048 ] 3049 }, 3050 { 3051 version: "0.1.0", 3052 prs: [ 3053 55, 3054 127 3055 ] 3056 } 3057 ] 3058 }, 3059 "ai.model_id": { 3060 brief: "The vendor-specific ID of the model used.", 3061 type: "string", 3062 applyScrubbing: { 3063 key: "manual" 3064 }, 3065 isInOtel: !1, 3066 visibility: "public", 3067 example: "gpt-4", 3068 deprecation: { 3069 replacement: "gen_ai.response.model" 3070 }, 3071 aliases: [ 3072 "gen_ai.response.model" 3073 ], 3074 changelog: [ 3075 { 3076 version: "0.1.0", 3077 prs: [ 3078 57, 3079 61, 3080 127 3081 ] 3082 }, 3083 { 3084 version: "0.0.0" 3085 } 3086 ] 3087 }, 3088 "ai.model.provider": { 3089 brief: "The provider of the model.", 3090 type: "string", 3091 applyScrubbing: { 3092 key: "manual" 3093 }, 3094 isInOtel: !1, 3095 visibility: "public", 3096 example: "openai", 3097 deprecation: { 3098 replacement: "gen_ai.provider.name" 3099 }, 3100 aliases: [ 3101 "gen_ai.provider.name", 3102 "gen_ai.system" 3103 ], 3104 changelog: [ 3105 { 3106 version: "0.4.0", 3107 prs: [ 3108 253 3109 ] 3110 }, 3111 { 3112 version: "0.1.0", 3113 prs: [ 3114 57, 3115 61, 3116 108, 3117 127 3118 ] 3119 } 3120 ] 3121 }, 3122 "ai.pipeline.name": { 3123 brief: "The name of the AI pipeline.", 3124 type: "string", 3125 applyScrubbing: { 3126 key: "manual" 3127 }, 3128 isInOtel: !1, 3129 visibility: "public", 3130 example: "Autofix Pipeline", 3131 deprecation: { 3132 replacement: "gen_ai.pipeline.name" 3133 }, 3134 aliases: [ 3135 "gen_ai.pipeline.name" 3136 ], 3137 changelog: [ 3138 { 3139 version: "0.1.0", 3140 prs: [ 3141 53, 3142 76,
3143 108, 3144 127 3145 ] 3146 } 3147 ] 3148 }, 3149 "ai.preamble": { 3150 brief: "For an AI model call, the preamble parameter. Preambles are a part of the prompt used to adjust the model's overall behavior and conversation style.", 3151 type: "string", 3152 applyScrubbing: { 3153 key: "auto" 3154 }, 3155 isInOtel: !1, 3156 visibility: "public", 3157 example: "You are now a clown.", 3158 deprecation: { 3159 replacement: "gen_ai.system_instructions" 3160 }, 3161 aliases: [ 3162 "gen_ai.system_instructions" 3163 ], 3164 changelog: [ 3165 { 3166 version: "0.5.0", 3167 prs: [ 3168 264 3169 ] 3170 }, 3171 { 3172 version: "0.1.0", 3173 prs: [ 3174 55 3175 ] 3176 } 3177 ] 3178 }, 3179 "ai.presence_penalty": { 3180 brief: "Used to reduce repetitiveness of generated tokens. Similar to frequency_penalty, except that this penalty is applied equally to all tokens that have already appeared, regardless of their exact frequencies.", 3181 type: "double", 3182 applyScrubbing: { 3183 key: "manual" 3184 }, 3185 isInOtel: !1, 3186 visibility: "public", 3187 example: .5, 3188 deprecation: { 3189 replacement: "gen_ai.request.presence_penalty" 3190 }, 3191 aliases: [ 3192 "gen_ai.request.presence_penalty" 3193 ], 3194 changelog: [ 3195 { 3196 version: "0.4.0", 3197 prs: [ 3198 228 3199 ] 3200 }, 3201 { 3202 version: "0.1.0", 3203 prs: [ 3204 55, 3205 57, 3206 61, 3207 108 3208 ] 3209 } 3210 ] 3211 }, 3212 "ai.prompt_tokens.used": { 3213 brief: "The number of tokens used to process just the prompt.", 3214 type: "integer", 3215 applyScrubbing: { 3216 key: "manual" 3217 }, 3218 isInOtel: !1, 3219 visibility: "public", 3220 example: 20, 3221 deprecation: { 3222 replacement: "gen_ai.usage.input_tokens" 3223 }, 3224 aliases: [ 3225 "gen_ai.usage.prompt_tokens", 3226 "gen_ai.usage.input_tokens" 3227 ], 3228 changelog: [ 3229 { 3230 version: "0.4.0", 3231 prs: [ 3232 228 3233 ] 3234 }, 3235 { 3236 version: "0.1.0", 3237 prs: [ 3238 57, 3239 61 3240 ] 3241 }, 3242 { 3243 version: "0.0.0" 3244 } 3245 ] 3246 }, 3247 "ai.raw_prompting": { 3248 brief: "When enabled, the user\u2019s prompt will be sent to the model without any pre-processing.", 3249 type: "boolean", 3250 applyScrubbing: { 3251 key: "manual" 3252 }, 3253 isInOtel: !1, 3254 visibility: "public", 3255 example: !0, 3256 deprecation: {}, 3257 changelog: [ 3258 { 3259 version: "0.5.0", 3260 prs: [ 3261 264 3262 ] 3263 }, 3264 { 3265 version: "0.1.0", 3266 prs: [ 3267 55 3268 ] 3269 } 3270 ] 3271 }, 3272 "ai.responses": { 3273 brief: "The response messages sent back by the AI model.", 3274 type: "string[]", 3275 applyScrubbing: { 3276 key: "manual" 3277 }, 3278 isInOtel: !1, 3279 visibility: "public", 3280 example: [ 3281 "hello", 3282 "world" 3283 ], 3284 deprecation: { 3285 replacement: "gen_ai.output.messages" 3286 }, 3287 changelog: [ 3288 { 3289 version: "0.1.0", 3290 prs: [ 3291 65, 3292 127 3293 ] 3294 }, 3295 { 3296 version: "0.0.0" 3297 } 3298 ] 3299 }, 3300 "ai.response_format": { 3301 brief: "For an AI model call, the format of the response", 3302 type: "string", 3303 applyScrubbing: { 3304 key: "manual" 3305 }, 3306 isInOtel: !1, 3307 visibility: "public", 3308 example: "json_object", 3309 deprecation: {}, 3310 changelog: [ 3311 { 3312 version: "0.5.0", 3313 prs: [ 3314 264 3315 ] 3316 }, 3317 { 3318 version: "0.1.0", 3319 prs: [ 3320 55, 3321 127 3322 ] 3323 } 3324 ] 3325 }, 3326 "ai.search_queries": { 3327 brief: "Queries used to search for relevant context or documents.", 3328 type: "string[]", 3329 applyScrubbing: { 3330 key: "auto" 3331 }, 3332 isInOtel: !1, 3333 visibility: "public", 3334 example: [ 3335 "climate change effects", 3336 "renewable energy" 3337 ], 3338 deprecation: {}, 3339 changelog: [ 3340 { 3341 version: "0.5.0", 3342 prs: [ 3343 264 3344 ] 3345 }, 3346 { 3347 version: "0.1.0", 3348 prs: [ 3349 55 3350 ] 3351 } 3352 ] 3353 }, 3354 "ai.search_results": { 3355 brief: "Results returned from search queries for context.", 3356 type: "string[]", 3357 applyScrubbing: { 3358 key: "auto" 3359 }, 3360 isInOtel: !1, 3361 visibility: "public", 3362 example: [ 3363 "search_result_1, search_result_2" 3364 ], 3365 deprecation: {}, 3366 changelog: [ 3367 { 3368 version: "0.5.0", 3369 prs: [ 3370 264 3371 ] 3372 }, 3373 { 3374 version: "0.1.0", 3375 prs: [ 3376 55 3377 ] 3378 } 3379 ] 3380 }, 3381 "ai.seed": { 3382 brief: "The seed, ideally models given the same seed and same other parameters will produce the exact same output.", 3383 type: "string", 3384 applyScrubbing: { 3385 key: "manual" 3386 }, 3387 isInOtel: !1, 3388 visibility: "public", 3389 example: "1234567890", 3390 deprecation: { 3391 replacement: "gen_ai.request.seed" 3392 }, 3393 aliases: [ 3394 "gen_ai.request.seed" 3395 ], 3396 changelog: [ 3397 { 3398 version: "0.1.0", 3399 prs: [ 3400 55, 3401 57, 3402 61, 3403 108, 3404 127 3405 ] 3406 } 3407 ] 3408 }, 3409 "ai.streaming": { 3410 brief: "Whether the request was streamed back.", 3411 type: "boolean", 3412 applyScrubbing: { 3413 key: "manual" 3414 }, 3415 isInOtel: !1, 3416 visibility: "public", 3417 example: !0, 3418 deprecation: { 3419 replacement: "gen_ai.response.streaming" 3420 }, 3421 aliases: [ 3422 "gen_ai.response.streaming" 3423 ], 3424 changelog: [ 3425 { 3426 version: "0.1.0", 3427 prs: [ 3428 76,
3429 108 3430 ] 3431 }, 3432 { 3433 version: "0.0.0" 3434 } 3435 ] 3436 }, 3437 "ai.tags": { 3438 brief: "Tags that describe an AI pipeline step.", 3439 type: "string", 3440 applyScrubbing: { 3441 key: "manual" 3442 }, 3443 isInOtel: !1, 3444 visibility: "public", 3445 example: '{"executed_function": "add_integers"}', 3446 deprecation: {}, 3447 changelog: [ 3448 { 3449 version: "0.5.0", 3450 prs: [ 3451 264 3452 ] 3453 }, 3454 { 3455 version: "0.1.0", 3456 prs: [ 3457 55, 3458 127 3459 ] 3460 } 3461 ] 3462 }, 3463 "ai.temperature": { 3464 brief: "For an AI model call, the temperature parameter. Temperature essentially means how random the output will be.", 3465 type: "double", 3466 applyScrubbing: { 3467 key: "manual" 3468 }, 3469 isInOtel: !1, 3470 visibility: "public", 3471 example: .1, 3472 deprecation: { 3473 replacement: "gen_ai.request.temperature" 3474 }, 3475 aliases: [ 3476 "gen_ai.request.temperature" 3477 ], 3478 changelog: [ 3479 { 3480 version: "0.4.0", 3481 prs: [ 3482 228 3483 ] 3484 }, 3485 { 3486 version: "0.1.0", 3487 prs: [ 3488 55, 3489 57, 3490 61, 3491 108 3492 ] 3493 } 3494 ] 3495 }, 3496 "ai.texts": { 3497 brief: "Raw text inputs provided to the model.", 3498 type: "string[]", 3499 applyScrubbing: { 3500 key: "auto" 3501 }, 3502 isInOtel: !1, 3503 visibility: "public", 3504 example: [ 3505 "Hello, how are you?", 3506 "What is the capital of France?" 3507 ], 3508 deprecation: { 3509 replacement: "gen_ai.input.messages" 3510 }, 3511 aliases: [ 3512 "gen_ai.input.messages" 3513 ], 3514 changelog: [ 3515 { 3516 version: "0.5.0", 3517 prs: [ 3518 264 3519 ] 3520 }, 3521 { 3522 version: "0.1.0", 3523 prs: [ 3524 55 3525 ] 3526 } 3527 ] 3528 }, 3529 "ai.tools": { 3530 brief: "For an AI model call, the functions that are available", 3531 type: "string[]", 3532 applyScrubbing: { 3533 key: "manual" 3534 }, 3535 isInOtel: !1, 3536 visibility: "public", 3537 example: [ 3538 "function_1", 3539 "function_2" 3540 ], 3541 deprecation: { 3542 replacement: "gen_ai.tool.definitions" 3543 }, 3544 changelog: [ 3545 { 3546 version: "0.1.0", 3547 prs: [ 3548 55, 3549 65, 3550 127 3551 ] 3552 } 3553 ] 3554 }, 3555 "ai.tool_calls": { 3556 brief: "For an AI model call, the tool calls that were made.", 3557 type: "string[]", 3558 applyScrubbing: { 3559 key: "auto" 3560 }, 3561 isInOtel: !1, 3562 visibility: "public", 3563 example: [ 3564 "tool_call_1", 3565 "tool_call_2" 3566 ], 3567 deprecation: { 3568 replacement: "gen_ai.output.messages" 3569 }, 3570 changelog: [ 3571 { 3572 version: "0.1.0", 3573 prs: [ 3574 55, 3575 65 3576 ] 3577 } 3578 ] 3579 }, 3580 "ai.top_k": { 3581 brief: "Limits the model to only consider the K most likely next tokens, where K is an integer (e.g., top_k=20 means only the 20 highest probability tokens are considered).", 3582 type: "integer", 3583 applyScrubbing: { 3584 key: "manual" 3585 }, 3586 isInOtel: !1, 3587 visibility: "public", 3588 example: 35, 3589 deprecation: { 3590 replacement: "gen_ai.request.top_k" 3591 }, 3592 aliases: [ 3593 "gen_ai.request.top_k" 3594 ], 3595 changelog: [ 3596 { 3597 version: "0.4.0", 3598 prs: [ 3599 228 3600 ] 3601 }, 3602 { 3603 version: "0.1.0", 3604 prs: [ 3605 55, 3606 57, 3607 61, 3608 108 3609 ] 3610 } 3611 ] 3612 }, 3613 "ai.top_p": { 3614 brief: "Limits the model to only consider tokens whose cumulative probability mass adds up to p, where p is a float between 0 and 1 (e.g., top_p=0.7 means only tokens that sum up to 70% of the probability mass are considered).", 3615 type: "double", 3616 applyScrubbing: { 3617 key: "manual" 3618 }, 3619 isInOtel: !1, 3620 visibility: "public", 3621 example: .7, 3622 deprecation: { 3623 replacement: "gen_ai.request.top_p" 3624 }, 3625 aliases: [ 3626 "gen_ai.request.top_p" 3627 ], 3628 changelog: [ 3629 { 3630 version: "0.4.0", 3631 prs: [ 3632 228 3633 ] 3634 }, 3635 { 3636 version: "0.1.0", 3637 prs: [ 3638 55, 3639 57, 3640 61, 3641 108 3642 ] 3643 } 3644 ] 3645 }, 3646 "ai.total_cost": { 3647 brief: "The total cost for the tokens used.", 3648 type: "double", 3649 applyScrubbing: { 3650 key: "manual" 3651 }, 3652 isInOtel: !1, 3653 visibility: "public", 3654 example: 12.34, 3655 deprecation: { 3656 replacement: "gen_ai.cost.total_tokens" 3657 }, 3658 aliases: [ 3659 "gen_ai.cost.total_tokens" 3660 ], 3661 changelog: [ 3662 { 3663 version: "0.5.0", 3664 prs: [ 3665 264 3666 ] 3667 }, 3668 { 3669 version: "0.4.0", 3670 prs: [ 3671 228 3672 ] 3673 }, 3674 { 3675 version: "0.1.0", 3676 prs: [ 3677 53 3678 ] 3679 } 3680 ] 3681 }, 3682 "ai.total_tokens.used": { 3683 brief: "The total number of tokens used to process the prompt.", 3684 type: "integer", 3685 applyScrubbing: { 3686 key: "manual" 3687 }, 3688 isInOtel: !1, 3689 visibility: "public", 3690 example: 30, 3691 deprecation: { 3692 replacement: "gen_ai.usage.total_tokens" 3693 }, 3694 aliases: [ 3695 "gen_ai.usage.total_tokens" 3696 ], 3697 changelog: [ 3698 { 3699 version: "0.4.0", 3700 prs: [ 3701 228 3702 ] 3703 }, 3704 { 3705 version: "0.1.0", 3706 prs: [ 3707 57, 3708 61, 3709 108 3710 ] 3711 }, 3712 { 3713 version: "0.0.0" 3714 } 3715 ] 3716 }, 3717 "ai.warnings": { 3718 brief: "Warning messages generated during model execution.", 3719 type: "string[]", 3720 applyScrubbing: { 3721 key: "auto" 3722 }, 3723 isInOtel: !1, 3724 visibility: "public", 3725 example: [ 3726 "Token limit exceeded" 3727 ], 3728 deprecation: {}, 3729 changelog: [ 3730 { 3731 version: "0.5.0", 3732 prs: [ 3733 264 3734 ] 3735 }, 3736 { 3737 version: "0.1.0", 3738 prs: [ 3739 55 3740 ] 3741 } 3742 ] 3743 }, 3744 "angular.version": { 3745 brief: "The version of the Angular framework", 3746 type: "string", 3747 applyScrubbing: { 3748 key: "manual" 3749 }, 3750 isInOtel: !1, 3751 visibility: "public", 3752 example: "17.1.0", 3753 changelog: [ 3754 { 3755 version: "0.7.0", 3756 prs: [ 3757 367 3758 ], 3759 description: "Added angular.version attribute" 3760 } 3761 ] 3762 }, 3763 "app.app_build": { 3764 brief: "Internal build identifier, as it appears on the platform.", 3765 type: "string", 3766 applyScrubbing: { 3767 key: "manual" 3768 }, 3769 isInOtel: !1, 3770 visibility: "public", 3771 example: "1", 3772 deprecation: { 3773 replacement: "app.build",
3774 reason: "Deprecated in favor of app.build" 3775 }, 3776 aliases: [ 3777 "app.build" 3778 ], 3779 changelog: [ 3780 { 3781 version: "0.5.0", 3782 prs: [ 3783 296 3784 ], 3785 description: "Added and deprecated app.app_build in favor of app.build" 3786 } 3787 ] 3788 }, 3789 "app.app_identifier": { 3790 brief: "Version-independent application identifier, often a dotted bundle ID.", 3791 type: "string", 3792 applyScrubbing: { 3793 key: "manual" 3794 }, 3795 isInOtel: !1, 3796 visibility: "public", 3797 example: "com.example.myapp", 3798 deprecation: { 3799 replacement: "app.identifier", 3800 reason: "Deprecated in favor of app.identifier" 3801 }, 3802 aliases: [ 3803 "app.identifier" 3804 ], 3805 changelog: [ 3806 { 3807 version: "0.5.0", 3808 prs: [ 3809 296 3810 ], 3811 description: "Added and deprecated app.app_identifier in favor of app.identifier" 3812 } 3813 ] 3814 }, 3815 "app.app_name": { 3816 brief: "Human readable application name, as it appears on the platform.", 3817 type: "string", 3818 applyScrubbing: { 3819 key: "manual" 3820 }, 3821 isInOtel: !1, 3822 visibility: "public", 3823 example: "My App", 3824 deprecation: { 3825 replacement: "app.name", 3826 reason: "Deprecated in favor of app.name" 3827 }, 3828 aliases: [ 3829 "app.name" 3830 ], 3831 changelog: [ 3832 { 3833 version: "0.5.0", 3834 prs: [ 3835 296 3836 ], 3837 description: "Added and deprecated app.app_name in favor of app.name" 3838 } 3839 ] 3840 }, 3841 "app.app_start_time": { 3842 brief: "Formatted UTC timestamp when the user started the application.", 3843 type: "string", 3844 applyScrubbing: { 3845 key: "manual" 3846 }, 3847 isInOtel: !1, 3848 visibility: "public", 3849 example: "2025-01-01T00:00:00.000Z", 3850 deprecation: { 3851 replacement: "app.start_time", 3852 reason: "Deprecated in favor of app.start_time" 3853 }, 3854 aliases: [ 3855 "app.start_time" 3856 ], 3857 changelog: [ 3858 { 3859 version: "0.5.0", 3860 prs: [ 3861 296 3862 ], 3863 description: "Added and deprecated app.app_start_time in favor of app.start_time" 3864 } 3865 ] 3866 }, 3867 "app.app_version": { 3868 brief: "Human readable application version, as it appears on the platform.", 3869 type: "string", 3870 applyScrubbing: { 3871 key: "manual" 3872 }, 3873 isInOtel: !1, 3874 visibility: "public", 3875 example: "1.0.0", 3876 deprecation: { 3877 replacement: "app.version", 3878 reason: "Deprecated in favor of app.version" 3879 }, 3880 aliases: [ 3881 "app.version" 3882 ], 3883 changelog: [ 3884 { 3885 version: "0.5.0", 3886 prs: [ 3887 296 3888 ], 3889 description: "Added and deprecated app.app_version in favor of app.version" 3890 } 3891 ] 3892 }, 3893 "app.build": { 3894 brief: "Internal build identifier, as it appears on the platform.", 3895 type: "string", 3896 applyScrubbing: { 3897 key: "manual" 3898 }, 3899 isInOtel: !1, 3900 visibility: "public", 3901 example: "1", 3902 aliases: [ 3903 "app.app_build" 3904 ], 3905 changelog: [ 3906 { 3907 version: "0.5.0", 3908 prs: [ 3909 296 3910 ], 3911 description: "Added app.build attribute" 3912 } 3913 ] 3914 }, 3915 "app.identifier": { 3916 brief: "Version-independent application identifier, often a dotted bundle ID.", 3917 type: "string", 3918 applyScrubbing: { 3919 key: "manual" 3920 }, 3921 isInOtel: !1, 3922 visibility: "public", 3923 example: "com.example.myapp", 3924 aliases: [ 3925 "app.app_identifier" 3926 ], 3927 changelog: [ 3928 { 3929 version: "0.5.0", 3930 prs: [ 3931 296 3932 ], 3933 description: "Added app.identifier attribute" 3934 } 3935 ] 3936 }, 3937 "app.in_foreground": { 3938 brief: "Whether the application is currently in the foreground.", 3939 type: "boolean", 3940 applyScrubbing: { 3941 key: "manual" 3942 }, 3943 isInOtel: !1, 3944 visibility: "public", 3945 example: !0, 3946 changelog: [ 3947 { 3948 version: "0.5.0", 3949 prs: [ 3950 296 3951 ], 3952 description: "Added app.in_foreground attribute" 3953 } 3954 ] 3955 }, 3956 "app.name": { 3957 brief: "Human readable application name, as it appears on the platform.", 3958 type: "string", 3959 applyScrubbing: { 3960 key: "manual" 3961 }, 3962 isInOtel: !1, 3963 visibility: "public", 3964 example: "My App", 3965 aliases: [ 3966 "app.app_name" 3967 ], 3968 changelog: [ 3969 { 3970 version: "0.5.0", 3971 prs: [ 3972 296 3973 ], 3974 description: "Added app.name attribute" 3975 } 3976 ] 3977 }, 3978 app_start_cold: { 3979 brief: "The duration of a cold app start in milliseconds", 3980 type: "double", 3981 applyScrubbing: { 3982 key: "manual" 3983 }, 3984 isInOtel: !1, 3985 visibility: "public", 3986 example: 1234.56, 3987 deprecation: { 3988 replacement: "app.vitals.start.cold.value", 3989 reason: "Replaced by app.vitals.start.cold.value to align with the app.vitals.* namespace for mobile performance attributes"
3990 }, 3991 aliases: [ 3992 "app.vitals.start.cold.value" 3993 ], 3994 changelog: [ 3995 { 3996 version: "0.5.0", 3997 prs: [ 3998 323 3999 ], 4000 description: "Added and deprecated in favor of app.vitals.start.cold.value" 4001 } 4002 ] 4003 }, 4004 "app.start_time": { 4005 brief: "Formatted UTC timestamp when the user started the application.", 4006 type: "string", 4007 applyScrubbing: { 4008 key: "manual" 4009 }, 4010 isInOtel: !1, 4011 visibility: "public", 4012 example: "2025-01-01T00:00:00.000Z", 4013 aliases: [ 4014 "app.app_start_time" 4015 ], 4016 changelog: [ 4017 { 4018 version: "0.5.0", 4019 prs: [ 4020 296 4021 ], 4022 description: "Added app.start_time attribute" 4023 } 4024 ] 4025 }, 4026 app_start_type: { 4027 brief: "Mobile app start variant. Either cold or warm.", 4028 type: "string", 4029 applyScrubbing: { 4030 key: "manual" 4031 }, 4032 isInOtel: !1, 4033 visibility: "public", 4034 example: "cold", 4035 deprecation: { 4036 replacement: "app.vitals.start.type", 4037 reason: "Replaced by app.vitals.start.type to align with the app.vitals.* namespace for mobile performance attributes" 4038 }, 4039 aliases: [ 4040 "app.vitals.start.type" 4041 ], 4042 changelog: [ 4043 { 4044 version: "0.5.0", 4045 prs: [ 4046 313 4047 ], 4048 description: "Deprecated in favor of app.vitals.start.type" 4049 }, 4050 { 4051 version: "0.1.0", 4052 prs: [ 4053 127 4054 ] 4055 }, 4056 { 4057 version: "0.0.0" 4058 } 4059 ] 4060 }, 4061 app_start_warm: { 4062 brief: "The duration of a warm app start in milliseconds", 4063 type: "double", 4064 applyScrubbing: { 4065 key: "manual" 4066 }, 4067 isInOtel: !1, 4068 visibility: "public", 4069 example: 1234.56, 4070 deprecation: { 4071 replacement: "app.vitals.start.warm.value", 4072 reason: "Replaced by app.vitals.start.warm.value to align with the app.vitals.* namespace for mobile performance attributes" 4073 }, 4074 aliases: [ 4075 "app.vitals.start.warm.value" 4076 ], 4077 changelog: [ 4078 { 4079 version: "0.5.0", 4080 prs: [ 4081 323 4082 ], 4083 description: "Added and deprecated in favor of app.vitals.start.warm.value" 4084 } 4085 ] 4086 }, 4087 "app.version": { 4088 brief: "Human readable application version, as it appears on the platform.", 4089 type: "string", 4090 applyScrubbing: { 4091 key: "manual" 4092 }, 4093 isInOtel: !1, 4094 visibility: "public", 4095 example: "1.0.0", 4096 aliases: [ 4097 "app.app_version" 4098 ], 4099 changelog: [ 4100 { 4101 version: "0.5.0", 4102 prs: [ 4103 296 4104 ], 4105 description: "Added app.version attribute" 4106 } 4107 ] 4108 }, 4109 "app.vitals.frames.delay.value": { 4110 brief: "The sum of all delayed frame durations in seconds during the lifetime of the span. For more information see [frames delay](https://develop.sentry.dev/sdk/performance/frames-delay/).", 4111 type: "integer", 4112 applyScrubbing: { 4113 key: "manual" 4114 }, 4115 isInOtel: !1, 4116 visibility: "public", 4117 example: 5, 4118 aliases: [ 4119 "frames.delay" 4120 ], 4121 changelog: [ 4122 { 4123 version: "0.5.0", 4124 prs: [ 4125 313 4126 ], 4127 description: "Added app.vitals.frames.delay.value to replace frames.delay" 4128 } 4129 ] 4130 }, 4131 "app.vitals.frames.frozen.count": { 4132 brief: "The number of frozen frames rendered during the lifetime of the span.", 4133 type: "integer", 4134 applyScrubbing: { 4135 key: "manual" 4136 }, 4137 isInOtel: !1, 4138 visibility: "public", 4139 example: 3, 4140 aliases: [ 4141 "frames.frozen" 4142 ], 4143 changelog: [ 4144 { 4145 version: "0.5.0", 4146 prs: [ 4147 313 4148 ], 4149 description: "Added app.vitals.frames.frozen.count to replace frames.frozen" 4150 } 4151 ] 4152 }, 4153 "app.vitals.frames.slow.count": { 4154 brief: "The number of slow frames rendered during the lifetime of the span.", 4155 type: "integer", 4156 applyScrubbing: { 4157 key: "manual" 4158 }, 4159 isInOtel: !1, 4160 visibility: "public", 4161 example: 1, 4162 aliases: [ 4163 "frames.slow" 4164 ], 4165 changelog: [ 4166 { 4167 version: "0.5.0", 4168 prs: [ 4169 313 4170 ], 4171 description: "Added app.vitals.frames.slow.count to replace frames.slow" 4172 } 4173 ] 4174 }, 4175 "app.vitals.frames.total.count": { 4176 brief: "The number of total frames rendered during the lifetime of the span.", 4177 type: "integer", 4178 applyScrubbing: { 4179 key: "manual" 4180 }, 4181 isInOtel: !1, 4182 visibility: "public", 4183 example: 60, 4184 aliases: [ 4185 "frames.total" 4186 ], 4187 changelog: [ 4188 { 4189 version: "0.5.0", 4190 prs: [ 4191 313 4192 ], 4193 description: "Added app.vitals.frames.total.count to replace frames.total" 4194 } 4195 ] 4196 }, 4197 "app.vitals.start.cold.value": { 4198 brief: "The duration of a cold app start in milliseconds", 4199 type: "double", 4200 applyScrubbing: { 4201 key: "manual" 4202 }, 4203 isInOtel: !1, 4204 visibility: "public", 4205 example: 1234.56, 4206 aliases: [ 4207 "app_start_cold" 4208 ], 4209 changelog: [ 4210 { 4211 version: "0.5.0", 4212 prs: [ 4213 313 4214 ], 4215 description: "Added app.vitals.start.cold.value attribute" 4216 } 4217 ] 4218 }, 4219 "app.vitals.start.prewarmed": { 4220 brief: "Whether the app start was prewarmed.", 4221 type: "boolean", 4222 applyScrubbing: { 4223 key: "manual" 4224 }, 4225 isInOtel: !1, 4226 visibility: "public", 4227 example: !0, 4228 changelog: [ 4229 { 4230 version: "0.11.0", 4231 prs: [ 4232 379 4233 ], 4234 description: "Added app.vitals.start.prewarmed attribute" 4235 } 4236 ] 4237 }, 4238 "app.vitals.start.reason": { 4239 brief: "The reason that triggered the app start.", 4240 type: "string", 4241 applyScrubbing: { 4242 key: "manual" 4243 }, 4244 isInOtel: !1, 4245 visibility: "public", 4246 example: "push", 4247 changelog: [ 4248 { 4249 version: "0.7.0", 4250 prs: [ 4251 353 4252 ], 4253 description: "Added app.vitals.start.reason attribute" 4254 } 4255 ] 4256 }, 4257 "app.vitals.start.screen": { 4258 brief: "The screen that is rendered when the app start is complete. This is the screen the user first sees and can interact with after launch. The absence of this attribute on the app start span indicates a background app start where no UI was rendered.", 4259 type: "string", 4260 applyScrubbing: { 4261 key: "manual" 4262 }, 4263 isInOtel: !1, 4264 visibility: "public", 4265 example: "MainActivity", 4266 changelog: [ 4267 { 4268 version: "0.7.0", 4269 prs: [ 4270 353 4271 ], 4272 description: "Added app.vitals.start.screen attribute" 4273 } 4274 ] 4275 }, 4276 "app.vitals.start.type": { 4277 brief: "The type of app start, for example `cold` or `warm`", 4278 type: "string", 4279 applyScrubbing: { 4280 key: "manual" 4281 }, 4282 isInOtel: !1, 4283 visibility: "public", 4284 example: "cold", 4285 aliases: [ 4286 "app_start_type" 4287 ], 4288 changelog: [ 4289 { 4290 version: "0.5.0", 4291 prs: [ 4292 313 4293 ], 4294 description: "Added app.vitals.start.type attribute" 4295 } 4296 ] 4297 }, 4298 "app.vitals.start.warm.value": { 4299 brief: "The duration of a warm app start in milliseconds", 4300 type: "double", 4301 applyScrubbing: { 4302 key: "manual" 4303 }, 4304 isInOtel: !1, 4305 visibility: "public", 4306 example: 1234.56, 4307 aliases: [ 4308 "app_start_warm" 4309 ], 4310 changelog: [ 4311 { 4312 version: "0.5.0", 4313 prs: [ 4314 313 4315 ], 4316 description: "Added app.vitals.start.warm.value attribute" 4317 } 4318 ] 4319 }, 4320 "app.vitals.ttfd.value": { 4321 brief: "The duration of time to full display in milliseconds", 4322 type: "double", 4323 applyScrubbing: { 4324 key: "manual" 4325 }, 4326 isInOtel: !1, 4327 visibility: "public", 4328 example: 1234.56, 4329 aliases: [ 4330 "time_to_full_display" 4331 ], 4332 changelog: [ 4333 { 4334 version: "0.5.0", 4335 prs: [ 4336 313 4337 ], 4338 description: "Added app.vitals.ttfd.value attribute" 4339 } 4340 ] 4341 }, 4342 "app.vitals.ttid.value": { 4343 brief: "The duration of time to initial display in milliseconds", 4344 type: "double", 4345 applyScrubbing: { 4346 key: "manual" 4347 }, 4348 isInOtel: !1, 4349 visibility: "public", 4350 example: 1234.56, 4351 aliases: [ 4352 "time_to_initial_display" 4353 ], 4354 changelog: [ 4355 { 4356 version: "0.5.0", 4357 prs: [ 4358 313 4359 ], 4360 description: "Added app.vitals.ttid.value attribute" 4361 } 4362 ] 4363 }, 4364 "art.gc.blocking_count": { 4365 brief: "Total number of blocking (stop-the-world) garbage collections performed by the Android Runtime", 4366 type: "integer", 4367 applyScrubbing: { 4368 key: "manual" 4369 }, 4370 isInOtel: !1, 4371 visibility: "public", 4372 example: 1, 4373 changelog: [ 4374 { 4375 version: "0.11.0", 4376 prs: [ 4377 382 4378 ], 4379 description: "Added art.gc.blocking_count attribute" 4380 } 4381 ] 4382 }, 4383 "art.gc.blocking_time": { 4384 brief: "Total time spent in blocking (stop-the-world) garbage collections by the Android Runtime, in milliseconds", 4385 type: "double", 4386 applyScrubbing: { 4387 key: "manual" 4388 }, 4389 isInOtel: !1, 4390 visibility: "public", 4391 example: 11.873, 4392 changelog: [ 4393 { 4394 version: "0.11.0", 4395 prs: [ 4396 382 4397 ], 4398 description: "Added art.gc.blocking_time attribute" 4399 } 4400 ] 4401 }, 4402 "art.gc.pre_oome_count": { 4403 brief: "Total number of garbage collections triggered as a last resort before an OutOfMemoryError by the Android Runtime", 4404 type: "integer", 4405 applyScrubbing: { 4406 key: "manual" 4407 }, 4408 isInOtel: !1, 4409 visibility: "public", 4410 example: 0, 4411 changelog: [ 4412 { 4413 version: "0.11.0", 4414 prs: [ 4415 382 4416 ], 4417 description: "Added art.gc.pre_oome_count attribute" 4418 } 4419 ] 4420 }, 4421 "art.gc.total_count": { 4422 brief: "Total number of garbage collections performed by the Android Runtime", 4423 type: "integer", 4424 applyScrubbing: { 4425 key: "manual" 4426 }, 4427 isInOtel: !1, 4428 visibility: "public", 4429 example: 1, 4430 changelog: [ 4431 { 4432 version: "0.11.0", 4433 prs: [ 4434 382 4435 ], 4436 description: "Added art.gc.total_count attribute" 4437 } 4438 ] 4439 }, 4440 "art.gc.total_time": { 4441 brief: "Total time spent in garbage collection by the Android Runtime, in milliseconds", 4442 type: "double", 4443 applyScrubbing: { 4444 key: "manual" 4445 }, 4446 isInOtel: !1, 4447 visibility: "public", 4448 example: 11.807, 4449 changelog: [ 4450 { 4451 version: "0.11.0", 4452 prs: [ 4453 382 4454 ], 4455 description: "Added art.gc.total_time attribute" 4456 } 4457 ] 4458 }, 4459 "art.gc.waiting_time": { 4460 brief: "Total time threads spent waiting for garbage collection to complete in the Android Runtime, in milliseconds", 4461 type: "double", 4462 applyScrubbing: { 4463 key: "manual" 4464 }, 4465 isInOtel: !1, 4466 visibility: "public", 4467 example: 8.054, 4468 changelog: [ 4469 { 4470 version: "0.11.0", 4471 prs: [ 4472 382 4473 ], 4474 description: "Added art.gc.waiting_time attribute" 4475 } 4476 ] 4477 }, 4478 "art.memory.free": { 4479 brief: "Free memory available to the process as reported by the Android Runtime, in bytes", 4480 type: "integer", 4481 applyScrubbing: { 4482 key: "manual" 4483 }, 4484 isInOtel: !1, 4485 visibility: "public", 4486 example: 3181568, 4487 changelog: [ 4488 { 4489 version: "0.11.0", 4490 prs: [ 4491 382 4492 ], 4493 description: "Added art.memory.free attribute" 4494 } 4495 ] 4496 }, 4497 "art.memory.free_until_gc": { 4498 brief: "Free memory available before a garbage collection would be triggered by the Android Runtime, in bytes", 4499 type: "integer", 4500 applyScrubbing: { 4501 key: "manual" 4502 }, 4503 isInOtel: !1, 4504 visibility: "public", 4505 example: 3181568, 4506 changelog: [ 4507 { 4508 version: "0.11.0", 4509 prs: [ 4510 382 4511 ], 4512 description: "Added art.memory.free_until_gc attribute" 4513 } 4514 ] 4515 }, 4516 "art.memory.free_until_oome": { 4517 brief: "Free memory available before an OutOfMemoryError would be thrown by the Android Runtime, in bytes", 4518 type: "integer", 4519 applyScrubbing: { 4520 key: "manual" 4521 }, 4522 isInOtel: !1, 4523 visibility: "public", 4524 example: 196083712, 4525 changelog: [ 4526 { 4527 version: "0.11.0", 4528 prs: [ 4529 382 4530 ], 4531 description: "Added art.memory.free_until_oome attribute" 4532 } 4533 ] 4534 }, 4535 "art.memory.max": { 4536 brief: "Maximum memory the process is allowed to use as reported by the Android Runtime, in bytes", 4537 type: "integer", 4538 applyScrubbing: { 4539 key: "manual" 4540 }, 4541 isInOtel: !1, 4542 visibility: "public", 4543 example: 201326592, 4544 changelog: [ 4545 { 4546 version: "0.11.0", 4547 prs: [ 4548 382 4549 ], 4550 description: "Added art.memory.max attribute" 4551 } 4552 ] 4553 }, 4554 "art.memory.total": { 4555 brief: "Total memory currently allocated to the process by the Android Runtime, in bytes", 4556 type: "integer", 4557 applyScrubbing: { 4558 key: "manual" 4559 }, 4560 isInOtel: !1, 4561 visibility: "public", 4562 example: 7774208, 4563 changelog: [ 4564 { 4565 version: "0.11.0", 4566 prs: [ 4567 382 4568 ], 4569 description: "Added art.memory.total attribute" 4570 } 4571 ] 4572 }, 4573 "aws.cloudwatch.logs.log_group": { 4574 brief: "The name of the CloudWatch Logs log group", 4575 type: "string", 4576 applyScrubbing: { 4577 key:
4577"manual" 4578 }, 4579 isInOtel: !1, 4580 visibility: "public", 4581 example: "/aws/lambda/my-function", 4582 changelog: [ 4583 { 4584 version: "0.7.0", 4585 prs: [ 4586 369 4587 ], 4588 description: "Added aws.cloudwatch.logs.log_group attribute" 4589 } 4590 ] 4591 }, 4592 "aws.cloudwatch.logs.log_stream": { 4593 brief: "The name of the CloudWatch Logs log stream", 4594 type: "string", 4595 applyScrubbing: { 4596 key: "manual" 4597 }, 4598 isInOtel: !1, 4599 visibility: "public", 4600 example: "2024/01/01/[$LATEST]abcdef1234567890", 4601 changelog: [ 4602 { 4603 version: "0.7.0", 4604 prs: [ 4605 369 4606 ], 4607 description: "Added aws.cloudwatch.logs.log_stream attribute" 4608 } 4609 ] 4610 }, 4611 "aws.cloudwatch.logs.url": { 4612 brief: "The URL to the CloudWatch Logs log group", 4613 type: "string", 4614 applyScrubbing: { 4615 key: "manual" 4616 }, 4617 isInOtel: !1, 4618 visibility: "public", 4619 example: "https://console.aws.amazon.com/cloudwatch/home?region=us-east-1#logsV2:log-groups/log-group/my-log-group", 4620 changelog: [ 4621 { 4622 version: "0.7.0", 4623 prs: [ 4624 369 4625 ], 4626 description: "Added aws.cloudwatch.logs.url attribute" 4627 } 4628 ] 4629 }, 4630 "aws.dynamodb.attribute_definitions": { 4631 brief: "The JSON-serialized value of each item in the `AttributeDefinitions` request field.", 4632 type: "string[]", 4633 applyScrubbing: { 4634 key: "manual" 4635 }, 4636 isInOtel: !0, 4637 visibility: "public", 4638 example: [ 4639 '{ "AttributeName": "string", "AttributeType": "string" }' 4640 ], 4641 changelog: [ 4642 { 4643 version: "0.16.0", 4644 prs: [ 4645 479 4646 ], 4647 description: "Added aws.dynamodb.attribute_definitions attribute" 4648 } 4649 ] 4650 }, 4651 "aws.dynamodb.consistent_read": { 4652 brief: "The value of the `ConsistentRead` request parameter.", 4653 type: "boolean", 4654 applyScrubbing: { 4655 key: "manual" 4656 }, 4657 isInOtel: !0, 4658 visibility: "public", 4659 example: !0, 4660 changelog: [ 4661 { 4662 version: "0.16.0", 4663 prs: [ 4664 479 4665 ], 4666 description: "Added aws.dynamodb.consistent_read attribute" 4667 } 4668 ] 4669 }, 4670 "aws.dynamodb.consumed_capacity": { 4671 brief: "The JSON-serialized value of each item in the `ConsumedCapacity` response field.", 4672 type: "string[]", 4673 applyScrubbing: { 4674 key: "manual" 4675 }, 4676 isInOtel: !0, 4677 visibility: "public", 4678 example: [ 4679 '{ "CapacityUnits": number, "GlobalSecondaryIndexes": { "string" : { "CapacityUnits": number, "ReadCapacityUnits": number, "WriteCapacityUnits": number } }, "LocalSecondaryIndexes": { "string" : { "CapacityUnits": number, "ReadCapacityUnits": number, "WriteCapacityUnits": number } }, "ReadCapacityUnits": number, "Table": { "CapacityUnits": number, "ReadCapacityUnits": number, "WriteCapacityUnits": number }, "TableName": "string", "WriteCapacityUnits": number }' 4680 ], 4681 changelog: [ 4682 { 4683 version: "0.16.0", 4684 prs: [ 4685 479 4686 ], 4687 description: "Added aws.dynamodb.consumed_capacity attribute" 4688 } 4689 ] 4690 }, 4691 "aws.dynamodb.count": { 4692 brief: "The value of the `Count` response parameter.", 4693 type: "integer", 4694 applyScrubbing: { 4695 key: "manual" 4696 }, 4697 isInOtel: !0, 4698 visibility: "public", 4699 example: 10, 4700 changelog: [ 4701 { 4702 version: "0.16.0", 4703 prs: [ 4704 479 4705 ], 4706 description: "Added aws.dynamodb.count attribute" 4707 } 4708 ] 4709 }, 4710 "aws.dynamodb.exclusive_start_table": { 4711 brief: "The value of the `ExclusiveStartTableName` request parameter.", 4712 type: "string", 4713 applyScrubbing: { 4714 key: "manual" 4715 }, 4716 isInOtel: !0, 4717 visibility: "public", 4718 example: "Users", 4719 changelog: [ 4720 { 4721 version: "0.16.0", 4722 prs: [ 4723 479 4724 ], 4725 description: "Added aws.dynamodb.exclusive_start_table attribute" 4726 } 4727 ] 4728 }, 4729 "aws.dynamodb.global_secondary_indexes": { 4730 brief: "The JSON-serialized value of each item of the `GlobalSecondaryIndexes` request field.", 4731 type: "string[]", 4732 applyScrubbing: { 4733 key: "manual" 4734 }, 4735 isInOtel: !0, 4736 visibility: "public", 4737 example: [ 4738 '{ "IndexName": "string", "KeySchema": [ { "AttributeName": "string", "KeyType": "string" } ], "Projection": { "NonKeyAttributes": [ "string" ], "ProjectionType": "string" }, "ProvisionedThroughput": { "ReadCapacityUnits": number, "WriteCapacityUnits": number } }' 4739 ], 4740 changelog: [ 4741 { 4742 version: "0.16.0", 4743 prs: [ 4744 479 4745 ], 4746 description: "Added aws.dynamodb.global_secondary_indexes attribute" 4747 } 4748 ] 4749 }, 4750 "aws.dynamodb.global_secondary_index_updates": { 4751 brief: "The JSON-serialized value of each item in the `GlobalSecondaryIndexUpdates` request field.", 4752 type: "string[]", 4753 applyScrubbing: { 4754 key: "manual" 4755 }, 4756 isInOtel: !0, 4757 visibility: "public", 4758 example: [ 4759 '{ "Create": { "IndexName": "string", "KeySchema": [ { "AttributeName": "string", "KeyType": "string" } ], "Projection": { "NonKeyAttributes": [ "string" ], "ProjectionType": "string" }, "ProvisionedThroughput": { "ReadCapacityUnits": number, "WriteCapacityUnits": number } }' 4760 ], 4761 changelog: [ 4762 { 4763 version: "0.16.0", 4764 prs: [ 4765 479 4766 ], 4767 description: "Added aws.dynamodb.global_secondary_index_updates attribute" 4768 } 4769 ] 4770 }, 4771 "aws.dynamodb.index_name": { 4772 brief: "The value of the `IndexName` request parameter.", 4773 type: "string", 4774 applyScrubbing: { 4775 key: "manual" 4776 }, 4777 isInOtel: !0, 4778 visibility: "public", 4779 example: "name_to_group", 4780 changelog: [ 4781 { 4782 version: "0.16.0", 4783 prs: [ 4784 479 4785 ], 4786 description: "Added aws.dynamodb.index_name attribute" 4787 } 4788 ] 4789 }, 4790 "aws.dynamodb.item_collection_metrics": { 4791 brief: "The JSON-serialized value of the `ItemCollectionMetrics` response field.", 4792 type: "string", 4793 applyScrubbing: { 4794 key: "manual" 4795 }, 4796 isInOtel: !0, 4797 visibility: "public", 4798 example: '{ "string" : [ { "ItemCollectionKey": { "string" : { "B": blob, "BOOL": boolean, "BS": [ blob ], "L": [ "AttributeValue" ], "M": { "string" : "AttributeValue" }, "N": "string", "NS": [ "string" ], "NULL": boolean, "S": "string", "SS": [ "string" ] } }, "SizeEstimateRangeGB": [ number ] } ] }', 4799 changelog: [ 4800 { 4801 version: "0.16.0", 4802 prs: [ 4803 479 4804 ], 4805 description: "Added aws.dynamodb.item_collection_metrics attribute" 4806 } 4807 ] 4808 }, 4809 "aws.dynamodb.limit": { 4810 brief: "The value of the `Limit` request parameter.", 4811 type: "integer", 4812 applyScrubbing: { 4813 key: "manual" 4814 }, 4815 isInOtel: !0, 4816 visibility: "public", 4817 example: 10, 4818 changelog: [ 4819 { 4820 version: "0.16.0", 4821 prs: [ 4822 479 4823 ], 4824 description: "Added aws.dynamodb.limit attribute" 4825 } 4826 ] 4827 }, 4828 "aws.dynamodb.local_secondary_indexes": { 4829 brief: "The JSON-serialized value of each item of the `LocalSecondaryIndexes` request field.", 4830 type: "string[]", 4831 applyScrubbing: { 4832 key: "manual" 4833 }, 4834 isInOtel: !0, 4835 visibility: "public", 4836 example: [ 4837 '{ "IndexArn": "string", "IndexName": "string", "IndexSizeBytes": number, "ItemCount": number, "KeySchema": [ { "AttributeName": "string", "KeyType": "string" } ], "Projection": { "NonKeyAttributes": [ "string" ], "ProjectionType": "string" } }' 4838 ], 4839 changelog: [ 4840 { 4841 version: "0.16.0", 4842 prs: [ 4843 479 4844 ], 4845 description: "Added aws.dynamodb.local_secondary_indexes attribute" 4846 } 4847 ] 4848 }, 4849 "aws.dynamodb.projection": { 4850 brief: "The value of the `ProjectionExpression` request parameter.", 4851 type: "string", 4852 applyScrubbing: { 4853 key: "manual" 4854 }, 4855 isInOtel: !0, 4856 visibility: "public", 4857 example: "Title, Price, Color", 4858 changelog: [ 4859 { 4860 version: "0.16.0", 4861 prs: [ 4862 479 4863 ], 4864 description: "Added aws.dynamodb.projection attribute" 4865 } 4866 ] 4867 }, 4868 "aws.dynamodb.provisioned_read_capacity": { 4869 brief: "The value of the `ProvisionedThroughput.ReadCapacityUnits` request parameter.", 4870 type: "double", 4871 applyScrubbing: { 4872 key: "manual" 4873 }, 4874 isInOtel: !0, 4875 visibility: "public", 4876 example: 1, 4877 changelog: [ 4878 { 4879 version: "0.16.0", 4880 prs: [ 4881 479 4882 ], 4883 description: "Added aws.dynamodb.provisioned_read_capacity attribute" 4884 } 4885 ] 4886 }, 4887 "aws.dynamodb.provisioned_write_capacity": { 4888 brief: "The value of the `ProvisionedThroughput.WriteCapacityUnits` request parameter.", 4889 type: "double", 4890 applyScrubbing: { 4891 key: "manual" 4892 }, 4893 isInOtel: !0, 4894 visibility: "public", 4895 example: 2, 4896 changelog: [ 4897 { 4898 version: "0.16.0", 4899 prs: [ 4900 479 4901 ], 4902 description: "Added aws.dynamodb.provisioned_write_capacity attribute" 4903 } 4904 ] 4905 }, 4906 "aws.dynamodb.scanned_count": { 4907 brief: "The value of the `ScannedCount` response parameter.", 4908 type: "integer", 4909 applyScrubbing: { 4910 key: "manual" 4911 }, 4912 isInOtel: !0, 4913 visibility: "public", 4914 example: 50, 4915 changelog: [ 4916 { 4917 version: "0.16.0", 4918 prs: [ 4919 479 4920 ], 4921 description: "Added aws.dynamodb.scanned_count attribute" 4922 } 4923 ] 4924 }, 4925 "aws.dynamodb.scan_forward": { 4926 brief: "The value of the `ScanIndexForward` request parameter.", 4927 type: "boolean", 4928 applyScrubbing: { 4929 key: "manual" 4930 }, 4931 isInOtel: !0, 4932 visibility: "public", 4933 example: !0, 4934 changelog: [ 4935 { 4936 version: "0.16.0", 4937 prs: [ 4938 479 4939 ], 4940 description: "Added aws.dynamodb.scan_forward attribute" 4941 } 4942 ] 4943 }, 4944 "aws.dynamodb.segment": { 4945 brief: "The value of the `Segment` request parameter.", 4946 type: "integer", 4947 applyScrubbing: { 4948 key: "manual" 4949 }, 4950 isInOtel: !0, 4951 visibility: "public", 4952 example: 10, 4953 changelog: [ 4954 { 4955 version: "0.16.0", 4956 prs: [ 4957 479 4958 ], 4959 description: "Added aws.dynamodb.segment attribute" 4960 } 4961 ] 4962 }, 4963 "aws.dynamodb.select": { 4964 brief: "The value of the `Select` request parameter.", 4965 type: "string", 4966 applyScrubbing: { 4967 key: "manual" 4968 }, 4969 isInOtel: !0, 4970 visibility: "public", 4971 example: "ALL_ATTRIBUTES", 4972 changelog: [ 4973 { 4974 version: "0.16.0", 4975 prs: [ 4976 479 4977 ], 4978 description: "Added aws.dynamodb.select attribute" 4979 } 4980 ] 4981 }, 4982 "aws.dynamodb.table_count": { 4983 brief: "The number of items in the `TableNames` response parameter.", 4984 type: "integer", 4985 applyScrubbing: { 4986 key: "manual" 4987 }, 4988 isInOtel: !0, 4989 visibility: "public", 4990 example: 20, 4991 changelog: [ 4992 { 4993 version: "0.16.0", 4994 prs: [ 4995 479 4996 ], 4997 description: "Added aws.dynamodb.table_count attribute" 4998 } 4999 ] 5000 }, 5001 "aws.dynamodb.table_names": { 5002 brief: "The keys in the `RequestItems` object field.", 5003 type: "string[]", 5004 applyScrubbing: { 5005 key: "manual" 5006 }, 5007 isInOtel: !0, 5008 visibility: "public", 5009 example: [ 5010 "Users", 5011 "Cats" 5012 ], 5013 changelog: [ 5014 { 5015 version: "0.16.0", 5016 prs: [ 5017 479 5018 ], 5019 description: "Added aws.dynamodb.table_names attribute" 5020 } 5021 ] 5022 }, 5023 "aws.dynamodb.total_segments": { 5024 brief: "The value of the `TotalSegments` request parameter.", 5025 type: "integer", 5026 applyScrubbing: { 5027 key: "manual" 5028 }, 5029 isInOtel: !0, 5030 visibility: "public", 5031 example: 100, 5032 changelog: [ 5033 { 5034 version: "0.16.0", 5035 prs: [ 5036 479 5037 ], 5038 description: "Added aws.dynamodb.total_segments attribute" 5039 } 5040 ] 5041 }, 5042 "aws.extended_request_id": { 5043 brief: "The AWS extended request ID as returned in the response headers.", 5044 type: "string", 5045 applyScrubbing: { 5046 key: "manual" 5047 }, 5048 isInOtel: !0, 5049 visibility: "public", 5050 example: "wzHcyEWfmOGDIE5QOhTAqFDoDWP3y8IUvpNINCwL9N4TEHbUw0/gZJ+VZTmCNCWR7fezEN3eCiQ=", 5051 aliases: [ 5052 "aws.request.extended_id" 5053 ], 5054 changelog: [ 5055 { 5056 version: "0.16.0", 5057 prs: [ 5058 480 5059 ], 5060 description: "Added aws.extended_request_id attribute" 5061 } 5062 ] 5063 }, 5064 "aws.kinesis.stream_name": { 5065 brief: "The name of the AWS Kinesis stream the request refers to.", 5066 type: "string", 5067 applyScrubbing: { 5068 key: "manual" 5069 }, 5070 isInOtel: !0, 5071 visibility: "public", 5072 example: "some-stream-name", 5073 aliases: [ 5074 "aws.kinesis.stream.name" 5075 ], 5076 changelog: [ 5077 { 5078 version: "0.16.0", 5079 prs: [ 5080 480 5081 ], 5082 description: "Added aws.kinesis.stream_name attribute" 5083 } 5084 ] 5085 }, 5086 "aws.kinesis.stream.name": { 5087 brief: "The name of the AWS Kinesis stream the request refers to.", 5088 type: "string", 5089 applyScrubbing: { 5090 key: "manual" 5091 }, 5092 isInOtel: !1, 5093 visibility: "public", 5094 example: "some-stream-name", 5095 deprecation: { 5096 replacement: "aws.kinesis.stream_name",
5097 reason: "This attribute is being deprecated in favor of aws.kinesis.stream_name, which is the OTel-aligned replacement." 5098 }, 5099 aliases: [ 5100 "aws.kinesis.stream_name" 5101 ], 5102 changelog: [ 5103 { 5104 version: "0.16.0", 5105 prs: [ 5106 480 5107 ], 5108 description: "Added aws.kinesis.stream.name attribute, deprecated in favor of aws.kinesis.stream_name" 5109 } 5110 ] 5111 }, 5112 "aws.lambda.aws_request_id": { 5113 brief: "The AWS request ID as received by the Lambda function runtime", 5114 type: "string", 5115 applyScrubbing: { 5116 key: "manual" 5117 }, 5118 isInOtel: !1, 5119 visibility: "public", 5120 example: "8476a536-e9f4-11e8-9739-2dfe598c3fcd", 5121 deprecation: { 5122 replacement: "faas.invocation_id", 5123 reason: "This attribute is being deprecated in favor of faas.invocation_id" 5124 }, 5125 aliases: [ 5126 "faas.invocation_id", 5127 "faas.execution" 5128 ], 5129 changelog: [ 5130 { 5131 version: "0.16.0", 5132 prs: [ 5133 473 5134 ], 5135 description: "Added faas.execution as an alias" 5136 }, 5137 { 5138 version: "0.11.1", 5139 prs: [ 5140 414, 5141 424 5142 ], 5143 description: "Deprecated aws.lambda.aws_request_id in favor of faas.invocation_id" 5144 }, 5145 { 5146 version: "0.7.0", 5147 prs: [ 5148 369 5149 ], 5150 description: "Added aws.lambda.aws_request_id attribute" 5151 } 5152 ] 5153 }, 5154 "aws.lambda.execution_duration_in_millis": { 5155 brief: "The execution duration of the Lambda function invocation in milliseconds", 5156 type: "double", 5157 applyScrubbing: { 5158 key: "manual" 5159 }, 5160 isInOtel: !1, 5161 visibility: "public", 5162 example: 1234.56, 5163 changelog: [ 5164 { 5165 version: "0.7.0", 5166 prs: [ 5167 369 5168 ], 5169 description: "Added aws.lambda.execution_duration_in_millis attribute" 5170 } 5171 ] 5172 }, 5173 "aws.lambda.function_name": { 5174 brief: "The name of the Lambda function", 5175 type: "string", 5176 applyScrubbing: { 5177 key: "manual" 5178 }, 5179 isInOtel: !1, 5180 visibility: "public", 5181 example: "my-function", 5182 deprecation: { 5183 replacement: "faas.name", 5184 reason: "Use the OTel-aligned faas.name attribute instead" 5185 }, 5186 aliases: [ 5187 "faas.name" 5188 ], 5189 changelog: [ 5190 { 5191 version: "0.11.1", 5192 prs: [ 5193 414 5194 ], 5195 description: "Deprecated aws.lambda.function_name in favor of faas.name" 5196 }, 5197 { 5198 version: "0.7.0", 5199 prs: [ 5200 369 5201 ], 5202 description: "Added aws.lambda.function_name attribute" 5203 } 5204 ] 5205 }, 5206 "aws.lambda.function_version": { 5207 brief: "The version of the Lambda function", 5208 type: "string", 5209 applyScrubbing: { 5210 key: "manual" 5211 }, 5212 isInOtel: !1, 5213 visibility: "public", 5214 example: "$LATEST", 5215 deprecation: { 5216 replacement: "faas.version", 5217 reason: "Use the OTel-aligned faas.version attribute instead" 5218 }, 5219 aliases: [ 5220 "faas.version" 5221 ], 5222 changelog: [ 5223 { 5224 version: "0.11.1", 5225 prs: [ 5226 414, 5227 424 5228 ], 5229 description: "Deprecated aws.lambda.function_version in favor of faas.version" 5230 }, 5231 { 5232 version: "0.7.0", 5233 prs: [ 5234 369 5235 ], 5236 description: "Added aws.lambda.function_version attribute" 5237 } 5238 ] 5239 }, 5240 "aws.lambda.invoked_arn": { 5241 brief: "The full ARN of the Lambda function that was invoked", 5242 type: "string", 5243 applyScrubbing: { 5244 key: "manual" 5245 }, 5246 isInOtel: !0, 5247 visibility: "public", 5248 example: "arn:aws:lambda:us-east-1:123456789012:function:my-function", 5249 aliases: [ 5250 "aws.lambda.invoked_function_arn" 5251 ], 5252 changelog: [ 5253 { 5254 version: "0.11.1", 5255 prs: [ 5256 414 5257 ] 5258 } 5259 ] 5260 }, 5261 "aws.lambda.invoked_function_arn": { 5262 brief: "The full ARN of the Lambda function that was invoked", 5263 type: "string", 5264 applyScrubbing: { 5265 key: "manual" 5266 }, 5267 isInOtel: !1, 5268 visibility: "public", 5269 example: "arn:aws:lambda:us-east-1:123456789012:function:my-function", 5270 deprecation: { 5271 replacement: "aws.lambda.invoked_arn",
5272 reason: "This attribute is being deprecated in favor of aws.lambda.invoked_arn" 5273 }, 5274 aliases: [ 5275 "aws.lambda.invoked_arn" 5276 ], 5277 changelog: [ 5278 { 5279 version: "0.11.1", 5280 prs: [ 5281 414 5282 ], 5283 description: "Deprecated aws.lambda.invoked_function_arn in favor of aws.lambda.invoked_arn" 5284 }, 5285 { 5286 version: "0.7.0", 5287 prs: [ 5288 369 5289 ], 5290 description: "Added aws.lambda.invoked_function_arn attribute" 5291 } 5292 ] 5293 }, 5294 "aws.lambda.remaining_time_in_millis": { 5295 brief: "The remaining time in milliseconds before the Lambda function times out", 5296 type: "double", 5297 applyScrubbing: { 5298 key: "manual" 5299 }, 5300 isInOtel: !1, 5301 visibility: "public", 5302 example: 5e3, 5303 changelog: [ 5304 { 5305 version: "0.7.0", 5306 prs: [ 5307 369 5308 ], 5309 description: "Added aws.lambda.remaining_time_in_millis attribute" 5310 } 5311 ] 5312 }, 5313 "aws.log.group.names": { 5314 brief: "The name(s) of the AWS log group(s) an application is writing to.", 5315 type: "string[]", 5316 applyScrubbing: { 5317 key: "manual" 5318 }, 5319 isInOtel: !0, 5320 visibility: "public", 5321 example: [ 5322 "/aws/lambda/my-function", 5323 "opentelemetry-service" 5324 ], 5325 changelog: [ 5326 { 5327 version: "0.11.1", 5328 prs: [ 5329 414 5330 ] 5331 } 5332 ] 5333 }, 5334 "aws.log.stream.names": { 5335 brief: "The name(s) of the AWS log stream(s) an application is writing to.", 5336 type: "string[]", 5337 applyScrubbing: { 5338 key: "manual" 5339 }, 5340 isInOtel: !0, 5341 visibility: "public", 5342 example: [ 5343 "logs/main/10838bed-421f-43ef-870a-f43feacbbb5b" 5344 ], 5345 changelog: [ 5346 { 5347 version: "0.11.1", 5348 prs: [ 5349 414 5350 ] 5351 } 5352 ] 5353 }, 5354 "aws.request.extended_id": { 5355 brief: "The AWS extended request ID as returned in the response headers.", 5356 type: "string", 5357 applyScrubbing: { 5358 key: "manual" 5359 }, 5360 isInOtel: !1, 5361 visibility: "public", 5362 example: "wzHcyEWfmOGDIE5QOhTAqFDoDWP3y8IUvpNINCwL9N4TEHbUw0/gZJ+VZTmCNCWR7fezEN3eCiQ=", 5363 deprecation: { 5364 replacement: "aws.extended_request_id",
5365 reason: "This attribute is being deprecated in favor of aws.extended_request_id, which is the OTel-aligned replacement." 5366 }, 5367 aliases: [ 5368 "aws.extended_request_id" 5369 ], 5370 changelog: [ 5371 { 5372 version: "0.16.0", 5373 prs: [ 5374 480 5375 ], 5376 description: "Added aws.request.extended_id attribute, deprecated in favor of aws.extended_request_id" 5377 } 5378 ] 5379 }, 5380 "aws.request_id": { 5381 brief: "The AWS request ID as returned in the response headers.", 5382 type: "string", 5383 applyScrubbing: { 5384 key: "manual" 5385 }, 5386 isInOtel: !0, 5387 visibility: "public", 5388 example: "79b9da39-b7ae-508a-a6bc-864b2829c622", 5389 aliases: [ 5390 "aws.request.id" 5391 ], 5392 changelog: [ 5393 { 5394 version: "0.16.0", 5395 prs: [ 5396 480 5397 ], 5398 description: "Added aws.request_id attribute" 5399 } 5400 ] 5401 }, 5402 "aws.request.id": { 5403 brief: "The AWS request ID as returned in the response headers.", 5404 type: "string", 5405 applyScrubbing: { 5406 key: "manual" 5407 }, 5408 isInOtel: !1, 5409 visibility: "public", 5410 example: "79b9da39-b7ae-508a-a6bc-864b2829c622", 5411 deprecation: { 5412 replacement: "aws.request_id",
5413 reason: "This attribute is being deprecated in favor of aws.request_id, which is the OTel-aligned replacement." 5414 }, 5415 aliases: [ 5416 "aws.request_id" 5417 ], 5418 changelog: [ 5419 { 5420 version: "0.16.0", 5421 prs: [ 5422 480 5423 ], 5424 description: "Added aws.request.id attribute, deprecated in favor of aws.request_id" 5425 } 5426 ] 5427 }, 5428 "aws.s3.bucket": { 5429 brief: "The S3 bucket name the request refers to.", 5430 type: "string", 5431 applyScrubbing: { 5432 key: "manual" 5433 }, 5434 isInOtel: !0, 5435 visibility: "public", 5436 example: "ot-demo-test", 5437 changelog: [ 5438 { 5439 version: "0.16.0", 5440 prs: [ 5441 480 5442 ], 5443 description: "Added aws.s3.bucket attribute" 5444 } 5445 ] 5446 }, 5447 "aws.secretsmanager.secret.arn": { 5448 brief: "The ARN of the Secret stored in Secrets Manager.", 5449 type: "string", 5450 applyScrubbing: { 5451 key: "manual" 5452 }, 5453 isInOtel: !0, 5454 visibility: "public", 5455 example: "arn:aws:secretsmanager:us-east-1:123456789012:secret:SecretName-6RandomCharacters", 5456 changelog: [ 5457 { 5458 version: "0.16.0", 5459 prs: [ 5460 480 5461 ], 5462 description: "Added aws.secretsmanager.secret.arn attribute" 5463 } 5464 ] 5465 }, 5466 "aws.sns.topic.arn": { 5467 brief: "The ARN of the AWS SNS Topic. An Amazon SNS topic is a logical access point that acts as a communication channel.", 5468 type: "string", 5469 applyScrubbing: { 5470 key: "manual" 5471 }, 5472 isInOtel: !0, 5473 visibility: "public", 5474 example: "arn:aws:sns:us-east-1:123456789012:mystack-mytopic-NZJ5JSMVGFIE", 5475 changelog: [ 5476 { 5477 version: "0.16.0", 5478 prs: [ 5479 480 5480 ], 5481 description: "Added aws.sns.topic.arn attribute" 5482 } 5483 ] 5484 }, 5485 "aws.step_functions.activity.arn": { 5486 brief: "The ARN of the AWS Step Functions Activity.", 5487 type: "string", 5488 applyScrubbing: { 5489 key: "manual" 5490 }, 5491 isInOtel: !0, 5492 visibility: "public", 5493 example: "arn:aws:states:us-east-1:123456789012:activity:get-greeting", 5494 changelog: [ 5495 { 5496 version: "0.16.0", 5497 prs: [ 5498 480 5499 ], 5500 description: "Added aws.step_functions.activity.arn attribute" 5501 } 5502 ] 5503 }, 5504 "aws.step_functions.state_machine.arn": { 5505 brief: "The ARN of the AWS Step Functions State Machine.", 5506 type: "string", 5507 applyScrubbing: { 5508 key: "manual" 5509 }, 5510 isInOtel: !0, 5511 visibility: "public", 5512 example: "arn:aws:states:us-east-1:123456789012:stateMachine:myStateMachine:1", 5513 changelog: [ 5514 { 5515 version: "0.16.0", 5516 prs: [ 5517 480 5518 ], 5519 description: "Added aws.step_functions.state_machine.arn attribute" 5520 } 5521 ] 5522 }, 5523 blocked_main_thread: { 5524 brief: "Whether the main thread was blocked by the span.", 5525 type: "boolean", 5526 applyScrubbing: { 5527 key: "manual" 5528 }, 5529 isInOtel: !1, 5530 visibility: "public", 5531 example: !0, 5532 changelog: [ 5533 { 5534 version: "0.0.0" 5535 } 5536 ] 5537 }, 5538 "browser.name": { 5539 brief: "The name of the browser.", 5540 type: "string", 5541 applyScrubbing: { 5542 key: "manual" 5543 }, 5544 isInOtel: !1, 5545 visibility: "public", 5546 example: "Chrome", 5547 aliases: [ 5548 "sentry.browser.name" 5549 ], 5550 changelog: [ 5551 { 5552 version: "0.1.0", 5553 prs: [ 5554 127, 5555 139 5556 ] 5557 }, 5558 { 5559 version: "0.0.0" 5560 } 5561 ] 5562 }, 5563 "browser.performance.navigation.activation_start": { 5564 brief: "The time between initiating a navigation to a page and the browser activating the page", 5565 type: "double", 5566 applyScrubbing: { 5567 key: "manual" 5568 }, 5569 isInOtel: !1, 5570 visibility: "public", 5571 example: 1.983, 5572 aliases: [ 5573 "performance.activationStart" 5574 ], 5575 changelog: [ 5576 { 5577 version: "0.5.0", 5578 prs: [ 5579 321 5580 ], 5581 description: "Added browser.performance.navigation.activation_start attribute" 5582 } 5583 ] 5584 }, 5585 "browser.performance.time_origin": { 5586 brief: "The browser's performance.timeOrigin timestamp representing the time when the pageload was initiated", 5587 type: "double", 5588 applyScrubbing: { 5589 key: "manual" 5590 }, 5591 isInOtel: !1, 5592 visibility: "public", 5593 example: 1776185678886e-3, 5594 aliases: [ 5595 "performance.timeOrigin" 5596 ], 5597 changelog: [ 5598 { 5599 version: "0.5.0", 5600 prs: [ 5601 321 5602 ], 5603 description: "Added browser.performance.time_origin attribute attribute" 5604 } 5605 ] 5606 }, 5607 "browser.report.type": { 5608 brief: "A browser report sent via reporting API..", 5609 type: "string", 5610 applyScrubbing: { 5611 key: "manual" 5612 }, 5613 isInOtel: !1, 5614 visibility: "public", 5615 example: "network-error", 5616 changelog: [ 5617 { 5618 version: "0.1.0", 5619 prs: [ 5620 68, 5621 127 5622 ] 5623 } 5624 ] 5625 }, 5626 "browser.script.invoker": {
5627 brief: "How a script was called in the browser.", 5628 type: "string", 5629 applyScrubbing: { 5630 key: "manual" 5631 }, 5632 isInOtel: !1, 5633 visibility: "public", 5634 example: "Window.requestAnimationFrame", 5635 changelog: [ 5636 { 5637 version: "0.1.0", 5638 prs: [ 5639 127 5640 ] 5641 }, 5642 { 5643 version: "0.0.0" 5644 } 5645 ] 5646 }, 5647 "browser.script.invoker_type": { 5648 brief: "Browser script entry point type.", 5649 type: "string", 5650 applyScrubbing: { 5651 key: "manual" 5652 }, 5653 isInOtel: !1, 5654 visibility: "public", 5655 example: "event-listener", 5656 changelog: [ 5657 { 5658 version: "0.1.0", 5659 prs: [ 5660 127 5661 ] 5662 }, 5663 { 5664 version: "0.0.0" 5665 } 5666 ] 5667 }, 5668 "browser.script.source_char_position": { 5669 brief: "A number representing the script character position of the script.", 5670 type: "integer", 5671 applyScrubbing: { 5672 key: "manual" 5673 }, 5674 isInOtel: !1, 5675 visibility: "public", 5676 example: 678, 5677 changelog: [ 5678 { 5679 version: "0.4.0", 5680 prs: [ 5681 228 5682 ] 5683 }, 5684 { 5685 version: "0.0.0" 5686 } 5687 ] 5688 }, 5689 "browser.version": { 5690 brief: "The version of the browser.", 5691 type: "string", 5692 applyScrubbing: { 5693 key: "manual" 5694 }, 5695 isInOtel: !1, 5696 visibility: "public", 5697 example: "120.0.6099.130", 5698 aliases: [ 5699 "sentry.browser.version" 5700 ], 5701 changelog: [ 5702 { 5703 version: "0.1.0", 5704 prs: [ 5705 59, 5706 127, 5707 139 5708 ] 5709 } 5710 ] 5711 }, 5712 "browser.web_vital.cls.report_event": { 5713 brief: "The event that caused the SDK to report CLS (pagehide or navigation)", 5714 type: "string", 5715 applyScrubbing: { 5716 key: "manual" 5717 }, 5718 isInOtel: !1, 5719 visibility: "public", 5720 example: "navigation", 5721 changelog: [ 5722 { 5723 version: "0.5.0", 5724 prs: [ 5725 319 5726 ], 5727 description: "Added browser.web_vital.cls.report_event attribute" 5728 } 5729 ] 5730 }, 5731 "browser.web_vital.cls.source.<key>": { 5732 brief: "The HTML elements or components responsible for the layout shift. <key> is a numeric index from 1 to N", 5733 type: "string", 5734 applyScrubbing: { 5735 key: "manual" 5736 }, 5737 isInOtel: !1, 5738 visibility: "public", 5739 hasDynamicSuffix: !0, 5740 example: "body > div#app", 5741 aliases: [ 5742 "cls.source.<key>" 5743 ], 5744 changelog: [ 5745 { 5746 version: "0.5.0", 5747 prs: [ 5748 234 5749 ] 5750 } 5751 ] 5752 }, 5753 "browser.web_vital.cls.value": { 5754 brief: "The value of the recorded Cumulative Layout Shift (CLS) web vital", 5755 type: "double", 5756 applyScrubbing: { 5757 key: "manual" 5758 }, 5759 isInOtel: !1, 5760 visibility: "public", 5761 example: .2361, 5762 aliases: [ 5763 "cls" 5764 ], 5765 changelog: [ 5766 { 5767 version: "0.5.0", 5768 prs: [ 5769 229 5770 ], 5771 description: "Added browser.web_vital.cls.value attribute" 5772 } 5773 ] 5774 }, 5775 "browser.web_vital.fcp.value": { 5776 brief: "The time it takes for the browser to render the first piece of meaningful content on the screen", 5777 type: "double", 5778 applyScrubbing: { 5779 key: "manual" 5780 }, 5781 isInOtel: !1, 5782 visibility: "public", 5783 example: 547.6951, 5784 aliases: [ 5785 "fcp" 5786 ], 5787 changelog: [ 5788 { 5789 version: "0.5.0", 5790 prs: [ 5791 235 5792 ] 5793 } 5794 ] 5795 }, 5796 "browser.web_vital.fp.value": { 5797 brief: "The time in milliseconds it takes for the browser to render the first pixel on the screen", 5798 type: "double", 5799 applyScrubbing: { 5800 key: "manual" 5801 }, 5802 isInOtel: !1, 5803 visibility: "public", 5804 example: 477.1926, 5805 aliases: [ 5806 "fp" 5807 ], 5808 changelog: [ 5809 { 5810 version: "0.5.0", 5811 prs: [ 5812 235 5813 ] 5814 } 5815 ] 5816 }, 5817 "browser.web_vital.inp.value": { 5818 brief: "The value of the recorded Interaction to Next Paint (INP) web vital", 5819 type: "double", 5820 applyScrubbing: { 5821 key: "manual" 5822 }, 5823 isInOtel: !1, 5824 visibility: "public", 5825 example: 200, 5826 aliases: [ 5827 "inp" 5828 ], 5829 changelog: [ 5830 { 5831 version: "0.5.0", 5832 prs: [ 5833 229 5834 ], 5835 description: "Added browser.web_vital.inp.value attribute" 5836 } 5837 ] 5838 }, 5839 "browser.web_vital.lcp.element": { 5840 brief: "The HTML element selector or component name for which LCP was reported", 5841 type: "string", 5842 applyScrubbing: { 5843 key: "manual" 5844 }, 5845 isInOtel: !1, 5846 visibility: "public", 5847 example: "body > div#app > div#container > div", 5848 aliases: [ 5849 "lcp.element" 5850 ], 5851 changelog: [ 5852 { 5853 version: "0.5.0", 5854 prs: [ 5855 233 5856 ] 5857 } 5858 ] 5859 }, 5860 "browser.web_vital.lcp.id": { 5861 brief: "The id of the dom element responsible for the largest contentful paint", 5862 type: "string", 5863 applyScrubbing: { 5864 key: "manual" 5865 }, 5866 isInOtel: !1, 5867 visibility: "public", 5868 example: "#gero", 5869 aliases: [ 5870 "lcp.id" 5871 ], 5872 changelog: [ 5873 { 5874 version: "0.5.0", 5875 prs: [ 5876 233 5877 ] 5878 } 5879 ] 5880 }, 5881 "browser.web_vital.lcp.load_time": { 5882 brief: "The time it took for the LCP element to be loaded", 5883 type: "integer", 5884 applyScrubbing: { 5885 key: "manual" 5886 }, 5887 isInOtel: !1, 5888 visibility: "public", 5889 example: 1402, 5890 aliases: [ 5891 "lcp.loadTime" 5892 ], 5893 changelog: [ 5894 { 5895 version: "0.5.0", 5896 prs: [ 5897 233 5898 ] 5899 } 5900 ] 5901 }, 5902 "browser.web_vital.lcp.render_time": { 5903 brief: "The time it took for the LCP element to be rendered", 5904 type: "integer", 5905 applyScrubbing: { 5906 key: "manual" 5907 }, 5908 isInOtel: !1, 5909 visibility: "public", 5910 example: 1685, 5911 aliases: [ 5912 "lcp.renderTime" 5913 ], 5914 changelog: [ 5915 { 5916 version: "0.5.0", 5917 prs: [ 5918 233 5919 ] 5920 } 5921 ] 5922 }, 5923 "browser.web_vital.lcp.report_event": { 5924 brief: "The event that caused the SDK to report LCP (pagehide or navigation)", 5925 type: "string", 5926 applyScrubbing: { 5927 key: "manual" 5928 }, 5929 isInOtel: !1, 5930 visibility: "public", 5931 example: "pagehide", 5932 changelog: [ 5933 { 5934 version: "0.5.0", 5935 prs: [ 5936 319 5937 ], 5938 description: "Added browser.web_vital.lcp.report_event attribute" 5939 } 5940 ] 5941 }, 5942 "browser.web_vital.lcp.size": { 5943 brief: "The size of the largest contentful paint element", 5944 type: "integer", 5945 applyScrubbing: { 5946 key: "manual" 5947 }, 5948 isInOtel: !1, 5949 visibility: "public", 5950 example: 1024, 5951 aliases: [ 5952 "lcp.size" 5953 ], 5954 changelog: [ 5955 { 5956 version: "0.5.0", 5957 prs: [ 5958 233 5959 ] 5960 } 5961 ] 5962 }, 5963 "browser.web_vital.lcp.url": { 5964 brief: "The url of the dom element responsible for the largest contentful paint", 5965 type: "string", 5966 applyScrubbing: { 5967 key: "auto" 5968 }, 5969 isInOtel: !1, 5970 visibility: "public", 5971 example: "https://example.com/static/img.png", 5972 aliases: [ 5973 "lcp.url" 5974 ], 5975 changelog: [ 5976 { 5977 version: "0.5.0", 5978 prs: [ 5979 233 5980 ] 5981 } 5982 ] 5983 }, 5984 "browser.web_vital.lcp.value": { 5985 brief: "The value of the recorded Largest Contentful Paint (LCP) web vital", 5986 type: "double", 5987 applyScrubbing: { 5988 key: "manual" 5989 }, 5990 isInOtel: !1, 5991 visibility: "public", 5992 example: 2500, 5993 aliases: [ 5994 "lcp" 5995 ], 5996 changelog: [ 5997 { 5998 version: "0.5.0", 5999 prs: [ 6000 229 6001 ], 6002 description: "Added browser.web_vital.lcp.value attribute" 6003 } 6004 ] 6005 }, 6006 "browser.web_vital.ttfb.request_time": { 6007 brief: "The time it takes for the server to process the initial request and send the first byte of a response to the user's browser", 6008 type: "double", 6009 applyScrubbing: { 6010 key: "manual" 6011 }, 6012 isInOtel: !1, 6013 visibility: "public", 6014 example: 1554.5814, 6015 aliases: [ 6016 "ttfb.requestTime" 6017 ], 6018 changelog: [ 6019 { 6020 version: "0.5.0", 6021 prs: [ 6022 235 6023 ] 6024 } 6025 ] 6026 }, 6027 "browser.web_vital.ttfb.value": { 6028 brief: "The value of the recorded Time To First Byte (TTFB) web vital in Milliseconds", 6029 type: "double", 6030 applyScrubbing: { 6031 key: "manual" 6032 }, 6033 isInOtel: !1, 6034 visibility: "public", 6035 example: 194.3322, 6036 aliases: [ 6037 "ttfb" 6038 ], 6039 changelog: [ 6040 { 6041 version: "0.5.0", 6042 prs: [ 6043 235 6044 ] 6045 } 6046 ] 6047 }, 6048 "cache.hit": { 6049 brief: "If the cache was hit during this span.", 6050 type: "boolean", 6051 applyScrubbing: { 6052 key: "manual" 6053 }, 6054 isInOtel: !1, 6055 visibility: "public", 6056 example: !0, 6057 changelog: [ 6058 { 6059 version: "0.0.0" 6060 } 6061 ] 6062 }, 6063 "cache.item_size": { 6064 brief: "The size of the requested item in the cache. In bytes.", 6065 type: "integer", 6066 applyScrubbing: { 6067 key: "manual" 6068 }, 6069 isInOtel: !1, 6070 visibility: "public", 6071 example: 58, 6072 changelog: [ 6073 { 6074 version: "0.4.0", 6075 prs: [ 6076 228 6077 ] 6078 }, 6079 { 6080 version: "0.0.0" 6081 } 6082 ] 6083 }, 6084 "cache.key": { 6085 brief: "The key of the cache accessed.", 6086 type: "string[]", 6087 applyScrubbing: { 6088 key: "manual" 6089 }, 6090 isInOtel: !1, 6091 visibility: "public", 6092 example: [ 6093 "my-cache-key", 6094 "my-other-cache-key" 6095 ], 6096 changelog: [ 6097 { 6098 version: "0.0.0" 6099 } 6100 ] 6101 }, 6102 "cache.operation": { 6103 brief: "The operation being performed on the cache.", 6104 type: "string", 6105 applyScrubbing: { 6106 key: "manual" 6107 }, 6108 isInOtel: !1, 6109 visibility: "public", 6110 example: "get", 6111 changelog: [ 6112 { 6113 version: "0.1.0", 6114 prs: [ 6115 127 6116 ] 6117 }, 6118 { 6119 version: "0.0.0" 6120 } 6121 ] 6122 }, 6123 "cache.ttl": { 6124 brief: "The ttl of the cache in seconds", 6125 type: "integer", 6126 applyScrubbing: { 6127 key: "manual" 6128 }, 6129 isInOtel: !1, 6130 visibility: "public", 6131 example: 120, 6132 changelog: [ 6133 { 6134 version: "0.4.0", 6135 prs: [ 6136 228 6137 ] 6138 }, 6139 { 6140 version: "0.0.0" 6141 } 6142 ] 6143 }, 6144 "cache.write": { 6145 brief: "If the cache operation resulted in a write to the cache.", 6146 type: "boolean", 6147 applyScrubbing: { 6148 key: "manual" 6149 }, 6150 isInOtel: !1, 6151 visibility: "public", 6152 example: !0, 6153 changelog: [ 6154 { 6155 version: "0.5.0" 6156 } 6157 ] 6158 }, 6159 channel: { 6160 brief: "The channel name that is being used.", 6161 type: "string", 6162 applyScrubbing: { 6163 key: "manual" 6164 }, 6165 isInOtel: !1, 6166 visibility: "public", 6167 example: "mail", 6168 changelog: [ 6169 { 6170 version: "0.1.0", 6171 prs: [ 6172 127 6173 ] 6174 }, 6175 { 6176 version: "0.0.0" 6177 } 6178 ] 6179 }, 6180 "client.address": { 6181 brief: "Client address - domain name if available without reverse DNS lookup; otherwise, IP address or Unix domain socket name.", 6182 type: "string", 6183 applyScrubbing: { 6184 key: "auto" 6185 }, 6186 isInOtel: !0, 6187 visibility: "public", 6188 example: "example.com", 6189 aliases: [ 6190 "http.client_ip" 6191 ], 6192 changelog: [ 6193 { 6194 version: "0.1.0", 6195 prs: [ 6196 106, 6197 127 6198 ] 6199 }, 6200 { 6201 version: "0.0.0" 6202 } 6203 ] 6204 }, 6205 "client.port": { 6206 brief: "Client port number.", 6207 type: "integer", 6208 applyScrubbing: { 6209 key: "manual" 6210 }, 6211 isInOtel: !0, 6212 visibility: "public", 6213 example: 5432, 6214 changelog: [ 6215 { 6216 version: "0.4.0", 6217 prs: [ 6218 228 6219 ] 6220 }, 6221 { 6222 version: "0.0.0" 6223 } 6224 ] 6225 }, 6226 "cloudflare.d1.duration": { 6227 brief: "The duration of a Cloudflare D1 operation.", 6228 type: "integer", 6229 applyScrubbing: { 6230 key: "manual" 6231 }, 6232 isInOtel: !1, 6233 visibility: "public", 6234 example: 543, 6235 changelog: [ 6236 { 6237 version: "0.4.0", 6238 prs: [ 6239 228 6240 ] 6241 }, 6242 { 6243 version: "0.0.0" 6244 } 6245 ] 6246 }, 6247 "cloudflare.d1.query_type": { 6248 brief: "The type of query executed in a Cloudflare D1 operation", 6249 type: "string", 6250 applyScrubbing: { 6251 key: "manual" 6252 }, 6253 isInOtel: !1, 6254 visibility: "public", 6255 example: "run", 6256 deprecation: { 6257 replacement: "db.operation.name" 6258 }, 6259 aliases: [ 6260 "db.operation.name", 6261 "db.operation" 6262 ], 6263 changelog: [ 6264 { 6265 version: "0.11.0", 6266 prs: [ 6267 392 6268 ], 6269 description: "Added cloudflare.d1.query_type attribute" 6270 } 6271 ] 6272 }, 6273 "cloudflare.d1.rows_read": { 6274 brief: "The number of rows read in a Cloudflare D1 operation.", 6275 type: "integer", 6276 applyScrubbing: { 6277 key: "manual" 6278 }, 6279 isInOtel: !1, 6280 visibility: "public", 6281 example: 12, 6282 changelog: [ 6283 { 6284 version: "0.4.0", 6285 prs: [ 6286 228 6287 ] 6288 }, 6289 { 6290 version: "0.0.0" 6291 } 6292 ] 6293 }, 6294 "cloudflare.d1.rows_written": { 6295
6295 brief: "The number of rows written in a Cloudflare D1 operation.", 6296 type: "integer", 6297 applyScrubbing: { 6298 key: "manual" 6299 }, 6300 isInOtel: !1, 6301 visibility: "public", 6302 example: 12, 6303 changelog: [ 6304 { 6305 version: "0.4.0", 6306 prs: [ 6307 228 6308 ] 6309 }, 6310 { 6311 version: "0.0.0" 6312 } 6313 ] 6314 }, 6315 "cloudflare.durable_object.query.bindings": { 6316 brief: "The number of bound parameters passed to the SQL exec call.", 6317 type: "integer", 6318 applyScrubbing: { 6319 key: "manual" 6320 }, 6321 isInOtel: !1, 6322 visibility: "public", 6323 example: 2, 6324 changelog: [ 6325 { 6326 version: "0.13.0", 6327 prs: [ 6328 435 6329 ], 6330 description: "Added cloudflare.durable_object.query.bindings attribute" 6331 } 6332 ] 6333 }, 6334 "cloudflare.durable_object.response.rows_read": { 6335 brief: "The number of rows read by a Cloudflare Durable Object SQL operation.", 6336 type: "integer", 6337 applyScrubbing: { 6338 key: "manual" 6339 }, 6340 isInOtel: !1, 6341 visibility: "public", 6342 example: 12, 6343 changelog: [ 6344 { 6345 version: "0.13.0", 6346 prs: [ 6347 435 6348 ], 6349 description: "Added cloudflare.durable_object.response.rows_read attribute" 6350 } 6351 ] 6352 }, 6353 "cloudflare.durable_object.response.rows_written": { 6354 brief: "The number of rows written by a Cloudflare Durable Object SQL operation.", 6355 type: "integer", 6356 applyScrubbing: { 6357 key: "manual" 6358 }, 6359 isInOtel: !1, 6360 visibility: "public", 6361 example: 1, 6362 changelog: [ 6363 { 6364 version: "0.13.0", 6365 prs: [ 6366 435 6367 ], 6368 description: "Added cloudflare.durable_object.response.rows_written attribute" 6369 } 6370 ] 6371 }, 6372 "cloudflare.r2.bucket": { 6373 brief: "The name of the Cloudflare R2 bucket binding", 6374 type: "string", 6375 applyScrubbing: { 6376 key: "manual" 6377 }, 6378 isInOtel: !1, 6379 visibility: "public", 6380 example: "MY_BUCKET", 6381 changelog: [ 6382 { 6383 version: "0.11.1", 6384 prs: [ 6385 413 6386 ], 6387 description: "Added cloudflare.r2.bucket attribute" 6388 } 6389 ] 6390 }, 6391 "cloudflare.r2.operation": { 6392 brief: "The R2 API operation being performed", 6393 type: "string", 6394 applyScrubbing: { 6395 key: "manual" 6396 }, 6397 isInOtel: !1, 6398 visibility: "public", 6399 example: "GetObject", 6400 changelog: [ 6401 { 6402 version: "0.11.1", 6403 prs: [ 6404 413 6405 ], 6406 description: "Added cloudflare.r2.operation attribute" 6407 } 6408 ] 6409 }, 6410 "cloudflare.r2.request.delimiter": { 6411 brief: "The delimiter used to group objects in an R2 list operation", 6412 type: "string", 6413 applyScrubbing: { 6414 key: "manual" 6415 }, 6416 isInOtel: !1, 6417 visibility: "public", 6418 example: "/", 6419 changelog: [ 6420 { 6421 version: "0.11.1", 6422 prs: [ 6423 413 6424 ], 6425 description: "Added cloudflare.r2.request.delimiter attribute" 6426 } 6427 ] 6428 }, 6429 "cloudflare.r2.request.key": { 6430 brief: "The object key used in the R2 operation", 6431 type: "string", 6432 applyScrubbing: { 6433 key: "manual" 6434 }, 6435 isInOtel: !1, 6436 visibility: "public", 6437 example: "my-file.txt", 6438 changelog: [ 6439 { 6440 version: "0.11.1", 6441 prs: [ 6442 413 6443 ], 6444 description: "Added cloudflare.r2.request.key attribute" 6445 } 6446 ] 6447 }, 6448 "cloudflare.r2.request.part_number": { 6449 brief: "The part number in a multipart upload operation", 6450 type: "integer", 6451 applyScrubbing: { 6452 key: "manual" 6453 }, 6454 isInOtel: !1, 6455 visibility: "public", 6456 example: 1, 6457 changelog: [ 6458 { 6459 version: "0.11.1", 6460 prs: [ 6461 413 6462 ], 6463 description: "Added cloudflare.r2.request.part_number attribute" 6464 } 6465 ] 6466 }, 6467 "cloudflare.r2.request.prefix": { 6468 brief: "The prefix used to filter objects in an R2 list operation", 6469 type: "string", 6470 applyScrubbing: { 6471 key: "manual" 6472 }, 6473 isInOtel: !1, 6474 visibility: "public", 6475 example: "images/", 6476 changelog: [ 6477 { 6478 version: "0.11.1", 6479 prs: [ 6480 413 6481 ], 6482 description: "Added cloudflare.r2.request.prefix attribute" 6483 } 6484 ] 6485 }, 6486 "cloudflare.workflow.attempt": { 6487 brief: "The current attempt number for a Cloudflare Workflow step", 6488 type: "integer", 6489 applyScrubbing: { 6490 key: "manual" 6491 }, 6492 isInOtel: !1, 6493 visibility: "public", 6494 example: 1, 6495 changelog: [ 6496 { 6497 version: "0.11.0", 6498 prs: [ 6499 392 6500 ], 6501 description: "Added cloudflare.workflow.attempt attribute" 6502 } 6503 ] 6504 }, 6505 "cloudflare.workflow.retries.backoff": { 6506 brief: "The backoff strategy for Cloudflare Workflow step retries", 6507 type: "string", 6508 applyScrubbing: { 6509 key: "manual" 6510 }, 6511 isInOtel: !1, 6512 visibility: "public", 6513 example: "exponential", 6514 changelog: [ 6515 { 6516 version: "0.11.0", 6517 prs: [ 6518 392 6519 ], 6520 description: "Added cloudflare.workflow.retries.backoff attribute" 6521 } 6522 ] 6523 }, 6524 "cloudflare.workflow.retries.delay": { 6525 brief: "The delay between Cloudflare Workflow step retries", 6526 type: "string", 6527 applyScrubbing: { 6528 key: "manual" 6529 }, 6530 isInOtel: !1, 6531 visibility: "public", 6532 example: "5 seconds", 6533 changelog: [ 6534 { 6535 version: "0.11.0", 6536 prs: [ 6537 392 6538 ], 6539 description: "Added cloudflare.workflow.retries.delay attribute" 6540 } 6541 ] 6542 }, 6543 "cloudflare.workflow.retries.limit": { 6544 brief: "The maximum number of retries for a Cloudflare Workflow step", 6545 type: "integer", 6546 applyScrubbing: { 6547 key: "manual" 6548 }, 6549 isInOtel: !1, 6550 visibility: "public", 6551 example: 3, 6552 changelog: [ 6553 { 6554 version: "0.11.0", 6555 prs: [ 6556 392 6557 ], 6558 description: "Added cloudflare.workflow.retries.limit attribute" 6559 } 6560 ] 6561 }, 6562 "cloudflare.workflow.timeout": { 6563 brief: "The timeout duration for a Cloudflare Workflow step", 6564 type: "string", 6565 applyScrubbing: { 6566 key: "manual" 6567 }, 6568 isInOtel: !1, 6569 visibility: "public", 6570 example: "1 minute", 6571 changelog: [ 6572 { 6573 version: "0.11.0", 6574 prs: [ 6575 392 6576 ], 6577 description: "Added cloudflare.workflow.timeout attribute" 6578 } 6579 ] 6580 }, 6581 "cloud.account.id": { 6582 brief: "The cloud account ID the resource is assigned to", 6583 type: "string", 6584 applyScrubbing: { 6585 key: "manual" 6586 }, 6587 isInOtel: !0, 6588 visibility: "public", 6589 example: "123456789012", 6590 changelog: [ 6591 { 6592 version: "0.7.0", 6593 prs: [ 6594 364 6595 ], 6596 description: "Added cloud.account.id attribute" 6597 } 6598 ] 6599 }, 6600 "cloud.availability_zone": { 6601 brief: "Cloud regions often have multiple, isolated locations known as zones to increase availability", 6602 type: "string", 6603 applyScrubbing: { 6604 key: "manual" 6605 }, 6606 isInOtel: !0, 6607 visibility: "public", 6608 example: "us-east-1c", 6609 changelog: [ 6610 { 6611 version: "0.7.0", 6612 prs: [ 6613 364 6614 ], 6615 description: "Added cloud.availability_zone attribute" 6616 } 6617 ] 6618 }, 6619 "cloud.platform": { 6620 brief: "The cloud platform in use", 6621 type: "string", 6622 applyScrubbing: { 6623 key: "manual" 6624 }, 6625 isInOtel: !0, 6626 visibility: "public", 6627 example: "aws_lambda", 6628 changelog: [ 6629 { 6630 version: "0.7.0", 6631 prs: [ 6632 364 6633 ], 6634 description: "Added cloud.platform attribute" 6635 } 6636 ] 6637 }, 6638 "cloud.provider": { 6639 brief: "Name of the cloud provider", 6640 type: "string", 6641 applyScrubbing: { 6642 key: "manual" 6643 }, 6644 isInOtel: !0, 6645 visibility: "public", 6646 example: "aws", 6647 changelog: [ 6648 { 6649 version: "0.7.0", 6650 prs: [ 6651 364 6652 ], 6653 description: "Added cloud.provider attribute" 6654 } 6655 ] 6656 }, 6657 "cloud.region": { 6658 brief: "The geographical region the resource is running", 6659 type: "string", 6660 applyScrubbing: { 6661 key: "manual" 6662 }, 6663 isInOtel: !0, 6664 visibility: "public", 6665 example: "us-east-1", 6666 changelog: [ 6667 { 6668 version: "0.7.0", 6669 prs: [ 6670 364 6671 ], 6672 description: "Added cloud.region attribute" 6673 } 6674 ] 6675 }, 6676 "cloud.resource_id": { 6677 brief: "Cloud provider-specific native identifier of the monitored cloud resource", 6678 type: "string", 6679 applyScrubbing: { 6680 key: "manual" 6681 }, 6682 isInOtel: !0, 6683 visibility: "public", 6684 example: "arn:aws:lambda:REGION:ACCOUNT_ID:function:my-function", 6685 aliases: [ 6686 "faas.id" 6687 ], 6688 changelog: [ 6689 { 6690 version: "0.16.0", 6691 prs: [ 6692 475 6693 ], 6694 description: "Added faas.id as an alias" 6695 }, 6696 { 6697 version: "0.11.1", 6698 prs: [ 6699 414 6700 ] 6701 } 6702 ], 6703 additionalContext: [ 6704 "This can be an identifier for a resource in AWS, GCP, or Azure. There may be some overlap in values found here with other attributes. For instance, an AWS lambda ARN may be found here as well as in `aws.lambda.invoked_arn`. OTEL recommends setting them alongside each other." 6705 ] 6706 }, 6707 cls: { 6708 brief: "The value of the recorded Cumulative Layout Shift (CLS) web vital", 6709 type: "double", 6710 applyScrubbing: { 6711 key: "manual" 6712 }, 6713 isInOtel: !1, 6714 visibility: "public", 6715 example: .2361, 6716 deprecation: { 6717 replacement: "browser.web_vital.cls.value", 6718 reason: "The CLS web vital is now recorded as a browser.web_vital.cls.value attribute." 6719 }, 6720 aliases: [ 6721 "browser.web_vital.cls.value" 6722 ], 6723 changelog: [ 6724 { 6725 version: "0.5.0", 6726 prs: [ 6727 229 6728 ], 6729 description: "Added and deprecated attribute to document JS SDK's current behaviour" 6730 } 6731 ] 6732 }, 6733 "cls.source.<key>": { 6734 brief: "The HTML elements or components responsible for the layout shift. <key> is a numeric index from 1 to N", 6735 type: "string", 6736 applyScrubbing: { 6737 key: "manual" 6738 }, 6739 isInOtel: !1, 6740 visibility: "public", 6741 hasDynamicSuffix: !0, 6742 example: "body > div#app", 6743 deprecation: { 6744 replacement: "browser.web_vital.cls.source.<key>",
6745 reason: "The CLS source is now recorded as a browser.web_vital.cls.source.<key> attribute." 6746 }, 6747 aliases: [ 6748 "browser.web_vital.cls.source.<key>" 6749 ], 6750 changelog: [ 6751 { 6752 version: "0.5.0", 6753 prs: [ 6754 234 6755 ] 6756 } 6757 ] 6758 }, 6759 "code.filepath": { 6760 brief: "The source code file name that identifies the code unit as uniquely as possible (preferably an absolute file path).", 6761 type: "string", 6762 applyScrubbing: { 6763 key: "manual" 6764 }, 6765 isInOtel: !0, 6766 visibility: "public", 6767 example: "/app/myapplication/http/handler/server.py", 6768 deprecation: { 6769 replacement: "code.file.path" 6770 }, 6771 aliases: [ 6772 "code.file.path" 6773 ], 6774 changelog: [ 6775 { 6776 version: "0.1.0", 6777 prs: [ 6778 61 6779 ] 6780 }, 6781 { 6782 version: "0.0.0" 6783 } 6784 ] 6785 }, 6786 "code.file.path": { 6787 brief: "The source code file name that identifies the code unit as uniquely as possible (preferably an absolute file path).", 6788 type: "string", 6789 applyScrubbing: { 6790 key: "manual" 6791 }, 6792 isInOtel: !0, 6793 visibility: "public", 6794 example: "/app/myapplication/http/handler/server.py", 6795 aliases: [ 6796 "code.filepath" 6797 ], 6798 changelog: [ 6799 { 6800 version: "0.0.0" 6801 } 6802 ] 6803 }, 6804 "code.function": { 6805 brief: "The method or function name, or equivalent (usually rightmost part of the code unit's name).", 6806 type: "string", 6807 applyScrubbing: { 6808 key: "manual" 6809 }, 6810 isInOtel: !0, 6811 visibility: "public", 6812 example: "server_request", 6813 aliases: [ 6814 "code.function.name" 6815 ], 6816 changelog: [ 6817 { 6818 version: "0.1.0", 6819 prs: [ 6820 61, 6821 74 6822 ] 6823 }, 6824 { 6825 version: "0.0.0" 6826 } 6827 ] 6828 }, 6829 "code.function.name": { 6830 brief: "The method or function fully-qualified name without arguments.", 6831 type: "string", 6832 applyScrubbing: { 6833 key: "manual" 6834 }, 6835 isInOtel: !0, 6836 visibility: "public", 6837 example: "server_request", 6838 aliases: [ 6839 "code.function" 6840 ], 6841 changelog: [ 6842 { 6843 version: "0.1.0", 6844 prs: [ 6845 127 6846 ] 6847 }, 6848 { 6849 version: "0.0.0" 6850 } 6851 ] 6852 }, 6853 "code.lineno": { 6854 brief: "The line number in code.filepath best representing the operation. It SHOULD point within the code unit named in code.function", 6855 type: "integer", 6856 applyScrubbing: { 6857 key: "manual" 6858 }, 6859 isInOtel: !0, 6860 visibility: "public", 6861 example: 42, 6862 deprecation: { 6863 replacement: "code.line.number" 6864 }, 6865 aliases: [ 6866 "code.line.number" 6867 ], 6868 changelog: [ 6869 { 6870 version: "0.4.0", 6871 prs: [ 6872 228 6873 ] 6874 }, 6875 { 6876 version: "0.1.0", 6877 prs: [ 6878 61, 6879 108 6880 ] 6881 }, 6882 { 6883 version: "0.0.0" 6884 } 6885 ] 6886 }, 6887 "code.line.number": { 6888 brief: "The line number in code.filepath best representing the operation. It SHOULD point within the code unit named in code.function", 6889 type: "integer", 6890 applyScrubbing: { 6891 key: "manual" 6892 }, 6893 isInOtel: !0, 6894 visibility: "public", 6895 example: 42, 6896 aliases: [ 6897 "code.lineno" 6898 ], 6899 changelog: [ 6900 { 6901 version: "0.4.0", 6902 prs: [ 6903 228 6904 ] 6905 }, 6906 { 6907 version: "0.0.0" 6908 } 6909 ] 6910 }, 6911 "code.namespace": { 6912 brief: "The 'namespace' within which code.function is defined. Usually the qualified class or module name, such that code.namespace + some separator + code.function form a unique identifier for the code unit.", 6913 type: "string", 6914 applyScrubbing: { 6915 key: "manual" 6916 }, 6917 isInOtel: !0, 6918 visibility: "public", 6919 example: "http.handler", 6920 changelog: [ 6921 { 6922 version: "0.1.0", 6923 prs: [ 6924 61, 6925 74
6926 ] 6927 }, 6928 { 6929 version: "0.0.0" 6930 } 6931 ] 6932 }, 6933 connectionType: { 6934 brief: "Specifies the type of the current connection (e.g. wifi, ethernet, cellular , etc).", 6935 type: "string", 6936 applyScrubbing: { 6937 key: "manual" 6938 }, 6939 isInOtel: !1, 6940 visibility: "public", 6941 example: "wifi", 6942 deprecation: { 6943 replacement: "network.connection.type", 6944 reason: "Old namespace-less attribute, to be replaced with network.connection.type for span-first future" 6945 }, 6946 aliases: [ 6947 "network.connection.type", 6948 "device.connection_type" 6949 ], 6950 changelog: [ 6951 { 6952 version: "0.5.0", 6953 prs: [ 6954 279 6955 ], 6956 description: "Added and deprecated attribute to document JS SDK's current behaviour" 6957 } 6958 ] 6959 }, 6960 "connection.rtt": { 6961 brief: "Specifies the estimated effective round-trip time of the current connection, in milliseconds.", 6962 type: "integer", 6963 applyScrubbing: { 6964 key: "manual" 6965 }, 6966 isInOtel: !1, 6967 visibility: "public", 6968 example: 100, 6969 deprecation: { 6970 replacement: "network.connection.rtt", 6971 reason: "Old attribute name (no official namespace), to be replaced with network.connection.rtt for span-first future" 6972 }, 6973 aliases: [ 6974 "network.connection.rtt" 6975 ], 6976 changelog: [ 6977 { 6978 version: "0.5.0", 6979 prs: [ 6980 279 6981 ], 6982 description: "Added and deprecated attribute to document JS SDK's current behaviour" 6983 } 6984 ] 6985 }, 6986 "culture.calendar": { 6987 brief: "The calendar system used by the culture.", 6988 type: "string", 6989 applyScrubbing: { 6990 key: "manual" 6991 }, 6992 isInOtel: !1, 6993 visibility: "public", 6994 example: "GregorianCalendar", 6995 changelog: [ 6996 { 6997 version: "0.4.0", 6998 prs: [ 6999 243 7000 ] 7001 } 7002 ] 7003 }, 7004 "culture.display_name": { 7005 brief: "Human readable name of the culture.", 7006 type: "string", 7007 applyScrubbing: { 7008 key: "manual" 7009 }, 7010 isInOtel: !1, 7011 visibility: "public", 7012 example: "English (United States)", 7013 changelog: [ 7014 { 7015 version: "0.4.0", 7016 prs: [ 7017 243 7018 ] 7019 } 7020 ] 7021 }, 7022 "culture.is_24_hour_format": { 7023 brief: "Whether the culture uses 24-hour time format.", 7024 type: "boolean", 7025 applyScrubbing: { 7026 key: "manual" 7027 }, 7028 isInOtel: !1, 7029 visibility: "public", 7030 example: !0, 7031 changelog: [ 7032 { 7033 version: "0.4.0", 7034 prs: [ 7035 243 7036 ] 7037 } 7038 ] 7039 }, 7040 "culture.locale": { 7041 brief: "The locale identifier following RFC 4646.", 7042 type: "string", 7043 applyScrubbing: { 7044 key: "manual" 7045 }, 7046 isInOtel: !1, 7047 visibility: "public", 7048 example: "en-US", 7049 changelog: [ 7050 { 7051 version: "0.4.0", 7052 prs: [ 7053 243 7054 ] 7055 } 7056 ] 7057 }, 7058 "culture.timezone": { 7059 brief: "The timezone of the culture, as a geographic timezone identifier.", 7060 type: "string", 7061 applyScrubbing: { 7062 key: "manual" 7063 }, 7064 isInOtel: !1, 7065 visibility: "public", 7066 example: "Europe/Vienna", 7067 changelog: [ 7068 { 7069 version: "0.4.0", 7070 prs: [ 7071 243 7072 ] 7073 } 7074 ] 7075 }, 7076 "db.collection.name": { 7077 brief: "The name of a collection (table, container) within the database.", 7078 type: "string", 7079 applyScrubbing: { 7080 key: "manual" 7081 }, 7082 isInOtel: !0, 7083 visibility: "public", 7084 example: "users", 7085 changelog: [ 7086 { 7087 version: "0.1.0", 7088 prs: [ 7089 106, 7090 127 7091 ] 7092 }, 7093 { 7094 version: "0.0.0" 7095 } 7096 ] 7097 }, 7098 "db.driver.name": { 7099 brief: "The name of the driver used for the database connection.", 7100 type: "string", 7101 applyScrubbing: { 7102 key: "manual" 7103 }, 7104 isInOtel: !1, 7105 visibility: "public", 7106 example: "psycopg2", 7107 changelog: [ 7108 { 7109 version: "0.5.0", 7110 prs: [ 7111 297 7112 ], 7113 description: "Added db.driver.name attribute" 7114 } 7115 ] 7116 }, 7117 "db.name": { 7118 brief: "The name of the database being accessed.", 7119 type: "string", 7120 applyScrubbing: { 7121 key: "manual" 7122 }, 7123 isInOtel: !0, 7124 visibility: "public", 7125 example: "customers", 7126 deprecation: { 7127 replacement: "db.namespace" 7128 }, 7129 aliases: [ 7130 "db.namespace" 7131 ], 7132 changelog: [ 7133 { 7134 version: "0.1.0", 7135 prs: [ 7136 61, 7137 127 7138 ] 7139 }, 7140 { 7141 version: "0.0.0" 7142 } 7143 ] 7144 }, 7145 "db.namespace": { 7146 brief: "The name of the database being accessed.", 7147 type: "string", 7148 applyScrubbing: { 7149 key: "manual" 7150 }, 7151 isInOtel: !0, 7152 visibility: "public", 7153 example: "customers", 7154 aliases: [ 7155 "db.name" 7156 ], 7157 changelog: [ 7158 { 7159 version: "0.1.0", 7160 prs: [ 7161 127 7162 ] 7163 }, 7164 { 7165 version: "0.0.0" 7166 } 7167 ] 7168 }, 7169 "db.operation": { 7170 brief: "The name of the operation being executed.", 7171 type: "string", 7172 applyScrubbing: { 7173 key: "manual" 7174 }, 7175 isInOtel: !0, 7176 visibility: "public", 7177 example: "SELECT", 7178 deprecation: { 7179 replacement: "db.operation.name" 7180 }, 7181 aliases: [ 7182 "db.operation.name", 7183 "cloudflare.d1.query_type" 7184 ], 7185 changelog: [ 7186 { 7187 version: "0.4.0", 7188 prs: [ 7189 199 7190 ] 7191 }, 7192 { 7193 version: "0.1.0", 7194 prs: [ 7195 61, 7196 127 7197 ] 7198 }, 7199 { 7200 version: "0.0.0" 7201 } 7202 ] 7203 }, 7204 "db.operation.batch.size": { 7205 brief: "The number of queries included in a batch operation. Operations are only considered batches when they contain two or more operations, and so db.operation.batch.size SHOULD never be 1.", 7206 type: "integer", 7207 applyScrubbing: { 7208 key: "manual" 7209 }, 7210 isInOtel: !0, 7211 visibility: "public", 7212 example: 3, 7213 changelog: [ 7214 { 7215 version: "0.11.0", 7216 prs: [ 7217 407 7218 ], 7219 description: "Added db.operation.batch.size attribute" 7220 } 7221 ] 7222 }, 7223 "db.operation.name": { 7224 brief: "The name of the operation being executed.", 7225 type: "string", 7226 applyScrubbing: { 7227 key: "manual" 7228 }, 7229 isInOtel: !0, 7230 visibility: "public", 7231 example: "SELECT", 7232 aliases: [ 7233 "db.operation", 7234 "cloudflare.d1.query_type" 7235 ], 7236 changelog: [ 7237 { 7238 version: "0.1.0", 7239 prs: [ 7240 127 7241 ] 7242 }, 7243 { 7244 version: "0.0.0" 7245 } 7246 ] 7247 }, 7248 "db.query.parameter.<key>": { 7249 brief: "A query parameter used in db.query.text, with <key> being the parameter name, and the attribute value being a string representation of the parameter value.", 7250 type: "string", 7251 applyScrubbing: { 7252 key: "auto" 7253 }, 7254 isInOtel: !0, 7255 visibility: "public", 7256 hasDynamicSuffix: !0, 7257 example: "db.query.parameter.foo='123'", 7258 changelog: [ 7259 { 7260 version: "0.1.0", 7261 prs: [ 7262 103, 7263 127 7264 ] 7265 } 7266 ] 7267 }, 7268 "db.query.summary": { 7269 brief: "A shortened representation of operation(s) in the full query. This attribute must be low-cardinality and should only contain the operation table names.", 7270 type: "string", 7271 applyScrubbing: { 7272 key: "manual" 7273 }, 7274 isInOtel: !0, 7275 visibility: "public", 7276 example: "SELECT users", 7277 changelog: [ 7278 { 7279 version: "0.4.0", 7280 prs: [ 7281 208 7282 ] 7283 }, 7284 { 7285 version: "0.1.0", 7286 prs: [ 7287 127 7288 ] 7289 }, 7290 { 7291 version: "0.0.0" 7292 } 7293 ] 7294 }, 7295 "db.query.text": { 7296 brief: "The database parameterized query being executed. Any parameter values (filters, insertion values, etc) should be replaced with parameter placeholders. If applicable, use `db.query.parameter.<key>` to add the parameter value.", 7297 type: "string", 7298 applyScrubbing: { 7299 key: "manual" 7300 }, 7301 isInOtel: !0, 7302 visibility: "public",
7303 example: "SELECT * FROM users WHERE id = $1", 7304 aliases: [ 7305 "db.statement" 7306 ], 7307 changelog: [ 7308 { 7309 version: "0.4.0", 7310 prs: [ 7311 208 7312 ] 7313 }, 7314 { 7315 version: "0.1.0", 7316 prs: [ 7317 127 7318 ] 7319 }, 7320 { 7321 version: "0.0.0" 7322 } 7323 ] 7324 }, 7325 "db.redis.connection": { 7326 brief: "The redis connection name.", 7327 type: "string", 7328 applyScrubbing: { 7329 key: "manual" 7330 }, 7331 isInOtel: !1, 7332 visibility: "public", 7333 example: "my-redis-instance", 7334 changelog: [ 7335 { 7336 version: "0.1.0", 7337 prs: [ 7338 127 7339 ] 7340 }, 7341 { 7342 version: "0.0.0" 7343 } 7344 ] 7345 }, 7346 "db.redis.key": { 7347 brief: "The key the Redis command is operating on.", 7348 type: "string", 7349 applyScrubbing: { 7350 key: "manual" 7351 }, 7352 isInOtel: !1, 7353 visibility: "public", 7354 example: "user:2047:city", 7355 changelog: [ 7356 { 7357 version: "0.6.0", 7358 prs: [ 7359 326 7360 ], 7361 description: "Added db.redis.key attribute" 7362 } 7363 ] 7364 }, 7365 "db.redis.parameters": { 7366 brief: "The array of command parameters given to a redis command.", 7367 type: "string[]", 7368 applyScrubbing: { 7369 key: "auto" 7370 }, 7371 isInOtel: !1, 7372 visibility: "public", 7373 example: [ 7374 "test", 7375 "*" 7376 ], 7377 changelog: [ 7378 { 7379 version: "0.0.0" 7380 } 7381 ] 7382 }, 7383 "db.response.status_code": { 7384 brief: "Database response status code. The status code returned by the database. Usually it represents an error code, but may also represent partial success, warning, or differentiate between various types of successful outcomes.", 7385 type: "string", 7386 applyScrubbing: { 7387 key: "manual" 7388 }, 7389 isInOtel: !0, 7390 visibility: "public", 7391 example: "ORA-17002", 7392 changelog: [ 7393 { 7394 version: "0.16.0", 7395 prs: [ 7396 462 7397 ], 7398 description: "Added db.response.status_code attribute" 7399 } 7400 ] 7401 }, 7402 "db.sql.bindings": { 7403 brief: "The array of query bindings.", 7404 type: "string[]", 7405 applyScrubbing: { 7406 key: "auto" 7407 }, 7408 isInOtel: !1, 7409 visibility: "public", 7410 example: [ 7411 "1", 7412 "foo" 7413 ], 7414 deprecation: { 7415 replacement: "db.query.parameter.<key>", 7416 reason: "Instead of adding every binding in the db.sql.bindings attribute, add them as individual entires with db.query.parameter.<key>." 7417 }, 7418 changelog: [ 7419 { 7420 version: "0.1.0", 7421 prs: [ 7422 61 7423 ] 7424 }, 7425 { 7426 version: "0.0.0" 7427 } 7428 ] 7429 }, 7430 "db.statement": { 7431 brief: "The database statement being executed.", 7432 type: "string", 7433 applyScrubbing: { 7434 key: "auto" 7435 }, 7436 isInOtel: !0, 7437 visibility: "public", 7438 example: "SELECT * FROM users", 7439 deprecation: { 7440 replacement: "db.query.text" 7441 }, 7442 aliases: [ 7443 "db.query.text" 7444 ], 7445 changelog: [ 7446 { 7447 version: "0.4.0", 7448 prs: [ 7449 199 7450 ] 7451 }, 7452 { 7453 version: "0.1.0", 7454 prs: [ 7455 61, 7456 127 7457 ] 7458 }, 7459 { 7460 version: "0.0.0" 7461 } 7462 ] 7463 }, 7464 "db.stored_procedure.name": { 7465 brief: "The name of a stored procedure being called.", 7466 type: "string", 7467 applyScrubbing: { 7468 key: "manual" 7469 }, 7470 isInOtel: !0, 7471 visibility: "public", 7472 example: "GetUserById", 7473 changelog: [ 7474 { 7475 version: "0.11.0", 7476 prs: [ 7477 398 7478 ] 7479 } 7480 ] 7481 }, 7482 "db.system": { 7483 brief: "An identifier for the database management system (DBMS) product being used. See [OpenTelemetry docs](
7483https://github.com/open-telemetry/semantic-conventions/blob/main/docs/database/database-spans.md#notes-and-well-known-identifiers-for-dbsystem) for a list of well-known identifiers.", 7484 type: "string", 7485 applyScrubbing: { 7486 key: "manual" 7487 }, 7488 isInOtel: !0, 7489 visibility: "public", 7490 example: "postgresql", 7491 deprecation: { 7492 replacement: "db.system.name" 7493 }, 7494 aliases: [ 7495 "db.system.name" 7496 ], 7497 changelog: [ 7498 { 7499 version: "0.4.0", 7500 prs: [ 7501 199, 7502 224 7503 ] 7504 }, 7505 { 7506 version: "0.1.0", 7507 prs: [ 7508 61, 7509 127 7510 ] 7511 }, 7512 { 7513 version: "0.0.0" 7514 } 7515 ] 7516 }, 7517 "db.system.name": { 7518 brief: "An identifier for the database management system (DBMS) product being used. See [OpenTelemetry docs](https://github.com/open-telemetry/semantic-conventions/blob/main/docs/database/database-spans.md#notes-and-well-known-identifiers-for-dbsystem) for a list of well-known identifiers.", 7519 type: "string", 7520 applyScrubbing: { 7521 key: "manual" 7522 }, 7523 isInOtel: !0, 7524 visibility: "public", 7525 example: "postgresql", 7526 aliases: [ 7527 "db.system" 7528 ], 7529 changelog: [ 7530 { 7531 version: "0.1.0", 7532 prs: [ 7533 127 7534 ] 7535 }, 7536 { 7537 version: "0.0.0" 7538 } 7539 ] 7540 }, 7541 "db.user": { 7542 brief: "The database user.", 7543 type: "string", 7544 applyScrubbing: { 7545 key: "manual" 7546 }, 7547 isInOtel: !0, 7548 visibility: "public", 7549 example: "fancy_user", 7550 changelog: [ 7551 { 7552 version: "0.0.0" 7553 } 7554 ] 7555 }, 7556 deviceMemory: { 7557 brief: "The estimated total memory capacity of the device, only a rough estimation in gigabytes.", 7558 type: "string", 7559 applyScrubbing: { 7560 key: "manual" 7561 }, 7562 isInOtel: !1, 7563 visibility: "public", 7564 example: "8 GB", 7565 deprecation: { 7566 replacement: "device.memory.estimated_capacity", 7567 reason: "Old namespace-less attribute, to be replaced with device.memory.estimated_capacity for span-first future" 7568 }, 7569 aliases: [ 7570 "device.memory.estimated_capacity" 7571 ], 7572 changelog: [ 7573 { 7574 version: "0.5.0", 7575 prs: [ 7576 281 7577 ], 7578 description: "Added and deprecated attribute to document JS SDK's current behaviour" 7579 } 7580 ] 7581 }, 7582 "device.archs": { 7583 brief: "The CPU architectures of the device.", 7584 type: "string[]", 7585 applyScrubbing: { 7586 key: "manual" 7587 }, 7588 isInOtel: !1, 7589 visibility: "public", 7590 example: [ 7591 "arm64-v8a", 7592 "armeabi-v7a", 7593 "armeabi" 7594 ], 7595 changelog: [ 7596 { 7597 version: "0.5.0", 7598 prs: [ 7599 303 7600 ], 7601 description: "Added device.archs attribute" 7602 } 7603 ] 7604 }, 7605 "device.battery_level": { 7606 brief: "The battery level of the device as a percentage (0-100).", 7607 type: "double", 7608 applyScrubbing: { 7609 key: "manual" 7610 }, 7611 isInOtel: !1, 7612 visibility: "public", 7613 example: 100, 7614 changelog: [ 7615 { 7616 version: "0.5.0", 7617 prs: [ 7618 303 7619 ], 7620 description: "Added device.battery_level attribute" 7621 } 7622 ] 7623 }, 7624 "device.battery_temperature": { 7625 brief: "The battery temperature of the device in Celsius.", 7626 type: "double", 7627 applyScrubbing: { 7628 key: "manual" 7629 }, 7630 isInOtel: !1, 7631 visibility: "public", 7632 example: 25, 7633 changelog: [ 7634 { 7635 version: "0.5.0", 7636 prs: [ 7637 303 7638 ], 7639 description: "Added device.battery_temperature attribute" 7640 } 7641 ] 7642 }, 7643 "device.boot_time": { 7644 brief: "A formatted UTC timestamp when the system was booted.", 7645 type: "string", 7646 applyScrubbing: { 7647 key: "manual" 7648 }, 7649 isInOtel: !1, 7650 visibility: "public", 7651 example: "2018-02-08T12:52:12Z", 7652 changelog: [ 7653 { 7654 version: "0.5.0", 7655 prs: [ 7656 303 7657 ], 7658 description: "Added device.boot_time attribute" 7659 } 7660 ] 7661 }, 7662 "device.brand": { 7663 brief: "The brand of the device.", 7664 type: "string", 7665 applyScrubbing: { 7666 key: "manual" 7667 }, 7668 isInOtel: !1, 7669 visibility: "public", 7670 example: "Apple", 7671 changelog: [ 7672 { 7673 version: "0.1.0", 7674 prs: [ 7675 116,
7676 127 7677 ] 7678 } 7679 ] 7680 }, 7681 "device.charging": { 7682 brief: "Whether the device was charging or not.", 7683 type: "boolean", 7684 applyScrubbing: { 7685 key: "manual" 7686 }, 7687 isInOtel: !1, 7688 visibility: "public", 7689 example: !1, 7690 changelog: [ 7691 { 7692 version: "0.5.0", 7693 prs: [ 7694 303 7695 ], 7696 description: "Added device.charging attribute" 7697 } 7698 ] 7699 }, 7700 "device.chipset": { 7701 brief: "The chipset of the device.", 7702 type: "string", 7703 applyScrubbing: { 7704 key: "manual" 7705 }, 7706 isInOtel: !1, 7707 visibility: "public", 7708 example: "Qualcomm SM8550", 7709 changelog: [ 7710 { 7711 version: "0.5.0", 7712 prs: [ 7713 303 7714 ], 7715 description: "Added device.chipset attribute" 7716 } 7717 ] 7718 }, 7719 "device.class": { 7720 brief: "The classification of the device. For example, `low`, `medium`, or `high`. Typically inferred by Relay - SDKs generally do not need to set this directly.", 7721 type: "string", 7722 applyScrubbing: { 7723 key: "manual" 7724 }, 7725 isInOtel: !1, 7726 visibility: "public", 7727 example: "medium", 7728 changelog: [ 7729 { 7730 version: "0.5.0", 7731 prs: [ 7732 300 7733 ], 7734 description: "Added device.class attribute" 7735 } 7736 ] 7737 }, 7738 "device.connection_type": { 7739 brief: "The internet connection type currently being used by the device.", 7740 type: "string", 7741 applyScrubbing: { 7742 key: "manual" 7743 }, 7744 isInOtel: !1, 7745 visibility: "public", 7746 example: "wifi", 7747 deprecation: { 7748 replacement: "network.connection.type",
7749 reason: "This attribute is being deprecated in favor of network.connection.type" 7750 }, 7751 aliases: [ 7752 "network.connection.type", 7753 "connectionType" 7754 ], 7755 changelog: [ 7756 { 7757 version: "0.5.0", 7758 prs: [ 7759 303 7760 ], 7761 description: "Added and deprecated device.connection_type in favor of network.connection.type" 7762 } 7763 ] 7764 }, 7765 "device.cpu_description": { 7766 brief: "A description of the CPU of the device.", 7767 type: "string", 7768 applyScrubbing: { 7769 key: "manual" 7770 }, 7771 isInOtel: !1, 7772 visibility: "public", 7773 example: "Intel(R) Core(TM)2 Quad CPU Q6600 @ 2.40GHz", 7774 changelog: [ 7775 { 7776 version: "0.5.0", 7777 prs: [ 7778 303 7779 ], 7780 description: "Added device.cpu_description attribute" 7781 } 7782 ] 7783 }, 7784 "device.external_free_storage": { 7785 brief: "External storage free size in bytes.", 7786 type: "integer", 7787 applyScrubbing: { 7788 key: "manual" 7789 }, 7790 isInOtel: !1, 7791 visibility: "public", 7792 example: 67108864e3, 7793 changelog: [ 7794 { 7795 version: "0.5.0", 7796 prs: [ 7797 303 7798 ], 7799 description: "Added device.external_free_storage attribute" 7800 } 7801 ] 7802 }, 7803 "device.external_storage_size": { 7804 brief: "External storage total size in bytes.", 7805 type: "integer", 7806 applyScrubbing: { 7807 key: "manual" 7808 }, 7809 isInOtel: !1, 7810 visibility: "public", 7811 example: 134217728e3, 7812 changelog: [ 7813 { 7814 version: "0.5.0", 7815 prs: [ 7816 303 7817 ], 7818 description: "Added device.external_storage_size attribute" 7819 } 7820 ] 7821 }, 7822 "device.family": { 7823 brief: "The family of the device.", 7824 type: "string", 7825 applyScrubbing: { 7826 key: "manual" 7827 }, 7828 isInOtel: !1, 7829 visibility: "public", 7830 example: "iPhone", 7831 changelog: [ 7832 { 7833 version: "0.1.0", 7834 prs: [ 7835 116, 7836 127 7837 ] 7838 } 7839 ] 7840 }, 7841 "device.free_memory": { 7842 brief: "Free system memory in bytes.", 7843 type: "integer", 7844 applyScrubbing: { 7845 key: "manual" 7846 }, 7847 isInOtel: !1, 7848 visibility: "public", 7849 example: 2147483648, 7850 changelog: [ 7851 { 7852 version: "0.5.0", 7853 prs: [ 7854 300 7855 ], 7856 description: "Added device.free_memory attribute" 7857 } 7858 ] 7859 }, 7860 "device.free_storage": { 7861 brief: "Free device storage in bytes.", 7862 type: "integer", 7863 applyScrubbing: { 7864 key: "manual" 7865 }, 7866 isInOtel: !1, 7867 visibility: "public", 7868 example: 107374182400, 7869 changelog: [ 7870 { 7871 version: "0.5.0", 7872 prs: [ 7873 303 7874 ], 7875 description: "Added device.free_storage attribute" 7876 } 7877 ] 7878 }, 7879 "device.id": { 7880 brief: "Unique device identifier.", 7881 type: "string", 7882 applyScrubbing: { 7883 key: "manual" 7884 }, 7885 isInOtel: !0, 7886 visibility: "public", 7887 example: "a1b2c3d4-e5f6-7890-abcd-ef1234567890", 7888 changelog: [ 7889 { 7890 version: "0.5.0", 7891 prs: [ 7892 303 7893 ], 7894 description: "Added device.id attribute" 7895 } 7896 ] 7897 }, 7898 "device.locale": { 7899 brief: "The locale of the device.", 7900 type: "string", 7901 applyScrubbing: { 7902 key: "manual" 7903 }, 7904 isInOtel: !1, 7905 visibility: "public", 7906 example: "en-US", 7907 changelog: [ 7908 { 7909 version: "0.5.0", 7910 prs: [ 7911 303 7912 ], 7913 description: "Added device.locale attribute" 7914 } 7915 ] 7916 }, 7917 "device.low_memory": { 7918 brief: "Whether the device was low on memory.", 7919 type: "boolean", 7920 applyScrubbing: { 7921 key: "manual" 7922 }, 7923 isInOtel: !1, 7924 visibility: "public", 7925 example: !1, 7926 changelog: [ 7927 { 7928 version: "0.5.0", 7929 prs: [ 7930 303 7931 ], 7932 description: "Added device.low_memory attribute" 7933 } 7934 ] 7935 }, 7936 "device.low_power_mode": { 7937 brief: "Whether the device is in Low Power Mode.", 7938 type: "boolean", 7939 applyScrubbing: { 7940 key: "manual" 7941 }, 7942 isInOtel: !1, 7943 visibility: "public", 7944 example: !0, 7945 changelog: [ 7946 { 7947 version: "0.6.0", 7948 prs: [ 7949 314 7950 ], 7951 description: "Added device.low_power_mode attribute" 7952 } 7953 ] 7954 }, 7955 "device.manufacturer": { 7956 brief: "The manufacturer of the device.", 7957 type: "string", 7958 applyScrubbing: { 7959 key: "manual" 7960 }, 7961 isInOtel: !0, 7962 visibility: "public", 7963 example: "Google", 7964 changelog: [ 7965 { 7966 version: "0.5.0", 7967 prs: [ 7968 303 7969 ], 7970 description: "Added device.manufacturer attribute" 7971 } 7972 ] 7973 }, 7974 "device.memory.estimated_capacity": { 7975 brief: "The estimated total memory capacity of the device, only a rough estimation in gigabytes. Browsers report estimations in buckets of powers of 2, mostly capped at 8 GB", 7976 type: "integer", 7977 applyScrubbing: { 7978 key: "manual" 7979 }, 7980 isInOtel: !1, 7981 visibility: "public", 7982 example: 8, 7983 aliases: [ 7984 "deviceMemory" 7985 ], 7986 changelog: [ 7987 { 7988 version: "0.5.0", 7989 prs: [ 7990 281 7991 ], 7992 description: "Added attribute device.memory.estimated_capacity to be used instead of deviceMemory" 7993 } 7994 ] 7995 }, 7996 "device.memory_size": { 7997 brief: "Total system memory available in bytes.", 7998 type: "integer", 7999 applyScrubbing: { 8000 key: "manual" 8001 }, 8002 isInOtel: !1, 8003 visibility: "public", 8004 example: 17179869184, 8005 changelog: [ 8006 { 8007 version: "0.5.0", 8008 prs: [ 8009 300 8010 ], 8011 description: "Added device.memory_size attribute" 8012 } 8013 ] 8014 }, 8015 "device.model": { 8016 brief: "The model of the device.", 8017 type: "string", 8018 applyScrubbing: { 8019 key: "manual" 8020 }, 8021 isInOtel: !1, 8022 visibility: "public", 8023 example: "iPhone 15 Pro Max", 8024 changelog: [ 8025 { 8026 version: "0.1.0", 8027 prs: [ 8028 116,
8029 127 8030 ] 8031 } 8032 ] 8033 }, 8034 "device.model_id": { 8035 brief: "An internal hardware revision to identify the device exactly.", 8036 type: "string", 8037 applyScrubbing: { 8038 key: "manual" 8039 }, 8040 isInOtel: !1, 8041 visibility: "public", 8042 example: "N861AP", 8043 changelog: [ 8044 { 8045 version: "0.5.0", 8046 prs: [ 8047 300 8048 ], 8049 description: "Added device.model_id attribute" 8050 } 8051 ] 8052 }, 8053 "device.name": { 8054 brief: "The name of the device. On mobile, this is the user-assigned device name. On servers and desktops, this is typically the hostname.", 8055 type: "string", 8056 applyScrubbing: { 8057 key: "auto" 8058 }, 8059 isInOtel: !1, 8060 visibility: "public", 8061 example: "localhost", 8062 changelog: [ 8063 { 8064 version: "0.5.0", 8065 prs: [ 8066 303 8067 ], 8068 description: "Added device.name attribute" 8069 } 8070 ] 8071 }, 8072 "device.online": { 8073 brief: "Whether the device was online or not.", 8074 type: "boolean", 8075 applyScrubbing: { 8076 key: "manual" 8077 }, 8078 isInOtel: !1, 8079 visibility: "public", 8080 example: !0, 8081 changelog: [ 8082 { 8083 version: "0.5.0", 8084 prs: [ 8085 303 8086 ], 8087 description: "Added device.online attribute" 8088 } 8089 ] 8090 }, 8091 "device.orientation": { 8092 brief: 'The orientation of the device, either "portrait" or "landscape".', 8093 type: "string", 8094 applyScrubbing: { 8095 key: "manual" 8096 }, 8097 isInOtel: !1, 8098 visibility: "public", 8099 example: "portrait", 8100 changelog: [ 8101 { 8102 version: "0.5.0", 8103 prs: [ 8104 303 8105 ], 8106 description: "Added device.orientation attribute" 8107 } 8108 ] 8109 }, 8110 "device.processor_count": { 8111 brief: 'Number of "logical processors".', 8112 type: "integer", 8113 applyScrubbing: { 8114 key: "manual" 8115 }, 8116 isInOtel: !1, 8117 visibility: "public", 8118 example: 8, 8119 aliases: [ 8120 "hardwareConcurrency" 8121 ], 8122 changelog: [ 8123 { 8124 version: "0.5.0", 8125 prs: [ 8126 300 8127 ], 8128 description: "Added and deprecated attribute device.processor_count in favor of device.cpu.logical_core_count" 8129 } 8130 ] 8131 }, 8132 "device.processor_frequency": { 8133 brief: "Processor frequency in MHz.", 8134 type: "double", 8135 applyScrubbing: { 8136 key: "manual" 8137 }, 8138 isInOtel: !1, 8139 visibility: "public", 8140 example: 2400, 8141 changelog: [ 8142 { 8143 version: "0.5.0", 8144 prs: [ 8145 303 8146 ], 8147 description: "Added device.processor_frequency attribute" 8148 } 8149 ] 8150 }, 8151 "device.screen_density": { 8152 brief: "The screen density of the device.", 8153 type: "double", 8154 applyScrubbing: { 8155 key: "manual" 8156 }, 8157 isInOtel: !1, 8158 visibility: "public", 8159 example: 2.625, 8160 changelog: [ 8161 { 8162 version: "0.5.0", 8163 prs: [ 8164 303 8165 ], 8166 description: "Added device.screen_density attribute" 8167 } 8168 ] 8169 }, 8170 "device.screen_dpi": { 8171 brief: "The screen density in dots-per-inch (DPI) of the device.", 8172 type: "integer", 8173 applyScrubbing: { 8174 key: "manual" 8175 }, 8176 isInOtel: !1, 8177 visibility: "public", 8178 example: 420, 8179 changelog: [ 8180 { 8181 version: "0.5.0", 8182 prs: [ 8183 303 8184 ], 8185 description: "Added device.screen_dpi attribute" 8186 } 8187 ] 8188 }, 8189 "device.screen_height_pixels": { 8190 brief: "The height of the device screen in pixels.", 8191 type: "integer", 8192 applyScrubbing: { 8193 key: "manual" 8194 }, 8195 isInOtel: !1, 8196 visibility: "public", 8197 example: 2400, 8198 changelog: [ 8199 { 8200 version: "0.5.0", 8201 prs: [ 8202 303 8203 ], 8204 description: "Added device.screen_height_pixels attribute" 8205 } 8206 ] 8207 }, 8208 "device.screen_width_pixels": { 8209 brief: "The width of the device screen in pixels.", 8210 type: "integer", 8211 applyScrubbing: { 8212 key: "manual" 8213 }, 8214 isInOtel: !1, 8215 visibility: "public", 8216 example: 1080, 8217 changelog: [ 8218 { 8219 version: "0.5.0", 8220 prs: [ 8221 303 8222 ], 8223 description: "Added device.screen_width_pixels attribute" 8224 } 8225 ] 8226 }, 8227 "device.simulator": { 8228 brief: "Whether the device is a simulator or an actual device.", 8229 type: "boolean", 8230 applyScrubbing: { 8231 key: "manual" 8232 }, 8233 isInOtel: !1, 8234 visibility: "public", 8235 example: !1, 8236 changelog: [ 8237 { 8238 version: "0.5.0", 8239 prs: [ 8240 300 8241 ], 8242 description: "Added device.simulator attribute" 8243 } 8244 ] 8245 }, 8246 "device.storage_size": { 8247 brief: "Total device storage in bytes.", 8248 type: "integer", 8249 applyScrubbing: { 8250 key: "manual" 8251 }, 8252 isInOtel: !1, 8253 visibility: "public", 8254 example: 274877906944, 8255 changelog: [ 8256 { 8257 version: "0.5.0", 8258 prs: [ 8259 303 8260 ], 8261 description: "Added device.storage_size attribute" 8262 } 8263 ] 8264 }, 8265 "device.thermal_state": { 8266 brief: "The thermal state of the device. Based on Apple's `ProcessInfo.ThermalState` enum: `nominal`, `fair`, `serious`, or `critical`.", 8267 type: "string", 8268 applyScrubbing: { 8269 key: "manual" 8270 }, 8271 isInOtel: !1, 8272 visibility: "public", 8273 example: "nominal", 8274 changelog: [ 8275 { 8276 version: "0.5.0", 8277 prs: [ 8278 303 8279 ], 8280 description: "Added device.thermal_state attribute" 8281 } 8282 ] 8283 }, 8284 "device.timezone": { 8285 brief: "The timezone of the device.", 8286 type: "string", 8287 applyScrubbing: { 8288 key: "manual" 8289 }, 8290 isInOtel: !1, 8291 visibility: "public", 8292 example: "Europe/Vienna", 8293 changelog: [ 8294 { 8295 version: "0.5.0", 8296 prs: [ 8297 303 8298 ], 8299 description: "Added device.timezone attribute" 8300 } 8301 ] 8302 }, 8303 "device.usable_memory": { 8304 brief: "Memory usable for the app in bytes.", 8305 type: "integer", 8306 applyScrubbing: { 8307 key: "manual" 8308 }, 8309 isInOtel: !1, 8310 visibility: "public", 8311 example: 2147483648, 8312 changelog: [ 8313 { 8314 version: "0.5.0", 8315 prs: [ 8316 303 8317 ], 8318 description: "Added device.usable_memory attribute" 8319 } 8320 ] 8321 }, 8322 dist: { 8323 brief: "The sentry dist.", 8324 type: "string", 8325 applyScrubbing: { 8326 key: "never" 8327 }, 8328 isInOtel: !1, 8329 visibility: "public", 8330 example: "1.0", 8331 deprecation: { 8332 replacement: "sentry.dist",
8333 reason: "This attribute is being deprecated in favor of sentry.dist." 8334 }, 8335 aliases: [ 8336 "sentry.dist" 8337 ], 8338 changelog: [ 8339 { 8340 version: "0.16.0", 8341 prs: [ 8342 489 8343 ], 8344 description: "Added dist attribute" 8345 } 8346 ] 8347 }, 8348 effectiveConnectionType: { 8349 brief: "Specifies the estimated effective type of the current connection (e.g. slow-2g, 2g, 3g, 4g).", 8350 type: "string", 8351 applyScrubbing: { 8352 key: "manual" 8353 }, 8354 isInOtel: !1, 8355 visibility: "public", 8356 example: "4g", 8357 deprecation: { 8358 replacement: "network.connection.effective_type", 8359 reason: "Old namespace-less attribute, to be replaced with network.connection.effective_type for span-first future" 8360 }, 8361 aliases: [ 8362 "network.connection.effective_type" 8363 ], 8364 changelog: [ 8365 { 8366 version: "0.5.0", 8367 prs: [ 8368 279 8369 ], 8370 description: "Added and deprecated attribute to document JS SDK's current behaviour" 8371 } 8372 ] 8373 }, 8374 environment: { 8375 brief: "The sentry environment.", 8376 type: "string", 8377 applyScrubbing: { 8378 key: "manual" 8379 }, 8380 isInOtel: !1, 8381 visibility: "public", 8382 example: "production", 8383 deprecation: { 8384 replacement: "sentry.environment" 8385 }, 8386 aliases: [ 8387 "sentry.environment" 8388 ], 8389 changelog: [ 8390 { 8391 version: "0.1.0", 8392 prs: [ 8393 61, 8394 127 8395 ] 8396 }, 8397 { 8398 version: "0.0.0" 8399 } 8400 ] 8401 }, 8402 "error.type": { 8403 brief: "Describes a class of error the operation ended with.", 8404 type: "string", 8405 applyScrubbing: { 8406 key: "manual" 8407 }, 8408 isInOtel: !0, 8409 visibility: "public",
8410 example: "timeout", 8411 changelog: [ 8412 { 8413 version: "0.1.0", 8414 prs: [ 8415 127 8416 ] 8417 }, 8418 { 8419 version: "0.0.0" 8420 } 8421 ] 8422 }, 8423 "event.id": { 8424 brief: "The unique identifier for this event (log record)", 8425 type: "integer", 8426 applyScrubbing: { 8427 key: "manual" 8428 }, 8429 isInOtel: !1, 8430 visibility: "public", 8431 example: 1234567890, 8432 changelog: [ 8433 { 8434 version: "0.1.0", 8435 prs: [ 8436 101 8437 ] 8438 } 8439 ] 8440 }, 8441 "event.name": { 8442 brief: "The name that uniquely identifies this event (log record)", 8443 type: "string", 8444 applyScrubbing: { 8445 key: "manual" 8446 }, 8447 isInOtel: !1, 8448 visibility: "public", 8449 example: "Process Payload", 8450 changelog: [ 8451 { 8452 version: "0.1.0", 8453 prs: [ 8454 101, 8455 127 8456 ] 8457 } 8458 ] 8459 }, 8460 "exception.escaped": { 8461 brief: "SHOULD be set to true if the exception event is recorded at a point where it is known that the exception is escaping the scope of the span.", 8462 type: "boolean", 8463 applyScrubbing: { 8464 key: "manual" 8465 }, 8466 isInOtel: !0, 8467 visibility: "public", 8468 example: !0, 8469 changelog: [ 8470 { 8471 version: "0.0.0" 8472 } 8473 ] 8474 }, 8475 "exception.message": { 8476 brief: "The error message.", 8477 type: "string", 8478 applyScrubbing: { 8479 key: "auto" 8480 }, 8481 isInOtel: !0, 8482 visibility: "public", 8483 example: "ENOENT: no such file or directory", 8484 changelog: [ 8485 { 8486 version: "0.1.0", 8487 prs: [ 8488 127 8489 ] 8490 }, 8491 { 8492 version: "0.0.0" 8493 } 8494 ] 8495 }, 8496 "exception.stacktrace": { 8497 brief: "A stacktrace as a string in the natural representation for the language runtime. The representation is to be determined and documented by each language SIG.", 8498 type: "string", 8499 applyScrubbing: { 8500 key: "auto" 8501 }, 8502 isInOtel: !0, 8503 visibility: "public", 8504 example: 'Exception in thread "main" java.lang.RuntimeException: Test exception\n at com.example.GenerateTrace.methodB(GenerateTrace.java:13)\n at com.example.GenerateTrace.methodA(GenerateTrace.java:9)\n at com.example.GenerateTrace.main(GenerateTrace.java:5)', 8505 changelog: [ 8506 { 8507 version: "0.1.0", 8508 prs: [ 8509 127 8510 ] 8511 }, 8512 { 8513 version: "0.0.0" 8514 } 8515 ] 8516 }, 8517 "exception.type": { 8518 brief: "The type of the exception (its fully-qualified class name, if applicable). The dynamic type of the exception should be preferred over the static type in languages that support it.", 8519 type: "string", 8520 applyScrubbing: { 8521 key: "manual" 8522 }, 8523 isInOtel: !0, 8524 visibility: "public", 8525 example: "OSError", 8526 changelog: [ 8527 { 8528 version: "0.1.0", 8529 prs: [ 8530 127 8531 ] 8532 }, 8533 { 8534 version: "0.0.0" 8535 } 8536 ] 8537 }, 8538 "faas.coldstart": { 8539 brief: "A boolean that is true if the serverless function is executed for the first time (aka cold-start).", 8540 type: "boolean", 8541 applyScrubbing: { 8542 key: "manual" 8543 }, 8544 isInOtel: !0, 8545 visibility: "public", 8546 example: !0, 8547 changelog: [ 8548 { 8549 version: "0.0.0" 8550 } 8551 ] 8552 }, 8553 "faas.cron": { 8554 brief: "A string containing the schedule period as Cron Expression.", 8555 type: "string", 8556 applyScrubbing: { 8557 key: "manual" 8558 }, 8559 isInOtel: !0, 8560 visibility: "public", 8561 example: "0/5 * * * ? *", 8562 changelog: [ 8563 { 8564 version: "0.1.0", 8565 prs: [ 8566 127 8567 ] 8568 }, 8569 { 8570 version: "0.0.0" 8571 } 8572 ] 8573 }, 8574 "faas.duration_in_ms": { 8575 brief: "The duration a function took to run, in milliseconds.", 8576 type: "integer", 8577 applyScrubbing: { 8578 key: "manual" 8579 }, 8580 isInOtel: !1, 8581 visibility: "public", 8582 example: 120, 8583 changelog: [ 8584 { 8585 version: "0.11.0", 8586 prs: [ 8587 403 8588 ] 8589 } 8590 ] 8591 }, 8592 "faas.entry_point": { 8593 brief: "The code that's run when the cloud provider invokes your function.", 8594 type: "string", 8595 applyScrubbing: { 8596 key: "manual" 8597 }, 8598 isInOtel: !1, 8599 visibility: "public", 8600 example: "my_main_function", 8601 changelog: [ 8602 { 8603 version: "0.11.0", 8604 prs: [ 8605 403, 8606 415 8607 ] 8608 } 8609 ] 8610 }, 8611 "faas.execution": { 8612 brief: "The execution ID of the current function execution.", 8613 type: "string", 8614 applyScrubbing: { 8615 key: "manual" 8616 }, 8617 isInOtel: !1, 8618 visibility: "public", 8619 example: "af9d5aa4-a685-4c5f-a22b-444f80b3cc28", 8620 deprecation: { 8621 replacement: "faas.invocation_id",
8622 reason: "This attribute is being deprecated in favor of faas.invocation_id, which is the OTel-aligned replacement." 8623 }, 8624 aliases: [ 8625 "faas.invocation_id", 8626 "aws.lambda.aws_request_id" 8627 ], 8628 changelog: [ 8629 { 8630 version: "0.16.0", 8631 prs: [ 8632 473 8633 ], 8634 description: "Added faas.execution attribute, deprecated in favor of faas.invocation_id" 8635 } 8636 ] 8637 }, 8638 "faas.id": { 8639 brief: "The unique ID of the single function that this runtime instance executes.", 8640 type: "string", 8641 applyScrubbing: { 8642 key: "manual" 8643 }, 8644 isInOtel: !1, 8645 visibility: "public", 8646 example: "arn:aws:lambda:REGION:ACCOUNT_ID:function:my-function", 8647 deprecation: { 8648 replacement: "cloud.resource_id", 8649 reason: "This attribute is being deprecated in favor of cloud.resource_id, which is the OTel-aligned replacement (renamed in OTel semantic conventions v1.19.0)." 8650 }, 8651 aliases: [ 8652 "cloud.resource_id" 8653 ], 8654 changelog: [ 8655 { 8656 version: "0.16.0", 8657 prs: [ 8658 475 8659 ], 8660 description: "Added faas.id attribute, deprecated
8660in favor of cloud.resource_id" 8661 } 8662 ] 8663 }, 8664 "faas.identity": { 8665 brief: "The Service Account (GCP), IAM Execution Role (AWS), or Managed Identity (Azure) used by the serverless function when interacting with other cloud services", 8666 type: "string", 8667 applyScrubbing: { 8668 key: "manual" 8669 }, 8670 isInOtel: !1, 8671 visibility: "public", 8672 example: "[email protected] (GCP), arn:aws:iam::123456789012:role/role-name (AWS), 00000000-0000-0000-0000-000000000000 (Azure)", 8673 changelog: [ 8674 { 8675 version: "0.11.0", 8676 prs: [ 8677 403 8678 ] 8679 } 8680 ] 8681 }, 8682 "faas.invocation_id": { 8683 brief: "The invocation ID of the current function invocation.", 8684 type: "string", 8685 applyScrubbing: { 8686 key: "manual" 8687 }, 8688 isInOtel: !0, 8689 visibility: "public", 8690 example: "af9d5aa4-a685-4c5f-a22b-444f80b3cc28", 8691 aliases: [ 8692 "aws.lambda.aws_request_id", 8693 "faas.execution" 8694 ], 8695 changelog: [ 8696 { 8697 version: "0.16.0", 8698 prs: [ 8699 473 8700 ], 8701 description: "Added faas.execution as an alias" 8702 }, 8703 { 8704 version: "0.11.1", 8705 prs: [ 8706 414, 8707 424 8708 ] 8709 } 8710 ] 8711 }, 8712 "faas.invoked_name": { 8713 brief: "The name of the invoked function.", 8714 type: "string", 8715 applyScrubbing: { 8716 key: "manual" 8717 }, 8718 isInOtel: !0, 8719 visibility: "public", 8720 example: "my-function", 8721 changelog: [ 8722 { 8723 version: "0.16.0", 8724 prs: [ 8725 481 8726 ], 8727 description: "Added faas.invoked_name attribute" 8728 } 8729 ] 8730 }, 8731 "faas.invoked_provider": { 8732 brief: "The cloud provider of the invoked function.", 8733 type: "string", 8734 applyScrubbing: { 8735 key: "manual" 8736 }, 8737 isInOtel: !0, 8738 visibility: "public", 8739 example: "aws", 8740 changelog: [ 8741 { 8742 version: "0.16.0", 8743 prs: [ 8744 481 8745 ], 8746 description: "Added faas.invoked_provider attribute" 8747 } 8748 ] 8749 }, 8750 "faas.invoked_region": { 8751 brief: "The cloud region of the invoked function.", 8752 type: "string", 8753 applyScrubbing: { 8754 key: "manual" 8755 }, 8756 isInOtel: !0, 8757 visibility: "public", 8758 example: "eu-central-1", 8759 changelog: [ 8760 { 8761 version: "0.16.0", 8762 prs: [ 8763 481 8764 ], 8765 description: "Added faas.invoked_region attribute" 8766 } 8767 ] 8768 }, 8769 "faas.name": { 8770 brief: "The name of the serverless function", 8771 type: "string", 8772 applyScrubbing: { 8773 key: "manual" 8774 }, 8775 isInOtel: !0, 8776 visibility: "public", 8777 example: "my_function", 8778 aliases: [ 8779 "aws.lambda.function_name" 8780 ], 8781 changelog: [ 8782 { 8783 version: "0.11.0", 8784 prs: [ 8785 403, 8786 415 8787 ] 8788 } 8789 ] 8790 }, 8791 "faas.time": { 8792 brief: "A string containing the function invocation time in the ISO 8601 format expressed in UTC.", 8793 type: "string", 8794 applyScrubbing: { 8795 key: "manual" 8796 }, 8797 isInOtel: !0, 8798 visibility: "public", 8799 example: "2020-01-23T13:47:06Z", 8800 changelog: [ 8801 { 8802 version: "0.1.0", 8803 prs: [ 8804 127 8805 ] 8806 }, 8807 { 8808 version: "0.0.0" 8809 } 8810 ] 8811 }, 8812 "faas.trigger": { 8813 brief: "Type of the trigger which caused this function invocation.", 8814 type: "string", 8815 applyScrubbing: { 8816 key: "manual" 8817 }, 8818 isInOtel: !0, 8819 visibility: "public",
8820 example: "timer", 8821 changelog: [ 8822 { 8823 version: "0.1.0", 8824 prs: [ 8825 127 8826 ] 8827 }, 8828 { 8829 version: "0.0.0" 8830 } 8831 ] 8832 }, 8833 "faas.version": { 8834 brief: "The version of the function that was invoked", 8835 type: "string", 8836 applyScrubbing: { 8837 key: "manual" 8838 }, 8839 isInOtel: !0, 8840 visibility: "public", 8841 example: "$LATEST", 8842 aliases: [ 8843 "aws.lambda.function_version" 8844 ], 8845 changelog: [ 8846 { 8847 version: "0.11.1", 8848 prs: [ 8849 414, 8850 424 8851 ] 8852 } 8853 ] 8854 }, 8855 fcp: { 8856 brief: "The time it takes for the browser to render the first piece of meaningful content on the screen", 8857 type: "double", 8858 applyScrubbing: { 8859 key: "manual" 8860 }, 8861 isInOtel: !1, 8862 visibility: "public", 8863 example: 547.6951, 8864 deprecation: { 8865 replacement: "browser.web_vital.fcp.value",
8866 reason: "This attribute is being deprecated in favor of browser.web_vital.fcp.value" 8867 }, 8868 aliases: [ 8869 "browser.web_vital.fcp.value" 8870 ], 8871 changelog: [ 8872 { 8873 version: "0.5.0", 8874 prs: [ 8875 235 8876 ] 8877 } 8878 ] 8879 }, 8880 "flag.evaluation.<key>": { 8881 brief: "An instance of a feature flag evaluation. The value of this attribute is the boolean representing the evaluation result. The <key> suffix is the name of the feature flag.", 8882 type: "boolean", 8883 applyScrubbing: { 8884 key: "manual" 8885 }, 8886 isInOtel: !1, 8887 visibility: "public", 8888 hasDynamicSuffix: !0, 8889 example: "flag.evaluation.is_new_ui=true", 8890 changelog: [ 8891 { 8892 version: "0.1.0", 8893 prs: [ 8894 103 8895 ] 8896 } 8897 ] 8898 }, 8899 fp: { 8900 brief: "The time it takes for the browser to render the first pixel on the screen", 8901 type: "double", 8902 applyScrubbing: { 8903 key: "manual" 8904 }, 8905 isInOtel: !1, 8906 visibility: "public", 8907 example: 477.1926, 8908 deprecation: { 8909 replacement: "browser.web_vital.fp.value",
8910 reason: "This attribute is being deprecated in favor of browser.web_vital.fp.value" 8911 }, 8912 aliases: [ 8913 "browser.web_vital.fp.value" 8914 ], 8915 changelog: [ 8916 { 8917 version: "0.5.0", 8918 prs: [ 8919 235 8920 ] 8921 } 8922 ] 8923 }, 8924 "frames.delay": { 8925 brief: "The sum of all delayed frame durations in seconds during the lifetime of the span. For more information see [frames delay](https://develop.sentry.dev/sdk/performance/frames-delay/).", 8926 type: "integer", 8927 applyScrubbing: { 8928 key: "manual" 8929 }, 8930 isInOtel: !1, 8931 visibility: "public", 8932 example: 5, 8933 deprecation: { 8934 replacement: "app.vitals.frames.delay.value", 8935 reason: "Replaced by app.vitals.frames.delay.value to align with the app.vitals.* namespace for mobile performance attributes" 8936 }, 8937 aliases: [ 8938 "app.vitals.frames.delay.value" 8939 ], 8940 changelog: [ 8941 { 8942 version: "0.5.0", 8943 prs: [ 8944 313 8945 ], 8946 description: "Deprecated in favor of app.vitals.frames.delay.value" 8947 }, 8948 { 8949 version: "0.4.0", 8950 prs: [ 8951 228 8952 ] 8953 }, 8954 { 8955 version: "0.0.0" 8956 } 8957 ] 8958 }, 8959 "frames.frozen": { 8960 brief: "The number of frozen frames rendered during the lifetime of the span.", 8961 type: "integer", 8962 applyScrubbing: { 8963 key: "manual" 8964 }, 8965 isInOtel: !1, 8966 visibility: "public", 8967 example: 3, 8968 deprecation: { 8969 replacement: "app.vitals.frames.frozen.count", 8970 reason: "Replaced by app.vitals.frames.frozen.count to align with the app.vitals.* namespace for mobile performance attributes" 8971 }, 8972 aliases: [ 8973 "app.vitals.frames.frozen.count" 8974 ], 8975 changelog: [ 8976 { 8977 version: "0.5.0", 8978 prs: [ 8979 313 8980 ], 8981 description: "Deprecated in favor of app.vitals.frames.frozen.count" 8982 }, 8983 { 8984 version: "0.4.0", 8985 prs: [ 8986 228 8987 ] 8988 }, 8989 { 8990 version: "0.0.0" 8991 } 8992 ] 8993 }, 8994 frames_frozen_rate: { 8995 brief: "The rate of frozen frames, or `app_vitals.frames.frozen.count` divided by `app_vitals.frames.total.count`. This is computed by Relay.", 8996 type: "double", 8997 applyScrubbing: { 8998 key: "manual" 8999 }, 9000 isInOtel: !1, 9001 visibility: "public", 9002 changelog: [ 9003 { 9004 version: "0.7.0", 9005 prs: [ 9006 362 9007 ], 9008 description: "Added frames_frozen_rate attribute" 9009 } 9010 ] 9011 }, 9012 "frames.slow": { 9013 brief: "The number of slow frames rendered during the lifetime of the span.", 9014 type: "integer", 9015 applyScrubbing: { 9016 key: "manual" 9017 }, 9018 isInOtel: !1, 9019 visibility: "public", 9020 example: 1, 9021 deprecation: { 9022 replacement: "app.vitals.frames.slow.count", 9023 reason: "Replaced by app.vitals.frames.slow.count to align with the app.vitals.* namespace for mobile performance attributes" 9024 }, 9025 aliases: [ 9026 "app.vitals.frames.slow.count" 9027 ], 9028 changelog: [ 9029 { 9030 version: "0.5.0", 9031 prs: [ 9032 313 9033 ], 9034 description: "Deprecated in favor of app.vitals.frames.slow.count" 9035 }, 9036 { 9037 version: "0.4.0", 9038 prs: [ 9039 228 9040 ] 9041 }, 9042 { 9043 version: "0.0.0" 9044 } 9045 ] 9046 }, 9047 frames_slow_rate: { 9048 brief: "The rate of slow frames, or `app_vitals.frames.slow.count` divided by `app_vitals.frames.total.count`. This is computed by Relay.", 9049 type: "double", 9050 applyScrubbing: { 9051 key: "manual" 9052 }, 9053 isInOtel: !1, 9054 visibility: "public", 9055 changelog: [ 9056 { 9057 version: "0.7.0", 9058 prs: [ 9059 362 9060 ], 9061 description: "Added frames_slow_rate attribute" 9062 } 9063 ] 9064 }, 9065 "frames.total": { 9066 brief: "The number of total frames rendered during the lifetime of the span.", 9067 type: "integer", 9068 applyScrubbing: { 9069 key: "manual" 9070 }, 9071 isInOtel: !1, 9072 visibility: "public", 9073 example: 60, 9074 deprecation: { 9075 replacement: "app.vitals.frames.total.count", 9076 reason: "Replaced by app.vitals.frames.total.count to align with the app.vitals.* namespace for mobile performance attributes"
9077 }, 9078 aliases: [ 9079 "app.vitals.frames.total.count" 9080 ], 9081 changelog: [ 9082 { 9083 version: "0.5.0", 9084 prs: [ 9085 313 9086 ], 9087 description: "Deprecated in favor of app.vitals.frames.total.count" 9088 }, 9089 { 9090 version: "0.4.0", 9091 prs: [ 9092 228 9093 ] 9094 }, 9095 { 9096 version: "0.0.0" 9097 } 9098 ] 9099 }, 9100 fs_error: { 9101 brief: "The error message of a file system error.", 9102 type: "string", 9103 applyScrubbing: { 9104 key: "manual" 9105 }, 9106 isInOtel: !1, 9107 visibility: "public", 9108 example: "ENOENT: no such file or directory", 9109 deprecation: { 9110 replacement: "error.type", 9111 reason: "This attribute is not part of the OpenTelemetry specification and error.type fits much better." 9112 }, 9113 changelog: [ 9114 { 9115 version: "0.1.0", 9116 prs: [ 9117 61, 9118 127 9119 ] 9120 }, 9121 { 9122 version: "0.0.0" 9123 } 9124 ] 9125 }, 9126 "gcp.function.context.event_id": { 9127 brief: "The event ID from the legacy GCP Cloud Function context (1st gen)", 9128 type: "string", 9129 applyScrubbing: { 9130 key: "manual" 9131 }, 9132 isInOtel: !1, 9133 visibility: "public", 9134 example: "1234567890", 9135 changelog: [ 9136 { 9137 version: "0.7.0", 9138 prs: [ 9139 371 9140 ], 9141 description: "Added gcp.function.context.event_id attribute" 9142 } 9143 ] 9144 }, 9145 "gcp.function.context.event_type": { 9146 brief: "The type of the GCP Cloud Function event", 9147 type: "string", 9148 applyScrubbing: { 9149 key: "manual" 9150 }, 9151 isInOtel: !1, 9152 visibility: "public", 9153 example: "google.pubsub.topic.publish", 9154 changelog: [ 9155 { 9156 version: "0.7.0", 9157 prs: [ 9158 371 9159 ], 9160 description: "Added gcp.function.context.event_type attribute" 9161 } 9162 ] 9163 }, 9164 "gcp.function.context.id": { 9165 brief: "The unique event ID from the GCP CloudEvents context (2nd gen Cloud Functions)", 9166 type: "string", 9167 applyScrubbing: { 9168 key: "manual" 9169 }, 9170 isInOtel: !1, 9171 visibility: "public", 9172 example: "1234567890", 9173 changelog: [ 9174 { 9175 version: "0.7.0", 9176 prs: [ 9177 371 9178 ], 9179 description: "Added gcp.function.context.id attribute" 9180 } 9181 ] 9182 }, 9183 "gcp.function.context.resource": { 9184 brief: "The resource that triggered the GCP Cloud Function event", 9185 type: "string", 9186 applyScrubbing: { 9187 key: "manual" 9188 }, 9189 isInOtel: !1, 9190 visibility: "public", 9191 example: "projects/my-project/topics/my-topic", 9192 changelog: [ 9193 { 9194 version: "0.7.0", 9195 prs: [ 9196 371 9197 ], 9198 description: "Added gcp.function.context.resource attribute" 9199 } 9200 ] 9201 }, 9202 "gcp.function.context.source": { 9203 brief: "The source of the GCP Cloud Function event", 9204 type: "string", 9205 applyScrubbing: { 9206 key: "manual" 9207 }, 9208 isInOtel: !1, 9209 visibility: "public", 9210 example: "//pubsub.googleapis.com/projects/my-project/topics/my-topic", 9211 changelog: [ 9212 { 9213 version: "0.7.0", 9214 prs: [ 9215 371 9216 ], 9217 description: "Added gcp.function.context.source attribute" 9218 } 9219 ] 9220 }, 9221 "gcp.function.context.specversion": { 9222 brief: "The CloudEvents specification version of the GCP Cloud Function event", 9223 type: "string", 9224 applyScrubbing: { 9225 key: "manual" 9226 }, 9227 isInOtel: !1, 9228 visibility: "public", 9229 example: "1.0", 9230 changelog: [ 9231 { 9232 version: "0.7.0", 9233 prs: [ 9234 371 9235 ], 9236 description: "Added gcp.function.context.specversion attribute" 9237 } 9238 ] 9239 }, 9240 "gcp.function.context.time": { 9241 brief: "The timestamp of the GCP Cloud Function event", 9242 type: "string", 9243 applyScrubbing: { 9244 key: "manual" 9245 }, 9246 isInOtel: !1, 9247 visibility: "public", 9248 example: "2024-01-01T00:00:00.000Z", 9249 changelog: [ 9250 { 9251 version: "0.7.0", 9252 prs: [ 9253 371 9254 ], 9255 description: "Added gcp.function.context.time attribute" 9256 } 9257 ] 9258 }, 9259 "gcp.function.context.timestamp": { 9260 brief: "The legacy timestamp of the GCP Cloud Function event", 9261 type: "string", 9262 applyScrubbing: { 9263 key: "manual" 9264 }, 9265 isInOtel: !1, 9266 visibility: "public", 9267 example: "2024-01-01T00:00:00.000Z", 9268 changelog: [ 9269 { 9270 version: "0.7.0", 9271 prs: [ 9272 371 9273 ], 9274 description: "Added gcp.function.context.timestamp attribute" 9275 } 9276 ] 9277 }, 9278 "gcp.function.context.type": { 9279 brief: "The type of the GCP Cloud Function event context", 9280 type: "string", 9281 applyScrubbing: { 9282 key: "manual" 9283 }, 9284 isInOtel: !1, 9285 visibility: "public", 9286 example: "cloud_functions.context", 9287 changelog: [ 9288 { 9289 version: "0.7.0", 9290 prs: [ 9291 371 9292 ], 9293 description: "Added gcp.function.context.type attribute" 9294 } 9295 ] 9296 }, 9297 "gcp.project.id": { 9298 brief: "The ID of the project in GCP that this resource is associated with", 9299 type: "string", 9300 applyScrubbing: { 9301 key: "manual" 9302 }, 9303 isInOtel: !1, 9304 visibility: "public", 9305 example: "my-project-123", 9306 changelog: [ 9307 { 9308 version: "0.11.0", 9309 prs: [ 9310 403 9311 ] 9312 } 9313 ] 9314 }, 9315 "gen_ai.agent.name": { 9316 brief: "The name of the agent being used.", 9317 type: "string", 9318 applyScrubbing: { 9319 key: "manual" 9320 }, 9321 isInOtel: !0, 9322 visibility: "public", 9323 example: "ResearchAssistant", 9324 changelog: [ 9325 { 9326 version: "0.1.0", 9327 prs: [ 9328 62, 9329 127 9330 ] 9331 } 9332 ] 9333 }, 9334 "gen_ai.context.utilization": { 9335 brief: "The fraction of the model context window utilized by this generation.", 9336 type: "double", 9337 applyScrubbing: { 9338 key: "manual" 9339 }, 9340 isInOtel: !1, 9341 visibility: "public", 9342 example: .75, 9343 changelog: [ 9344 { 9345 version: "0.5.0", 9346 prs: [ 9347 315 9348 ], 9349 description: "Added gen_ai.context.utilization attribute" 9350 } 9351 ] 9352 }, 9353 "gen_ai.context.window_size": { 9354 brief: "The maximum context window size supported by the model for this generation.", 9355 type: "integer", 9356 applyScrubbing: { 9357 key: "manual" 9358 }, 9359 isInOtel: !1, 9360 visibility: "public", 9361 example: 128e3, 9362 changelog: [ 9363 { 9364 version: "0.5.0", 9365 prs: [ 9366 315 9367 ], 9368 description: "Added gen_ai.context.window_size attribute" 9369 } 9370 ] 9371 }, 9372 "gen_ai.conversation.id": { 9373 brief: "The unique identifier for a conversation (session, thread), used to store and correlate messages within this conversation.", 9374 type: "string", 9375 applyScrubbing: { 9376 key: "manual" 9377 }, 9378 isInOtel: !0, 9379 visibility: "public", 9380 example: "conv_5j66UpCpwteGg4YSxUnt7lPY", 9381 changelog: [ 9382 { 9383 version: "0.4.0", 9384 prs: [ 9385 250 9386 ] 9387 } 9388 ] 9389 }, 9390 "gen_ai.cost.cache_creation.input_tokens": { 9391 brief: "The cost of input tokens written to cache in USD.", 9392 type: "double", 9393 applyScrubbing: { 9394 key: "manual" 9395 }, 9396 isInOtel: !1, 9397 visibility: "public", 9398 example: 12.34, 9399 changelog: [ 9400 { 9401 version: "0.16.0", 9402 description: "Added gen_ai.cost.cache_creation.input_tokens attribute" 9403 } 9404 ], 9405 additionalContext: [ 9406 "This attribute appears on both agent parent spans (aggregated totals) and LLM child spans (per-call values). When using sum() to calculate total cost, filter to gen_ai.operation.type:ai_client to avoid double-counting hierarchical spans.", 9407 "Despite the name 'cost.cache_creation.input_tokens', this value is cost in USD, not a token count. For token counts, use gen_ai.usage.cache_creation.input_tokens.", 9408 "This is a subset of gen_ai.cost.input_tokens, not an independent cost. Do not sum this with gen_ai.cost.input_tokens \u2014 it is already included." 9409 ] 9410 }, 9411 "gen_ai.cost.cache_read.input_tokens": { 9412 brief: "The cost of cached input tokens in USD.", 9413 type: "double", 9414 applyScrubbing: { 9415 key: "manual" 9416 }, 9417 isInOtel: !1, 9418 visibility: "public", 9419 example: 12.34, 9420 changelog: [ 9421 { 9422 version: "0.16.0", 9423 description: "Added gen_ai.cost.cache_read.input_tokens attribute" 9424 } 9425 ], 9426 additionalContext: [ 9427 "This attribute appears on both agent parent spans (aggregated totals) and LLM child spans (per-call values). When using sum() to calculate total cost, filter to gen_ai.operation.type:ai_client to avoid double-counting hierarchical spans.", 9428 "Despite the name 'cost.cache_read.input_tokens', this value is cost in USD, not a token count. For token counts, use gen_ai.usage.cache_read.input_tokens.", 9429 "This is a subset of gen_ai.cost.input_tokens, not an independent cost. Do not sum this with gen_ai.cost.input_tokens \u2014 it is already included." 9430 ] 9431 }, 9432 "gen_ai.cost.input_tokens": { 9433 brief: "The total cost of all input tokens in USD (includes cached and cache
9433creation tokens).", 9434 type: "double", 9435 applyScrubbing: { 9436 key: "manual" 9437 }, 9438 isInOtel: !1, 9439 visibility: "public", 9440 example: 123.45, 9441 changelog: [ 9442 { 9443 version: "0.9.0", 9444 prs: [ 9445 397 9446 ], 9447 description: "Add additional_context" 9448 }, 9449 { 9450 version: "0.4.0", 9451 prs: [ 9452 228 9453 ] 9454 }, 9455 { 9456 version: "0.1.0", 9457 prs: [ 9458 112 9459 ] 9460 } 9461 ], 9462 additionalContext: [ 9463 "This attribute appears on both agent parent spans (aggregated totals) and LLM child spans (per-call values). When using sum() to calculate total cost, filter to gen_ai.operation.type:ai_client to avoid double-counting hierarchical spans.", 9464 "Despite the name 'cost.input_tokens', this value is cost in USD, not a token count. For token counts, use gen_ai.usage.input_tokens.", 9465 "This is the total cost of all input tokens, including cached and cache creation tokens at their respective rates. For the cached portion, see gen_ai.cost.cache_read.input_tokens. For the cache creation portion, see gen_ai.cost.cache_creation.input_tokens." 9466 ] 9467 }, 9468 "gen_ai.cost.output_tokens": { 9469 brief: "The total cost of all output tokens in USD (includes reasoning tokens).", 9470 type: "double", 9471 applyScrubbing: { 9472 key: "manual" 9473 }, 9474 isInOtel: !1, 9475 visibility: "public", 9476 example: 123.45, 9477 changelog: [ 9478 { 9479 version: "0.9.0", 9480 prs: [ 9481 397 9482 ], 9483 description: "Add additional_context" 9484 }, 9485 { 9486 version: "0.4.0", 9487 prs: [ 9488 228 9489 ] 9490 }, 9491 { 9492 version: "0.1.0", 9493 prs: [ 9494 112 9495 ] 9496 } 9497 ], 9498 additionalContext: [ 9499 "This attribute appears on both agent parent spans (aggregated totals) and LLM child spans (per-call values). When using sum() to calculate total cost, filter to gen_ai.operation.type:ai_client to avoid double-counting hierarchical spans.", 9500 "Despite the name 'cost.output_tokens', this value is cost in USD, not a token count. For token counts, use gen_ai.usage.output_tokens.", 9501 "This is the total cost of all output tokens, including reasoning tokens at their respective rate. For the reasoning portion, see gen_ai.cost.reasoning.output_tokens." 9502 ] 9503 }, 9504 "gen_ai.cost.reasoning.output_tokens": { 9505 brief: "The cost of reasoning output tokens in USD.", 9506 type: "double", 9507 applyScrubbing: { 9508 key: "manual" 9509 }, 9510 isInOtel: !1, 9511 visibility: "public", 9512 example: 12.34, 9513 changelog: [ 9514 { 9515 version: "0.16.0", 9516 description: "Added gen_ai.cost.reasoning.output_tokens attribute" 9517 } 9518 ], 9519 additionalContext: [ 9520 "This attribute appears on both agent parent spans (aggregated totals) and LLM child spans (per-call values). When using sum() to calculate total cost, filter to gen_ai.operation.type:ai_client to avoid double-counting hierarchical spans.", 9521 "Despite the name 'cost.reasoning.output_tokens', this value is cost in USD, not a token count. For token counts, use gen_ai.usage.reasoning.output_tokens.", 9522 "This is a subset of gen_ai.cost.output_tokens, not an independent cost. Do not sum this with gen_ai.cost.output_tokens \u2014 it is already included." 9523 ] 9524 }, 9525 "gen_ai.cost.total_tokens": { 9526 brief: "The total cost for the tokens used.", 9527 type: "double", 9528 applyScrubbing: { 9529 key: "manual" 9530 }, 9531 isInOtel: !1, 9532 visibility: "public", 9533 example: 12.34, 9534 aliases: [ 9535 "ai.total_cost" 9536 ], 9537 changelog: [ 9538 { 9539 version: "0.9.0", 9540 prs: [ 9541 397 9542 ], 9543 description: "Add additional_context" 9544 }, 9545 { 9546 version: "0.5.0", 9547 prs: [ 9548 264 9549 ] 9550 }, 9551 { 9552 version: "0.4.0", 9553 prs: [ 9554 228 9555 ] 9556 }, 9557 { 9558 version: "0.1.0", 9559 prs: [ 9560 126 9561 ] 9562 } 9563 ], 9564 additionalContext: [ 9565 "This attribute appears on both agent parent spans (aggregated totals) and LLM child spans (per-call values). When using sum() to calculate total cost, filter to gen_ai.operation.type:ai_client to avoid double-counting hierarchical spans.", 9566 "Despite the name 'cost.total_tokens', this value is cost in USD, not a token count. For token counts, use gen_ai.usage.total_tokens." 9567 ] 9568 }, 9569 "gen_ai.embeddings.input": { 9570 brief: "The input to the embeddings model.", 9571 type: "string", 9572 applyScrubbing: { 9573 key: "manual" 9574 }, 9575 isInOtel: !1, 9576 visibility: "public", 9577 example: "What's the weather in Paris?", 9578 changelog: [ 9579 { 9580 version: "0.3.1", 9581 prs: [ 9582 195 9583 ] 9584 } 9585 ] 9586 }, 9587 "gen_ai.function_id": { 9588 brief: "Framework-specific tracing label for the execution of a function or other unit of execution in a generative AI system.", 9589 type: "string", 9590 applyScrubbing: { 9591 key: "manual" 9592 }, 9593 isInOtel: !1, 9594 visibility: "public", 9595 example: "my-awesome-function", 9596 changelog: [ 9597 { 9598 version: "0.5.0", 9599 prs: [ 9600 308 9601 ], 9602 description: "Added gen_ai.function_id attribute" 9603 } 9604 ] 9605 }, 9606 "gen_ai.input.messages": { 9607 brief: 'The messages passed to the model. It has to be a stringified version of an array of objects. The `role` attribute of each object must be `"user"`, `"assistant"`, `"tool"`, or `"system"`. For messages of the role `"tool"`, the `content` can be a string or an arbitrary object with information about the tool call. For other messages the `content` can be either a string or a list of objects in the format `{type: "text", text:"..."}`.', 9608 type: "string", 9609 applyScrubbing: { 9610 key: "manual" 9611 }, 9612 isInOtel: !0, 9613 visibility: "public", 9614 example: '[{"role": "user", "parts": [{"type": "text", "content": "Weather in Paris?"}]}, {"role": "assistant", "parts": [{"type": "tool_call", "id": "call_VSPygqKTWdrhaFErNvMV18Yl", "n
9614ame": "get_weather", "arguments": {"location": "Paris"}}]}, {"role": "tool", "parts": [{"type": "tool_call_response", "id": "call_VSPygqKTWdrhaFErNvMV18Yl", "result": "rainy, 57\xB0F"}]}]', 9615 aliases: [ 9616 "ai.texts" 9617 ], 9618 changelog: [ 9619 { 9620 version: "0.5.0", 9621 prs: [ 9622 264 9623 ] 9624 }, 9625 { 9626 version: "0.4.0", 9627 prs: [ 9628 221 9629 ] 9630 } 9631 ] 9632 }, 9633 "gen_ai.operation.name": { 9634 brief: "The name of the operation being performed. It has the following list of well-known values: 'chat', 'create_agent', 'embeddings', 'execute_tool', 'generate_content', 'invoke_agent', 'text_completion'. If one of them applies, then that value MUST be used. Otherwise a custom value MAY be used.", 9635 type: "string", 9636 applyScrubbing: { 9637 key: "manual" 9638 }, 9639 isInOtel: !0, 9640 visibility: "public", 9641 example: "chat", 9642 changelog: [ 9643 { 9644 version: "0.4.0", 9645 prs: [ 9646 225 9647 ] 9648 }, 9649 { 9650 version: "0.1.0", 9651 prs: [ 9652 62, 9653 127 9654 ] 9655 } 9656 ] 9657 }, 9658 "gen_ai.operation.type": { 9659 brief: "The type of AI operation. Must be one of 'agent' (invoke_agent and create_agent spans), 'ai_client' (any LLM call), 'tool'
9659(execute_tool spans), 'handoff' (handoff spans), 'other' (input and output processors, skill loading, guardrails etc.) . Added during ingestion based on span.op and gen_ai.operation.type. Used to filter and aggregate data in the UI", 9660 type: "string", 9661 applyScrubbing: { 9662 key: "manual" 9663 }, 9664 isInOtel: !1, 9665 visibility: "public", 9666 example: "tool", 9667 changelog: [ 9668 { 9669 version: "0.4.0", 9670 prs: [ 9671 257 9672 ] 9673 }, 9674 { 9675 version: "0.1.0", 9676 prs: [ 9677 113, 9678 127 9679 ] 9680 } 9681 ] 9682 }, 9683 "gen_ai.output.messages": { 9684 brief: "The model's response messages. It has to be a stringified version of an array of message objects, which can include text responses and tool calls.", 9685 type: "string", 9686 applyScrubbing: { 9687 key: "manual" 9688 }, 9689 isInOtel: !0, 9690 visibility: "public", 9691 example: '[{"role": "assistant", "parts": [{"type": "text", "content": "The weather in Paris is currently rainy with a temperature of 57\xB0F."}], "finish_reason": "stop"}]', 9692 changelog: [ 9693 { 9694 version: "0.4.0", 9695 prs: [ 9696 221 9697 ] 9698 } 9699 ] 9700 }, 9701 "gen_ai.pipeline.name": { 9702 brief: "Name of the AI pipeline or chain being executed.", 9703 type: "string", 9704 applyScrubbing: { 9705 key: "manual" 9706 }, 9707 isInOtel: !1, 9708 visibility: "public", 9709 example: "Autofix Pipeline", 9710 aliases: [ 9711 "ai.pipeline.name" 9712 ], 9713 changelog: [ 9714 { 9715 version: "0.1.0", 9716 prs: [ 9717 76, 9718 127 9719 ] 9720 } 9721 ] 9722 }, 9723 "gen_ai.prompt": { 9724 brief: "The input messages sent to the model", 9725 type: "string", 9726 applyScrubbing: { 9727 key: "manual" 9728 }, 9729 isInOtel: !0, 9730 visibility: "public", 9731 example: '[{"role": "user", "message": "hello"}]', 9732 deprecation: { 9733 reason: "Deprecated from OTEL, use gen_ai.input.messages with the new format instead." 9734 }, 9735 changelog: [ 9736 { 9737 version: "0.1.0", 9738 prs: [ 9739 74, 9740 108, 9741 119 9742 ] 9743 }, 9744 { 9745 version: "0.0.0" 9746 } 9747 ] 9748 }, 9749 "gen_ai.prompt.name": { 9750 brief: "The name of the prompt that uniquely identifies it.", 9751 type: "string", 9752 applyScrubbing: { 9753 key: "manual", 9754 reason: "Prompt names may reveal user behavior patterns or sensitive operations" 9755 }, 9756 isInOtel: !0, 9757 visibility: "public", 9758 example: "summarize_text", 9759 aliases: [ 9760 "mcp.prompt.name" 9761 ], 9762 changelog: [ 9763 { 9764 version: "0.12.0", 9765 prs: [ 9766 420 9767 ], 9768 description: "Added gen_ai.prompt.name attribute" 9769 } 9770 ] 9771 }, 9772 "gen_ai.provider.name": { 9773 brief: "The Generative AI provider as identified by the client or server instrumentation.", 9774 type: "string", 9775 applyScrubbing: { 9776 key: "manual" 9777 }, 9778 isInOtel: !0, 9779 visibility: "public", 9780 example: "openai", 9781 aliases: [ 9782 "ai.model.provider", 9783 "gen_ai.system" 9784 ], 9785 changelog: [ 9786 { 9787 version: "0.4.0", 9788 prs: [ 9789 253 9790 ] 9791 } 9792 ] 9793 }, 9794 "gen_ai.request.available_tools": { 9795 brief: "The available tools for the model. It has to be a stringified version of an array of objects.", 9796 type: "string", 9797 applyScrubbing: { 9798 key: "manual" 9799 }, 9800 isInOtel: !1, 9801 visibility: "public", 9802 example: '[{"name": "get_weather", "description": "Get the weather for a given location"}, {"name": "get_news", "description": "Get the news for a given topic"}]', 9803 deprecation: { 9804 replacement: "gen_ai.tool.definitions" 9805 }, 9806 changelog: [ 9807 { 9808 version: "0.4.0", 9809 prs: [ 9810 221 9811 ] 9812 }, 9813 { 9814 version: "0.1.0", 9815 prs: [ 9816 63, 9817 127 9818 ] 9819 } 9820 ] 9821 }, 9822 "gen_ai.request.frequency_penalty": { 9823 brief: "Used to reduce repetitiveness of generated tokens. The higher the value, the stronger a penalty is a
9823pplied to previously present tokens, proportional to how many times they have already appeared in the prompt or prior generation.", 9824 type: "double", 9825 applyScrubbing: { 9826 key: "manual" 9827 }, 9828 isInOtel: !0, 9829 visibility: "public", 9830 example: .5, 9831 aliases: [ 9832 "ai.frequency_penalty" 9833 ], 9834 changelog: [ 9835 { 9836 version: "0.4.0", 9837 prs: [ 9838 228 9839 ] 9840 }, 9841 { 9842 version: "0.1.0", 9843 prs: [ 9844 57 9845 ] 9846 } 9847 ] 9848 }, 9849 "gen_ai.request.max_tokens": { 9850 brief: "The maximum number of tokens to generate in the response.", 9851 type: "integer", 9852 applyScrubbing: { 9853 key: "manual" 9854 }, 9855 isInOtel: !0, 9856 visibility: "public", 9857 example: 2048, 9858 changelog: [ 9859 { 9860 version: "0.4.0", 9861 prs: [ 9862 228 9863 ] 9864 }, 9865 { 9866 version: "0.1.0", 9867 prs: [ 9868 62 9869 ] 9870 } 9871 ] 9872 }, 9873 "gen_ai.request.messages": { 9874 brief: 'The messages passed to the model. It has to be a stringified version of an array of objects. The `role` attribute of each object must be `"user"`, `"assistant"`, `"tool"`, or `"system"`. For messages of the role `"tool"`, the `content` can be a string or an arbitrary object with information about the tool call. For other messages the `content` can be either a string or a list of objects in the format `{type: "text", text:"..."}`.', 9875 type: "string", 9876 applyScrubbing: { 9877 key: "manual" 9878 }, 9879 isInOtel: !1, 9880 visibility: "public", 9881 example: '[{"role": "system", "content": "Generate a random number."}, {"role": "user", "content": [{"text": "Generate a random number between 0 and 10.", "type": "text"}]}, {"role": "tool", "content": {"toolCallId": "1", "toolName": "Weather", "output": "rainy"}}]', 9882 deprecation: { 9883 replacement: "gen_ai.input.messages" 9884 }, 9885 aliases: [ 9886 "ai.input_messages" 9887 ], 9888 changelog: [ 9889 { 9890 version: "0.4.0", 9891 prs: [ 9892 221 9893 ] 9894 }, 9895 { 9896 version: "0.1.0", 9897 prs: [ 9898 63, 9899 74, 9900 108, 9901 119, 9902 122 9903 ] 9904 } 9905 ] 9906 }, 9907 "gen_ai.request.model": { 9908 brief: "The model identifier being used for the request.", 9909 type: "string", 9910 applyScrubbing: { 9911 key: "manual" 9912 }, 9913 isInOtel: !0, 9914 visibility: "public", 9915 example: "gpt-4-turbo-preview", 9916 changelog: [ 9917 { 9918 version: "0.1.0", 9919 prs: [ 9920 62, 9921 127 9922 ] 9923 } 9924 ] 9925 }, 9926 "gen_ai.request.presence_penalty": { 9927 brief: "Used to reduce repetitiveness of generated tokens. Similar to frequency_penalty, except that this penalty is applied equally to all tokens that have already appeared, regardless of their exact frequencies.", 9928 type: "double", 9929 applyScrubbing: { 9930 key: "manual" 9931 }, 9932 isInOtel: !0, 9933 visibility: "public", 9934 example: .5, 9935 aliases: [ 9936 "ai.presence_penalty" 9937 ], 9938 changelog: [ 9939 { 9940 version: "0.4.0", 9941 prs: [ 9942 228 9943 ] 9944 }, 9945 { 9946 version: "0.1.0", 9947 prs: [ 9948 57 9949 ] 9950 } 9951 ] 9952 }, 9953 "gen_ai.request.reasoning_effort": { 9954 brief: "Constrains the effort on reasoning for reasoning models. Supported values vary by provider.", 9955 type: "string", 9956 applyScrubbing: { 9957 key: "manual" 9958 }, 9959 isInOtel: !1, 9960 visibility: "public", 9961 example: "high", 9962 changelog: [ 9963 { 9964 version: "0.13.0", 9965 prs: [ 9966 334 9967 ], 9968 description: "Added gen_ai.request.reasoning_effort attribute" 9969 } 9970 ] 9971 }, 9972 "gen_ai.request.seed": { 9973 brief: "The seed, ideally models given the same seed and same other parameters will produce the exact same output.", 9974 type: "string", 9975 applyScrubbing: { 9976 key: "manual" 9977 }, 9978 isInOtel: !0, 9979 visibility: "public", 9980 example: "1234567890", 9981 aliases: [ 9982 "ai.seed" 9983 ], 9984 changelog: [ 9985 { 9986 version: "0.1.0", 9987 prs: [ 9988 57, 9989 127 9990 ] 9991 } 9992 ] 9993 }, 9994 "gen_ai.request.stop_sequences": { 9995 brief: "List of sequences that the model will use to stop generating further tokens.", 9996 type: "string[]", 9997 applyScrubbing: { 9998 key: "manual" 9999 }, 10000 isInOtel: !0, 10001 visibility: "public", 10002 example: [ 10003 "forest", 10004 "lived" 10005 ], 10006 changelog: [ 10007 { 10008 version: "0.16.0", 10009 prs: [ 10010 482 10011 ], 10012 description: "Added gen_ai.request.stop_sequences attribute" 10013 } 10014 ] 10015 }, 10016 "gen_ai.request.temperature": { 10017 brief: "For an AI model call, the temperature parameter. Temperature essentially means how random the output will be.", 10018 type: "double", 10019 applyScrubbing: { 10020 key: "manual" 10021 }, 10022 isInOtel: !0, 10023 visibility: "public", 10024 example: .1, 10025 aliases: [ 10026 "ai.temperature" 10027 ], 10028 changelog: [ 10029 { 10030 version: "0.4.0", 10031 prs: [ 10032 228 10033 ] 10034 }, 10035 { 10036 version: "0.1.0", 10037 prs: [ 10038 57 10039 ] 10040 } 10041 ] 10042 }, 10043 "gen_ai.request.top_k": { 10044 brief: "Limits the model to only consider the K most likely next tokens, where K is an integer (e.g., top_k=20 means only the 20 highest probability tokens are considered).", 10045 type: "integer", 10046 applyScrubbing: { 10047 key: "manual" 10048 }, 10049 isInOtel: !0, 10050 visibility: "public", 10051 example: 35, 10052 aliases: [ 10053 "ai.top_k" 10054 ], 10055 changelog: [ 10056 { 10057 version: "0.4.0", 10058 prs: [ 10059 228 10060 ] 10061 }, 10062 { 10063 version: "0.1.0", 10064 prs: [ 10065 57 10066 ] 10067 } 10068 ] 10069 }, 10070 "gen_ai.request.top_p": { 10071 brief: "Limits the model to only consider tokens whose cumulative probability mass adds up to p, where p is a float between 0 and 1 (e.g., top_p=0.7 means only tokens that sum up to 70% of the probability mass are considered).", 10072 type: "double", 10073 applyScrubbing: { 10074 key: "manual" 10075 }, 10076 isInOtel: !0, 10077 visibility: "public", 10078 example: .7, 10079 aliases: [ 10080 "ai.top_p" 10081 ], 10082 changelog: [ 10083 { 10084 version: "0.4.0", 10085 prs: [ 10086 228 10087 ] 10088 }, 10089 { 10090 version: "0.1.0", 10091 prs: [ 10092 57 10093 ] 10094 } 10095 ] 10096 }, 10097 "gen_ai.response.finish_reasons": { 10098 brief: "The reason why the model stopped generating.", 10099 type: "string", 10100 applyScrubbing: { 10101 key: "manual" 10102 }, 10103 isInOtel: !0, 10104 visibility: "public", 10105 example: "COMPLETE", 10106 aliases: [ 10107 "ai.finish_reason" 10108 ], 10109 changelog: [ 10110 { 10111 version: "0.1.0", 10112 prs: [ 10113 57, 10114 127 10115 ] 10116 } 10117 ] 10118 }, 10119 "gen_ai.response.id": { 10120 brief: "Unique identifier for the completion.", 10121 type: "string", 10122 applyScrubbing: { 10123 key: "manual" 10124 }, 10125 isInOtel: !0, 10126 visibility: "public", 10127 example: "gen_123abc", 10128 aliases: [ 10129 "ai.generation_id" 10130 ], 10131 changelog: [ 10132 { 10133 version: "0.1.0", 10134 prs: [ 10135 57, 10136 127 10137 ] 10138 } 10139 ] 10140 }, 10141 "gen_ai.response.model": { 10142 brief: "The vendor-specific ID of the model used.", 10143 type: "string", 10144 applyScrubbing: { 10145 key: "manual" 10146 }, 10147 isInOtel: !0, 10148 visibility: "public", 10149 example: "gpt-4", 10150 aliases: [ 10151 "ai.model_id" 10152 ], 10153 changelog: [ 10154 { 10155 version: "0.1.0", 10156 prs: [ 10157 127 10158 ] 10159 }, 10160 { 10161 version: "0.0.0" 10162 } 10163 ] 10164 }, 10165 "gen_ai.response.streaming": { 10166 brief: "Whether or not the AI model call's response was streamed back asynchronously", 10167 type: "boolean", 10168 applyScrubbing: { 10169 key: "manual" 10170 }, 10171 isInOtel: !1, 10172 visibility: "public", 10173 example: !0, 10174 aliases: [ 10175 "ai.streaming" 10176 ], 10177 changelog: [ 10178 { 10179 version: "0.1.0", 10180 prs: [ 10181 76 10182 ] 10183 } 10184 ] 10185 }, 10186 "gen_ai.response.text": { 10187 brief: "The model's response text messages. It has to be a stringified version of an array of response text messages.", 10188 type: "string", 10189 applyScrubbing: { 10190 key: "manual" 10191 }, 10192 isInOtel: !1, 10193 visibility: "public", 10194 example: '["The weather in Paris is rainy and overcast, with temperatures around 57\xB0F", "The weather in London is sunny and warm, with temperatures around 65\xB0F"]', 10195 deprecation: { 10196 replacement: "gen_ai.output.messages" 10197 }, 10198 changelog: [ 10199 { 10200 version: "0.4.0", 10201 prs: [ 10202 221 10203 ] 10204 }, 10205 { 10206 version: "0.1.0", 10207 prs: [ 10208 63, 10209 74
10210 ] 10211 } 10212 ] 10213 }, 10214 "gen_ai.response.time_to_first_chunk": { 10215 brief: "Time in seconds when the first response content chunk arrived in streaming responses.", 10216 type: "double", 10217 applyScrubbing: { 10218 key: "manual" 10219 }, 10220 isInOtel: !0, 10221 visibility: "public", 10222 example: .6853435, 10223 aliases: [ 10224 "gen_ai.response.time_to_first_token" 10225 ], 10226 changelog: [ 10227 { 10228 version: "0.11.0", 10229 prs: [ 10230 418 10231 ], 10232 description: "Added gen_ai.response.time_to_first_chunk attribute" 10233 } 10234 ] 10235 }, 10236 "gen_ai.response.time_to_first_token": { 10237 brief: "Time in seconds when the first response content chunk arrived in streaming responses.", 10238 type: "double", 10239 applyScrubbing: { 10240 key: "manual" 10241 }, 10242 isInOtel: !1, 10243 visibility: "public", 10244 example: .6853435, 10245 deprecation: { 10246 replacement: "gen_ai.response.time_to_first_chunk" 10247 }, 10248 aliases: [ 10249 "gen_ai.response.time_to_first_chunk" 10250 ], 10251 changelog: [ 10252 { 10253 version: "0.11.0", 10254 prs: [ 10255 418 10256 ], 10257 description: "Deprecate in favor of gen_ai.response.time_to_first_chunk" 10258 }, 10259 { 10260 version: "0.4.0", 10261 prs: [ 10262 227 10263 ] 10264 } 10265 ] 10266 }, 10267 "gen_ai.response.tokens_per_second": { 10268 brief: "The total output tokens per seconds throughput", 10269 type: "double", 10270 applyScrubbing: { 10271 key: "manual" 10272 }, 10273 isInOtel: !1, 10274 visibility: "public", 10275 example: 12345.67, 10276 changelog: [ 10277 { 10278 version: "0.4.0", 10279 prs: [ 10280 228 10281 ] 10282 }, 10283 { 10284 version: "0.1.0", 10285 prs: [ 10286 66 10287 ] 10288 } 10289 ] 10290 }, 10291 "gen_ai.response.tool_calls": { 10292 brief: "The tool calls in the model's response. It has to be a stringified version of an array of objects.", 10293 type: "string", 10294 applyScrubbing: { 10295 key: "manual" 10296 }, 10297 isInOtel: !1, 10298 visibility: "public", 10299 example: '[{"name": "get_weather", "arguments": {"location": "Paris"}}]', 10300 deprecation: { 10301 replacement: "gen_ai.output.messages" 10302 }, 10303 changelog: [ 10304 { 10305 version: "0.4.0", 10306 prs: [ 10307 221 10308 ] 10309 }, 10310 { 10311 version: "0.1.0", 10312 prs: [ 10313 63, 10314 74 10315 ] 10316 } 10317 ] 10318 }, 10319 "gen_ai.system": { 10320 brief: "The provider of the model.", 10321 type: "string", 10322 applyScrubbing: { 10323 key: "manual" 10324 }, 10325 isInOtel: !0, 10326 visibility: "public", 10327 example: "openai", 10328 deprecation: { 10329 replacement: "gen_ai.provider.name" 10330 }, 10331 aliases: [ 10332 "ai.model.provider", 10333 "gen_ai.provider.name" 10334 ], 10335 changelog: [ 10336 { 10337 version: "0.4.0", 10338 prs: [ 10339 253 10340 ] 10341 }, 10342 { 10343 version: "0.1.0", 10344 prs: [ 10345 57, 10346 127 10347 ] 10348 } 10349 ] 10350 }, 10351 "gen_ai.system_instructions": { 10352 brief: "The system instructions passed to the model.", 10353 type: "string", 10354 applyScrubbing: { 10355 key: "manual" 10356 }, 10357 isInOtel: !0, 10358 visibility: "public", 10359 example: "You are a helpful assistant", 10360 aliases: [ 10361 "ai.preamble" 10362 ], 10363 changelog: [ 10364 { 10365 version: "0.5.0", 10366 prs: [ 10367 264 10368 ] 10369 }, 10370 { 10371 version: "0.4.0", 10372 prs: [ 10373 221 10374 ] 10375 } 10376 ] 10377 }, 10378 "gen_ai.system.message": { 10379 brief: "The system instructions passed to the model.", 10380 type: "string", 10381 applyScrubbing: { 10382 key: "auto" 10383 }, 10384 isInOtel: !1, 10385 visibility: "public", 10386 example: "You are a helpful assistant", 10387 deprecation: { 10388 replacement: "gen_ai.system_instructions" 10389 }, 10390 changelog: [ 10391 { 10392 version: "0.4.0", 10393 prs: [ 10394 221 10395 ] 10396 }, 10397 { 10398 version: "0.1.0", 10399 prs: [ 10400 62 10401 ] 10402 } 10403 ] 10404 }, 10405 "gen_ai.tool.call.arguments": { 10406 brief: "The arguments of the tool call. It has to be a stringified version of the arguments to the tool.", 10407 type: "string", 10408 applyScrubbing: { 10409 key: "manual" 10410 }, 10411 isInOtel: !0, 10412 visibility: "public", 10413 example: '{"location": "Paris"}', 10414 aliases: [ 10415 "gen_ai.tool.input" 10416 ], 10417 changelog: [ 10418 { 10419 version: "0.5.0", 10420 prs: [ 10421 265 10422 ] 10423 }, 10424 { 10425 version: "0.4.0", 10426 prs: [ 10427 221 10428 ] 10429 } 10430 ] 10431 }, 10432 "gen_ai.tool.call.result": { 10433 brief: "The result of the tool call. It has to be a stringified version of the result of the tool.", 10434 type: "string", 10435 applyScrubbing: { 10436 key: "manual" 10437 }, 10438 isInOtel: !0, 10439 visibility: "public", 10440 example: "rainy, 57\xB0F", 10441 aliases: [ 10442 "gen_ai.tool.output", 10443 "gen_ai.tool.message", 10444 "mcp.tool.result.content" 10445 ], 10446 changelog: [ 10447 { 10448 version: "0.5.0", 10449 prs: [ 10450 265 10451 ] 10452 }, 10453 { 10454 version: "0.4.0", 10455 prs: [ 10456 221 10457 ] 10458 } 10459 ] 10460 }, 10461 "gen_ai.tool.definitions": { 10462 brief: "The list of source system tool definitions available to the GenAI agent or model.", 10463 type: "string", 10464 applyScrubbing: { 10465 key: "manual" 10466 }, 10467 isInOtel: !0, 10468 visibility: "public", 10469 example: '[{"type": "function", "name": "get_current_weather", "description": "Get the current weather in a given location", "parameters": {"type": "object", "properties": {"location": {"type": "string", "description": "The city and state, e.g. San Francisco, CA"}, "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}}, "required": ["location", "unit"]}}]', 10470 changelog: [ 10471 { 10472 version: "0.4.0", 10473 prs: [ 10474 221 10475 ] 10476 } 10477 ] 10478 }, 10479 "gen_ai.tool.description": { 10480 brief: "The description of the tool being used.", 10481 type: "string", 10482 applyScrubbing: { 10483 key: "manual" 10484 }, 10485 isInOtel: !0, 10486 visibility: "public", 10487 example: "Searches the web for current information about a to
10487pic", 10488 changelog: [ 10489 { 10490 version: "0.1.0", 10491 prs: [ 10492 62, 10493 127 10494 ] 10495 } 10496 ] 10497 }, 10498 "gen_ai.tool.input": { 10499 brief: "The input of the tool being used. It has to be a stringified version of the input to the tool.", 10500 type: "string", 10501 applyScrubbing: { 10502 key: "manual" 10503 }, 10504 isInOtel: !1, 10505 visibility: "public", 10506 example: '{"location": "Paris"}', 10507 deprecation: { 10508 replacement: "gen_ai.tool.call.arguments" 10509 }, 10510 aliases: [ 10511 "gen_ai.tool.call.arguments" 10512 ], 10513 changelog: [ 10514 { 10515 version: "0.5.0", 10516 prs: [ 10517 265 10518 ] 10519 }, 10520 { 10521 version: "0.1.0", 10522 prs: [ 10523 63, 10524 74 10525 ] 10526 } 10527 ] 10528 }, 10529 "gen_ai.tool.message": { 10530 brief: "The response from a tool or function call passed to the model.", 10531 type: "string", 10532 applyScrubbing: { 10533 key: "auto" 10534 }, 10535 isInOtel: !1, 10536 visibility: "public", 10537 example: "rainy, 57\xB0F", 10538 deprecation: { 10539 replacement: "gen_ai.tool.call.result" 10540 }, 10541 aliases: [ 10542 "gen_ai.tool.call.result", 10543 "gen_ai.tool.output", 10544 "mcp.tool.result.content" 10545 ], 10546 changelog: [ 10547 { 10548 version: "0.5.0", 10549 prs: [ 10550 265 10551 ] 10552 }, 10553 { 10554 version: "0.1.0", 10555 prs: [ 10556 62 10557 ] 10558 } 10559 ] 10560 }, 10561 "gen_ai.tool.name": { 10562 brief: "Name of the tool utilized by the agent.", 10563 type: "string", 10564 applyScrubbing: { 10565 key: "manual" 10566 }, 10567 isInOtel: !0, 10568 visibility: "public", 10569 example: "Flights", 10570 aliases: [ 10571 "ai.function_call", 10572 "mcp.tool.name" 10573 ], 10574 changelog: [ 10575 { 10576 version: "0.1.0", 10577 prs: [ 10578 57, 10579 127 10580 ] 10581 } 10582 ] 10583 }, 10584 "gen_ai.tool.output": { 10585 brief: "The output of the tool being used. It has to be a stringified version of the output of the tool.", 10586 type: "string", 10587 applyScrubbing: { 10588 key: "manual" 10589 }, 10590 isInOtel: !1, 10591 visibility: "public", 10592 example: "rainy, 57\xB0F", 10593 deprecation: { 10594 replacement: "gen_ai.tool.call.result" 10595 }, 10596 aliases: [ 10597 "gen_ai.tool.call.result", 10598 "gen_ai.tool.message", 10599 "mcp.tool.result.content" 10600 ], 10601 changelog: [ 10602 { 10603 version: "0.5.0", 10604 prs: [ 10605 265 10606 ] 10607 }, 10608 { 10609 version: "0.1.0", 10610 prs: [ 10611 63, 10612 74 10613 ] 10614 } 10615 ] 10616 }, 10617 "gen_ai.tool.type": { 10618 brief: "The type of tool being used.", 10619 type: "string", 10620 applyScrubbing: { 10621 key: "manual" 10622 }, 10623 isInOtel: !0, 10624 visibility: "public", 10625 example: "function", 10626 deprecation: { 10627 reason: "The gen_ai.tool.type attribute is deprecated and should no longer be set." 10628 }, 10629 changelog: [ 10630 { 10631 version: "0.1.0", 10632 prs: [ 10633 62, 10634 127 10635 ] 10636 } 10637 ] 10638 }, 10639 "gen_ai.usage.cache_creation.input_tokens": { 10640 brief: "The number of tokens written to the cache when processing the AI input (prompt).", 10641 type: "integer", 10642 applyScrubbing: { 10643 key: "manual" 10644 }, 10645 isInOtel: !0, 10646 visibility: "public", 10647 example: 100, 10648 aliases: [ 10649 "gen_ai.usage.input_tokens.cache_write" 10650 ], 10651 changelog: [ 10652 { 10653 version: "0.11.0", 10654 prs: [ 10655 418 10656 ], 10657 description: "Added gen_ai.usage.cache_creation.input_tokens attribute" 10658 } 10659 ], 10660 additionalContext: [ 10661 "This attribute appears on both agent parent spans (aggregated totals) and LLM child spans (per-call values). When using sum() to count tokens, filter to gen_ai.operation.type:ai_client to avoid double-counting hierarchical spans." 10662 ] 10663 }, 10664 "gen_ai.usage.cache_read.input_tokens": { 10665 brief: "The number of cached tokens used to process the AI input (prompt).", 10666 type: "integer", 10667 applyScrubbing: { 10668 key: "manual" 10669 }, 10670 isInOtel: !0, 10671 visibility: "public", 10672 example: 50, 10673 aliases: [ 10674 "gen_ai.usage.input_tokens.cached" 10675 ], 10676 changelog: [ 10677 { 10678 version: "0.11.0", 10679 prs: [ 10680 418 10681 ], 10682 description: "Added gen_ai.usage.cache_read.input_tokens attribute" 10683 } 10684 ], 10685 additionalContext: [ 10686 "This attribute appears on both agent parent spans (aggregated totals) and LLM child spans (per-call values). When using sum() to count tokens, filter to gen_ai.operation.type:ai_client to avoid double-counting hierarchical spans.", 10687 "This is a subset of gen_ai.usage.input_tokens, not an independent count. Do not sum this with gen_ai.usage.input_tokens \u2014 it is already included." 10688 ] 10689 }, 10690 "gen_ai.usage.completion_tokens": { 10691 brief: "The number of tokens used in the GenAI response
10691(completion).", 10692 type: "integer", 10693 applyScrubbing: { 10694 key: "manual" 10695 }, 10696 isInOtel: !0, 10697 visibility: "public", 10698 example: 10, 10699 deprecation: { 10700 replacement: "gen_ai.usage.output_tokens" 10701 }, 10702 aliases: [ 10703 "ai.completion_tokens.used", 10704 "gen_ai.usage.output_tokens" 10705 ], 10706 changelog: [ 10707 { 10708 version: "0.9.0", 10709 prs: [ 10710 397 10711 ], 10712 description: "Add additional_context" 10713 }, 10714 { 10715 version: "0.4.0", 10716 prs: [ 10717 228 10718 ] 10719 }, 10720 { 10721 version: "0.1.0", 10722 prs: [ 10723 61 10724 ] 10725 }, 10726 { 10727 version: "0.0.0" 10728 } 10729 ], 10730 additionalContext: [ 10731 "This attribute appears on both agent parent spans (aggregated totals) and LLM child spans (per-call values). When using sum() to count tokens, filter to gen_ai.operation.type:ai_client to avoid double-counting hierarchical spans." 10732 ] 10733 }, 10734 "gen_ai.usage.input_tokens": { 10735 brief: "The number of tokens used to process the AI input (prompt) including cached input tokens.", 10736 type: "integer", 10737 applyScrubbing: { 10738 key: "manual" 10739 }, 10740 isInOtel: !0, 10741 visibility: "public", 10742 example: 10, 10743 aliases: [ 10744 "ai.prompt_tokens.used", 10745 "gen_ai.usage.prompt_tokens" 10746 ], 10747 changelog: [ 10748 { 10749 version: "0.11.0", 10750 prs: [ 10751 418 10752 ], 10753 description: "Update additional_context to reference gen_ai.usage.cache_read.input_tokens" 10754 }, 10755 { 10756 version: "0.9.0", 10757 prs: [ 10758 397 10759 ], 10760 description: "Add additional_context" 10761 }, 10762 { 10763 version: "0.5.0", 10764 prs: [ 10765 261 10766 ] 10767 }, 10768 { 10769 version: "0.4.0", 10770 prs: [ 10771 228 10772 ] 10773 }, 10774 { 10775 version: "0.1.0", 10776 prs: [ 10777 112 10778 ] 10779 }, 10780 { 10781 version: "0.0.0" 10782 } 10783 ], 10784 additionalContext: [ 10785 "This attribute appears on both agent parent spans (aggregated totals) and LLM child spans (per-call values). When using sum() to count tokens, filter to gen_ai.operation.type:ai_client to avoid double-counting hierarchical spans.", 10786 "This count includes cached input tokens. gen_ai.usage.cache_read.input_tokens is a subset of this value, not an independent count \u2014 do not sum them together." 10787 ] 10788 }, 10789 "gen_ai.usage.input_tokens.cached": { 10790 brief: "The number of cached tokens used to process the AI input (prompt).", 10791 type: "integer", 10792 applyScrubbing: { 10793 key: "manual" 10794 }, 10795 isInOtel: !1, 10796 visibility: "public", 10797 example: 50, 10798 deprecation: { 10799 replacement: "gen_ai.usage.cache_read.input_tokens" 10800 }, 10801 aliases: [ 10802 "gen_ai.usage.cache_read.input_tokens" 10803 ], 10804 changelog: [ 10805 { 10806 version: "0.11.0", 10807 prs: [ 10808 418 10809 ], 10810 description: "Deprecate in favor of gen_ai.usage.cache_read.input_tokens" 10811 }, 10812 { 10813 version: "0.9.0", 10814 prs: [ 10815 397 10816 ], 10817 description: "Add additional_context" 10818 }, 10819 { 10820 version: "0.4.0", 10821 prs: [ 10822 228 10823 ] 10824 }, 10825 { 10826 version: "0.1.0", 10827 prs: [ 10828 62, 10829 112 10830 ] 10831 } 10832 ], 10833 additionalContext: [ 10834 "This attribute appears on both agent parent spans (aggregated totals) and LLM child spans (per-call values). When using sum() to count tokens, filter to gen_ai.operation.type:ai_client to avoid double-counting hierarchical spans.", 10835 "This is a subset of gen_ai.usage.input_tokens, not an independent count. Do not sum this with gen_ai.usage.input_tokens \u2014 it is already included." 10836 ] 10837 }, 10838 "gen_ai.usage.input_tokens.cache_write": { 10839 brief: "The number of tokens written to the cache when processing the AI input (prompt).", 10840 type: "integer", 10841 applyScrubbing: { 10842 key: "manual" 10843 }, 10844 isInOtel: !1, 10845 visibility: "public", 10846 example: 100, 10847 deprecation: { 10848 replacement: "gen_ai.usage.cache_creation.input_tokens" 10849 }, 10850 aliases: [ 10851 "gen_ai.usage.cache_creation.input_tokens" 10852 ], 10853 changelog: [ 10854 { 10855 version: "0.11.0", 10856 prs: [ 10857 418 10858 ], 10859 description: "Deprecate in favor of gen_ai.usage.cache_creation.input_tokens" 10860 }, 10861 { 10862 version: "0.9.0", 10863 prs: [ 10864 397 10865 ], 10866 description: "Add additional_context" 10867 }, 10868 { 10869 version: "0.4.0", 10870 prs: [ 10871 217, 10872 228 10873 ] 10874 } 10875 ], 10876 additionalContext: [ 10877 "This attribute appears on both agent parent spans (aggregated totals) and LLM child spans (per-call values). When using sum() to count tokens, filter to gen_ai.operation.type:ai_client to avoid double-counting hierarchical spans." 10878 ] 10879 }, 10880 "gen_ai.usage.output_tokens": { 10881 brief: "The number of tokens used for creating the AI output (including reasoning tokens).", 10882 type: "integer", 10883 applyScrubbing: { 10884 key: "manual" 10885 }, 10886 isInOtel: !0, 10887 visibility: "public", 10888 example: 10, 10889 aliases: [ 10890 "ai.completion_tokens.used", 10891 "gen_ai.usage.completion_tokens" 10892 ], 10893 changelog: [ 10894 { 10895 version: "0.11.0", 10896 prs: [ 10897 418 10898 ], 10899 description: "Update additional_context to reference gen_ai.usage.reasoning.output_tokens" 10900 }, 10901 { 10902 version: "0.9.0", 10903 prs: [ 10904 397 10905 ], 10906 description: "Add additional_context" 10907 }, 10908 { 10909 version: "0.5.0", 10910 prs: [ 10911 261 10912 ] 10913 }, 10914 { 10915 version: "0.4.0", 10916 prs: [ 10917 228 10918 ] 10919 }, 10920 { 10921 version: "0.1.0", 10922 prs: [ 10923 112 10924 ] 10925 }, 10926 { 10927 version: "0.0.0" 10928 } 10929 ], 10930 additionalContext: [ 10931 "This attribute appears on both agent parent spans (aggregated totals) and LLM child spans (per-call values). When using sum() to count tokens, filter to gen_ai.operation.type:ai_client to avoid double-counting hierarchical spans.", 10932 "This count includes reasoning tokens. gen_ai.usage.reasoning.output_tokens is a subset of this value, not an independent count \u2014 do not sum them together." 10933 ] 10934 }, 10935 "gen_ai.usage.output_tokens.reasoning": { 10936 brief: "The number of tokens used for reasoning to create the AI output.", 10937 type: "integer", 10938 applyScrubbing: { 10939 key: "manual" 10940 }, 10941 isInOtel: !1, 10942 visibility: "public", 10943 example: 75, 10944 deprecation: { 10945 replacement: "gen_ai.usage.reasoning.output_tokens" 10946 }, 10947 aliases: [ 10948 "gen_ai.usage.reasoning.output_tokens" 10949 ], 10950 changelog: [ 10951 { 10952 version: "0.11.0", 10953 prs: [ 10954 418 10955 ], 10956 description: "Deprecate in favor of gen_ai.usage.reasoning.output_tokens" 10957 }, 10958 { 10959 version: "0.9.0", 10960 prs: [ 10961 397 10962 ], 10963 description: "Add additional_context" 10964 }, 10965 { 10966 version: "0.4.0", 10967 prs: [ 10968 228 10969 ] 10970 }, 10971 { 10972 version: "0.1.0", 10973 prs: [ 10974 62, 10975 112 10976 ] 10977 } 10978 ], 10979 additionalContext: [ 10980 "This attribute appears on both agent parent spans (aggregated totals) and LLM child spans (per-call values). When using sum() to count tokens, filter to gen_ai.operation.type:ai_client to avoid double-counting hierarchical spans.", 10981 "This is a subset of gen_ai.usage.output_tokens, not an independent count. Do not sum this with gen_ai.usage.output_tokens \u2014 it is already included." 10982 ] 10983 }, 10984 "gen_ai.usage.prompt_tokens": { 10985 brief: "The number of tokens used in the GenAI input (prompt).", 10986 type: "integer", 10987 applyScrubbing: { 10988 key: "manual" 10989 }, 10990 isInOtel: !0, 10991 visibility: "public", 10992 example: 20, 10993 deprecation: { 10994 replacement: "gen_ai.usage.input_tokens" 10995 }, 10996 aliases: [ 10997 "ai.prompt_tokens.used", 10998 "gen_ai.usage.input_tokens" 10999 ], 11000 changelog: [ 11001 { 11002 version: "0.9.0", 11003 prs: [ 11004 397 11005 ], 11006 description: "Add additional_context" 11007 }, 11008 { 11009 version: "0.4.0", 11010 prs: [ 11011 228 11012 ] 11013 }, 11014 { 11015 version: "0.1.0", 11016 prs: [ 11017 61 11018 ] 11019 }, 11020 { 11021 version: "0.0.0" 11022 } 11023 ], 11024 additionalContext: [ 11025 "This attribute appears on both agent parent spans (aggregated totals) and LLM child spans (per-call values). When using sum() to count tokens, filter to gen_ai.operation.type:ai_client to avoid double-counting hierarchical spans." 11026 ] 11027 }, 11028 "gen_ai.usage.reasoning.output_tokens": { 11029 brief: "The number of tokens used for reasoning to create the AI output.", 11030 type: "integer", 11031 applyScrubbing: { 11032 key: "manual" 11033 }, 11034 isInOtel: !0, 11035 visibility: "public", 11036 example: 75, 11037 aliases: [ 11038 "gen_ai.usage.output_tokens.reasoning" 11039 ], 11040 changelog: [ 11041 { 11042 version: "0.11.0", 11043 prs: [ 11044 418 11045 ], 11046 description: "Added gen_ai.usage.reasoning.output_tokens attribute" 11047 } 11048 ], 11049 additionalContext: [ 11050 "This attribute appears on both agent parent spans (aggregated totals) and LLM child spans (per-call values). When using sum() to count tokens, filter to gen_ai.operation.type:ai_client to avoid double-counting hierarchical spans.", 11051 "This is a subset of gen_ai.usage.output_tokens, not an independent count. Do not sum this with gen_ai.usage.output_tokens \u2014 it is already included." 11052 ] 11053 }, 11054 "gen_ai.usage.total_tokens": { 11055 brief: "The total number of tokens used to process the prompt. (input tokens plus output todkens)", 11056 type: "integer", 11057 applyScrubbing: { 11058 key: "manual" 11059 }, 11060 isInOtel: !1, 11061 visibility: "public", 11062 example: 20, 11063 aliases: [ 11064 "ai.total_tokens.used" 11065 ], 11066 changelog: [ 11067 { 11068 version: "0.9.0", 11069 prs: [ 11070 397 11071 ], 11072 description: "Add additional_context" 11073 }, 11074 { 11075 version: "0.4.0", 11076 prs: [ 11077 228 11078 ] 11079 }, 11080 { 11081 version: "0.1.0", 11082 prs: [ 11083 57 11084 ] 11085 } 11086 ], 11087 additionalContext: [ 11088 "This attribute appears on both agent parent spans (aggregated totals) and LLM child spans (per-call values). When using sum() to count tokens, filter to gen_ai.operation.type:ai_client to avoid double-counting hierarchical spans.", 11089 "This is the sum of gen_ai.usage.input_tokens and gen_ai.usage.output_tokens. Do not sum this with either of them \u2014 they are already included." 11090 ] 11091 }, 11092 "graphql.document": { 11093 brief: "The GraphQL document being executed.", 11094 type: "string", 11095 applyScrubbing: { 11096 key: "auto", 11097 reason: "The document may contain sensitive information in arguments or variables. Instrumentation should redact sensitive information when possible." 11098 }, 11099 isInOtel: !0, 11100 visibility: "public", 11101 example: "query findBookById { bookById(id: ?) { name } }", 11102 changelog: [ 11103 { 11104 version: "0.7.0", 11105 description: "Adds the `graphql.document` attribute to track the GraphQL document being executed." 11106 } 11107 ] 11108 }, 11109 "graphql.operation.name": { 11110 brief: "The name of the operation being executed.", 11111 type: "string", 11112 applyScrubbing: { 11113 key: "manual" 11114 }, 11115 isInOtel: !0, 11116 visibility: "public", 11117 example: "findBookById", 11118 changelog: [ 11119 { 11120 version: "0.1.0", 11121 prs: [ 11122 127 11123 ] 11124 }, 11125 { 11126 version: "0.0.0" 11127 } 11128 ] 11129 }, 11130 "graphql.operation.type": { 11131 brief: "The type of the operation being executed.", 11132 type: "string", 11133 applyScrubbing: { 11134 key: "manual" 11135 }, 11136 isInOtel: !0, 11137 visibility: "public", 11138 example: "query", 11139 changelog: [ 11140 { 11141 version: "0.1.0", 11142 prs: [ 11143 127 11144 ] 11145 }, 11146 { 11147 version: "0.0.0" 11148 } 11149 ] 11150 }, 11151 hardwareConcurrency: { 11152 brief: "The number of logical CPU cores available.", 11153 type: "string", 11154 applyScrubbing: { 11155 key: "manual" 11156 }, 11157 isInOtel: !1, 11158 visibility: "public", 11159 example: "14", 11160 deprecation: { 11161 replacement: "device.processor_count", 11162 reason: "Old namespace-less attribute, to be replaced with device.processor_count for span-first future" 11163 }, 11164 aliases: [ 11165 "device.processor_count" 11166 ], 11167 changelog: [ 11168 { 11169 version: "0.5.0", 11170 prs: [ 11171 281, 11172 300 11173 ], 11174 description: "Added and deprecated attribute to document JS SDK's current behaviour" 11175 } 11176 ] 11177 }, 11178 "http.client_ip": { 11179 brief: "Client address - domain name if available without reverse DNS lookup; otherwise, IP address or Unix domain socket name.", 11180 type: "string", 11181 applyScrubbing: { 11182 key: "auto" 11183 }, 11184 isInOtel: !0, 11185 visibility: "public", 11186 example: "example.com", 11187 deprecation: { 11188 replacement: "client.address" 11189 }, 11190 aliases: [ 11191 "client.address" 11192 ], 11193 changelog: [ 11194 { 11195 version: "0.1.0", 11196 prs: [ 11197 61, 11198 106, 11199 127 11200 ] 11201 }, 11202 { 11203 version: "0.0.0" 11204 } 11205 ] 11206 }, 11207 "http.decoded_response_content_length": {
11208 brief: "The decoded body size of the response (in bytes).", 11209 type: "integer", 11210 applyScrubbing: { 11211 key: "manual" 11212 }, 11213 isInOtel: !1, 11214 visibility: "public", 11215 example: 456, 11216 changelog: [ 11217 { 11218 version: "0.4.0", 11219 prs: [ 11220 228 11221 ] 11222 }, 11223 { 11224 version: "0.0.0" 11225 } 11226 ] 11227 }, 11228 "http.flavor": { 11229 brief: "The actual version of the protocol used for network communication.", 11230 type: "string", 11231 applyScrubbing: { 11232 key: "manual" 11233 }, 11234 isInOtel: !0, 11235 visibility: "public", 11236 example: "1.1", 11237 deprecation: { 11238 replacement: "network.protocol.version" 11239 }, 11240 aliases: [ 11241 "network.protocol.version", 11242 "net.protocol.version" 11243 ], 11244 changelog: [ 11245 { 11246 version: "0.1.0", 11247 prs: [ 11248 61, 11249 108, 11250 127 11251 ] 11252 }, 11253 { 11254 version: "0.0.0" 11255 } 11256 ] 11257 }, 11258 "http.fragment": { 11259 brief: "The fragments present in the URI. Note that this contains the leading # character, while the `url.fragment` attribute does not.", 11260 type: "string", 11261 applyScrubbing: { 11262 key: "auto" 11263 }, 11264 isInOtel: !1, 11265 visibility: "public", 11266 example: "#details", 11267 changelog: [ 11268 { 11269 version: "0.0.0" 11270 } 11271 ] 11272 }, 11273 "http.host": { 11274 brief: "The domain name.", 11275 type: "string", 11276 applyScrubbing: { 11277 key: "manual" 11278 }, 11279 isInOtel: !0, 11280 visibility: "public", 11281 example: "example.com", 11282 deprecation: { 11283 replacement: "server.address", 11284 reason: "Deprecated, use one of `server.address` or `client.address`, depending on the usage" 11285 }, 11286 aliases: [ 11287 "server.address", 11288 "client.address", 11289 "http.server_name", 11290 "net.host.name", 11291 "server_name" 11292 ], 11293 changelog: [ 11294 { 11295 version: "0.1.0", 11296 prs: [ 11297 61, 11298 108, 11299 127 11300 ] 11301 }, 11302 { 11303 version: "0.0.0" 11304 } 11305 ] 11306 }, 11307 "http.method": { 11308 brief: "The HTTP method used.", 11309 type: "string", 11310 applyScrubbing: { 11311 key: "manual" 11312 }, 11313 isInOtel: !0, 11314 visibility: "public", 11315 example: "GET", 11316 deprecation: { 11317 replacement: "http.request.method" 11318 }, 11319 aliases: [ 11320 "http.request.method", 11321 "http.request_method", 11322 "method" 11323 ], 11324 changelog: [ 11325 { 11326 version: "0.1.0", 11327 prs: [ 11328 61, 11329 127 11330 ] 11331 }, 11332 { 11333 version: "0.0.0" 11334 } 11335 ] 11336 }, 11337 "http.query": { 11338 brief: "The query string present in the URL. Note that this contains the leading ? character, while the `url.query` attribute does not.", 11339 type: "string", 11340 applyScrubbing: { 11341 key: "auto", 11342 reason: "Query string values can contain sensitive information. Clients should attempt to scrub parameters that might contain sensitive information." 11343 }, 11344 isInOtel: !1, 11345 visibility: "public", 11346 example: "?foo=bar&bar=baz", 11347 changelog: [ 11348 { 11349 version: "0.0.0" 11350 } 11351 ] 11352 }, 11353 "http.request.body.data": { 11354 brief: "HTTP request body data. Can be given as string or structural data of any format.", 11355 type: "string", 11356 applyScrubbing: { 11357 key: "auto" 11358 }, 11359 isInOtel: !1, 11360 visibility: "public", 11361 example: '[{"role": "user", "message": "hello"}]', 11362 changelog: [ 11363 { 11364 version: "0.6.0", 11365 prs: [ 11366 336 11367 ], 11368 description: "Added http.request.body.data attribute" 11369 } 11370 ] 11371 }, 11372 "http.request.connection_end": { 11373 brief: "The UNIX timestamp representing the time immediately after the browser finishes establishing the connection to the server to retrieve the resource. The timestamp value includes the time interval to establish the transport connection, as well as other time intervals such as TLS handshake and SOCKS authentication.", 11374 type: "double", 11375 applyScrubbing: { 11376 key: "manual" 11377 }, 11378 isInOtel: !1, 11379 visibility: "public", 11380 example: 173282955515e-2, 11381 changelog: [ 11382 { 11383 version: "0.4.0", 11384 prs: [ 11385 228 11386 ] 11387 }, 11388 { 11389 version: "0.1.0", 11390 prs: [ 11391 134 11392 ] 11393 }, 11394 { 11395 version: "0.0.0" 11396 } 11397 ] 11398 }, 11399 "http.request.connect_start": { 11400 brief: "The UNIX timestamp representing the time immediately before the user agent starts establishing the connection to the server to retrieve the resource.", 11401 type: "double", 11402 applyScrubbing: { 11403 key: "manual" 11404 }, 11405 isInOtel: !1, 11406 visibility: "public", 11407 example: 1732829555111e-3, 11408 changelog: [ 11409 { 11410 version: "0.4.0", 11411 prs: [ 11412 228 11413 ] 11414 }, 11415 { 11416 version: "0.1.0", 11417 prs: [ 11418 134 11419 ] 11420 }, 11421 { 11422 version: "0.0.0" 11423 } 11424 ] 11425 }, 11426 "http.request.domain_lookup_end": { 11427 brief: "The UNIX timestamp representing the time immediately after the browser finishes the domain-name lookup for the resource.", 11428 type: "double", 11429 applyScrubbing: { 11430 key: "manual" 11431 }, 11432 isInOtel: !1, 11433 visibility: "public", 11434 example: 1732829555201e-3, 11435 changelog: [ 11436 { 11437 version: "0.4.0", 11438 prs: [ 11439 228 11440 ] 11441 }, 11442 { 11443 version: "0.1.0", 11444 prs: [ 11445 134 11446 ] 11447 }, 11448 { 11449 version: "0.0.0" 11450 } 11451 ] 11452 }, 11453 "http.request.domain_lookup_start": { 11454 brief: "The UNIX timestamp representing the time immediately before the browser starts the domain name lookup for the resource.", 11455 type: "double", 11456 applyScrubbing: { 11457 key: "manual" 11458 }, 11459 isInOtel: !1, 11460 visibility: "public", 11461 example: 1732829555322e-3, 11462 changelog: [ 11463 { 11464 version: "0.4.0", 11465 prs: [ 11466 228 11467 ] 11468 }, 11469 { 11470 version: "0.1.0", 11471 prs: [ 11472 134 11473 ] 11474 }, 11475 { 11476 version: "0.0.0" 11477 } 11478 ] 11479 }, 11480 "http.request.fetch_start": { 11481 brief: "The UNIX timestamp representing the time immediately before the browser starts to fetch the resource.", 11482 type: "double", 11483 applyScrubbing: { 11484 key: "manual" 11485 }, 11486 isInOtel: !1, 11487 visibility: "public", 11488 example: 1732829555389e-3, 11489 changelog: [ 11490 { 11491 version: "0.4.0", 11492 prs: [ 11493 228 11494 ] 11495 }, 11496 { 11497 version: "0.1.0", 11498 prs: [ 11499 134 11500 ] 11501 }, 11502 { 11503 version: "0.0.0" 11504 } 11505 ] 11506 }, 11507 "http.request.header.<key>": { 11508 brief: "HTTP request headers, <key> being the normalized HTTP Header name (lowercase), the value being the header values.", 11509 type: "string[]", 11510 applyScrubbing: { 11511 key: "auto" 11512 }, 11513 isInOtel: !0, 11514 visibility: "public", 11515 hasDynamicSuffix: !0, 11516 example: "http.request.header.custom-header=['foo', 'bar']", 11517 changelog: [ 11518 { 11519 version: "0.4.0", 11520 prs: [ 11521 201, 11522 204 11523 ] 11524 }, 11525 { 11526 version: "0.1.0", 11527 prs: [ 11528 103 11529 ] 11530 } 11531 ] 11532 }, 11533 "http.request.method": { 11534 brief: "The HTTP method used.", 11535 type: "string", 11536 applyScrubbing: { 11537 key: "manual" 11538 }, 11539 isInOtel: !0, 11540 visibility: "public", 11541 example: "GET", 11542 aliases: [ 11543 "method", 11544 "http.method", 11545 "http.request_method" 11546 ], 11547 changelog: [ 11548 { 11549 version: "0.1.0", 11550 prs: [ 11551 127 11552 ] 11553 }, 11554 { 11555 version: "0.0.0" 11556 } 11557 ] 11558 }, 11559 "http.request_method": { 11560 brief: "The HTTP method used.", 11561 type: "string", 11562 applyScrubbing: { 11563 key: "manual" 11564 }, 11565 isInOtel: !1, 11566 visibility: "public", 11567 example: "GET", 11568 deprecation: { 11569 replacement: "http.request.method" 11570 }, 11571 aliases: [ 11572 "method", 11573 "http.method", 11574 "http.request.method" 11575 ], 11576 changelog: [ 11577 { 11578 version: "0.6.0", 11579 prs: [ 11580 343 11581 ], 11582 description: "Added http.request_method attribute" 11583 } 11584 ] 11585 }, 11586 "http.request.redirect_end": { 11587 brief: "The UNIX timestamp representing the timestamp immediately after receiving the last b
11587yte of the response of the last redirect", 11588 type: "double", 11589 applyScrubbing: { 11590 key: "manual" 11591 }, 11592 isInOtel: !1, 11593 visibility: "public", 11594 example: 1732829558502e-3, 11595 changelog: [ 11596 { 11597 version: "0.4.0", 11598 prs: [ 11599 228 11600 ] 11601 }, 11602 { 11603 version: "0.1.0", 11604 prs: [ 11605 130, 11606 134 11607 ] 11608 } 11609 ] 11610 }, 11611 "http.request.redirect_start": { 11612 brief: "The UNIX timestamp representing the start time of the fetch which that initiates the redirect.", 11613 type: "double", 11614 applyScrubbing: { 11615 key: "manual" 11616 }, 11617 isInOtel: !1, 11618 visibility: "public", 11619 example: 1732829555495e-3, 11620 changelog: [ 11621 { 11622 version: "0.4.0", 11623 prs: [ 11624 228 11625 ] 11626 }, 11627 { 11628 version: "0.1.0", 11629 prs: [ 11630 134 11631 ] 11632 }, 11633 { 11634 version: "0.0.0" 11635 } 11636 ] 11637 }, 11638 "http.request.request_start": { 11639 brief: "The UNIX timestamp representing the time immediately before the browser starts requesting the resource from the server, cache, or local resource. If the transport connection fails and the browser retires the request, the value returned will be the start of the retry request.", 11640 type: "double", 11641 applyScrubbing: { 11642 key: "manual" 11643 }, 11644 isInOtel: !1, 11645 visibility: "public", 11646 example: 173282955551e-2, 11647 changelog: [ 11648 { 11649 version: "0.4.0", 11650 prs: [ 11651 228 11652 ] 11653 }, 11654 { 11655 version: "0.1.0", 11656 prs: [ 11657 134 11658 ] 11659 }, 11660 { 11661 version: "0.0.0" 11662 } 11663 ] 11664 }, 11665 "http.request.resend_count": { 11666 brief: "The ordinal number of request resending attempt (for any reason, including redirects).", 11667 type: "integer", 11668 applyScrubbing: { 11669 key: "manual" 11670 }, 11671 isInOtel: !1, 11672 visibility: "public", 11673 example: 2, 11674 changelog: [ 11675 { 11676 version: "0.4.0", 11677 prs: [ 11678 228 11679 ] 11680 }, 11681 { 11682 version: "0.0.0" 11683 } 11684 ] 11685 }, 11686 "http.request.response_end": { 11687 brief: "The UNIX timestamp representing the time immediately after the browser receives the last byte of the resource or immediately before the transport connection is closed, whichever comes first.", 11688 type: "double", 11689 applyScrubbing: { 11690 key: "manual" 11691 }, 11692 isInOtel: !1, 11693 visibility: "public", 11694 example: 173282955589e-2, 11695 changelog: [ 11696 { 11697 version: "0.4.0", 11698 prs: [ 11699 228 11700 ] 11701 }, 11702 { 11703 version: "0.1.0", 11704 prs: [ 11705 134 11706 ] 11707 }, 11708 { 11709 version: "0.0.0" 11710 } 11711 ] 11712 }, 11713 "http.request.response_start": { 11714 brief: "The UNIX timestamp representing the time immediately before the browser starts requesting the resource from the server, cache, or local resource. If the transport connection fails and the browser retires the request, the value returned will be the start of the retry request.", 11715 type: "double", 11716 applyScrubbing: { 11717 key: "manual" 11718 }, 11719 isInOtel: !1, 11720 visibility: "public", 11721 example: 17328295557e-1, 11722 changelog: [ 11723 { 11724 version: "0.4.0", 11725 prs: [ 11726 228 11727 ] 11728 }, 11729 { 11730 version: "0.1.0", 11731 prs: [ 11732 134 11733 ] 11734 }, 11735 { 11736 version: "0.0.0" 11737 } 11738 ] 11739 }, 11740 "http.request.same_origin": { 11741 brief: "Indicates that a URL has the same origin as the current page's origin in the browser.", 11742 type: "boolean", 11743 applyScrubbing: { 11744 key: "manual" 11745 }, 11746 isInOtel: !1, 11747 visibility: "public", 11748 example: !0, 11749 aliases: [ 11750 "url.same_origin" 11751 ], 11752 changelog: [ 11753 { 11754 version: "0.16.0", 11755 prs: [ 11756 456 11757 ], 11758 description: "Added http.request.same_origin attribute" 11759 } 11760 ] 11761 }, 11762 "http.request.secure_connection_start": { 11763 brief: "The UNIX timestamp representing the time immediately before the browser starts the handshake process to secure the current connection. If a secure connection is not used, the property returns zero.", 11764 type: "double", 11765 applyScrubbing: { 11766 key: "manual" 11767 }, 11768 isInOtel: !1, 11769 visibility: "public", 11770 example: 173282955573e-2, 11771 changelog: [ 11772 { 11773 version: "0.4.0", 11774 prs: [ 11775 228 11776 ] 11777 }, 11778 { 11779 version: "0.1.0", 11780 prs: [ 11781 134 11782 ] 11783 }, 11784 { 11785 version: "0.0.0" 11786 } 11787 ] 11788 }, 11789 "http.request.time_to_first_byte": { 11790 brief: "The time in seconds from the browser's timeorigin to when the first byte of the request's response was received. See https://web.dev/articles/ttfb#measure-resource-requests", 11791 type: "double", 11792 applyScrubbing: { 11793 key: "manual" 11794 }, 11795 isInOtel: !1, 11796 visibility: "public", 11797 example: 1.032, 11798 changelog: [ 11799 { 11800 version: "0.4.0", 11801 prs: [ 11802 228 11803 ] 11804 }, 11805 { 11806 version: "0.1.0", 11807 prs: [ 11808 131 11809 ] 11810 } 11811 ] 11812 }, 11813 "http.request.worker_start": { 11814 brief: "The UNIX timestamp representing the timestamp immediately before dispatching the FetchEvent if a Service Worker thread is already running, or immediately before starting the Service Worker thread if it is not already running.", 11815 type: "double", 11816 applyScrubbing: { 11817 key: "manual" 11818 }, 11819 isInOtel: !1, 11820 visibility: "public", 11821 example: 173282955368e-2, 11822 changelog: [ 11823 { 11824 version: "0.4.0", 11825 prs: [ 11826 228 11827 ] 11828 }, 11829 { 11830 version: "0.1.0", 11831 prs: [ 11832 130, 11833 134 11834 ] 11835 } 11836 ] 11837 }, 11838 "http.response.body.size": {
11839 brief: "The encoded body size of the response (in bytes).", 11840 type: "integer", 11841 applyScrubbing: { 11842 key: "manual" 11843 }, 11844 isInOtel: !0, 11845 visibility: "public", 11846 example: 123, 11847 aliases: [ 11848 "http.response_content_length", 11849 "http.response.header.content-length" 11850 ], 11851 changelog: [ 11852 { 11853 version: "0.4.0", 11854 prs: [ 11855 228 11856 ] 11857 }, 11858 { 11859 version: "0.1.0", 11860 prs: [ 11861 106 11862 ] 11863 }, 11864 { 11865 version: "0.0.0" 11866 } 11867 ] 11868 }, 11869 "http.response_content_length": { 11870 brief: "The encoded body size of the response (in bytes).", 11871 type: "integer", 11872 applyScrubbing: { 11873 key: "manual" 11874 }, 11875 isInOtel: !0, 11876 visibility: "public", 11877 example: 123, 11878 deprecation: { 11879 replacement: "http.response.body.size" 11880 }, 11881 aliases: [ 11882 "http.response.body.size", 11883 "http.response.header.content-length" 11884 ], 11885 changelog: [ 11886 { 11887 version: "0.4.0", 11888 prs: [ 11889 228 11890 ] 11891 }, 11892 { 11893 version: "0.1.0", 11894 prs: [ 11895 61, 11896 106 11897 ] 11898 }, 11899 { 11900 version: "0.0.0" 11901 } 11902 ] 11903 }, 11904 "http.response.header.content-length": { 11905 brief: "The size of the message body sent to the recipient (in bytes)", 11906 type: "string", 11907 applyScrubbing: { 11908 key: "manual" 11909 }, 11910 isInOtel: !0, 11911 visibility: "public", 11912 example: "http.response.header.custom-header=['foo', 'bar']", 11913 aliases: [ 11914 "http.response_content_length", 11915 "http.response.body.size" 11916 ], 11917 changelog: [ 11918 { 11919 version: "0.1.0", 11920 prs: [ 11921 127 11922 ] 11923 }, 11924 { 11925 version: "0.0.0" 11926 } 11927 ] 11928 }, 11929 "http.response.header.<key>": { 11930 brief: "HTTP response headers, <key> being the normalized HTTP Header name (lowercase), the value being the header values.", 11931 type: "string[]", 11932 applyScrubbing: { 11933 key: "auto" 11934 }, 11935 isInOtel: !0, 11936 visibility: "public", 11937 hasDynamicSuffix: !0, 11938 example: "http.response.header.custom-header=['foo', 'bar']", 11939 changelog: [ 11940 { 11941 version: "0.4.0", 11942 prs: [ 11943 201, 11944 204 11945 ] 11946 }, 11947 { 11948 version: "0.1.0", 11949 prs: [ 11950 103 11951 ] 11952 } 11953 ] 11954 }, 11955 "http.response.size": { 11956 brief: "The transfer size of the response (in bytes).", 11957 type: "integer", 11958 applyScrubbing: { 11959 key: "manual" 11960 }, 11961 isInOtel: !0, 11962 visibility: "public", 11963 example: 456, 11964 aliases: [ 11965 "http.response_transfer_size" 11966 ], 11967 changelog: [ 11968 { 11969 version: "0.4.0", 11970 prs: [ 11971 228 11972 ] 11973 }, 11974 { 11975 version: "0.0.0" 11976 } 11977 ] 11978 }, 11979 "http.response.status_code": { 11980 brief: "The status code of the HTTP response.", 11981 type: "integer", 11982 applyScrubbing: { 11983 key: "manual" 11984 }, 11985 isInOtel: !0, 11986 visibility: "public", 11987 example: 404, 11988 aliases: [ 11989 "http.status_code" 11990 ], 11991 changelog: [ 11992 { 11993 version: "0.4.0", 11994 prs: [ 11995 228 11996 ] 11997 }, 11998 { 11999 version: "0.0.0" 12000 } 12001 ] 12002 }, 12003 "http.response_transfer_size": {
12004 brief: "The transfer size of the response (in bytes).", 12005 type: "integer", 12006 applyScrubbing: { 12007 key: "manual" 12008 }, 12009 isInOtel: !1, 12010 visibility: "public", 12011 example: 456, 12012 deprecation: { 12013 replacement: "http.response.size" 12014 }, 12015 aliases: [ 12016 "http.response.size" 12017 ], 12018 changelog: [ 12019 { 12020 version: "0.4.0", 12021 prs: [ 12022 228 12023 ] 12024 }, 12025 { 12026 version: "0.1.0", 12027 prs: [ 12028 61 12029 ] 12030 }, 12031 { 12032 version: "0.0.0" 12033 } 12034 ] 12035 }, 12036 "http.route": { 12037 brief: "The matched route, that is, the path template in the format used by the respective server framework.", 12038 type: "string", 12039 applyScrubbing: { 12040 key: "manual" 12041 }, 12042 isInOtel: !0, 12043 visibility: "public", 12044 example: "/users/:id", 12045 aliases: [ 12046 "url.template" 12047 ], 12048 changelog: [ 12049 { 12050 version: "0.1.0", 12051 prs: [ 12052 127 12053 ] 12054 }, 12055 { 12056 version: "0.0.0" 12057 } 12058 ] 12059 }, 12060 "http.scheme": { 12061 brief: "The URI scheme component identifying the used protocol.", 12062 type: "string", 12063 applyScrubbing: { 12064 key: "manual" 12065 }, 12066 isInOtel: !0, 12067 visibility: "public", 12068 example: "https", 12069 deprecation: { 12070 replacement: "url.scheme" 12071 }, 12072 aliases: [ 12073 "url.scheme" 12074 ], 12075 changelog: [ 12076 { 12077 version: "0.1.0", 12078 prs: [ 12079 61, 12080 127 12081 ] 12082 }, 12083 { 12084 version: "0.0.0" 12085 } 12086 ] 12087 }, 12088 "http.server_name": { 12089 brief: "The server domain name", 12090 type: "string", 12091 applyScrubbing: { 12092 key: "manual" 12093 }, 12094 isInOtel: !0, 12095 visibility: "public", 12096 example: "example.com", 12097 deprecation: { 12098 replacement: "server.address" 12099 }, 12100 aliases: [ 12101 "server.address", 12102 "net.host.name", 12103 "http.host", 12104 "server_name" 12105 ], 12106 changelog: [ 12107 { 12108 version: "0.1.0", 12109 prs: [ 12110 61, 12111 108, 12112 127 12113 ] 12114 }, 12115 { 12116 version: "0.0.0" 12117 } 12118 ] 12119 }, 12120 "http.server.request.time_in_queue": { 12121 brief: "The time in milliseconds the request spent in the server queue before processing began. Measured from the X-Request-Start header set by reverse proxies (e.g., Nginx, HAProxy, Heroku) to when the application started handling the request.", 12122 type: "double", 12123 applyScrubbing: { 12124 key: "manual" 12125 }, 12126 isInOtel: !1, 12127 visibility: "public", 12128 example: 50, 12129 changelog: [ 12130 { 12131 version: "0.5.0", 12132 prs: [ 12133 267 12134 ] 12135 } 12136 ] 12137 }, 12138 "http.status_code": { 12139 brief: "The status code of the HTTP response.", 12140 type: "integer", 12141 applyScrubbing: { 12142 key: "manual" 12143 }, 12144 isInOtel: !0, 12145 visibility: "public", 12146 example: 404, 12147 deprecation: { 12148 replacement: "http.response.status_code" 12149 }, 12150 aliases: [ 12151 "http.response.status_code" 12152 ], 12153 changelog: [ 12154 { 12155 version: "0.4.0", 12156 prs: [ 12157 228 12158 ] 12159 }, 12160 { 12161 version: "0.1.0", 12162 prs: [ 12163 61 12164 ] 12165 }, 12166 { 12167 version: "0.0.0" 12168 } 12169 ] 12170 }, 12171 "http.target": { 12172 brief: "The pathname and query string of the URL.", 12173 type: "string", 12174 applyScrubbing: { 12175 key: "auto" 12176 }, 12177 isInOtel: !0, 12178 visibility: "public", 12179 example: "/test?foo=bar#buzz", 12180 deprecation: { 12181 replacement: "url.path",
12182 reason: "This attribute is being deprecated in favor of url.path and url.query" 12183 }, 12184 changelog: [ 12185 { 12186 version: "0.1.0", 12187 prs: [ 12188 61 12189 ] 12190 }, 12191 { 12192 version: "0.0.0" 12193 } 12194 ] 12195 }, 12196 "http.url": { 12197 brief: "The URL of the resource that was fetched.", 12198 type: "string", 12199 applyScrubbing: { 12200 key: "auto" 12201 }, 12202 isInOtel: !0, 12203 visibility: "public", 12204 example: "https://example.com/test?foo=bar#buzz", 12205 deprecation: { 12206 replacement: "url.full" 12207 }, 12208 aliases: [ 12209 "url.full", 12210 "url" 12211 ], 12212 changelog: [ 12213 { 12214 version: "0.1.0", 12215 prs: [ 12216 61, 12217 108 12218 ] 12219 }, 12220 { 12221 version: "0.0.0" 12222 } 12223 ] 12224 }, 12225 "http.user_agent": { 12226 brief: "Value of the HTTP User-Agent header sent by the client.", 12227 type: "string", 12228 applyScrubbing: { 12229 key: "manual" 12230 }, 12231 isInOtel: !0, 12232 visibility: "public", 12233 example: "Mozilla/5.0 (iPhone; CPU iPhone OS 14_7_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.2 Mobile/15E148 Safari/604.1", 12234 deprecation: { 12235 replacement: "user_agent.original" 12236 }, 12237 aliases: [ 12238 "user_agent.original" 12239 ], 12240 changelog: [ 12241 { 12242 version: "0.1.0", 12243 prs: [ 12244 61, 12245 127 12246 ] 12247 }, 12248 { 12249 version: "0.0.0" 12250 } 12251 ] 12252 }, 12253 id: { 12254 brief: "A unique identifier for the span.", 12255 type: "string", 12256 applyScrubbing: { 12257 key: "never" 12258 }, 12259 isInOtel: !1, 12260 visibility: "public", 12261 example: "f47ac10b58cc4372a5670e02b2c3d479", 12262 changelog: [ 12263 { 12264 version: "0.0.0" 12265 } 12266 ] 12267 }, 12268 inp: { 12269 brief: "The value of the recorded Interaction to Next Paint (INP) web vital", 12270 type: "double", 12271 applyScrubbing: { 12272 key: "manual" 12273 }, 12274 isInOtel: !1, 12275 visibility: "public", 12276 example: 200, 12277 deprecation: { 12278 replacement: "browser.web_vital.inp.value", 12279 reason: "The INP web vital is now recorded as a browser.web_vital.inp.value attribute." 12280 }, 12281 aliases: [ 12282 "browser.web_vital.inp.value" 12283 ], 12284 changelog: [ 12285 { 12286 version: "0.5.0", 12287 prs: [ 12288 229 12289 ], 12290 description: "Added and deprecated attribute to document JS SDK's current behaviour" 12291 } 12292 ] 12293 }, 12294 "jsonrpc.protocol.version": { 12295 brief: "The version of the JSON-RPC protocol used.", 12296 type: "string", 12297 applyScrubbing: { 12298 key: "manual" 12299 }, 12300 isInOtel: !0, 12301 visibility: "public", 12302 example: "2.0", 12303 changelog: [ 12304 { 12305 version: "0.12.0", 12306 prs: [ 12307 420 12308 ], 12309 description: "Added jsonrpc.protocol.version attribute" 12310 } 12311 ] 12312 }, 12313 "jsonrpc.request.id": { 12314 brief: "The JSON-RPC request identifier. Unique within the session.", 12315 type: "string", 12316 applyScrubbing: { 12317 key: "manual" 12318 }, 12319 isInOtel: !0, 12320 visibility: "public", 12321 example: "1", 12322 aliases: [ 12323 "mcp.request.id" 12324 ], 12325 changelog: [ 12326 { 12327 version: "0.12.0", 12328 prs: [ 12329 420 12330 ], 12331 description: "Added jsonrpc.request.id attribute" 12332 } 12333 ] 12334 }, 12335 "jvm.gc.action": { 12336 brief: "Name of the garbage collector action.", 12337 type: "string", 12338 applyScrubbing: { 12339 key: "manual" 12340 }, 12341 isInOtel: !0, 12342 visibility: "public", 12343 example: "end of minor GC", 12344 changelog: [ 12345 { 12346 version: "0.1.0", 12347 prs: [ 12348 127 12349 ] 12350 }, 12351 { 12352 version: "0.0.0" 12353 } 12354 ] 12355 }, 12356 "jvm.gc.name": { 12357 brief: "Name of the garbage collector.", 12358 type: "string", 12359 applyScrubbing: { 12360 key: "manual" 12361 }, 12362 isInOtel: !0, 12363 visibility: "public", 12364 example: "G1 Young Generation", 12365 changelog: [ 12366 { 12367 version: "0.1.0", 12368 prs: [ 12369 127 12370 ] 12371 }, 12372 { 12373 version: "0.0.0" 12374 } 12375 ] 12376 }, 12377 "jvm.memory.pool.name": { 12378 brief: "Name of the memory pool.", 12379 type: "string", 12380 applyScrubbing: { 12381 key: "manual" 12382 }, 12383 isInOtel: !0, 12384 visibility: "public", 12385 example: "G1 Old Gen", 12386 changelog: [ 12387 { 12388 version: "0.1.0", 12389 prs: [ 12390 127 12391 ] 12392 }, 12393 { 12394 version: "0.0.0" 12395 } 12396 ] 12397 }, 12398 "jvm.memory.type": { 12399 brief: "Name of the memory pool.", 12400 type: "string", 12401 applyScrubbing: { 12402 key: "manual" 12403 }, 12404 isInOtel: !0, 12405 visibility: "public", 12406 example: "G1 Old Gen", 12407 changelog: [ 12408 { 12409 version: "0.1.0", 12410 prs: [ 12411 127 12412 ] 12413 }, 12414 { 12415 version: "0.0.0" 12416 } 12417 ] 12418 }, 12419 "jvm.thread.daemon": { 12420 brief: "Whether the thread is daemon or not.", 12421 type: "boolean", 12422 applyScrubbing: { 12423 key: "manual" 12424 }, 12425 isInOtel: !0, 12426 visibility: "public", 12427 example: !0, 12428 changelog: [ 12429 { 12430 version: "0.0.0" 12431 } 12432 ] 12433 }, 12434 "jvm.thread.state": { 12435 brief: "State of the thread.", 12436 type: "string", 12437 applyScrubbing: { 12438 key: "manual" 12439 }, 12440 isInOtel: !0, 12441 visibility: "public", 12442 example: "blocked", 12443 changelog: [ 12444 { 12445 version: "0.1.0", 12446 prs: [ 12447 127 12448 ] 12449 }, 12450 { 12451 version: "0.0.0" 12452 } 12453 ] 12454 }, 12455 "koa.name": { 12456 brief: "The name of the Koa middleware or matched route that handled the request.", 12457 type: "string", 12458 applyScrubbing: { 12459 key: "manual" 12460 }, 12461 isInOtel: !1, 12462 visibility: "public", 12463 example: "/users/:id", 12464 deprecation: { 12465 reason: "No single replacement. SDKs should use http.route for router layers and code.function.name for middleware layers instead." 12466 }, 12467 changelog: [ 12468 { 12469 version: "0.16.0", 12470 prs: [ 12471 490 12472 ], 12473 description: "Added koa.name attribute as deprecated" 12474 } 12475 ] 12476 }, 12477 "koa.type": { 12478 brief: "The type of the Koa layer that handled the request.", 12479 type: "string", 12480 applyScrubbing: { 12481 key: "manual" 12482 }, 12483 isInOtel: !1, 12484 visibility: "public", 12485 example: "router", 12486 changelog: [ 12487 { 12488 version: "0.16.0", 12489 prs: [ 12490 471 12491 ], 12492 description: "Added koa.type attribute" 12493 } 12494 ] 12495 }, 12496 lcp: { 12497 brief: "The value of the recorded Largest Contentful Paint (LCP) web vital", 12498 type: "double", 12499 applyScrubbing: { 12500 key: "manual" 12501 }, 12502 isInOtel: !1, 12503 visibility: "public", 12504 example: 2500, 12505 deprecation: { 12506 replacement: "browser.web_vital.lcp.value", 12507 reason: "The LCP web vital is now recorded as a browser.web_vital.lcp.value attribute." 12508 }, 12509 aliases: [ 12510 "browser.web_vital.lcp.value" 12511 ], 12512 changelog: [ 12513 { 12514 version: "0.5.0", 12515 prs: [ 12516 229 12517 ], 12518 description: "Added and deprecated attribute to document JS SDK's current behaviour" 12519 } 12520 ] 12521 }, 12522 "lcp.element": { 12523 brief: "The dom element responsible for the largest contentful paint.", 12524 type: "string", 12525 applyScrubbing: { 12526 key: "manual" 12527 }, 12528 isInOtel: !1, 12529 visibility: "public", 12530 example: "img", 12531 deprecation: { 12532 replacement: "browser.web_vital.lcp.element", 12533 reason: "The LCP element is now recorded as a browser.web_vital.lcp.element attribute." 12534 }, 12535 aliases: [ 12536 "browser.web_vital.lcp.element" 12537 ], 12538 changelog: [ 12539 { 12540 version: "0.5.0", 12541 prs: [ 12542 233 12543 ] 12544 }, 12545 { 12546 version: "0.1.0", 12547 prs: [ 12548 127 12549 ] 12550 }, 12551 { 12552 version: "0.0.0" 12553 } 12554 ] 12555 }, 12556 "lcp.id": { 12557 brief: "The id of the dom element responsible for the largest contentful paint.", 12558 type: "string", 12559 applyScrubbing: { 12560 key: "manual" 12561 }, 12562 isInOtel: !1, 12563 visibility: "public", 12564 example: "#hero", 12565 deprecation: { 12566 replacement: "browser.web_vital.lcp.id", 12567 reason: "The LCP id is now recorded as a browser.web_vital.lcp.id attribute." 12568 }, 12569 aliases: [ 12570 "browser.web_vital.lcp.id" 12571 ], 12572 changelog: [ 12573 { 12574 version: "0.5.0", 12575 prs: [ 12576 233 12577 ] 12578 }, 12579 { 12580 version: "0.1.0", 12581 prs: [ 12582 127 12583 ] 12584 }, 12585 { 12586 version: "0.0.0" 12587 } 12588 ] 12589 }, 12590 "lcp.loadTime": { 12591 brief: "The time it took for the LCP element to be loaded", 12592 type: "integer", 12593 applyScrubbing: { 12594 key: "manual" 12595 }, 12596 isInOtel: !1, 12597 visibility: "public", 12598 example: 1402, 12599 deprecation: { 12600 replacement: "browser.web_vital.lcp.load_time", 12601 reason: "The LCP load time is now recorded as a browser.web_vital.lcp.load_time attribute." 12602 }, 12603 aliases: [ 12604 "browser.web_vital.lcp.load_time" 12605 ], 12606 changelog: [ 12607 { 12608 version: "0.5.0", 12609 prs: [ 12610 233 12611 ] 12612 } 12613 ] 12614 }, 12615 "lcp.renderTime": { 12616 brief: "The time it took for the LCP element to be rendered", 12617 type: "integer", 12618 applyScrubbing: { 12619 key: "manual" 12620 }, 12621 isInOtel: !1, 12622 visibility: "public", 12623 example: 1685, 12624 deprecation: { 12625 replacement: "browser.web_vital.lcp.render_time", 12626 reason: "The LCP render time is now recorded as a browser.web_vital.lcp.render_time attribute." 12627 }, 12628 aliases: [ 12629 "browser.web_vital.lcp.render_time" 12630 ], 12631 changelog: [ 12632 { 12633 version: "0.5.0", 12634 prs: [ 12635 233 12636 ] 12637 } 12638 ] 12639 }, 12640 "lcp.size": { 12641 brief: "The size of the largest contentful paint element.", 12642 type: "integer", 12643 applyScrubbing: { 12644 key: "manual" 12645 }, 12646 isInOtel: !1, 12647 visibility: "public", 12648 example: 1234, 12649 deprecation: { 12650 replacement: "browser.web_vital.lcp.size", 12651 reason: "The LCP size is now recorded as a browser.web_vital.lcp.size attribute." 12652 }, 12653 aliases: [ 12654 "browser.web_vital.lcp.size" 12655 ], 12656 changelog: [ 12657 { 12658 version: "0.5.0", 12659 prs: [ 12660 233 12661 ] 12662 }, 12663 { 12664 version: "0.4.0", 12665 prs: [ 12666 228 12667 ] 12668 }, 12669 { 12670 version: "0.0.0" 12671 } 12672 ] 12673 }, 12674 "lcp.url": { 12675 brief: "The url of the dom element responsible for the largest contentful paint.", 12676 type: "string", 12677 applyScrubbing: { 12678 key: "auto" 12679 }, 12680 isInOtel: !1, 12681 visibility: "public", 12682 example: "https://example.com", 12683 deprecation: { 12684 replacement: "browser.web_vital.lcp.url", 12685 reason: "The LCP url is now recorded as a browser.web_vital.lcp.url attribute." 12686 }, 12687 aliases: [ 12688 "browser.web_vital.lcp.url" 12689 ], 12690 changelog: [ 12691 { 12692 version: "0.5.0", 12693 prs: [ 12694 233 12695 ] 12696 }, 12697 { 12698 version: "0.1.0", 12699 prs: [ 12700 127 12701 ] 12702 }, 12703 { 12704 version: "0.0.0" 12705 } 12706 ] 12707 }, 12708 "logger.name": { 12709 brief: "The name of the logger that generated this event.", 12710 type: "string", 12711 applyScrubbing: { 12712 key: "manual" 12713 }, 12714 isInOtel: !1, 12715 visibility: "public", 12716 example: "myLogger", 12717 changelog: [ 12718 { 12719 version: "0.1.0", 12720 prs: [ 12721 127 12722 ] 12723 }, 12724 { 12725 version: "0.0.0" 12726 } 12727 ] 12728 }, 12729 "mcp.cancelled.reason": { 12730 brief: "Reason for the cancellation of an MCP operation.", 12731 type: "string", 12732 applyScrubbing: { 12733 key: "manual", 12734 reason: "Cancellation reasons may contain user-specific or sensitive information" 12735 }, 12736 isInOtel: !1, 12737 visibility: "public",
12738 example: "User cancelled the request", 12739 changelog: [ 12740 { 12741 version: "0.3.0", 12742 prs: [ 12743 171 12744 ] 12745 } 12746 ] 12747 }, 12748 "mcp.cancelled.request_id": { 12749 brief: "Request ID of the cancelled MCP operation.", 12750 type: "string", 12751 applyScrubbing: { 12752 key: "manual" 12753 }, 12754 isInOtel: !1, 12755 visibility: "public", 12756 example: "123", 12757 changelog: [ 12758 { 12759 version: "0.3.0", 12760 prs: [ 12761 171 12762 ] 12763 } 12764 ] 12765 }, 12766 "mcp.client.name": { 12767 brief: "Name of the MCP client application.", 12768 type: "string", 12769 applyScrubbing: { 12770 key: "manual" 12771 }, 12772 isInOtel: !1, 12773 visibility: "public", 12774 example: "claude-desktop", 12775 changelog: [ 12776 { 12777 version: "0.3.0", 12778 prs: [ 12779 171 12780 ] 12781 } 12782 ] 12783 }, 12784 "mcp.client.title": { 12785 brief: "Display title of the MCP client application.", 12786 type: "string", 12787 applyScrubbing: { 12788 key: "manual", 12789 reason: "Client titles may reveal user-specific application configurations or custom setups" 12790 }, 12791 isInOtel: !1, 12792 visibility: "public", 12793 example: "Claude Desktop", 12794 changelog: [ 12795 { 12796 version: "0.3.0", 12797 prs: [ 12798 171 12799 ] 12800 } 12801 ] 12802 }, 12803 "mcp.client.version": { 12804 brief: "Version of the MCP client application.", 12805 type: "string", 12806 applyScrubbing: { 12807 key: "manual" 12808 }, 12809 isInOtel: !1, 12810 visibility: "public", 12811 example: "1.0.0", 12812 changelog: [ 12813 { 12814 version: "0.3.0", 12815 prs: [ 12816 171 12817 ] 12818 } 12819 ] 12820 }, 12821 "mcp.lifecycle.phase": { 12822 brief: "Lifecycle phase indicator for MCP operations.", 12823 type: "string", 12824 applyScrubbing: { 12825 key: "manual" 12826 }, 12827 isInOtel: !1, 12828 visibility: "public", 12829 example: "initialization_complete", 12830 changelog: [ 12831 { 12832 version: "0.3.0", 12833 prs: [ 12834 171 12835 ] 12836 } 12837 ] 12838 }, 12839 "mcp.logging.data_type": { 12840 brief: "Data type of the logged message content.", 12841 type: "string", 12842 applyScrubbing: { 12843 key: "manual" 12844 }, 12845 isInOtel: !1, 12846 visibility: "public", 12847 example: "string", 12848 changelog: [ 12849 { 12850 version: "0.3.0", 12851 prs: [ 12852 171 12853 ] 12854 } 12855 ] 12856 }, 12857 "mcp.logging.level": { 12858 brief: "Log level for MCP logging operations.", 12859 type: "string", 12860 applyScrubbing: { 12861 key: "manual" 12862 }, 12863 isInOtel: !1, 12864 visibility: "public", 12865 example: "info", 12866 changelog: [ 12867 { 12868 version: "0.3.0", 12869 prs: [ 12870 171 12871 ] 12872 } 12873 ] 12874 }, 12875 "mcp.logging.logger": { 12876 brief: "Logger name for MCP logging operations.", 12877 type: "string", 12878 applyScrubbing: { 12879 key: "manual", 12880 reason: "Logger names may be user-defined and could contain sensitive information" 12881 }, 12882 isInOtel: !1, 12883 visibility: "public", 12884 example: "mcp_server", 12885 changelog: [ 12886 { 12887 version: "0.3.0", 12888 prs: [ 12889 171 12890 ] 12891 } 12892 ] 12893 }, 12894 "mcp.logging.message": { 12895 brief: "Log message content from MCP logging operations.", 12896 type: "string", 12897 applyScrubbing: { 12898 key: "auto", 12899 reason: "Log messages can contain user data" 12900 }, 12901 isInOtel: !1, 12902 visibility: "public", 12903 example: "Tool execution completed successfully", 12904 changelog: [ 12905 { 12906 version: "0.3.0", 12907 prs: [ 12908 171 12909 ] 12910 } 12911 ] 12912 }, 12913 "mcp.method.name": { 12914 brief: "The name of the MCP request or notification method being called.", 12915 type: "string", 12916 applyScrubbing: { 12917 key: "manual" 12918 }, 12919 isInOtel: !0, 12920 visibility: "public", 12921 example: "tools/call", 12922 changelog: [ 12923 { 12924 version: "0.12.0", 12925 prs: [ 12926 420 12927 ], 12928 description: "Set is_in_otel=true, attribute exists in OTel MCP registry" 12929 }, 12930 { 12931 version: "0.3.0", 12932 prs: [ 12933 171 12934 ] 12935 } 12936 ] 12937 }, 12938 "mcp.progress.current": { 12939 brief: "Current progress value of an MCP operation.", 12940 type: "integer", 12941 applyScrubbing: { 12942 key: "manual" 12943 }, 12944 isInOtel: !1, 12945 visibility: "public", 12946 example: 50, 12947 changelog: [ 12948 { 12949 version: "0.4.0", 12950 prs: [ 12951 228 12952 ] 12953 }, 12954 { 12955 version: "0.3.0", 12956 prs: [ 12957 171 12958 ] 12959 } 12960 ] 12961 }, 12962 "mcp.progress.message": { 12963 brief: "Progress message describing the current state of an MCP operation.", 12964 type: "string", 12965 applyScrubbing: { 12966 key: "manual", 12967 reason: "Progress messages may contain user-specific or sensitive information" 12968 }, 12969 isInOtel: !1, 12970 visibility: "public",
12971 example: "Processing 50 of 100 items", 12972 changelog: [ 12973 { 12974 version: "0.3.0", 12975 prs: [ 12976 171 12977 ] 12978 } 12979 ] 12980 }, 12981 "mcp.progress.percentage": { 12982 brief: "Calculated progress percentage of an MCP operation. Computed from current/total * 100.", 12983 type: "double", 12984 applyScrubbing: { 12985 key: "manual" 12986 }, 12987 isInOtel: !1, 12988 visibility: "public", 12989 example: 50, 12990 changelog: [ 12991 { 12992 version: "0.4.0", 12993 prs: [ 12994 228 12995 ] 12996 }, 12997 { 12998 version: "0.3.0", 12999 prs: [ 13000 171 13001 ] 13002 } 13003 ] 13004 }, 13005 "mcp.progress.token": { 13006 brief: "Token for tracking progress of an MCP operation.", 13007 type: "string", 13008 applyScrubbing: { 13009 key: "manual" 13010 }, 13011 isInOtel: !1, 13012 visibility: "public", 13013 example: "progress-token-123", 13014 changelog: [ 13015 { 13016 version: "0.3.0", 13017 prs: [ 13018 171 13019 ] 13020 } 13021 ] 13022 }, 13023 "mcp.progress.total": { 13024 brief: "Total progress target value of an MCP operation.", 13025 type: "integer", 13026 applyScrubbing: { 13027 key: "manual" 13028 }, 13029 isInOtel: !1, 13030 visibility: "public", 13031 example: 100, 13032 changelog: [ 13033 { 13034 version: "0.4.0", 13035 prs: [ 13036 228 13037 ] 13038 }, 13039 { 13040 version: "0.3.0", 13041 prs: [ 13042 171 13043 ] 13044 } 13045 ] 13046 }, 13047 "mcp.prompt.name": { 13048 brief: "Name of the MCP prompt template being used.", 13049 type: "string", 13050 applyScrubbing: { 13051 key: "manual", 13052 reason: "Prompt names may reveal user behavior patterns or sensitive operations" 13053 }, 13054 isInOtel: !1, 13055 visibility: "public", 13056 example: "summarize", 13057 deprecation: { 13058 replacement: "gen_ai.prompt.name", 13059 reason: "OTel uses gen_ai.prompt.name for MCP prompt names" 13060 }, 13061 aliases: [ 13062 "gen_ai.prompt.name" 13063 ], 13064 changelog: [ 13065 { 13066 version: "0.12.0", 13067 prs: [ 13068 420 13069 ], 13070 description: "Deprecated in favor of gen_ai.prompt.name" 13071 }, 13072 { 13073 version: "0.3.0", 13074 prs: [ 13075 171 13076 ] 13077 } 13078 ] 13079 }, 13080 "mcp.prompt.result.description": { 13081 brief: "Description of the prompt result.", 13082 type: "string", 13083 applyScrubbing: { 13084 key: "auto" 13085 }, 13086 isInOtel: !1, 13087 visibility: "public", 13088 example: "A summary of the requested information", 13089 changelog: [ 13090 { 13091 version: "0.3.0", 13092 prs: [ 13093 171 13094 ] 13095 } 13096 ] 13097 }, 13098 "mcp.prompt.result.message_content": { 13099 brief: "Content of the message in the prompt result. Used for single message results only.", 13100 type: "string", 13101 applyScrubbing: { 13102 key: "auto" 13103 }, 13104 isInOtel: !1, 13105 visibility: "public", 13106 example: "Please provide a summary of the document", 13107 changelog: [ 13108 { 13109 version: "0.3.0", 13110 prs: [ 13111 171 13112 ] 13113 } 13114 ] 13115 }, 13116 "mcp.prompt.result.message_count": { 13117 brief: "Number of messages in the prompt result.", 13118 type: "integer", 13119 applyScrubbing: { 13120 key: "manual" 13121 }, 13122 isInOtel: !1, 13123 visibility: "public", 13124 example: 3, 13125 changelog: [ 13126 { 13127 version: "0.4.0", 13128 prs: [ 13129 228 13130 ] 13131 }, 13132 { 13133 version: "0.3.0", 13134 prs: [ 13135 171 13136 ] 13137 } 13138 ] 13139 }, 13140 "mcp.prompt.result.message_role": { 13141 brief: "Role of the message in the prompt result. Used for single message results only.", 13142 type: "string", 13143 applyScrubbing: { 13144 key: "manual" 13145 }, 13146 isInOtel: !1, 13147 visibility: "public", 13148 example: "user", 13149 changelog: [ 13150 { 13151 version: "0.3.0", 13152 prs: [ 13153 171 13154 ] 13155 } 13156 ] 13157 }, 13158 "mcp.protocol.ready": { 13159 brief: "Protocol readiness indicator for MCP session. Non-zero value indicates the protocol is ready.", 13160 type: "integer", 13161 applyScrubbing: { 13162 key: "manual" 13163 }, 13164 isInOtel: !1, 13165 visibility: "public", 13166 example: 1, 13167 changelog: [ 13168 { 13169 version: "0.4.0", 13170 prs: [ 13171 228 13172 ] 13173 }, 13174 { 13175 version: "0.3.0", 13176 prs: [ 13177 171 13178 ] 13179 } 13180 ] 13181 }, 13182 "mcp.protocol.version": { 13183 brief: "MCP protocol version used in the session.", 13184 type: "string", 13185 applyScrubbing: { 13186 key: "manual" 13187 }, 13188 isInOtel: !0, 13189 visibility: "public", 13190 example: "2024-11-05", 13191 changelog: [ 13192 { 13193 version: "0.12.0", 13194 prs: [ 13195 420 13196 ], 13197 description: "Set is_in_otel=true, attribute exists in OTel MCP registry" 13198 }, 13199 { 13200 version: "0.3.0", 13201 prs: [ 13202 171 13203 ] 13204 } 13205 ] 13206 }, 13207 "mcp.request.argument.<key>": { 13208 brief: "MCP request argument with dynamic key suffix. The <key> is replaced with the actual argument name. The value is a JSON-stringified representation of the argument value.", 13209 type: "string", 13210 applyScrubbing: { 13211 key: "auto", 13212 reason: "Arguments contain user input" 13213 }, 13214 isInOtel: !1, 13215 visibility: "public", 13216 hasDynamicSuffix: !0, 13217 example: "mcp.request.argument.query='weather in Paris'", 13218 changelog: [ 13219 { 13220 version: "0.3.0", 13221 prs: [ 13222 176 13223 ] 13224 } 13225 ] 13226 }, 13227 "mcp.request.argument.name": { 13228 brief: "Name argument from prompts/get MCP request.", 13229 type: "string", 13230 applyScrubbing: { 13231 key: "auto", 13232 reason: "Prompt names can contain user input" 13233 }, 13234 isInOtel: !1, 13235 visibility: "public", 13236 example: "summarize", 13237 changelog: [ 13238 { 13239 version: "0.3.0", 13240 prs: [ 13241 171 13242 ] 13243 } 13244 ] 13245 }, 13246 "mcp.request.argument.uri": { 13247 brief: "URI argument from resources/read MCP request.", 13248 type: "string", 13249 applyScrubbing: { 13250 key: "auto", 13251 reason: "URIs can contain user file paths" 13252 }, 13253 isInOtel: !1, 13254 visibility: "public", 13255 example: "file:///path/to/resource", 13256 changelog: [ 13257 { 13258 version: "0.3.0", 13259 prs: [ 13260 171 13261 ] 13262 } 13263 ] 13264 }, 13265 "mcp.request.id": { 13266 brief: "JSON-RPC request identifier for the MCP request. Unique within the MCP session.", 13267 type: "string", 13268 applyScrubbing: { 13269 key: "manual" 13270 }, 13271 isInOtel: !1, 13272 visibility: "public", 13273 example: "1", 13274 deprecation: { 13275 replacement: "jsonrpc.request.id", 13276 reason: "OTel models MCP as JSON-RPC, uses jsonrpc.request.id" 13277 }, 13278 aliases: [ 13279 "jsonrpc.request.id" 13280 ], 13281 changelog: [ 13282 { 13283 version: "0.12.0", 13284 prs: [ 13285 420 13286 ],
13287 description: "Deprecated in favor of jsonrpc.request.id" 13288 }, 13289 { 13290 version: "0.3.0", 13291 prs: [ 13292 171 13293 ] 13294 } 13295 ] 13296 }, 13297 "mcp.resource.protocol": { 13298 brief: "Protocol of the resource URI being accessed, extracted from the URI.", 13299 type: "string", 13300 applyScrubbing: { 13301 key: "manual" 13302 }, 13303 isInOtel: !1, 13304 visibility: "public", 13305 example: "file", 13306 deprecation: { 13307 replacement: "network.protocol.name", 13308 reason: "OTel uses the generic network.protocol.name attribute" 13309 }, 13310 aliases: [ 13311 "network.protocol.name", 13312 "net.protocol.name" 13313 ], 13314 changelog: [ 13315 { 13316 version: "0.12.0", 13317 prs: [ 13318 420 13319 ], 13320 description: "Deprecated in favor of network.protocol.name" 13321 }, 13322 { 13323 version: "0.3.0", 13324 prs: [ 13325 171 13326 ] 13327 } 13328 ] 13329 }, 13330 "mcp.resource.uri": { 13331 brief: "The resource URI being accessed in an MCP operation.", 13332 type: "string", 13333 applyScrubbing: { 13334 key: "auto", 13335 reason: "URIs can contain sensitive file paths" 13336 }, 13337 isInOtel: !0, 13338 visibility: "public", 13339 example: "file:///path/to/file.txt", 13340 changelog: [ 13341 { 13342 version: "0.12.0", 13343 prs: [ 13344 420 13345 ], 13346 description: "Set is_in_otel=true, attribute exists in OTel MCP registry" 13347 }, 13348 { 13349 version: "0.3.0", 13350 prs: [ 13351 171 13352 ] 13353 } 13354 ] 13355 }, 13356 "mcp.server.name": { 13357 brief: "Name of the MCP server application.", 13358 type: "string", 13359 applyScrubbing: { 13360 key: "manual" 13361 }, 13362 isInOtel: !1, 13363 visibility: "public", 13364 example: "sentry-mcp-server", 13365 changelog: [ 13366 { 13367 version: "0.3.0", 13368 prs: [ 13369 171 13370 ] 13371 } 13372 ] 13373 }, 13374 "mcp.server.title": { 13375 brief: "Display title of the MCP server application.", 13376 type: "string", 13377 applyScrubbing: { 13378 key: "manual", 13379 reason: "Server titles may reveal user-specific application configurations or custom setups" 13380 }, 13381 isInOtel: !1, 13382 visibility: "public", 13383 example: "Sentry MCP Server", 13384 changelog: [ 13385 { 13386 version: "0.3.0", 13387 prs: [ 13388 171 13389 ] 13390 } 13391 ] 13392 }, 13393 "mcp.server.version": { 13394 brief: "Version of the MCP server application.", 13395 type: "string", 13396 applyScrubbing: { 13397 key: "manual" 13398 }, 13399 isInOtel: !1, 13400 visibility: "public", 13401 example: "0.1.0", 13402 changelog: [ 13403 { 13404 version: "0.3.0", 13405 prs: [ 13406 171 13407 ] 13408 } 13409 ] 13410 }, 13411 "mcp.session.id": { 13412 brief: "Identifier for the MCP session.", 13413 type: "string", 13414 applyScrubbing: { 13415 key: "manual" 13416 }, 13417 isInOtel: !0, 13418 visibility: "public", 13419 example: "550e8400-e29b-41d4-a716-446655440000", 13420 changelog: [ 13421 { 13422 version: "0.12.0", 13423 prs: [ 13424 420 13425 ], 13426 description: "Set is_in_otel=true, attribute exists in OTel MCP registry" 13427 }, 13428 { 13429 version: "0.3.0", 13430 prs: [ 13431 171 13432 ] 13433 } 13434 ] 13435 }, 13436 "mcp.tool.name": { 13437 brief: "Name of the MCP tool being called.", 13438 type: "string", 13439 applyScrubbing: { 13440 key: "manual" 13441 }, 13442 isInOtel: !1, 13443 visibility: "public", 13444 example: "calculator", 13445 deprecation: { 13446 replacement: "gen_ai.tool.name", 13447 reason: "OTel uses gen_ai.tool.name for MCP tool names" 13448 }, 13449 aliases: [ 13450 "gen_ai.tool.name", 13451 "ai.function_call" 13452 ], 13453 changelog: [ 13454 { 13455 version: "0.12.0", 13456 prs: [ 13457 420 13458 ],
13459 description: "Deprecated in favor of gen_ai.tool.name" 13460 }, 13461 { 13462 version: "0.3.0", 13463 prs: [ 13464 171 13465 ] 13466 } 13467 ] 13468 }, 13469 "mcp.tool.result.content": { 13470 brief: "The content of the tool result.", 13471 type: "string", 13472 applyScrubbing: { 13473 key: "auto", 13474 reason: "Tool results can contain user data" 13475 }, 13476 isInOtel: !1, 13477 visibility: "public", 13478 example: '{"output": "rainy", "toolCallId": "1"}', 13479 deprecation: { 13480 replacement: "gen_ai.tool.call.result", 13481 reason: "OTel uses gen_ai.tool.call.result for MCP tool results" 13482 }, 13483 aliases: [ 13484 "gen_ai.tool.call.result", 13485 "gen_ai.tool.message", 13486 "gen_ai.tool.output" 13487 ], 13488 changelog: [ 13489 { 13490 version: "0.12.0", 13491 prs: [ 13492 420 13493 ], 13494 description: "Deprecated in favor of gen_ai.tool.call.result" 13495 }, 13496 { 13497 version: "0.3.0", 13498 prs: [ 13499 171 13500 ] 13501 }, 13502 { 13503 version: "0.2.0", 13504 prs: [ 13505 164 13506 ] 13507 } 13508 ] 13509 }, 13510 "mcp.tool.result.content_count": { 13511 brief: "Number of content items in the tool result.", 13512 type: "integer", 13513 applyScrubbing: { 13514 key: "manual" 13515 }, 13516 isInOtel: !1, 13517 visibility: "public", 13518 example: 1, 13519 changelog: [ 13520 { 13521 version: "0.4.0", 13522 prs: [ 13523 228 13524 ] 13525 }, 13526 { 13527 version: "0.3.0", 13528 prs: [ 13529 171 13530 ] 13531 } 13532 ] 13533 }, 13534 "mcp.tool.result.is_error": { 13535 brief: "Whether a tool execution resulted in an error.", 13536 type: "boolean", 13537 applyScrubbing: { 13538 key: "manual" 13539 }, 13540 isInOtel: !1, 13541 visibility: "public", 13542 example: !1, 13543 deprecation: { 13544 replacement: "error.type", 13545 reason: "OTel uses error.type set to 'tool_error' when isError is true. Cannot be automatically backfilled due to type mismatch (boolean vs string)." 13546 }, 13547 changelog: [ 13548 { 13549 version: "0.12.0", 13550 prs: [ 13551 420 13552 ], 13553 description: "Deprecated in favor of error.type" 13554 }, 13555 { 13556 version: "0.3.0", 13557 prs: [ 13558 171 13559 ] 13560 } 13561 ] 13562 }, 13563 "mcp.transport": { 13564 brief: "Transport method used for MCP communication.", 13565 type: "string", 13566 applyScrubbing: { 13567 key: "manual" 13568 }, 13569 isInOtel: !1, 13570 visibility: "public", 13571 example: "stdio", 13572 deprecation: { 13573 replacement: "network.transport", 13574 reason: "OTel uses the generic network.transport attribute" 13575 }, 13576 aliases: [ 13577 "network.transport", 13578 "net.transport" 13579 ], 13580 changelog: [ 13581 { 13582 version: "0.12.0", 13583 prs: [ 13584 420 13585 ], 13586 description: "Deprecated in favor of network.transport" 13587 }, 13588 { 13589 version: "0.3.0", 13590 prs: [ 13591 171 13592 ] 13593 } 13594 ] 13595 }, 13596 "mdc.<key>": { 13597 brief: "Attributes from the Mapped Diagnostic Context (MDC) present at the moment the log record was created. The MDC is supported by all the most popular logging solutions in the Java ecosystem, and it's usually implemented as a thread-local map that stores context for e.g. a specific request.", 13598 type: "string", 13599 applyScrubbing: { 13600 key: "auto" 13601 }, 13602 isInOtel: !1, 13603 visibility: "public", 13604 hasDynamicSuffix: !0, 13605 example: "mdc.some_key='some_value'", 13606 changelog: [ 13607 { 13608 version: "0.3.0", 13609 prs: [ 13610 176 13611 ] 13612 } 13613 ] 13614 }, 13615 "messaging.batch.message_count": { 13616 brief: "The number of messages sent, received, or processed in the scope of the batching operation.", 13617 type: "integer", 13618 applyScrubbing: { 13619 key: "manual" 13620 }, 13621 isInOtel: !0, 13622 visibility: "public", 13623 example: 10, 13624 changelog: [ 13625 { 13626 version: "0.6.0", 13627 prs: [ 13628 341 13629 ], 13630 description: "Added messaging.batch.message_count attribute" 13631 } 13632 ] 13633 }, 13634 "messaging.destination": { 13635 brief: "The message destination name.", 13636 type: "string", 13637 applyScrubbing: { 13638 key: "manual" 13639 }, 13640 isInOtel: !1, 13641 visibility: "public", 13642 example: "BestTopic", 13643 deprecation: { 13644 replacement: "messaging.destination.name",
13645 reason: "This attribute is being deprecated in favor of messaging.destination.name, which is the OTel-aligned replacement." 13646 }, 13647 aliases: [ 13648 "messaging.destination.name" 13649 ], 13650 changelog: [ 13651 { 13652 version: "0.16.0", 13653 prs: [ 13654 482 13655 ], 13656 description: "Added messaging.destination attribute, deprecated in favor of messaging.destination.name" 13657 } 13658 ] 13659 }, 13660 "messaging.destination.connection": { 13661 brief: "The message destination connection.", 13662 type: "string", 13663 applyScrubbing: { 13664 key: "manual" 13665 }, 13666 isInOtel: !1, 13667 visibility: "public", 13668 example: "BestTopic", 13669 changelog: [ 13670 { 13671 version: "0.1.0", 13672 prs: [ 13673 127 13674 ] 13675 }, 13676 { 13677 version: "0.0.0" 13678 } 13679 ] 13680 }, 13681 "messaging.destination.name": { 13682 brief: "The message destination name.", 13683 type: "string", 13684 applyScrubbing: { 13685 key: "manual" 13686 }, 13687 isInOtel: !0, 13688 visibility: "public", 13689 example: "BestTopic", 13690 aliases: [ 13691 "messaging.destination" 13692 ], 13693 changelog: [ 13694 { 13695 version: "0.16.0", 13696 prs: [ 13697 482 13698 ], 13699 description: "Added messaging.destination as an alias" 13700 }, 13701 { 13702 version: "0.1.0", 13703 prs: [ 13704 127 13705 ] 13706 }, 13707 { 13708 version: "0.0.0" 13709 } 13710 ] 13711 }, 13712 "messaging.message.body.size": { 13713 brief: "The size of the message body in bytes.", 13714 type: "integer", 13715 applyScrubbing: { 13716 key: "manual" 13717 }, 13718 isInOtel: !0, 13719 visibility: "public", 13720 example: 839, 13721 changelog: [ 13722 { 13723 version: "0.4.0", 13724 prs: [ 13725 228 13726 ] 13727 }, 13728 { 13729 version: "0.0.0" 13730 } 13731 ] 13732 }, 13733 "messaging.message.conversation_id": { 13734 brief: 'The conversation ID identifying the conversation to which the message belongs, represented as a string. Sometimes called "Correlation ID".', 13735 type: "string", 13736 applyScrubbing: { 13737 key: "manual" 13738 }, 13739 isInOtel: !0, 13740 visibility: "public", 13741 example: "MyConversationId", 13742 changelog: [ 13743 { 13744 version: "0.16.0", 13745 prs: [ 13746 468 13747 ], 13748 description: "Added messaging.message.conversation_id attribute" 13749 } 13750 ] 13751 }, 13752 "messaging.message.envelope.size": { 13753 brief: "The size of the message body and metadata in bytes.", 13754 type: "integer", 13755 applyScrubbing: { 13756 key: "manual" 13757 }, 13758 isInOtel: !0, 13759 visibility: "public", 13760 example: 1045, 13761 changelog: [ 13762 { 13763 version: "0.4.0", 13764 prs: [ 13765 228 13766 ] 13767 }, 13768 { 13769 version: "0.0.0" 13770 } 13771 ] 13772 }, 13773 "messaging.message.id": { 13774 brief: "A value used by the messaging system as an identifier for the message, represented as a string.", 13775 type: "string", 13776 applyScrubbing: { 13777 key: "manual" 13778 }, 13779 isInOtel: !0, 13780 visibility: "public", 13781 example: "f47ac10b58cc4372a5670e02b2c3d479", 13782 changelog: [ 13783 { 13784 version: "0.1.0", 13785 prs: [ 13786 127 13787 ] 13788 }, 13789 { 13790 version: "0.0.0" 13791 } 13792 ] 13793 }, 13794 "messaging.message.receive.latency": { 13795 brief: "The latency between when the message was published and received.", 13796 type: "integer", 13797 applyScrubbing: { 13798 key: "manual" 13799 }, 13800 isInOtel: !1, 13801 visibility: "public", 13802 example: 1732847252, 13803 changelog: [ 13804 { 13805 version: "0.4.0", 13806 prs: [ 13807 228 13808 ] 13809 }, 13810 { 13811 version: "0.0.0" 13812 } 13813 ] 13814 }, 13815 "messaging.message.retry.count": { 13816 brief: "The amount of attempts to send the message.", 13817 type: "integer", 13818 applyScrubbing: { 13819 key: "manual" 13820 }, 13821 isInOtel: !1, 13822 visibility: "public", 13823 example: 2, 13824 changelog: [ 13825 { 13826 version: "0.4.0", 13827 prs: [ 13828 228 13829 ] 13830 }, 13831 { 13832 version: "0.0.0" 13833 } 13834 ] 13835 }, 13836 "messaging.operation.name": { 13837 brief: "The name of the messaging operation being performed", 13838 type: "string", 13839 applyScrubbing: { 13840 key: "manual" 13841 }, 13842 isInOtel: !0, 13843 visibility: "public", 13844 example: "send", 13845 changelog: [ 13846 { 13847 version: "0.11.0", 13848 prs: [ 13849 392 13850 ], 13851 description: "Added messaging.operation.name attribute" 13852 } 13853 ] 13854 }, 13855 "messaging.operation.type": { 13856 brief: "A string identifying the type of the messaging operation", 13857 type: "string", 13858 applyScrubbing: { 13859 key: "manual" 13860 }, 13861 isInOtel: !0, 13862 visibility: "public", 13863 example: "create", 13864 changelog: [ 13865 { 13866 version: "0.1.0", 13867 prs: [ 13868 51, 13869 127 13870 ] 13871 } 13872 ] 13873 },
13874 "messaging.rabbitmq.destination.routing_key": { 13875 brief: "RabbitMQ message routing key.", 13876 type: "string", 13877 applyScrubbing: { 13878 key: "manual" 13879 }, 13880 isInOtel: !0, 13881 visibility: "public", 13882 example: "myKey", 13883 changelog: [ 13884 { 13885 version: "0.16.0", 13886 prs: [ 13887 468 13888 ], 13889 description: "Added messaging.rabbitmq.destination.routing_key attribute" 13890 } 13891 ] 13892 }, 13893 "messaging.system": { 13894 brief: "The messaging system as identified by the client instrumentation.", 13895 type: "string", 13896 applyScrubbing: { 13897 key: "manual" 13898 }, 13899 isInOtel: !0, 13900 visibility: "public", 13901 example: "activemq", 13902 changelog: [ 13903 { 13904 version: "0.1.0", 13905 prs: [ 13906 127 13907 ] 13908 }, 13909 { 13910 version: "0.0.0" 13911 } 13912 ] 13913 }, 13914 method: { 13915 brief: "The HTTP method used.", 13916 type: "string", 13917 applyScrubbing: { 13918 key: "manual" 13919 }, 13920 isInOtel: !1, 13921 visibility: "public", 13922 example: "GET", 13923 deprecation: { 13924 replacement: "http.request.method" 13925 }, 13926 aliases: [ 13927 "http.request.method", 13928 "http.request_method", 13929 "http.method" 13930 ], 13931 changelog: [ 13932 { 13933 version: "0.1.0", 13934 prs: [ 13935 61, 13936 127 13937 ] 13938 }, 13939 { 13940 version: "0.0.0" 13941 } 13942 ] 13943 }, 13944 "middleware.name": { 13945 brief: "The name of the middleware.", 13946 type: "string", 13947 applyScrubbing: { 13948 key: "manual" 13949 }, 13950 isInOtel: !1, 13951 visibility: "public", 13952 example: "AuthenticationMiddleware", 13953 changelog: [ 13954 { 13955 version: "0.6.0", 13956 prs: [ 13957 336 13958 ], 13959 description: "Added middleware.name attribute" 13960 } 13961 ] 13962 }, 13963 "navigation.origin": { 13964 brief: "The origin of the navigation (usually client side router navigations). Should preferrably parameterized template (like url.template) or a URL path otherwise.", 13965 type: "string", 13966 applyScrubbing: { 13967 key: "auto" 13968 }, 13969 isInOtel: !1, 13970 visibility: "public", 13971 example: "/users/:id", 13972 aliases: [ 13973 "sentry.sveltekit.navigation.from" 13974 ], 13975 changelog: [ 13976 { 13977 version: "0.16.0", 13978 prs: [ 13979 467 13980 ], 13981 description: "Added navigation.origin attribute" 13982 } 13983 ] 13984 }, 13985 "navigation.route.id": { 13986 brief: "The identifier of the matched client-side route, as assigned by the routing framework (e.g., vue-router name, react-router id).", 13987 type: "string", 13988 applyScrubbing: { 13989 key: "auto" 13990 }, 13991 isInOtel: !1, 13992 visibility: "public", 13993 example: "AboutView", 13994 changelog: [ 13995 { 13996 version: "0.16.0", 13997 prs: [ 13998 468 13999 ], 14000 description: "Added navigation.route.id attribute" 14001 } 14002 ] 14003 }, 14004 "navigation.type": { 14005 brief: "The type of navigation done by a client-side router.", 14006 type: "string", 14007 applyScrubbing: { 14008 key: "manual" 14009 }, 14010 isInOtel: !1, 14011 visibility: "public", 14012 example: "router.push", 14013 aliases: [ 14014 "sentry.sveltekit.navigation.type" 14015 ], 14016 changelog: [ 14017 { 14018 version: "0.16.0", 14019 prs: [ 14020 467 14021 ], 14022 description: "Added new deprecated alias" 14023 }, 14024 { 14025 version: "0.1.0", 14026 prs: [ 14027 127 14028 ] 14029 }, 14030 { 14031 version: "0.0.0" 14032 } 14033 ] 14034 }, 14035 "nel.elapsed_time": { 14036 brief: "The elapsed number of milliseconds between the start of the resource fetch and when it was completed or aborted by the user agent.", 14037 type: "integer", 14038 applyScrubbing: { 14039 key: "manual" 14040 }, 14041 isInOtel: !1, 14042 visibility: "public", 14043 example: 100, 14044 changelog: [ 14045 { 14046 version: "0.4.0", 14047 prs: [ 14048 228 14049 ] 14050 }, 14051 { 14052 version: "0.1.0", 14053 prs: [ 14054 68 14055 ] 14056 } 14057 ] 14058 }, 14059 "nel.phase": { 14060 brief: 'If request failed, the phase of its network error. If request succeeded, "application".', 14061 type: "string", 14062 applyScrubbing: { 14063 key: "manual" 14064 }, 14065 isInOtel: !1, 14066 visibility: "public", 14067 example: "application", 14068 changelog: [ 14069 { 14070 version: "0.1.0", 14071 prs: [ 14072 68, 14073 127 14074 ] 14075 } 14076 ] 14077 }, 14078 "nel.referrer": { 14079 brief: "request's referrer, as determined by the referrer policy associated with its client.", 14080 type: "string", 14081 applyScrubbing: { 14082 key: "auto" 14083 }, 14084 isInOtel: !1, 14085 visibility: "public", 14086 example: "https://example.com/foo?bar=baz", 14087 changelog: [ 14088 { 14089 version: "0.1.0", 14090 prs: [ 14091 68, 14092 127 14093 ] 14094 } 14095 ] 14096 }, 14097 "nel.sampling_function": { 14098 brief: "The sampling function used to determine if the request should be sampled.", 14099 type: "double", 14100 applyScrubbing: { 14101 key: "manual" 14102 }, 14103 isInOtel: !1, 14104 visibility: "public", 14105 example: .5, 14106 changelog: [ 14107 { 14108 version: "0.4.0", 14109 prs: [ 14110 228 14111 ] 14112 }, 14113 { 14114 version: "0.1.0", 14115 prs: [ 14116 68 14117 ] 14118 } 14119 ] 14120 }, 14121 "nel.type": { 14122 brief: 'If request failed, the type of its network error. If request succeeded, "ok".', 14123 type: "string", 14124 applyScrubbing: { 14125 key: "manual" 14126 }, 14127 isInOtel: !1, 14128 visibility: "public", 14129 example: "dns.unreachable", 14130 changelog: [ 14131 { 14132 version: "0.1.0", 14133 prs: [ 14134 68, 14135 127 14136 ] 14137 } 14138 ] 14139 }, 14140 "network.connection.effective_type": { 14141 brief: "Specifies the effective type of the current connection (e.g. slow-2g, 2g, 3g, 4g).", 14142 type: "string", 14143 applyScrubbing: { 14144 key: "manual" 14145 }, 14146 isInOtel: !1, 14147 visibility: "public", 14148 example: "4g", 14149 aliases: [ 14150 "effectiveConnectionType" 14151 ], 14152 changelog: [ 14153 { 14154 version: "0.5.0", 14155 prs: [ 14156 279 14157 ], 14158 description: "Added attribute network.connection.effective_type to be used instead of effectiveConnectionType" 14159 } 14160 ] 14161 }, 14162 "network.connection.rtt": { 14163 brief: "Specifies the estimated effective round-trip time of the current connection, in milliseconds.", 14164 type: "integer", 14165 applyScrubbing: { 14166 key: "manual" 14167 }, 14168 isInOtel: !1, 14169 visibility: "public", 14170 example: 100, 14171 aliases: [ 14172 "connection.rtt" 14173 ], 14174 changelog: [ 14175 { 14176 version: "0.5.0", 14177 prs: [ 14178 279 14179 ], 14180 description: "Added attribute network.connection.rtt to be used instead of connection.rtt" 14181 } 14182 ] 14183 }, 14184 "network.connection.type": { 14185 brief: "Specifies the type of the current connection (e.g. wifi, ethernet, cellular , etc).", 14186 type: "string", 14187 applyScrubbing: { 14188 key: "manual" 14189 }, 14190 isInOtel: !0, 14191 visibility: "public", 14192 example: "wifi", 14193 aliases: [ 14194 "device.connection_type", 14195 "connectionType" 14196 ], 14197 changelog: [ 14198 { 14199 version: "0.5.0", 14200 prs: [ 14201 279 14202 ], 14203 description: "Added attribute network.connection.type to be used instead of connectionType" 14204 } 14205 ] 14206 }, 14207 "network.local.address": { 14208 brief: "Local address of the network connection - IP address or Unix domain socket name.", 14209 type: "string", 14210 applyScrubbing: { 14211 key: "manual" 14212 }, 14213 isInOtel: !0, 14214 visibility: "public", 14215 example: "10.1.2.80", 14216 aliases: [ 14217 "net.host.ip", 14218 "net.sock.host.addr" 14219 ], 14220 changelog: [ 14221 { 14222 version: "0.1.0", 14223 prs: [ 14224 127 14225 ] 14226 }, 14227 { 14228 version: "0.0.0" 14229 } 14230 ] 14231 }, 14232 "network.local.port": { 14233 brief: "Local port number of the network connection.", 14234 type: "integer", 14235 applyScrubbing: { 14236 key: "manual" 14237 }, 14238 isInOtel: !0, 14239 visibility: "public", 14240 example: 65400, 14241 aliases: [ 14242 "net.sock.host.port" 14243 ], 14244 changelog: [ 14245 { 14246 version: "0.4.0", 14247 prs: [ 14248 228 14249 ] 14250 }, 14251 { 14252 version: "0.0.0" 14253 } 14254 ] 14255 }, 14256 "network.peer.address": { 14257 brief: "Peer address of the network connection - IP address or Unix domain socket name.", 14258 type: "string", 14259 applyScrubbing: { 14260 key: "auto" 14261 }, 14262 isInOtel: !0, 14263 visibility: "public", 14264 example: "10.1.2.80", 14265 aliases: [ 14266 "net.peer.ip", 14267 "net.sock.peer.addr" 14268 ], 14269 changelog: [ 14270 { 14271 version: "0.1.0", 14272 prs: [ 14273 108, 14274 127 14275 ] 14276 }, 14277 { 14278 version: "0.0.0" 14279 } 14280 ] 14281 }, 14282 "network.peer.port": { 14283 brief: "Peer port number of the network connection.", 14284 type: "integer", 14285 applyScrubbing: { 14286 key: "manual" 14287 }, 14288 isInOtel: !0, 14289 visibility: "public", 14290 example: 65400, 14291 changelog: [ 14292 { 14293 version: "0.4.0", 14294 prs: [ 14295 228 14296 ] 14297 }, 14298 { 14299 version: "0.0.0" 14300 } 14301 ] 14302 }, 14303 "network.protocol.name": { 14304 brief: "OSI application layer or non-OSI equivalent.", 14305 type: "string", 14306 applyScrubbing: { 14307 key: "manual" 14308 }, 14309 isInOtel: !0, 14310 visibility: "public", 14311 example: "http", 14312 aliases: [ 14313 "net.protocol.name", 14314 "mcp.resource.protocol" 14315 ], 14316 changelog: [ 14317 { 14318 version: "0.1.0", 14319 prs: [ 14320 127 14321 ] 14322 }, 14323 { 14324 version: "0.0.0" 14325 } 14326 ] 14327 }, 14328 "network.protocol.version": { 14329 brief: "The actual version of the protocol used for network communication.", 14330 type: "string", 14331 applyScrubbing: { 14332 key: "manual" 14333 }, 14334 isInOtel: !0, 14335 visibility: "public", 14336 example: "1.1", 14337 aliases: [ 14338 "http.flavor", 14339 "net.protocol.version" 14340 ], 14341 changelog: [ 14342 { 14343 version: "0.1.0", 14344 prs: [ 14345 127 14346 ] 14347 }, 14348 { 14349 version: "0.0.0" 14350 } 14351 ] 14352 }, 14353 "network.transport": { 14354 brief: "OSI transport layer or inter-process communication method.", 14355 type: "string", 14356 applyScrubbing: { 14357 key: "manual" 14358 }, 14359 isInOtel: !0, 14360 visibility: "public", 14361 example: "tcp", 14362 aliases: [ 14363 "net.transport", 14364 "mcp.transport" 14365 ], 14366 changelog: [ 14367 { 14368 version: "0.1.0", 14369 prs: [ 14370 127 14371 ] 14372 }, 14373 { 14374 version: "0.0.0" 14375 } 14376 ] 14377 }, 14378 "network.type": { 14379 brief: "OSI network layer or non-OSI equivalent.", 14380 type: "string", 14381 applyScrubbing: { 14382 key: "manual" 14383 }, 14384 isInOtel: !0, 14385 visibility: "public", 14386 example: "ipv4", 14387 changelog: [ 14388 { 14389 version: "0.1.0", 14390 prs: [ 14391 127 14392 ] 14393 }, 14394 { 14395 version: "0.0.0" 14396 } 14397 ] 14398 }, 14399 "net.host.ip": { 14400 brief: "Local address of the network connection - IP address or Unix domain socket name.", 14401 type: "string", 14402 applyScrubbing: { 14403 key: "manual" 14404 }, 14405 isInOtel: !0, 14406 visibility: "public", 14407 example: "192.168.0.1", 14408 deprecation: { 14409 replacement: "network.local.address" 14410 }, 14411 aliases: [ 14412 "network.local.address", 14413 "net.sock.host.addr" 14414 ], 14415 changelog: [ 14416 { 14417 version: "0.1.0", 14418 prs: [ 14419 61, 14420 108, 14421 127 14422 ] 14423 }, 14424 { 14425 version: "0.0.0" 14426 } 14427 ] 14428 }, 14429 "net.host.name": { 14430 brief: "Server domain name if available without reverse DNS lookup; otherwise, IP address or Unix domain socket name.", 14431 type: "string", 14432 applyScrubbing: { 14433 key: "manual" 14434 }, 14435 isInOtel: !0, 14436 visibility: "public", 14437 example: "example.com", 14438 deprecation: { 14439 replacement: "server.address" 14440 }, 14441 aliases: [ 14442 "server.address", 14443 "http.server_name", 14444 "http.host", 14445 "server_name" 14446 ], 14447 changelog: [ 14448 { 14449 version: "0.1.0", 14450 prs: [ 14451 61, 14452 108, 14453 127 14454 ] 14455 }, 14456 { 14457 version: "0.0.0" 14458 } 14459 ] 14460 }, 14461 "net.host.port": { 14462 brief: "Server port number.", 14463 type: "integer", 14464 applyScrubbing: { 14465 key: "manual" 14466 }, 14467 isInOtel: !0, 14468 visibility: "public", 14469 example: 1337, 14470 deprecation: { 14471 replacement: "server.port" 14472 }, 14473 aliases: [ 14474 "server.port" 14475 ], 14476 changelog: [ 14477 { 14478 version: "0.4.0", 14479 prs: [ 14480 228 14481 ] 14482 }, 14483 { 14484 version: "0.1.0", 14485 prs: [ 14486 61 14487 ] 14488 }, 14489 { 14490 version: "0.0.0" 14491 } 14492 ] 14493 }, 14494 "net.peer.ip": { 14495 brief: "Peer address of the network connection - IP address or Unix domain socket name.", 14496 type: "string", 14497 applyScrubbing: { 14498 key: "auto" 14499 }, 14500 isInOtel: !0, 14501 visibility: "public", 14502 example: "192.168.0.1", 14503 deprecation: { 14504 replacement: "network.peer.address" 14505 }, 14506 aliases: [ 14507 "network.peer.address", 14508 "net.sock.peer.addr" 14509 ], 14510 changelog: [ 14511 { 14512 version: "0.1.0", 14513 prs: [ 14514 61, 14515 108, 14516 127 14517 ] 14518 }, 14519 { 14520 version: "0.0.0" 14521 } 14522 ] 14523 }, 14524
14524 "net.peer.name": { 14525 brief: "Server domain name if available without reverse DNS lookup; otherwise, IP address or Unix domain socket name.", 14526 type: "string", 14527 applyScrubbing: { 14528 key: "auto" 14529 }, 14530 isInOtel: !0, 14531 visibility: "public", 14532 example: "example.com", 14533 deprecation: { 14534 replacement: "server.address", 14535 reason: "Deprecated, use server.address on client spans and client.address on server spans." 14536 }, 14537 changelog: [ 14538 { 14539 version: "0.1.0", 14540 prs: [ 14541 61, 14542 127 14543 ] 14544 }, 14545 { 14546 version: "0.0.0" 14547 } 14548 ] 14549 }, 14550 "net.peer.port": { 14551 brief: "Peer port number.", 14552 type: "integer", 14553 applyScrubbing: { 14554 key: "manual" 14555 }, 14556 isInOtel: !0, 14557 visibility: "public", 14558 example: 1337, 14559 deprecation: { 14560 replacement: "server.port", 14561 reason: "Deprecated, use server.port on client spans and client.port on server spans." 14562 }, 14563 changelog: [ 14564 { 14565 version: "0.4.0", 14566 prs: [ 14567 228 14568 ] 14569 }, 14570 { 14571 version: "0.1.0", 14572 prs: [ 14573 61 14574 ] 14575 }, 14576 { 14577 version: "0.0.0" 14578 } 14579 ] 14580 }, 14581 "net.protocol.name": { 14582 brief: "OSI application layer or non-OSI equivalent.", 14583 type: "string", 14584 applyScrubbing: { 14585 key: "manual" 14586 }, 14587 isInOtel: !0, 14588 visibility: "public", 14589 example: "http", 14590 deprecation: { 14591 replacement: "network.protocol.name" 14592 }, 14593 aliases: [ 14594 "network.protocol.name", 14595 "mcp.resource.protocol" 14596 ], 14597 changelog: [ 14598 { 14599 version: "0.1.0", 14600 prs: [ 14601 61, 14602 127 14603 ] 14604 }, 14605 { 14606 version: "0.0.0" 14607 } 14608 ] 14609 }, 14610 "net.protocol.version": { 14611 brief: "The actual version of the protocol used for network communication.", 14612 type: "string", 14613 applyScrubbing: { 14614 key: "manual" 14615 }, 14616 isInOtel: !0, 14617 visibility: "public", 14618 example: "1.1", 14619 deprecation: { 14620 replacement: "network.protocol.version" 14621 }, 14622 aliases: [ 14623 "network.protocol.version", 14624 "http.flavor" 14625 ], 14626 changelog: [ 14627 { 14628 version: "0.1.0", 14629 prs: [ 14630 61, 14631 108, 14632 127 14633 ] 14634 }, 14635 { 14636 version: "0.0.0" 14637 } 14638 ] 14639 }, 14640 "net.sock.family": { 14641 brief: "OSI transport and network layer", 14642 type: "string", 14643 applyScrubbing: { 14644 key: "manual" 14645 }, 14646 isInOtel: !0, 14647 visibility: "public", 14648 example: "inet", 14649 deprecation: { 14650 replacement: "network.transport", 14651 reason: "Deprecated, use network.transport and network.type." 14652 }, 14653 changelog: [ 14654 { 14655 version: "0.1.0", 14656 prs: [ 14657 61, 14658 127 14659 ] 14660 }, 14661 { 14662 version: "0.0.0" 14663 } 14664 ] 14665 }, 14666 "net.sock.host.addr": { 14667 brief: "Local address of the network connection mapping to Unix domain socket name.", 14668 type: "string", 14669 applyScrubbing: { 14670 key: "manual" 14671 }, 14672 isInOtel: !0, 14673 visibility: "public", 14674 example: "/var/my.sock", 14675 deprecation: { 14676 replacement: "network.local.address" 14677 }, 14678 aliases: [ 14679 "network.local.address", 14680 "net.host.ip" 14681 ], 14682 changelog: [ 14683 { 14684 version: "0.1.0", 14685 prs: [ 14686 61, 14687 108, 14688 127 14689 ] 14690 }, 14691 { 14692 version: "0.0.0" 14693 } 14694 ] 14695 }, 14696 "net.sock.host.port": { 14697 brief: "Local port number of the network connection.", 14698 type: "integer", 14699 applyScrubbing: { 14700 key: "manual" 14701 }, 14702 isInOtel: !0, 14703 visibility: "public", 14704 example: 8080, 14705 deprecation: { 14706 replacement: "network.local.port" 14707 }, 14708 aliases: [ 14709 "network.local.port" 14710 ], 14711 changelog: [ 14712 { 14713 version: "0.4.0", 14714 prs: [ 14715 228 14716 ] 14717 }, 14718 { 14719 version: "0.1.0", 14720 prs: [ 14721 61 14722 ] 14723 }, 14724 { 14725 version: "0.0.0" 14726 } 14727 ] 14728 }, 14729 "net.sock.peer.addr": { 14730 brief: "Peer address of the network connection - IP address", 14731 type: "string", 14732 applyScrubbing: { 14733 key: "auto" 14734 }, 14735 isInOtel: !0, 14736 visibility: "public", 14737 example: "192.168.0.1", 14738 deprecation: { 14739 replacement: "network.peer.address" 14740 }, 14741 aliases: [ 14742 "network.peer.address", 14743 "net.peer.ip" 14744 ], 14745 changelog: [ 14746 { 14747 version: "0.1.0", 14748 prs: [ 14749 61, 14750 108, 14751 127 14752 ] 14753 }, 14754 { 14755 version: "0.0.0" 14756 } 14757 ] 14758 }, 14759 "net.sock.peer.name": { 14760 brief: "Peer address of the network connection - Unix domain socket name", 14761 type: "string", 14762 applyScrubbing: { 14763 key: "auto" 14764 }, 14765 isInOtel: !0, 14766 visibility: "public", 14767 example: "/var/my.sock", 14768 deprecation: { 14769 reason: "Deprecated from OTEL, no replacement at this time" 14770 }, 14771 changelog: [ 14772 { 14773 version: "0.1.0", 14774 prs: [ 14775 61, 14776 119, 14777 127 14778 ] 14779 }, 14780 { 14781 version: "0.0.0" 14782 } 14783 ] 14784 }, 14785 "net.sock.peer.port": { 14786 brief: "Peer port number of the network connection.", 14787 type: "integer", 14788 applyScrubbing: { 14789 key: "manual" 14790 }, 14791 isInOtel: !0, 14792 visibility: "public", 14793 example: 8080, 14794 deprecation: { 14795 replacement: "network.peer.port" 14796 }, 14797 changelog: [ 14798 { 14799 version: "0.4.0", 14800 prs: [ 14801 228 14802 ] 14803 }, 14804 { 14805 version: "0.1.0", 14806 prs: [ 14807 61 14808 ] 14809 }, 14810 { 14811 version: "0.0.0" 14812 } 14813 ] 14814 }, 14815 "net.transport": { 14816 brief: "OSI transport layer or inter-process communication method.", 14817 type: "string", 14818 applyScrubbing: { 14819 key: "manual" 14820 }, 14821 isInOtel: !0, 14822 visibility: "public", 14823 example: "tcp", 14824 deprecation: { 14825 replacement: "network.transport" 14826 }, 14827 aliases: [ 14828 "network.transport", 14829 "mcp.transport" 14830 ], 14831 changelog: [ 14832 { 14833 version: "0.1.0", 14834 prs: [ 14835 61, 14836 127 14837 ] 14838 }, 14839 { 14840 version: "0.0.0" 14841 } 14842 ] 14843 }, 14844 "os.build": { 14845 brief: "The build ID of the operating system.", 14846 type: "string", 14847 applyScrubbing: { 14848 key: "manual" 14849 }, 14850 isInOtel: !1, 14851 visibility: "public", 14852 example: "1234567890", 14853 deprecation: { 14854 replacement: "os.build_id" 14855 }, 14856 aliases: [ 14857 "os.build_id" 14858 ], 14859 changelog: [ 14860 { 14861 version: "0.5.0", 14862 prs: [ 14863 301 14864 ], 14865 description: "Added os.build attribute, deprecated
14865in favor of os.build_id" 14866 } 14867 ] 14868 }, 14869 "os.build_id": { 14870 brief: "The build ID of the operating system.", 14871 type: "string", 14872 applyScrubbing: { 14873 key: "manual" 14874 }, 14875 isInOtel: !0, 14876 visibility: "public", 14877 example: "1234567890", 14878 aliases: [ 14879 "os.build" 14880 ], 14881 changelog: [ 14882 { 14883 version: "0.5.0", 14884 prs: [ 14885 301 14886 ], 14887 description: "Added os.build as alias" 14888 }, 14889 { 14890 version: "0.1.0", 14891 prs: [ 14892 127 14893 ] 14894 }, 14895 { 14896 version: "0.0.0" 14897 } 14898 ] 14899 }, 14900 "os.description": { 14901 brief: "Human readable (not intended to be parsed) OS version information, like e.g. reported by ver or lsb_release -a commands.", 14902 type: "string", 14903 applyScrubbing: { 14904 key: "manual" 14905 }, 14906 isInOtel: !0, 14907 visibility: "public", 14908 example: "Ubuntu 18.04.1 LTS", 14909 changelog: [ 14910 { 14911 version: "0.1.0", 14912 prs: [ 14913 127 14914 ] 14915 }, 14916 { 14917 version: "0.0.0" 14918 } 14919 ] 14920 }, 14921 "os.kernel_version": { 14922 brief: "An independent kernel version string. Typically the entire output of the `uname` syscall.", 14923 type: "string", 14924 applyScrubbing: { 14925 key: "manual" 14926 }, 14927 isInOtel: !1, 14928 visibility: "public", 14929 example: "20.2.0", 14930 changelog: [ 14931 { 14932 version: "0.5.0", 14933 prs: [ 14934 301 14935 ], 14936 description: "Added os.kernel_version attribute" 14937 } 14938 ] 14939 }, 14940 "os.name": { 14941 brief: "Human readable operating system name.", 14942 type: "string", 14943 applyScrubbing: { 14944 key: "manual" 14945 }, 14946 isInOtel: !0, 14947 visibility: "public", 14948 example: "Ubuntu", 14949 changelog: [ 14950 { 14951 version: "0.1.0", 14952 prs: [ 14953 127 14954 ] 14955 }, 14956 { 14957 version: "0.0.0" 14958 } 14959 ] 14960 }, 14961 "os.raw_description": { 14962 brief: "An unprocessed description string obtained by the operating system. For some well-known runtimes, Sentry will attempt to parse `name` and `version` from this string, if they are not explicitly given.", 14963 type: "string", 14964 applyScrubbing: { 14965 key: "manual" 14966 }, 14967 isInOtel: !1, 14968 visibility: "public", 14969 example: "Ubuntu 22.04.4 LTS (Jammy Jellyfish)", 14970 changelog: [ 14971 { 14972 version: "0.5.0", 14973 prs: [ 14974 301 14975 ], 14976 description: "Added os.raw_description attribute" 14977 } 14978 ] 14979 }, 14980 "os.rooted": { 14981 brief: "Whether the operating system has been jailbroken or rooted.", 14982 type: "boolean", 14983 applyScrubbing: { 14984 key: "manual" 14985 }, 14986 isInOtel: !1, 14987 visibility: "public", 14988 example: !0, 14989 changelog: [ 14990 { 14991 version: "0.5.0", 14992 prs: [ 14993 301 14994 ], 14995 description: "Added os.rooted attribute" 14996 } 14997 ] 14998 }, 14999 "os.theme": { 15000 brief: "Whether the OS runs in dark mode or light mode.", 15001 type: "string", 15002 applyScrubbing: { 15003 key: "manual" 15004 }, 15005 isInOtel: !1, 15006 visibility: "public", 15007 example: "dark", 15008 changelog: [ 15009 { 15010 version: "0.5.0", 15011 prs: [ 15012 301 15013 ], 15014 description: "Added os.theme attribute" 15015 } 15016 ] 15017 }, 15018 "os.type": { 15019 brief: "The operating system type.", 15020 type: "string", 15021 applyScrubbing: { 15022 key: "manual" 15023 }, 15024 isInOtel: !0, 15025 visibility: "public", 15026 example: "linux", 15027 changelog: [ 15028 { 15029 version: "0.1.0", 15030 prs: [ 15031 127 15032 ] 15033 }, 15034 { 15035 version: "0.0.0" 15036 } 15037 ] 15038 }, 15039 "os.version": { 15040 brief: "The version of the operating system.", 15041 type: "string", 15042 applyScrubbing: { 15043 key: "manual" 15044 }, 15045 isInOtel: !0, 15046 visibility: "public", 15047 example: "18.04.2", 15048 changelog: [ 15049 { 15050 version: "0.1.0", 15051 prs: [ 15052 127 15053 ] 15054 }, 15055 { 15056 version: "0.0.0" 15057 } 15058 ] 15059 }, 15060 "otel.kind": {
15061 brief: "The span kind (https://opentelemetry.io/docs/concepts/signals/traces/#span-kind). Deprecated, use `sentry.kind` instead.", 15062 type: "string", 15063 applyScrubbing: { 15064 key: "manual" 15065 }, 15066 isInOtel: !1, 15067 visibility: "public", 15068 example: "SERVER", 15069 deprecation: { 15070 replacement: "sentry.kind", 15071 reason: "Deprecated in favor of sentry.kind" 15072 }, 15073 aliases: [ 15074 "sentry.kind" 15075 ], 15076 changelog: [ 15077 { 15078 version: "0.13.0", 15079 prs: [ 15080 440 15081 ], 15082 description: "Added otel.kind attribute" 15083 } 15084 ] 15085 }, 15086 "otel.scope.name": { 15087 brief: "The name of the instrumentation scope - (InstrumentationScope.Name in OTLP).", 15088 type: "string", 15089 applyScrubbing: { 15090 key: "manual" 15091 }, 15092 isInOtel: !0, 15093 visibility: "public", 15094 example: "io.opentelemetry.contrib.mongodb", 15095 changelog: [ 15096 { 15097 version: "0.1.0", 15098 prs: [ 15099 127 15100 ] 15101 }, 15102 { 15103 version: "0.0.0" 15104 } 15105 ] 15106 }, 15107 "otel.scope.version": { 15108 brief: "The version of the instrumentation scope - (InstrumentationScope.Version in OTLP).", 15109 type: "string", 15110 applyScrubbing: { 15111 key: "manual" 15112 }, 15113 isInOtel: !0, 15114 visibility: "public", 15115 example: "2.4.5", 15116 changelog: [ 15117 { 15118 version: "0.1.0", 15119 prs: [ 15120 127 15121 ] 15122 }, 15123 { 15124 version: "0.0.0" 15125 } 15126 ] 15127 }, 15128 "otel.status_code": { 15129 brief: "Name of the code, either \u201COK\u201D or \u201CERROR\u201D. MUST NOT be set if the status code is UNSET.", 15130 type: "string", 15131 applyScrubbing: { 15132 key: "manual" 15133 }, 15134 isInOtel: !0, 15135 visibility: "public", 15136 example: "OK", 15137 changelog: [ 15138 { 15139 version: "0.1.0", 15140 prs: [ 15141 127 15142 ] 15143 }, 15144 { 15145 version: "0.0.0" 15146 } 15147 ] 15148 }, 15149 "otel.status_description": { 15150 brief: "Description of the Status if it has a value, otherwise not set.", 15151 type: "string", 15152 applyScrubbing: { 15153 key: "auto" 15154 }, 15155 isInOtel: !0, 15156 visibility: "public", 15157 example: "resource not found", 15158 changelog: [ 15159 { 15160 version: "0.1.0", 15161 prs: [ 15162 127 15163 ] 15164 }, 15165 { 15166 version: "0.0.0" 15167 } 15168 ] 15169 }, 15170 "params.<key>": { 15171 brief: "Decoded parameters extracted from a URL path. Usually added by client-side routing frameworks like vue-router.", 15172 type: "string", 15173 applyScrubbing: { 15174 key: "auto" 15175 }, 15176 isInOtel: !1, 15177 visibility: "public", 15178 hasDynamicSuffix: !0, 15179 example: "params.id='123'", 15180 aliases: [ 15181 "url.path.parameter.<key>" 15182 ], 15183 changelog: [ 15184 { 15185 version: "0.1.0", 15186 prs: [ 15187 103 15188 ] 15189 } 15190 ] 15191 }, 15192 "performance.activationStart": { 15193 brief: "The time between initiating a navigation to a page and the browser activating the page", 15194 type: "double", 15195 applyScrubbing: { 15196 key: "manual" 15197 }, 15198 isInOtel: !1, 15199 visibility: "public", 15200 example: 1.983, 15201 deprecation: { 15202 replacement: "browser.performance.navigation.activation_start", 15203 reason: "The activationStart is now recorded as the browser.performance.navigation.activation_start attribute." 15204 }, 15205 aliases: [ 15206 "browser.performance.navigation.activation_start" 15207 ], 15208 changelog: [ 15209 { 15210 version: "0.5.0", 15211 prs: [ 15212 321 15213 ], 15214 description: "Added performance.activationStart attribute" 15215 } 15216 ] 15217 }, 15218 "performance.timeOrigin": { 15219 brief: "The browser's performance.timeOrigin timestamp representing the time when the pageload was initiated", 15220 type: "double", 15221 applyScrubbing: { 15222 key: "manual" 15223 }, 15224 isInOtel: !1, 15225 visibility: "public", 15226 example: 1776185678886e-3, 15227 deprecation: { 15228 replacement: "browser.performance.time_origin", 15229 reason: "The timeOrigin is now recorded as the browser.performance.time_origin attribute." 15230 }, 15231 aliases: [ 15232 "browser.performance.time_origin" 15233 ], 15234 changelog: [ 15235 { 15236 version: "0.5.0", 15237 prs: [ 15238 321 15239 ], 15240 description: "Added performance.timeOrigin attribute" 15241 } 15242 ] 15243 }, 15244 previous_route: { 15245 brief: "Also used by mobile SDKs to indicate the previous route in the application.", 15246 type: "string", 15247 applyScrubbing: { 15248 key: "manual" 15249 }, 15250 isInOtel: !1, 15251 visibility: "public", 15252 example: "HomeScreen", 15253 changelog: [ 15254 { 15255 version: "0.1.0", 15256 prs: [ 15257 74
15258 ] 15259 }, 15260 { 15261 version: "0.0.0" 15262 } 15263 ] 15264 }, 15265 "process.command_args": { 15266 brief: "All the command arguments (including the command/executable itself) as received by the process.", 15267 type: "string[]", 15268 applyScrubbing: { 15269 key: "auto" 15270 }, 15271 isInOtel: !0, 15272 visibility: "public", 15273 example: [ 15274 "cmd/otecol", 15275 "--config=config.yaml" 15276 ], 15277 changelog: [ 15278 { 15279 version: "0.6.0", 15280 prs: [ 15281 327 15282 ], 15283 description: "Added process.command_args attribute" 15284 } 15285 ] 15286 }, 15287 "process.executable.name": { 15288 brief: "The name of the executable that started the process.", 15289 type: "string", 15290 applyScrubbing: { 15291 key: "manual" 15292 }, 15293 isInOtel: !0, 15294 visibility: "public", 15295 example: "getsentry", 15296 changelog: [ 15297 { 15298 version: "0.1.0", 15299 prs: [ 15300 127 15301 ] 15302 }, 15303 { 15304 version: "0.0.0" 15305 } 15306 ] 15307 }, 15308 "process.pid": { 15309 brief: "The process ID of the running process.", 15310 type: "integer", 15311 applyScrubbing: { 15312 key: "manual" 15313 }, 15314 isInOtel: !0, 15315 visibility: "public", 15316 example: 12345, 15317 changelog: [ 15318 { 15319 version: "0.4.0", 15320 prs: [ 15321 228 15322 ] 15323 }, 15324 { 15325 version: "0.0.0" 15326 } 15327 ] 15328 }, 15329 "process.runtime.description": { 15330 brief: "An additional description about the runtime of the process, for example a specific vendor customization of the runtime environment. Equivalent to `raw_description` in the Sentry runtime context.", 15331 type: "string", 15332 applyScrubbing: { 15333 key: "manual" 15334 }, 15335 isInOtel: !0, 15336 visibility: "public", 15337 example: "Eclipse OpenJ9 VM openj9-0.21.0", 15338 aliases: [ 15339 "runtime.raw_description" 15340 ], 15341 changelog: [ 15342 { 15343 version: "0.1.0", 15344 prs: [ 15345 127 15346 ] 15347 }, 15348 { 15349 version: "0.0.0" 15350 } 15351 ] 15352 }, 15353 "process.runtime.engine.name": { 15354 brief: "The name of the runtime engine.", 15355 type: "string", 15356 applyScrubbing: { 15357 key: "manual" 15358 }, 15359 isInOtel: !1, 15360 visibility: "public", 15361 example: "v8", 15362 changelog: [ 15363 { 15364 version: "0.0.0" 15365 } 15366 ] 15367 }, 15368 "process.runtime.engine.version": { 15369 brief: "The version of the runtime engine.", 15370 type: "string", 15371 applyScrubbing: { 15372 key: "manual" 15373 }, 15374 isInOtel: !1, 15375 visibility: "public", 15376 example: "12.9.202.13-rusty", 15377 changelog: [ 15378 { 15379 version: "0.0.0" 15380 } 15381 ] 15382 }, 15383 "process.runtime.name": { 15384 brief: "The name of the runtime. Equivalent to `name` in the Sentry runtime context.", 15385 type: "string", 15386 applyScrubbing: { 15387 key: "manual" 15388 }, 15389 isInOtel: !0, 15390 visibility: "public", 15391 example: "node", 15392 aliases: [ 15393 "runtime.name" 15394 ], 15395 changelog: [ 15396 { 15397 version: "0.1.0", 15398 prs: [ 15399 127 15400 ] 15401 }, 15402 { 15403 version: "0.0.0" 15404 } 15405 ] 15406 }, 15407 "process.runtime.version": { 15408 brief: "The version of the runtime of this process, as returned by the runtime without modification. Equivalent to `version` in the Sentry runtime context.", 15409 type: "string", 15410 applyScrubbing: { 15411 key: "manual" 15412 }, 15413 isInOtel: !0, 15414 visibility: "public", 15415 example: "18.04.2", 15416 aliases: [ 15417 "runtime.version" 15418 ], 15419 changelog: [ 15420 { 15421 version: "0.1.0", 15422 prs: [ 15423 127 15424 ] 15425 }, 15426 { 15427 version: "0.0.0" 15428 } 15429 ] 15430 }, 15431 "query.<key>": { 15432 brief: "An item in a query string. Usually added by client-side routing frameworks like vue-router.", 15433 type: "string", 15434 applyScrubbing: { 15435 key: "auto" 15436 }, 15437 isInOtel: !1, 15438 visibility: "public", 15439 hasDynamicSuffix: !0, 15440 example: "query.id='123'", 15441 deprecation: { 15442 replacement: "url.query", 15443 reason: "Instead of sending items individually in query.<key>, they should be sent all together with url.query." 15444 }, 15445 changelog: [ 15446 { 15447 version: "0.1.0", 15448 prs: [ 15449 103 15450 ] 15451 } 15452 ] 15453 }, 15454 "react.version": { 15455 brief: "The version of the React framework", 15456 type: "string", 15457 applyScrubbing: { 15458 key: "manual" 15459 }, 15460 isInOtel: !1, 15461 visibility: "public", 15462 example: "18.2.0", 15463 changelog: [ 15464 { 15465 version: "0.7.0", 15466 prs: [ 15467 368 15468 ], 15469 description: "Added react.version attribute" 15470 } 15471 ] 15472 }, 15473 release: { 15474 brief: "The sentry release.", 15475 type: "string", 15476 applyScrubbing: { 15477 key: "manual" 15478 }, 15479 isInOtel: !1, 15480 visibility: "public", 15481 example: "production", 15482 deprecation: { 15483 replacement: "sentry.release" 15484 }, 15485 aliases: [ 15486 "sentry.release" 15487 ], 15488 changelog: [ 15489 { 15490 version: "0.1.0", 15491 prs: [ 15492 61, 15493 127 15494 ] 15495 }, 15496 { 15497 version: "0.0.0" 15498 } 15499 ] 15500 }, 15501 "remix.action_form_data.<key>": { 15502 brief: "Remix form data, <key> being the form data key, the value being the form data value.", 15503 type: "string", 15504 applyScrubbing: { 15505 key: "auto" 15506 }, 15507 isInOtel: !1, 15508 visibility: "public", 15509 hasDynamicSuffix: !0, 15510 example: "http.response.header.text='test'", 15511 changelog: [ 15512 { 15513 version: "0.1.0", 15514 prs: [ 15515 103 15516 ] 15517 } 15518 ] 15519 }, 15520 replay_id: { 15521 brief: "The id of the sentry replay.", 15522 type: "string", 15523 applyScrubbing: { 15524 key: "never" 15525 }, 15526 isInOtel: !1, 15527 visibility: "public", 15528 example: "123e4567e89b12d3a456426614174000", 15529 deprecation: { 15530 replacement: "sentry.replay_id" 15531 }, 15532 aliases: [ 15533 "sentry.replay_id" 15534 ], 15535 changelog: [ 15536 { 15537 version: "0.1.0", 15538 prs: [ 15539 61 15540 ] 15541 }, 15542 { 15543 version: "0.0.0" 15544 } 15545 ] 15546 }, 15547 "resource.deployment.environment": {
15548 brief: "The software deployment environment name.", 15549 type: "string", 15550 applyScrubbing: { 15551 key: "manual" 15552 }, 15553 isInOtel: !0, 15554 visibility: "public", 15555 example: "production", 15556 deprecation: { 15557 replacement: "sentry.environment" 15558 }, 15559 changelog: [ 15560 { 15561 version: "0.5.0", 15562 prs: [ 15563 266 15564 ] 15565 } 15566 ] 15567 }, 15568 "resource.deployment.environment.name": { 15569 brief: "The software deployment environment name.", 15570 type: "string", 15571 applyScrubbing: { 15572 key: "manual" 15573 }, 15574 isInOtel: !0, 15575 visibility: "public", 15576 example: "production", 15577 deprecation: { 15578 replacement: "sentry.environment" 15579 }, 15580 changelog: [ 15581 { 15582 version: "0.3.1", 15583 prs: [ 15584 196 15585 ] 15586 } 15587 ] 15588 }, 15589 "resource.render_blocking_status": { 15590 brief: "The render blocking status of the resource.", 15591 type: "string", 15592 applyScrubbing: { 15593 key: "manual" 15594 }, 15595 isInOtel: !1, 15596 visibility: "public", 15597 example: "non-blocking", 15598 changelog: [ 15599 { 15600 version: "0.1.0", 15601 prs: [ 15602 127 15603 ] 15604 }, 15605 { 15606 version: "0.0.0" 15607 } 15608 ] 15609 }, 15610 route: { 15611 brief: "The matched route, that is, the path template in the format used by the respective server framework. Also used by mobile SDKs to indicate the current route in the application.", 15612 type: "string", 15613 applyScrubbing: { 15614 key: "manual" 15615 }, 15616 isInOtel: !1, 15617 visibility: "public", 15618 example: "App\\Controller::indexAction", 15619 deprecation: { 15620 replacement: "http.route" 15621 }, 15622 aliases: [ 15623 "http.route" 15624 ], 15625 changelog: [ 15626 { 15627 version: "0.1.0", 15628 prs: [ 15629 61, 15630 74 15631 ] 15632 }, 15633 { 15634 version: "0.0.0" 15635 } 15636 ] 15637 }, 15638 "rpc.grpc.status_code": { 15639 brief: "The numeric status code of the gRPC request.", 15640 type: "integer", 15641 applyScrubbing: { 15642 key: "manual" 15643 }, 15644 isInOtel: !0, 15645 visibility: "public", 15646 example: 2, 15647 changelog: [ 15648 { 15649 version: "0.4.0", 15650 prs: [ 15651 228 15652 ] 15653 }, 15654 { 15655 version: "0.0.0" 15656 } 15657 ] 15658 }, 15659 "rpc.method": { 15660 brief: "The fully-qualified logical name of the method from the RPC interface perspective.", 15661 type: "string", 15662 applyScrubbing: { 15663 key: "manual" 15664 }, 15665 isInOtel: !0, 15666 visibility: "public", 15667 example: "com.example.ExampleService/exampleMethod", 15668 changelog: [ 15669 { 15670 version: "0.7.0", 15671 prs: [ 15672 351 15673 ], 15674 description: "Added rpc.method attribute" 15675 } 15676 ] 15677 }, 15678 "rpc.response.status_code": { 15679 brief: "Status code of the RPC returned by the RPC server or generated by the client.", 15680 type: "string", 15681 applyScrubbing: { 15682 key: "manual" 15683 }, 15684 isInOtel: !0, 15685 visibility: "public", 15686 example: "DEADLINE_EXCEEDED", 15687 changelog: [ 15688 { 15689 version: "0.7.0", 15690 prs: [ 15691 352 15692 ], 15693 description: "Added rpc.response.status_code attribute" 15694 } 15695 ] 15696 }, 15697 "rpc.service": { 15698 brief: "The full (logical) name of the service being called, including its package name, if applicable.", 15699 type: "string", 15700 applyScrubbing: { 15701 key: "manual" 15702 }, 15703 isInOtel: !0, 15704 visibility: "public", 15705 example: "myService.BestService", 15706 changelog: [ 15707 { 15708 version: "0.1.0", 15709 prs: [ 15710 127 15711 ] 15712 }, 15713 { 15714 version: "0.0.0" 15715 } 15716 ] 15717 }, 15718 "rpc.system": { 15719 brief: "A string identifying the remoting system.", 15720 type: "string", 15721 applyScrubbing: { 15722 key: "manual" 15723 }, 15724 isInOtel: !0, 15725 visibility: "public", 15726 example: "aws-api", 15727 deprecation: { 15728 replacement: "rpc.system.name",
15729 reason: "This attribute is being deprecated in favor of rpc.system.name, which is the OTel-aligned replacement." 15730 }, 15731 aliases: [ 15732 "rpc.system.name" 15733 ], 15734 changelog: [ 15735 { 15736 version: "0.16.0", 15737 prs: [ 15738 482 15739 ], 15740 description: "Added rpc.system attribute, deprecated in favor of rpc.system.name" 15741 } 15742 ] 15743 }, 15744 "rpc.system.name": { 15745 brief: "A string identifying the remoting system.", 15746 type: "string", 15747 applyScrubbing: { 15748 key: "manual" 15749 }, 15750 isInOtel: !0, 15751 visibility: "public", 15752 example: "aws-api", 15753 aliases: [ 15754 "rpc.system" 15755 ], 15756 changelog: [ 15757 { 15758 version: "0.16.0", 15759 prs: [ 15760 482 15761 ], 15762 description: "Added rpc.system.name attribute" 15763 } 15764 ] 15765 }, 15766 "runtime.build": { 15767 brief: "The application build string, when it is separate from the version.", 15768 type: "string", 15769 applyScrubbing: { 15770 key: "manual" 15771 }, 15772 isInOtel: !1, 15773 visibility: "public", 15774 example: "stable", 15775 deprecation: { 15776 reason: "The runtime.* namespace is deprecated in favor of process.runtime.*. No direct OTel equivalent exists for this attribute." 15777 }, 15778 changelog: [ 15779 { 15780 version: "0.11.0", 15781 prs: [ 15782 383 15783 ], 15784 description: "Added and deprecated runtime.build attribute" 15785 } 15786 ] 15787 }, 15788 "runtime.name": { 15789 brief: "The name of the runtime. For example node, CPython, or rustc.", 15790 type: "string", 15791 applyScrubbing: { 15792 key: "manual" 15793 }, 15794 isInOtel: !1, 15795 visibility: "public", 15796 example: "node", 15797 deprecation: { 15798 replacement: "process.runtime.name", 15799 reason: "Prefer OTel-aligned process.runtime.name" 15800 }, 15801 aliases: [ 15802 "process.runtime.name" 15803 ], 15804 changelog: [ 15805 { 15806 version: "0.11.0", 15807 prs: [ 15808 383 15809 ], 15810 description: "Added and deprecated runtime.name attribute in favor of process.runtime.name" 15811 } 15812 ] 15813 }, 15814 "runtime.raw_description": { 15815 brief: "Unprocessed description string as obtained from the runtime. Used to extract name and version for well-known runtimes.", 15816 type: "string", 15817 applyScrubbing: { 15818 key: "manual" 15819 }, 15820 isInOtel: !1, 15821 visibility: "public", 15822 example: "Eclipse OpenJ9 VM openj9-0.21.0", 15823 deprecation: { 15824 replacement: "process.runtime.description", 15825 reason: "Prefer OTel-aligned process.runtime.description" 15826 }, 15827 aliases: [ 15828 "process.runtime.description" 15829 ], 15830 changelog: [ 15831 { 15832 version: "0.11.0", 15833 prs: [ 15834 383 15835 ], 15836 description: "Added and deprecated runtime.raw_description attribute in favor of process.runtime.description" 15837 } 15838 ] 15839 }, 15840 "runtime.version": { 15841 brief: "The version of the runtime.", 15842 type: "string", 15843 applyScrubbing: { 15844 key: "manual" 15845 }, 15846 isInOtel: !1, 15847 visibility: "public", 15848 example: "18.04.2", 15849 deprecation: { 15850 replacement: "process.runtime.version", 15851 reason: "Prefer OTel-aligned process.runtime.version" 15852 }, 15853 aliases: [ 15854 "process.runtime.version" 15855 ], 15856 changelog: [ 15857 { 15858 version: "0.11.0", 15859 prs: [ 15860 383 15861 ], 15862 description: "Added and deprecated runtime.version attribute in favor of process.runtime.version" 15863 } 15864 ] 15865 }, 15866 "score.<key>": { 15867 brief: "The weighted performance score for a web vital. This is defined as `score.weight.<key>` * `score.ratio.<key>`.", 15868 type: "double", 15869 applyScrubbing: { 15870 key: "manual" 15871 }, 15872 isInOtel: !1, 15873 visibility: "public", 15874 hasDynamicSuffix: !0, 15875 example: "score.cls=0.1723", 15876 changelog: [ 15877 { 15878 version: "0.7.0", 15879 prs: [ 15880 355 15881 ], 15882 description: "Added score.<key> attribute" 15883 } 15884 ] 15885 }, 15886 "score.ratio.<key>": { 15887 brief: "The score for a web vital, normalized to a number between 0 and 1.", 15888 type: "double", 15889 applyScrubbing: { 15890 key: "manual" 15891 }, 15892 isInOtel: !1, 15893 visibility: "public", 15894 hasDynamicSuffix: !0, 15895 example: "score.ratio.inp=0.7748", 15896 changelog: [ 15897 { 15898 version: "0.7.0", 15899 prs: [ 15900 355 15901 ], 15902 description: "Added score.ratio.<key> attribute" 15903 } 15904 ] 15905 }, 15906 "score.total": { 15907 brief: "The total performance score of a span. This is the sum of individual weighted
15907web vital scores (see `score.<key>`).", 15908 type: "double", 15909 applyScrubbing: { 15910 key: "manual" 15911 }, 15912 isInOtel: !1, 15913 visibility: "public", 15914 changelog: [ 15915 { 15916 version: "0.7.0", 15917 prs: [ 15918 355 15919 ], 15920 description: "Added score.total attribute" 15921 } 15922 ] 15923 }, 15924 "score.weight.<key>": { 15925 brief: "The relative weight of a web vital in a span's performance score.", 15926 type: "double", 15927 applyScrubbing: { 15928 key: "manual" 15929 }, 15930 isInOtel: !1, 15931 visibility: "public", 15932 hasDynamicSuffix: !0, 15933 example: "score.weight.fcp=0.25", 15934 changelog: [ 15935 { 15936 version: "0.7.0", 15937 prs: [ 15938 355 15939 ], 15940 description: "Added score.weight.<key> attribute" 15941 } 15942 ] 15943 }, 15944 "sentry.action": { 15945 brief: "Used as a generic attribute representing the action depending on the type of span. For instance, this is the database query operation for DB spans, and the request method for HTTP spans.", 15946 type: "string", 15947 applyScrubbing: { 15948 key: "manual" 15949 }, 15950 isInOtel: !1, 15951 visibility: "public", 15952 example: "SELECT", 15953 changelog: [ 15954 { 15955 version: "0.4.0", 15956 prs: [ 15957 212 15958 ] 15959 } 15960 ] 15961 }, 15962 "sentry.browser.name": { 15963 brief: "The name of the browser.", 15964 type: "string", 15965 applyScrubbing: { 15966 key: "manual" 15967 }, 15968 isInOtel: !1, 15969 visibility: "public", 15970 example: "Chrome", 15971 deprecation: { 15972 replacement: "browser.name" 15973 }, 15974 aliases: [ 15975 "browser.name" 15976 ], 15977 changelog: [ 15978 { 15979 version: "0.1.0", 15980 prs: [ 15981 139 15982 ] 15983 } 15984 ] 15985 }, 15986 "sentry.browser.version": { 15987 brief: "The version of the browser.", 15988 type: "string", 15989 applyScrubbing: { 15990 key: "manual" 15991 }, 15992 isInOtel: !1, 15993 visibility: "public", 15994 example: "120.0.6099.130", 15995 deprecation: { 15996 replacement: "browser.version" 15997 }, 15998 aliases: [ 15999 "browser.version" 16000 ], 16001 changelog: [ 16002 { 16003 version: "0.1.0", 16004 prs: [ 16005 139 16006 ] 16007 } 16008 ] 16009 }, 16010 "sentry.cancellation_reason": { 16011 brief: "The reason why a span ended early.", 16012 type: "string", 16013 applyScrubbing: { 16014 key: "never" 16015 }, 16016 isInOtel: !1, 16017 visibility: "public", 16018 example: "document.hidden", 16019 changelog: [ 16020 { 16021 version: "0.0.0" 16022 } 16023 ] 16024 }, 16025 "sentry.category": { 16026 brief: "The high-level category of a span, derived from the span operation or span attributes. This categorizes spans by their general purpose (e.g., database, HTTP, UI). Known values include: 'ai', 'ai.pipeline', 'app', 'browser', 'cache', 'console', 'db', 'event', 'file', 'function.aws', 'function.azure', 'function.gcp', 'function.nextjs', 'function.remix', 'graphql', 'grpc', 'http', 'measure', 'middleware', 'navigation', 'pageload', 'queue', 'resource', 'rpc', 'serialize', 'subprocess', 'template', 'topic', 'ui', 'ui.angular', 'ui.ember', 'ui.react', 'ui.svelte', 'ui.vue', 'view', 'websocket'.", 16027 type: "string", 16028 applyScrubbing: { 16029 key: "never" 16030 }, 16031 isInOtel: !1, 16032 visibility: "public", 16033 example: "db", 16034 changelog: [ 16035 { 16036 version: "0.4.0", 16037 prs: [ 16038 218 16039 ] 16040 } 16041 ] 16042 }, 16043 "sentry.client_sample_rate": { 16044 brief: "Rate at which a span was sampled in the SDK.", 16045 type: "double", 16046 applyScrubbing: { 16047 key: "never" 16048 }, 16049 isInOtel: !1, 16050 visibility: "public", 16051 example: .5, 16052 changelog: [ 16053 { 16054 version: "0.1.0", 16055 prs: [ 16056 102 16057 ] 16058 } 16059 ] 16060 }, 16061 "sentry.description": { 16062 brief: "The human-readable description of a span.", 16063 type: "string", 16064 applyScrubbing: { 16065 key: "auto" 16066 }, 16067 isInOtel: !1, 16068 visibility: "public", 16069 example: "index view query", 16070 changelog: [ 16071 { 16072 version: "0.1.0", 16073 prs: [ 16074 135 16075 ] 16076 } 16077 ] 16078 }, 16079 "sentry.dist": { 16080 brief: "The sentry dist.", 16081 type: "string", 16082 applyScrubbing: { 16083 key: "never" 16084 }, 16085 isInOtel: !1, 16086 visibility: "public", 16087 example: "1.0", 16088 aliases: [ 16089 "dist" 16090 ], 16091 changelog: [ 16092 { 16093 version: "0.16.0", 16094 prs: [ 16095 489 16096 ], 16097 description: "Added dist as an alias" 16098 }, 16099 { 16100 version: "0.0.0" 16101 } 16102 ] 16103 }, 16104 "sentry.domain": { 16105 brief: "Used as a generic attribute representing the domain depending on the type of span. For instance, this is the collection/table name for database spans, and the server address for HTTP spans.", 16106 type: "string", 16107 applyScrubbing: { 16108 key: "manual" 16109 }, 16110 isInOtel: !1, 16111 visibility: "public", 16112 example: "example.com", 16113 changelog: [ 16114 { 16115 version: "0.4.0", 16116 prs: [ 16117 212 16118 ] 16119 } 16120 ] 16121 }, 16122 "sentry.dsc.environment": { 16123 brief: "The environment from the dynamic sampling context.", 16124 type: "string", 16125 applyScrubbing: { 16126 key: "never" 16127 }, 16128 isInOtel: !1, 16129 visibility: "internal", 16130 example: "prod", 16131 changelog: [ 16132 { 16133 version: "0.3.0", 16134 prs: [ 16135 185 16136 ] 16137 } 16138 ] 16139 }, 16140 "sentry.dsc.project_id": { 16141 brief: "The ID of the project where the trace originated (i.e. the project of the SDK that started the trace). Propagated through the dynamic sampling context and set by Relay during ingestion.", 16142 type: "string", 16143 applyScrubbing: { 16144 key: "never" 16145 }, 16146 isInOtel: !1, 16147 visibility: "internal", 16148 example: "12345", 16149 changelog: [ 16150 { 16151 version: "0.7.0", 16152 prs: [ 16153 358 16154 ], 16155 description: "Add sentry.dsc.project_id as an attribute" 16156 } 16157 ] 16158 }, 16159 "sentry.dsc.public_key": { 16160 brief: "The public key from the dynamic sampling context.", 16161 type: "string", 16162 applyScrubbing: { 16163 key: "manual" 16164 }, 16165 isInOtel: !1, 16166 visibility: "internal", 16167 example: "c51734c603c4430eb57cb0a5728a479d", 16168 changelog: [ 16169 { 16170 version: "0.3.0", 16171 prs: [ 16172 185 16173 ] 16174 } 16175 ] 16176 }, 16177 "sentry.dsc.release": { 16178 brief: "The release identifier from the dynamic sampling context.", 16179 type: "string", 16180 applyScrubbing: { 16181 key: "never" 16182 }, 16183 isInOtel: !1, 16184 visibility: "internal", 16185 example: "frontend@e8211be71b214afab5b85de4b4c54be3714952bb", 16186 changelog: [ 16187 { 16188 version: "0.3.0", 16189 prs: [ 16190 185 16191 ] 16192 } 16193 ] 16194 }, 16195 "sentry.dsc.sampled": { 16196 brief: "Whether the event was sampled according to the dynamic sampling context.", 16197 type: "boolean", 16198 applyScrubbing: { 16199 key: "never" 16200 }, 16201 isInOtel: !1, 16202 visibility: "internal", 16203 example: !0, 16204 changelog: [ 16205 { 16206 version: "0.3.0", 16207 prs: [ 16208 185 16209 ] 16210 } 16211 ] 16212 }, 16213 "sentry.dsc.sample_rate": { 16214 brief: "The sample rate from the dynamic sampling context.", 16215 type: "string", 16216 applyScrubbing: { 16217 key: "never" 16218 }, 16219 isInOtel: !1, 16220 visibility: "internal", 16221 example: "1.0", 16222 changelog: [ 16223 { 16224 version: "0.3.0", 16225 prs: [ 16226 185 16227 ] 16228 } 16229 ] 16230 }, 16231 "sentry.dsc.trace_id": { 16232 brief: "The trace ID from the dynamic sampling context.", 16233 type: "string", 16234 applyScrubbing: { 16235 key: "never" 16236 }, 16237 isInOtel: !1, 16238 visibility: "internal", 16239 example: "047372980460430cbc78d9779df33a46", 16240 changelog: [ 16241 { 16242 version: "0.3.0", 16243 prs: [ 16244 185 16245 ] 16246 } 16247 ] 16248 }, 16249 "sentry.dsc.transaction": { 16250 brief: "The transaction name from the dynamic sampling context.", 16251 type: "string", 16252 applyScrubbing: { 16253 key: "never" 16254 }, 16255 isInOtel: !1, 16256 visibility: "internal", 16257 example: "/issues/errors-outages/", 16258 changelog: [ 16259 { 16260 version: "0.3.0", 16261 prs: [ 16262 185 16263 ] 16264 } 16265 ] 16266 }, 16267 "sentry.environment": { 16268 brief: "The sentry environment.", 16269 type: "string", 16270 applyScrubbing: { 16271 key: "never" 16272 }, 16273 isInOtel: !1, 16274 visibility: "public", 16275 example: "production", 16276 aliases: [ 16277 "environment" 16278 ], 16279 changelog: [ 16280 { 16281 version: "0.0.0" 16282 } 16283 ] 16284 }, 16285 "sentry.exclusive_time": { 16286 brief: "The exclusive time duration of the span in milliseconds.", 16287 type: "double", 16288 applyScrubbing: { 16289 key: "manual" 16290 }, 16291 isInOtel: !1, 16292 visibility: "public", 16293 example: 1234, 16294 changelog: [ 16295 { 16296 version: "0.4.0", 16297 prs: [ 16298 228 16299 ] 16300 }, 16301 { 16302 version: "0.3.0", 16303 prs: [ 16304 160 16305 ] 16306 }, 16307 { 16308 version: "0.0.0" 16309 } 16310 ] 16311 }, 16312 "sentry.graphql.operation": { 16313 brief: "Indicates the type of graphql operation, emitted by the Javascript SDK.", 16314 type: "string", 16315 applyScrubbing: { 16316 key: "manual" 16317 }, 16318 isInOtel: !1, 16319 visibility: "public", 16320 example: "getUserById", 16321 changelog: [ 16322 { 16323 version: "0.3.1", 16324 prs: [ 16325 190 16326 ] 16327 } 16328 ] 16329 }, 16330 "sentry.group": { 16331 brief: "Stores the hash of `sentry.normalized_description`. This is primarily used for grouping spans in the product end.", 16332 type: "string", 16333 applyScrubbing: { 16334 key: "never" 16335 }, 16336 isInOtel: !1, 16337 visibility: "public", 16338 changelog: [ 16339 { 16340 version: "0.4.0", 16341 prs: [ 16342 212 16343 ] 16344 } 16345 ] 16346 }, 16347 "sentry.http.prefetch": { 16348 brief: "If an http request was a prefetch request.", 16349 type: "boolean", 16350 applyScrubbing: { 16351 key: "never" 16352 }, 16353 isInOtel: !1, 16354 visibility: "public", 16355 example: !0, 16356 changelog: [ 16357 { 16358 version: "0.0.0" 16359 } 16360 ] 16361 }, 16362 "sentry.idle_span_finish_reason": {
16363 brief: "The reason why an idle span ended early.", 16364 type: "string", 16365 applyScrubbing: { 16366 key: "never" 16367 }, 16368 isInOtel: !1, 16369 visibility: "public", 16370 example: "idleTimeout", 16371 changelog: [ 16372 { 16373 version: "0.0.0" 16374 } 16375 ] 16376 }, 16377 "sentry.is_remote": { 16378 brief: "Indicates whether a span's parent is remote.", 16379 type: "boolean", 16380 applyScrubbing: { 16381 key: "never" 16382 }, 16383 isInOtel: !1, 16384 visibility: "public", 16385 example: !0, 16386 changelog: [ 16387 { 16388 version: "0.3.1", 16389 prs: [ 16390 190 16391 ] 16392 } 16393 ] 16394 }, 16395 "sentry.kind": { 16396 brief: "Used to clarify the relationship between parents and children, or to distinguish between spans, e.g. a `server` and `client` span with the same name.", 16397 type: "string", 16398 applyScrubbing: { 16399 key: "manual" 16400 }, 16401 isInOtel: !1, 16402 visibility: "public", 16403 example: "server", 16404 aliases: [ 16405 "otel.kind" 16406 ], 16407 changelog: [ 16408 { 16409 version: "0.3.1", 16410 prs: [ 16411 190 16412 ] 16413 } 16414 ] 16415 }, 16416 "sentry.main_thread": { 16417 brief: "Whether the span or event occurred on the main thread. Computed by Relay and should not be set by SDKs.", 16418 type: "boolean", 16419 applyScrubbing: { 16420 key: "never" 16421 }, 16422 isInOtel: !1, 16423 visibility: "public", 16424 example: !0, 16425 changelog: [ 16426 { 16427 version: "0.5.0" 16428 } 16429 ] 16430 }, 16431 "sentry.message.parameter.<key>": { 16432 brief: "A parameter used in the message template. <key> can either be the number that represent the parameter's position in the template string (sentry.message.parameter.0, sentry.message.parameter.1, etc) or the parameter's name (sentry.message.parameter.item_id, sentry.message.parameter.user_id, etc)", 16433 type: "string", 16434 applyScrubbing: { 16435 key: "auto" 16436 }, 16437 isInOtel: !1, 16438 visibility: "public", 16439 example: "sentry.message.parameter.0='123'", 16440 changelog: [ 16441 { 16442 version: "0.1.0", 16443 prs: [ 16444 116 16445 ] 16446 } 16447 ] 16448 }, 16449 "sentry.message.template": { 16450 brief: "The parameterized template string.", 16451 type: "string", 16452 applyScrubbing: { 16453 key: "manual" 16454 }, 16455 isInOtel: !1, 16456 visibility: "public", 16457 example: "Hello, {name}!", 16458 changelog: [ 16459 { 16460 version: "0.1.0", 16461 prs: [ 16462 116 16463 ] 16464 } 16465 ] 16466 }, 16467 "sentry.metric.source": { 16468 brief: "The provenance of a metric. For example, this can be set to indicate if a metric was generated by Relay from a span.", 16469 type: "string", 16470 applyScrubbing: { 16471 key: "never" 16472 }, 16473 isInOtel: !1, 16474 visibility: "public", 16475 example: "span", 16476 changelog: [ 16477 { 16478 version: "0.16.0", 16479 prs: [ 16480 476 16481 ], 16482 description: "Added sentry.metric.source attribute" 16483 } 16484 ] 16485 }, 16486 "sentry.mobile": { 16487 brief: "Whether the application is using a mobile SDK. Computed by Relay and should not be set by SDKs.", 16488 type: "boolean", 16489 applyScrubbing: { 16490 key: "never" 16491 }, 16492 isInOtel: !1, 16493 visibility: "public", 16494 example: !0, 16495 changelog: [ 16496 { 16497 version: "0.5.0" 16498 } 16499 ] 16500 }, 16501 "sentry.module.<key>": { 16502 brief: "A module that was loaded in the process. The key is the name of the module.", 16503 type: "string", 16504 applyScrubbing: { 16505 key: "manual" 16506 }, 16507 isInOtel: !1, 16508 visibility: "public", 16509 hasDynamicSuffix: !0, 16510 example: "sentry.module.brianium/paratest='v7.7.0'", 16511 changelog: [ 16512 { 16513 version: "0.1.0", 16514 prs: [ 16515 103 16516 ] 16517 } 16518 ] 16519 }, 16520 "sentry.nextjs.ssr.function.route": { 16521 brief: "A parameterized route for a function in Next.js that contributes to Server-Side Rendering. Should be present on spans that track such functions when the file location of the function is known.", 16522 type: "string", 16523 applyScrubbing: { 16524 key: "never" 16525 }, 16526 isInOtel: !1, 16527 visibility: "public", 16528 example: "/posts/[id]/layout", 16529 changelog: [ 16530 { 16531 version: "0.1.0", 16532 prs: [ 16533 54, 16534 106 16535 ] 16536 } 16537 ] 16538 }, 16539 "sentry.nextjs.ssr.function.type": { 16540 brief: "A descriptor for a for a function in Next.js that contributes to Server-Side Rendering. Should be present on spans that track such functions.", 16541 type: "string", 16542 applyScrubbing: { 16543 key: "never" 16544 }, 16545 isInOtel: !1, 16546 visibility: "public", 16547 example: "generateMetadata", 16548 changelog: [ 16549 { 16550 version: "0.1.0", 16551 prs: [ 16552 54, 16553 106 16554 ] 16555 } 16556 ] 16557 }, 16558 "sentry.normalized_db_query": { 16559 brief: "The normalized version of `db.query.text`.", 16560 type: "string", 16561 applyScrubbing: { 16562 key: "manual" 16563 }, 16564 isInOtel: !1, 16565 visibility: "public", 16566 example: "SELECT .. FROM sentry_project WHERE (project_id = %s)", 16567 changelog: [ 16568 { 16569 version: "0.3.1", 16570 prs: [ 16571 194 16572 ] 16573 } 16574 ] 16575 }, 16576 "sentry.normalized_db_query.hash": { 16577 brief: "The hash of `sentry.normalized_db_query`.", 16578 type: "string", 16579 applyScrubbing: { 16580 key: "never" 16581 }, 16582 isInOtel: !1, 16583 visibility: "public", 16584 changelog: [ 16585 { 16586 version: "0.4.0", 16587 prs: [ 16588 200 16589 ] 16590 } 16591 ] 16592 }, 16593 "sentry.normalized_description": { 16594 brief: "Used as a generic attribute representing the normalized `sentry.description`. This refers to the legacy use case of `sentry.description` where it holds relevant data depending on the type of span (e.g. database query, resource url, http request description, etc).", 16595 type: "string", 16596 applyScrubbing: { 16597 key: "auto" 16598 }, 16599 isInOtel: !1, 16600 visibility: "public", 16601 example: "SELECT .. FROM sentry_project WHERE (project_id = %s)", 16602 changelog: [ 16603 { 16604 version: "0.4.0", 16605 prs: [ 16606 212 16607 ] 16608 } 16609 ] 16610 }, 16611 "sentry.observed_timestamp_nanos": { 16612 brief: "The timestamp at which an envelope was received by Relay, in nanoseconds.", 16613 type: "string", 16614 applyScrubbing: { 16615 key: "never" 16616 }, 16617 isInOtel: !1, 16618 visibility: "public", 16619 example: "1544712660300000000", 16620 changelog: [ 16621 { 16622 version: "0.3.0", 16623 prs: [ 16624 174 16625 ] 16626 }, 16627 { 16628 version: "0.2.0", 16629 prs: [ 16630 137 16631 ] 16632 } 16633 ] 16634 }, 16635 "sentry.op": { 16636 brief: "The operation of a span.", 16637 type: "string", 16638 applyScrubbing: { 16639 key: "never" 16640 }, 16641 isInOtel: !1, 16642 visibility: "public", 16643 example: "http.client", 16644 changelog: [ 16645 { 16646 version: "0.0.0" 16647 } 16648 ] 16649 }, 16650 "sentry.origin": { 16651 brief: "The origin of the instrumentation (e.g. span, log, etc.)", 16652 type: "string", 16653 applyScrubbing: { 16654 key: "never" 16655 }, 16656 isInOtel: !1, 16657 visibility: "public", 16658 example: "auto.http.otel.fastify", 16659 changelog: [ 16660 { 16661 version: "0.1.0", 16662 prs: [ 16663 68 16664 ] 16665 }, 16666 { 16667 version: "0.0.0" 16668 } 16669 ] 16670 }, 16671 "sentry.platform": { 16672 brief: "The sdk platform that generated the event.", 16673 type: "string", 16674 applyScrubbing: { 16675 key: "never" 16676 }, 16677 isInOtel: !1, 16678 visibility: "public", 16679 example: "php", 16680 changelog: [ 16681 { 16682 version: "0.0.0" 16683 } 16684 ] 16685 }, 16686 "sentry.profiler_id": { 16687 brief: "The id of the currently running profiler (continuous profiling)", 16688 type: "string", 16689 applyScrubbing: { 16690 key: "never" 16691 }, 16692 isInOtel: !1, 16693 visibility: "public", 16694 example: "18779b64dd35d1a538e7ce2dd2d3fad3", 16695 changelog: [ 16696 { 16697 version: "0.4.0", 16698 prs: [ 16699 242 16700 ] 16701 } 16702 ] 16703 }, 16704 "sentry.profile_id": { 16705 brief: "The ID of the Sentry profile the span is associated with. This is only meaningful for transaction-based profiling.", 16706 type: "string", 16707 applyScrubbing: { 16708 key: "never" 16709 }, 16710 isInOtel: !1, 16711 visibility: "public", 16712 example: "123e4567e89b12d3a456426614174000", 16713 changelog: [ 16714 { 16715 version: "0.6.0", 16716 prs: [ 16717 344 16718 ], 16719 description: "Added sentry.profile_id attribute" 16720 } 16721 ] 16722 }, 16723 "sentry.release": { 16724 brief: "The sentry release.", 16725 type: "string", 16726 applyScrubbing: { 16727 key: "never" 16728 }, 16729 isInOtel: !1, 16730 visibility: "public", 16731 example: "7.0.0", 16732 aliases: [ 16733 "service.version", 16734 "release" 16735 ], 16736 changelog: [ 16737 { 16738 version: "0.0.0" 16739 } 16740 ] 16741 }, 16742 "sentry.replay_id": { 16743 brief: "The id of the sentry replay.", 16744 type: "string", 16745 applyScrubbing: { 16746 key: "never" 16747 }, 16748 isInOtel: !1, 16749 visibility: "public", 16750 example: "123e4567e89b12d3a456426614174000", 16751 aliases: [ 16752 "replay_id" 16753 ], 16754 changelog: [ 16755 { 16756 version: "0.0.0" 16757 } 16758 ] 16759 }, 16760 "sentry.replay_is_buffering": { 16761 brief: "A sentinel attribute on log events indicating whether the current Session Replay is being buffered (onErrorSampleRate).", 16762 type: "boolean", 16763 applyScrubbing: { 16764 key: "never" 16765 }, 16766 isInOtel: !1, 16767 visibility: "public", 16768 example: !0, 16769 changelog: [ 16770 { 16771 version: "0.3.0", 16772 prs: [ 16773 185 16774 ] 16775 } 16776 ] 16777 }, 16778 "sentry.report_event": { 16779 brief: "(Deprecated) The event that caused the SDK to report CLS or LCP (pagehide or navigation)", 16780 type: "string", 16781 applyScrubbing: { 16782 key: "manual" 16783 }, 16784 isInOtel: !1, 16785 visibility: "public", 16786 example: "pagehide", 16787 deprecation: { 16788 reason: "The report event is now recorded as a browser.web_vital.lcp.report_event or browser.web_vital.cls.report_event attribute. No backfill required." 16789 }, 16790 changelog: [ 16791 { 16792 version: "0.5.0", 16793 prs: [ 16794 320 16795 ], 16796 description: "Added sentry.report_event attribute" 16797 } 16798 ] 16799 }, 16800 "sentry.sdk.integrations": { 16801 brief: "A list of names identifying enabled integrations. The list shouldhave all enabled integrations, including default integrations. Defaultintegrations are included because different SDK releases may contain differentdefault integrations.", 16802 type: "string[]", 16803 applyScrubbing: { 16804 key: "never" 16805 }, 16806 isInOtel: !1, 16807 visibility: "public", 16808 example: [ 16809 "InboundFilters", 16810 "FunctionToString", 16811 "BrowserApiErrors", 16812 "Breadcrumbs" 16813 ], 16814 changelog: [ 16815 { 16816 version: "0.0.0", 16817 prs: [ 16818 42 16819 ] 16820 } 16821 ] 16822 }, 16823 "sentry.sdk.name": { 16824 brief: "The sentry sdk name.", 16825 type: "string", 16826 applyScrubbing: { 16827 key: "never" 16828 }, 16829 isInOtel: !1, 16830 visibility: "public", 16831 example: "@sentry/react", 16832 changelog: [ 16833 { 16834 version: "0.0.0" 16835 } 16836 ] 16837 }, 16838 "sentry.sdk.version": { 16839 brief: "The sentry sdk version.", 16840 type: "string", 16841 applyScrubbing: { 16842 key: "never" 16843 }, 16844 isInOtel: !1, 16845 visibility: "public", 16846 example: "7.0.0", 16847 changelog: [ 16848 { 16849 version: "0.0.0" 16850 } 16851 ] 16852 }, 16853 "sentry.segment.id": { 16854 brief: "The segment ID of a span", 16855 type: "string", 16856 applyScrubbing: { 16857 key: "never" 16858 }, 16859 isInOtel: !1, 16860 visibility: "public", 16861 example: "051581bf3cb55c13", 16862 aliases: [ 16863 "sentry.segment_id" 16864 ], 16865 changelog: [ 16866 { 16867 version: "0.1.0", 16868 prs: [ 16869 107, 16870 124 16871 ] 16872 } 16873 ] 16874 }, 16875 "sentry.segment_id": { 16876 brief: "The segment ID of a span", 16877 type: "string", 16878 applyScrubbing: { 16879 key: "never" 16880 }, 16881 isInOtel: !1, 16882 visibility: "public", 16883 example: "051581bf3cb55c13", 16884 deprecation: { 16885 replacement: "sentry.segment.id" 16886 }, 16887 aliases: [ 16888 "sentry.segment.id" 16889 ], 16890 changelog: [ 16891 { 16892 version: "0.1.0", 16893 prs: [ 16894 124 16895 ] 16896 } 16897 ] 16898 }, 16899 "sentry.segment.name": { 16900 brief: "The segment name of a span", 16901 type: "string", 16902 applyScrubbing: { 16903 key: "manual" 16904 }, 16905 isInOtel: !1, 16906 visibility: "public", 16907 example: "GET /user", 16908 aliases: [ 16909 "sentry.transaction", 16910 "transaction" 16911 ], 16912 changelog: [ 16913 { 16914 version: "0.6.0", 16915 prs: [ 16916 345 16917 ], 16918 description: "Added sentry.transaction and transaction aliases" 16919 }, 16920 { 16921 version: "0.1.0", 16922 prs: [ 16923 104 16924 ] 16925 } 16926 ] 16927 }, 16928 "sentry.server_sample_rate": { 16929 brief: "Rate at which a span was sampled in Relay.", 16930 type: "double", 16931 applyScrubbing: { 16932 key: "never" 16933 }, 16934 isInOtel: !1, 16935 visibility: "public", 16936 example: .5, 16937 changelog: [ 16938 { 16939 version: "0.1.0", 16940 prs: [ 16941 102 16942 ] 16943 } 16944 ] 16945 }, 16946 "sentry.source": { 16947 brief: "The source of a span, also referred to as transaction source. Known values are: `'custom'`, `'url'`, `'route'`, `'component'`, `'view'`, `'task'`. '`source`' describes a parametrized route, while `'url'` describes the full URL, potentially containing identifiers.", 16948 type: "string", 16949 applyScrubbing: { 16950 key: "never" 16951 }, 16952 isInOtel: !1, 16953 visibility: "public", 16954 example: "route", 16955 deprecation: { 16956 replacement: "sentry.span.source",
16957 reason: "This attribute is being deprecated in favor of sentry.span.source" 16958 }, 16959 changelog: [ 16960 { 16961 version: "0.5.0" 16962 } 16963 ] 16964 }, 16965 "sentry.span.source": { 16966 brief: "The source of a span, also referred to as transaction source. Known values are: `'custom'`, `'url'`, `'route'`, `'component'`, `'view'`, `'task'`. '`source`' describes a parametrized route, while `'url'` describes the full URL, potentially containing identifiers.", 16967 type: "string", 16968 applyScrubbing: { 16969 key: "never" 16970 }, 16971 isInOtel: !1, 16972 visibility: "public", 16973 example: "route", 16974 changelog: [ 16975 { 16976 version: "0.4.0", 16977 prs: [ 16978 214 16979 ] 16980 }, 16981 { 16982 version: "0.0.0" 16983 } 16984 ] 16985 }, 16986 "sentry.status": { 16987 brief: 'The span\'s status (either "ok" or "error"). Older SDKs may set this to a more specific error, but this behaviour is deprecated.', 16988 type: "string", 16989 applyScrubbing: { 16990 key: "never" 16991 }, 16992 isInOtel: !1, 16993 visibility: "public", 16994 example: "ok", 16995 changelog: [ 16996 { 16997 version: "0.14.0", 16998 prs: [ 16999 453 17000 ] 17001 } 17002 ] 17003 }, 17004 "sentry.status_code": { 17005 brief: "The HTTP status code used in Sentry Insights. Typically set by Sentry during ingestion, rather than by clients.", 17006 type: "integer", 17007 applyScrubbing: { 17008 key: "manual" 17009 }, 17010 isInOtel: !1, 17011 visibility: "public", 17012 example: 200, 17013 changelog: [ 17014 { 17015 version: "0.4.0", 17016 prs: [ 17017 223, 17018 228 17019 ] 17020 } 17021 ] 17022 }, 17023 "sentry.status.message": { 17024 brief: "The from OTLP extracted status message.", 17025 type: "string", 17026 applyScrubbing: { 17027 key: "manual" 17028 }, 17029 isInOtel: !1, 17030 visibility: "public", 17031 example: "foobar", 17032 changelog: [ 17033 { 17034 version: "0.3.1", 17035 prs: [ 17036 190 17037 ] 17038 } 17039 ] 17040 }, 17041 "sentry.sveltekit.navigation.from": { 17042 brief: "the navigation origin (sveltekit router)", 17043 type: "string", 17044 applyScrubbing: { 17045 key: "auto" 17046 }, 17047 isInOtel: !1, 17048 visibility: "public", 17049 example: "/home", 17050 deprecation: { 17051 replacement: "navigation.origin", 17052 reason: "Use the more generic attribute instead" 17053 }, 17054 aliases: [ 17055 "navigation.origin" 17056 ], 17057 changelog: [ 17058 { 17059 version: "0.16.0", 17060 prs: [ 17061 467 17062 ], 17063 description: "Added sentry.sveltekit.navigation.from attribute" 17064 } 17065 ] 17066 }, 17067 "sentry.sveltekit.navigation.to": { 17068 brief: "the navigation destination", 17069 type: "string", 17070 applyScrubbing: { 17071 key: "auto" 17072 }, 17073 isInOtel: !1, 17074 visibility: "public", 17075 example: "/users/:id", 17076 deprecation: { 17077 reason: "the navigation destination is already covered by url.* attributes" 17078 }, 17079 changelog: [ 17080 { 17081 version: "0.16.0", 17082 prs: [ 17083 467 17084 ], 17085 description: "Added sentry.sveltekit.navigation.to attribute" 17086 } 17087 ] 17088 }, 17089 "sentry.sveltekit.navigation.type": { 17090 brief: "The type of navigation event emitted from the sveltekit client router", 17091 type: "string", 17092 applyScrubbing: { 17093 key: "manual" 17094 }, 17095 isInOtel: !1, 17096 visibility: "public", 17097 example: "link", 17098 deprecation: { 17099 replacement: "navigation.type", 17100 reason: "Use the more generic attribute instead" 17101 }, 17102 aliases: [ 17103 "navigation.type" 17104 ], 17105 changelog: [ 17106 { 17107 version: "0.16.0", 17108 prs: [ 17109 467 17110 ], 17111 description: "Added sentry.sveltekit.navigation.type attribute" 17112 } 17113 ] 17114 }, 17115 "sentry.thread.id": { 17116 brief: "Current \u201Cmanaged\u201D thread ID.", 17117 type: "integer", 17118 applyScrubbing: { 17119 key: "manual" 17120 }, 17121 isInOtel: !1, 17122 visibility: "public", 17123 example: 56, 17124 deprecation: { 17125 replacement: "thread.id",
17126 reason: "This attribute is being deprecated in favor of the OTel-standard thread.id" 17127 }, 17128 changelog: [ 17129 { 17130 version: "0.13.0", 17131 prs: [ 17132 451 17133 ] 17134 } 17135 ] 17136 }, 17137 "sentry.timestamp.sequence": { 17138 brief: "A sequencing counter for deterministic ordering of logs or metrics when timestamps share the same integer millisecond. Starts at 0 on SDK initialization, increments by 1 for each captured item, and resets to 0 when the integer millisecond of the current item differs from the previous one.", 17139 type: "integer", 17140 applyScrubbing: { 17141 key: "never" 17142 }, 17143 isInOtel: !1, 17144 visibility: "public", 17145 example: 0, 17146 changelog: [ 17147 { 17148 version: "0.5.0", 17149 prs: [ 17150 262 17151 ] 17152 } 17153 ] 17154 }, 17155 "sentry.trace_lifecycle": { 17156 brief: "Indicates the chosen trace lifecycle mode of the SDK (stream or static)", 17157 type: "string", 17158 applyScrubbing: { 17159 key: "manual" 17160 }, 17161 isInOtel: !1, 17162 visibility: "public", 17163 example: "stream", 17164 changelog: [ 17165 { 17166 version: "0.13.0", 17167 prs: [ 17168 442 17169 ], 17170 description: "Added sentry.trace_lifecycle attribute" 17171 } 17172 ] 17173 }, 17174 "sentry.trace.parent_span_id": { 17175 brief: "The span id of the span that was active when the log was collected. This should not be set if there was no active span.", 17176 type: "string", 17177 applyScrubbing: { 17178 key: "never" 17179 }, 17180 isInOtel: !1, 17181 visibility: "public", 17182 example: "b0e6f15b45c36b12", 17183 deprecation: {}, 17184 changelog: [ 17185 { 17186 version: "0.5.0", 17187 prs: [ 17188 287 17189 ], 17190 description: "Deprecate `sentry.trace.parent_span_id`" 17191 }, 17192 { 17193 version: "0.1.0", 17194 prs: [ 17195 116 17196 ] 17197 } 17198 ] 17199 }, 17200 "sentry.trace.status": { 17201 brief: 'The segment\'s status (either "ok" or "error"). Older SDKs may set this to a more specific error, but this behaviour is deprecated.', 17202 type: "string", 17203 applyScrubbing: { 17204 key: "never" 17205 }, 17206 isInOtel: !1, 17207 visibility: "public", 17208 example: "ok", 17209 changelog: [ 17210 { 17211 version: "0.14.0", 17212 prs: [ 17213 453 17214 ] 17215 } 17216 ] 17217 }, 17218 "sentry.transaction": { 17219 brief: "The sentry transaction (segment name).", 17220 type: "string", 17221 applyScrubbing: { 17222 key: "never" 17223 }, 17224 isInOtel: !1, 17225 visibility: "public", 17226 example: "GET /", 17227 deprecation: { 17228 replacement: "sentry.segment.name",
17229 reason: "This attribute is being deprecated in favor of sentry.segment.name" 17230 }, 17231 aliases: [ 17232 "sentry.segment.name", 17233 "transaction" 17234 ], 17235 changelog: [ 17236 { 17237 version: "0.6.0", 17238 prs: [ 17239 345 17240 ], 17241 description: "Deprecated sentry.transaction in favor of sentry.segment.name" 17242 }, 17243 { 17244 version: "0.0.0" 17245 } 17246 ] 17247 }, 17248 "sentry.user.email": { 17249 brief: "User email address.", 17250 type: "string", 17251 applyScrubbing: { 17252 key: "auto" 17253 }, 17254 isInOtel: !1, 17255 visibility: "public", 17256 deprecation: { 17257 replacement: "user.email" 17258 }, 17259 aliases: [ 17260 "user.email" 17261 ], 17262 changelog: [ 17263 { 17264 version: "0.10.0", 17265 prs: [ 17266 406 17267 ] 17268 } 17269 ] 17270 }, 17271 "sentry.user.geo.city": { 17272 brief: "Human readable city name.", 17273 type: "string", 17274 applyScrubbing: { 17275 key: "manual" 17276 }, 17277 isInOtel: !1, 17278 visibility: "public", 17279 deprecation: { 17280 replacement: "user.geo.city" 17281 }, 17282 aliases: [ 17283 "user.geo.city" 17284 ], 17285 changelog: [ 17286 { 17287 version: "0.10.0", 17288 prs: [ 17289 406 17290 ] 17291 } 17292 ] 17293 }, 17294 "sentry.user.geo.country_code": { 17295 brief: "Two-letter country code (ISO 3166-1 alpha-2).", 17296 type: "string", 17297 applyScrubbing: { 17298 key: "manual" 17299 }, 17300 isInOtel: !1, 17301 visibility: "public", 17302 deprecation: { 17303 replacement: "user.geo.country_code" 17304 }, 17305 aliases: [ 17306 "user.geo.country_code" 17307 ], 17308 changelog: [ 17309 { 17310 version: "0.10.0", 17311 prs: [ 17312 406 17313 ] 17314 } 17315 ] 17316 }, 17317 "sentry.user.geo.region": { 17318 brief: "Human readable region name or code.", 17319 type: "string", 17320 applyScrubbing: { 17321 key: "manual" 17322 }, 17323 isInOtel: !1, 17324 visibility: "public", 17325 deprecation: { 17326 replacement: "user.geo.region" 17327 }, 17328 aliases: [ 17329 "user.geo.region" 17330 ], 17331 changelog: [ 17332 { 17333 version: "0.10.0", 17334 prs: [ 17335 406 17336 ] 17337 } 17338 ] 17339 }, 17340 "sentry.user.geo.subdivision": { 17341 brief: "Human readable subdivision name.", 17342 type: "string", 17343 applyScrubbing: { 17344 key: "manual" 17345 }, 17346 isInOtel: !1, 17347 visibility: "public", 17348 deprecation: { 17349 replacement: "user.geo.subdivision" 17350 }, 17351 aliases: [ 17352 "user.geo.subdivision" 17353 ], 17354 changelog: [ 17355 { 17356 version: "0.10.0", 17357 prs: [ 17358 406 17359 ] 17360 } 17361 ] 17362 }, 17363 "sentry.user.id": { 17364 brief: "Unique identifier of the user.", 17365 type: "string", 17366 applyScrubbing: { 17367 key: "auto" 17368 }, 17369 isInOtel: !1, 17370 visibility: "public", 17371 deprecation: { 17372 replacement: "user.id" 17373 }, 17374 aliases: [ 17375 "user.id" 17376 ], 17377 changelog: [ 17378 { 17379 version: "0.10.0", 17380 prs: [ 17381 406 17382 ] 17383 } 17384 ] 17385 }, 17386 "sentry.user.ip": { 17387 brief: "The IP address of the user.", 17388 type: "string", 17389 applyScrubbing: { 17390 key: "auto" 17391 }, 17392 isInOtel: !1, 17393 visibility: "public", 17394 deprecation: { 17395 replacement: "user.ip_address" 17396 }, 17397 aliases: [ 17398 "user.ip_address" 17399 ], 17400 changelog: [ 17401 { 17402 version: "0.10.0", 17403 prs: [ 17404 406 17405 ] 17406 } 17407 ] 17408 }, 17409 "sentry.user.username": { 17410 brief: "Short name or login/username of the user.", 17411 type: "string", 17412 applyScrubbing: { 17413 key: "auto" 17414 }, 17415 isInOtel: !1, 17416 visibility: "public", 17417 deprecation: { 17418 replacement: "user.name" 17419 }, 17420 aliases: [ 17421 "user.name" 17422 ], 17423 changelog: [ 17424 { 17425 version: "0.10.0", 17426 prs: [ 17427 406 17428 ] 17429 } 17430 ] 17431 }, 17432 "server.address": { 17433 brief: "Server domain name if available without reverse DNS lookup; otherwise, IP address or Unix domain socket name.", 17434 type: "string", 17435 applyScrubbing: { 17436 key: "manual" 17437 }, 17438 isInOtel: !0, 17439 visibility: "public", 17440 example: "example.com", 17441 aliases: [ 17442 "http.server_name", 17443 "net.host.name", 17444 "http.host", 17445 "server_name" 17446 ], 17447 changelog: [ 17448 { 17449 version: "0.1.0", 17450 prs: [ 17451 108, 17452 127 17453 ] 17454 }, 17455 { 17456 version: "0.0.0" 17457 } 17458 ] 17459 }, 17460 server_name: { 17461 brief: "Server domain name if available without reverse DNS lookup; otherwise, IP address or Unix domain socket name.", 17462 type: "string", 17463 applyScrubbing: { 17464 key: "manual" 17465 }, 17466 isInOtel: !1, 17467 visibility: "public", 17468 example: "example.com", 17469 deprecation: { 17470 replacement: "server.address",
17471 reason: "This attribute is being deprecated in favor of server.address, which is the OTel-aligned replacement." 17472 }, 17473 aliases: [ 17474 "server.address", 17475 "http.server_name", 17476 "net.host.name", 17477 "http.host" 17478 ], 17479 changelog: [ 17480 { 17481 version: "0.16.0", 17482 prs: [ 17483 477 17484 ], 17485 description: "Added server_name attribute, deprecated in favor of server.address" 17486 } 17487 ] 17488 }, 17489 "server.port": { 17490 brief: "Server port number.", 17491 type: "integer", 17492 applyScrubbing: { 17493 key: "manual" 17494 }, 17495 isInOtel: !0, 17496 visibility: "public", 17497 example: 1337, 17498 aliases: [ 17499 "net.host.port" 17500 ], 17501 changelog: [ 17502 { 17503 version: "0.4.0", 17504 prs: [ 17505 228 17506 ] 17507 }, 17508 { 17509 version: "0.0.0" 17510 } 17511 ] 17512 }, 17513 "service.name": { 17514 brief: "Logical name of the service.", 17515 type: "string", 17516 applyScrubbing: { 17517 key: "manual" 17518 }, 17519 isInOtel: !0, 17520 visibility: "public", 17521 example: "omegastar", 17522 changelog: [ 17523 { 17524 version: "0.1.0", 17525 prs: [ 17526 127 17527 ] 17528 }, 17529 { 17530 version: "0.0.0" 17531 } 17532 ] 17533 }, 17534 "service.version": { 17535 brief: "The version string of the service API or implementation. The format is not defined by these conventions.", 17536 type: "string", 17537 applyScrubbing: { 17538 key: "manual" 17539 }, 17540 isInOtel: !0, 17541 visibility: "public", 17542 example: "5.0.0", 17543 aliases: [ 17544 "sentry.release" 17545 ], 17546 changelog: [ 17547 { 17548 version: "0.1.0", 17549 prs: [ 17550 127 17551 ] 17552 }, 17553 { 17554 version: "0.0.0" 17555 } 17556 ] 17557 }, 17558 "session.id": { 17559 brief: "A unique id identifying the active session at the time of setting this attribute", 17560 type: "string", 17561 applyScrubbing: { 17562 key: "manual" 17563 }, 17564 isInOtel: !0, 17565 visibility: "public", 17566 example: "00112233-4455-6677-8899-aabbccddeeff", 17567 changelog: [ 17568 { 17569 version: "0.11.0", 17570 prs: [ 17571 412 17572 ], 17573 description: "Added session.id attribute" 17574 } 17575 ] 17576 }, 17577 stall_percentage: { 17578 brief: "The fraction of time the app was stalled. Only applies to React Native. This is computed by Relay.", 17579 type: "double", 17580 applyScrubbing: { 17581 key: "manual" 17582 }, 17583 isInOtel: !1, 17584 visibility: "public", 17585 changelog: [ 17586 { 17587 version: "0.7.0", 17588 prs: [ 17589 362 17590 ], 17591 description: "Added stall_percentage attribute" 17592 } 17593 ] 17594 }, 17595 stall_total_time: { 17596 brief: "The combined duration of all stalls in milliseconds. Only applies to React Native. This is computed by Relay.", 17597 type: "double", 17598 applyScrubbing: { 17599 key: "manual" 17600 }, 17601 isInOtel: !1, 17602 visibility: "public", 17603 changelog: [ 17604 { 17605 version: "0.7.0", 17606 prs: [ 17607 362 17608 ], 17609 description: "Added stall_total_time attribute" 17610 } 17611 ] 17612 }, 17613 "state.type": { 17614 brief: "The type of state management library", 17615 type: "string", 17616 applyScrubbing: { 17617 key: "manual" 17618 }, 17619 isInOtel: !1, 17620 visibility: "public", 17621 example: "redux", 17622 changelog: [ 17623 { 17624 version: "0.7.0", 17625 prs: [ 17626 365 17627 ], 17628 description: "Added state.type attribute" 17629 } 17630 ] 17631 }, 17632 "thread.id": { 17633 brief: "Current \u201Cmanaged\u201D thread ID.", 17634 type: "integer", 17635 applyScrubbing: { 17636 key: "manual" 17637 }, 17638 isInOtel: !0, 17639 visibility: "public", 17640 example: 56, 17641 changelog: [ 17642 { 17643 version: "0.0.0" 17644 } 17645 ] 17646 }, 17647 "thread.name": { 17648 brief: "Current thread name.", 17649 type: "string", 17650 applyScrubbing: { 17651 key: "manual" 17652 }, 17653 isInOtel: !0, 17654 visibility: "public", 17655 example: "main", 17656 changelog: [ 17657 { 17658 version: "0.1.0", 17659 prs: [ 17660 127 17661 ] 17662 }, 17663 { 17664 version: "0.0.0" 17665 } 17666 ] 17667 }, 17668 "timber.tag": { 17669 brief: "The log tag provided by the timber logging framework.", 17670 type: "string", 17671 applyScrubbing: { 17672 key: "manual" 17673 }, 17674 isInOtel: !1, 17675 visibility: "public", 17676 example: "MyTag", 17677 changelog: [ 17678 { 17679 version: "0.3.0", 17680 prs: [ 17681 183 17682 ] 17683 } 17684 ] 17685 }, 17686 time_to_full_display: { 17687 brief: "The duration of time to full display in milliseconds", 17688 type: "double", 17689 applyScrubbing: { 17690 key: "manual" 17691 }, 17692 isInOtel: !1, 17693 visibility: "public", 17694 example: 1234.56, 17695 deprecation: { 17696 replacement: "app.vitals.ttfd.value", 17697 reason: "Replaced by app.vitals.ttfd.value to align with the app.vitals.* namespace for mobile performance attributes"
17698 }, 17699 aliases: [ 17700 "app.vitals.ttfd.value" 17701 ], 17702 changelog: [ 17703 { 17704 version: "0.5.0", 17705 prs: [ 17706 313 17707 ], 17708 description: "Added and deprecated in favor of app.vitals.ttfd.value" 17709 } 17710 ] 17711 }, 17712 time_to_initial_display: { 17713 brief: "The duration of time to initial display in milliseconds", 17714 type: "double", 17715 applyScrubbing: { 17716 key: "manual" 17717 }, 17718 isInOtel: !1, 17719 visibility: "public", 17720 example: 1234.56, 17721 deprecation: { 17722 replacement: "app.vitals.ttid.value", 17723 reason: "Replaced by app.vitals.ttid.value to align with the app.vitals.* namespace for mobile performance attributes" 17724 }, 17725 aliases: [ 17726 "app.vitals.ttid.value" 17727 ], 17728 changelog: [ 17729 { 17730 version: "0.5.0", 17731 prs: [ 17732 313 17733 ], 17734 description: "Added and deprecated in favor of app.vitals.ttid.value" 17735 } 17736 ] 17737 }, 17738 transaction: { 17739 brief: "The sentry transaction (segment name).", 17740 type: "string", 17741 applyScrubbing: { 17742 key: "manual" 17743 }, 17744 isInOtel: !1, 17745 visibility: "public", 17746 example: "GET /", 17747 deprecation: { 17748 replacement: "sentry.segment.name" 17749 }, 17750 aliases: [ 17751 "sentry.segment.name", 17752 "sentry.transaction" 17753 ], 17754 changelog: [ 17755 { 17756 version: "0.6.0", 17757 prs: [ 17758 345 17759 ], 17760 description: "Updated transaction deprecation replacement to sentry.segment.name" 17761 }, 17762 { 17763 version: "0.1.0", 17764 prs: [ 17765 61, 17766 127 17767 ] 17768 }, 17769 { 17770 version: "0.0.0" 17771 } 17772 ] 17773 }, 17774 "trpc.procedure_path": { 17775 brief: "The path of the tRPC procedure being called", 17776 type: "string", 17777 applyScrubbing: { 17778 key: "manual" 17779 }, 17780 isInOtel: !1, 17781 visibility: "public", 17782 example: "user.getById", 17783 changelog: [ 17784 { 17785 version: "0.7.0", 17786 prs: [ 17787 370 17788 ], 17789 description: "Added trpc.procedure_path attribute" 17790 } 17791 ] 17792 }, 17793 "trpc.procedure_type": { 17794 brief: "The type of the tRPC procedure", 17795 type: "string", 17796 applyScrubbing: { 17797 key: "manual" 17798 }, 17799 isInOtel: !1, 17800 visibility: "public", 17801 example: "query", 17802 changelog: [ 17803 { 17804 version: "0.7.0", 17805 prs: [ 17806 370 17807 ], 17808 description: "Added trpc.procedure_type attribute" 17809 } 17810 ] 17811 }, 17812 ttfb: { 17813 brief: "The value of the recorded Time To First Byte (TTFB) web vital in milliseconds", 17814 type: "double", 17815 applyScrubbing: { 17816 key: "manual" 17817 }, 17818 isInOtel: !1, 17819 visibility: "public", 17820 example: 194, 17821 deprecation: { 17822 replacement: "browser.web_vital.ttfb.value",
17823 reason: "This attribute is being deprecated in favor of browser.web_vital.ttfb.value" 17824 }, 17825 aliases: [ 17826 "browser.web_vital.ttfb.value" 17827 ], 17828 changelog: [ 17829 { 17830 version: "0.5.0", 17831 prs: [ 17832 235 17833 ] 17834 } 17835 ] 17836 }, 17837 "ttfb.requestTime": { 17838 brief: "The time it takes for the server to process the initial request and send the first byte of a response to the user's browser", 17839 type: "double", 17840 applyScrubbing: { 17841 key: "manual" 17842 }, 17843 isInOtel: !1, 17844 visibility: "public", 17845 example: 1554.5814, 17846 deprecation: { 17847 replacement: "browser.web_vital.ttfb.request_time", 17848 reason: "This attribute is being deprecated in favor of browser.web_vital.ttfb.request_time" 17849 }, 17850 aliases: [ 17851 "browser.web_vital.ttfb.request_time" 17852 ], 17853 changelog: [ 17854 { 17855 version: "0.5.0", 17856 prs: [ 17857 235 17858 ] 17859 } 17860 ] 17861 }, 17862 type: { 17863 brief: "More granular type of the operation happening.", 17864 type: "string", 17865 applyScrubbing: { 17866 key: "manual" 17867 }, 17868 isInOtel: !1, 17869 visibility: "public", 17870 example: "fetch", 17871 changelog: [ 17872 { 17873 version: "0.0.0" 17874 } 17875 ] 17876 }, 17877 "ui.component_name": { 17878 brief: "The name of the associated component.", 17879 type: "string", 17880 applyScrubbing: { 17881 key: "manual" 17882 }, 17883 isInOtel: !1, 17884 visibility: "public", 17885 example: "HomeButton", 17886 changelog: [ 17887 { 17888 version: "0.1.0", 17889 prs: [ 17890 127 17891 ] 17892 }, 17893 { 17894 version: "0.0.0" 17895 } 17896 ] 17897 }, 17898 "ui.contributes_to_ttfd": { 17899 brief: "Whether the span execution contributed to the TTFD (time to fully drawn) metric.", 17900 type: "boolean", 17901 applyScrubbing: { 17902 key: "manual" 17903 }, 17904 isInOtel: !1, 17905 visibility: "public", 17906 example: !0, 17907 changelog: [ 17908 { 17909 version: "0.0.0" 17910 } 17911 ] 17912 }, 17913 "ui.contributes_to_ttid": { 17914 brief: "Whether the span execution contributed to the TTID (time to initial display) metric.", 17915 type: "boolean", 17916 applyScrubbing: { 17917 key: "manual" 17918 }, 17919 isInOtel: !1, 17920 visibility: "public", 17921 example: !0, 17922 changelog: [ 17923 { 17924 version: "0.0.0" 17925 } 17926 ] 17927 }, 17928 "ui.element.height": { 17929 brief: "The height of the UI element (for Html in pixels)", 17930 type: "integer", 17931 applyScrubbing: { 17932 key: "manual" 17933 }, 17934 isInOtel: !1, 17935 visibility: "public", 17936 example: 256, 17937 changelog: [ 17938 { 17939 version: "0.5.0", 17940 prs: [ 17941 284 17942 ], 17943 description: "Added ui.element.height attribute" 17944 } 17945 ] 17946 }, 17947 "ui.element.id": { 17948 brief: "The id of the UI element", 17949 type: "string", 17950 applyScrubbing: { 17951 key: "manual" 17952 }, 17953 isInOtel: !1, 17954 visibility: "public", 17955 example: "btn-login", 17956 changelog: [ 17957 { 17958 version: "0.5.0", 17959 prs: [ 17960 284 17961 ], 17962 description: "Added ui.element.id attribute" 17963 } 17964 ] 17965 }, 17966 "ui.element.identifier": { 17967 brief: "The identifier used to measure the UI element timing", 17968 type: "string", 17969 applyScrubbing: { 17970 key: "manual" 17971 }, 17972 isInOtel: !1, 17973 visibility: "public", 17974 example: "heroImage", 17975 changelog: [ 17976 { 17977 version: "0.5.0", 17978 prs: [ 17979 284 17980 ],
17981 description: "Added ui.element.identifier attribute" 17982 } 17983 ] 17984 }, 17985 "ui.element.load_time": { 17986 brief: "The loading time of a UI element (from time origin to finished loading)", 17987 type: "double", 17988 applyScrubbing: { 17989 key: "manual" 17990 }, 17991 isInOtel: !1, 17992 visibility: "public", 17993 example: 998.2234, 17994 changelog: [ 17995 { 17996 version: "0.5.0", 17997 prs: [ 17998 284 17999 ], 18000 description: "Added ui.element.load_time attribute" 18001 } 18002 ] 18003 }, 18004 "ui.element.paint_type": { 18005 brief: "The type of element paint. Can either be 'image-paint' or 'text-paint'", 18006 type: "string", 18007 applyScrubbing: { 18008 key: "manual" 18009 }, 18010 isInOtel: !1, 18011 visibility: "public", 18012 example: "image-paint", 18013 changelog: [ 18014 { 18015 version: "0.5.0", 18016 prs: [ 18017 284 18018 ], 18019 description: "Added ui.element.paint_type attribute" 18020 } 18021 ] 18022 }, 18023 "ui.element.render_time": { 18024 brief: "The rendering time of the UI element (from time origin to finished rendering)", 18025 type: "double", 18026 applyScrubbing: { 18027 key: "manual" 18028 }, 18029 isInOtel: !1, 18030 visibility: "public", 18031 example: 1023.1124, 18032 changelog: [ 18033 { 18034 version: "0.5.0", 18035 prs: [ 18036 284 18037 ], 18038 description: "Added ui.element.render_time attribute" 18039 } 18040 ] 18041 }, 18042 "ui.element.type": { 18043 brief: "type of the UI element", 18044 type: "string", 18045 applyScrubbing: { 18046 key: "manual" 18047 }, 18048 isInOtel: !1, 18049 visibility: "public", 18050 example: "img", 18051 changelog: [ 18052 { 18053 version: "0.5.0", 18054 prs: [ 18055 284 18056 ], 18057 description: "Added ui.element.type attribute" 18058 } 18059 ] 18060 }, 18061 "ui.element.url": { 18062 brief: "The URL of the UI element (e.g. an img src)", 18063 type: "string", 18064 applyScrubbing: { 18065 key: "auto" 18066 }, 18067 isInOtel: !1, 18068 visibility: "public", 18069 example: "https://assets.myapp.com/hero.png", 18070 changelog: [ 18071 { 18072 version: "0.5.0", 18073 prs: [ 18074 284 18075 ], 18076 description: "Added ui.element.url attribute" 18077 } 18078 ] 18079 }, 18080 "ui.element.width": { 18081 brief: "The width of the UI element (for HTML in pixels)", 18082 type: "integer", 18083 applyScrubbing: { 18084 key: "manual" 18085 }, 18086 isInOtel: !1, 18087 visibility: "public", 18088 example: 512, 18089 changelog: [ 18090 { 18091 version: "0.5.0", 18092 prs: [ 18093 284 18094 ], 18095 description: "Added ui.element.width attribute" 18096 } 18097 ] 18098 }, 18099 url: { 18100 brief: "The URL of the resource that was fetched.", 18101 type: "string", 18102 applyScrubbing: { 18103 key: "auto" 18104 }, 18105 isInOtel: !1, 18106 visibility: "public", 18107 example: "https://example.com/test?foo=bar#buzz", 18108 deprecation: { 18109 replacement: "url.full" 18110 }, 18111 aliases: [ 18112 "url.full", 18113 "http.url" 18114 ], 18115 changelog: [ 18116 { 18117 version: "0.1.0", 18118 prs: [ 18119 61 18120 ] 18121 }, 18122 { 18123 version: "0.0.0" 18124 } 18125 ] 18126 }, 18127 "url.domain": { 18128 brief: "Server domain name if available without reverse DNS lookup; otherwise, IP address or Unix domain socket name.", 18129 type: "string", 18130 applyScrubbing: { 18131 key: "manual" 18132 }, 18133 isInOtel: !0, 18134 visibility: "public", 18135 example: "example.com", 18136 changelog: [ 18137 { 18138 version: "0.1.0", 18139 prs: [ 18140 127 18141 ] 18142 }, 18143 { 18144 version: "0.0.0" 18145 } 18146 ] 18147 }, 18148 "url.fragment": { 18149 brief: "The fragments present in the URI. Note that this does not contain the leading # character, while the `http.fragment` attribute does.", 18150 type: "string", 18151 applyScrubbing: { 18152 key: "auto" 18153 }, 18154 isInOtel: !0, 18155 visibility: "public", 18156 example: "details", 18157 changelog: [ 18158 { 18159 version: "0.0.0" 18160 } 18161 ] 18162 }, 18163 "url.full": { 18164 brief: "The URL of the resource that was fetched.", 18165 type: "string", 18166 applyScrubbing: { 18167 key: "auto" 18168 }, 18169 isInOtel: !0, 18170 visibility: "public", 18171 example: "https://example.com/test?foo=bar#buzz", 18172 aliases: [ 18173 "http.url", 18174 "url" 18175 ], 18176 changelog: [ 18177 { 18178 version: "0.1.0", 18179 prs: [ 18180 108 18181 ] 18182 }, 18183 { 18184 version: "0.0.0" 18185 } 18186 ] 18187 }, 18188 "url.path": { 18189 brief: "The URI path component.", 18190 type: "string", 18191 applyScrubbing: { 18192 key: "auto" 18193 }, 18194 isInOtel: !0, 18195 visibility: "public", 18196 example: "/foo", 18197 changelog: [ 18198 { 18199 version: "0.0.0" 18200 } 18201 ] 18202 }, 18203 "url.path.parameter.<key>": { 18204 brief: "Decoded parameters extracted from a URL path. Usually added by client-side routing frameworks like vue-router.", 18205 type: "string", 18206 applyScrubbing: { 18207 key: "auto" 18208 }, 18209 isInOtel: !1, 18210 visibility: "public", 18211 hasDynamicSuffix: !0, 18212 example: "url.path.parameter.id='123'", 18213 aliases: [ 18214 "params.<key>"
18215 ], 18216 changelog: [ 18217 { 18218 version: "0.1.0", 18219 prs: [ 18220 103 18221 ] 18222 } 18223 ] 18224 }, 18225 "url.port": { 18226 brief: "Server port number.", 18227 type: "integer", 18228 applyScrubbing: { 18229 key: "manual" 18230 }, 18231 isInOtel: !0, 18232 visibility: "public", 18233 example: 1337, 18234 changelog: [ 18235 { 18236 version: "0.4.0", 18237 prs: [ 18238 228 18239 ] 18240 }, 18241 { 18242 version: "0.0.0" 18243 } 18244 ] 18245 }, 18246 "url.query": { 18247 brief: "The query string present in the URL. Note that this does not contain the leading ? character, while the `http.query` attribute does.", 18248 type: "string", 18249 applyScrubbing: { 18250 key: "auto", 18251 reason: "Query string values can contain sensitive information. Clients should attempt to scrub parameters that might contain sensitive information." 18252 }, 18253 isInOtel: !0, 18254 visibility: "public", 18255 example: "foo=bar&bar=baz", 18256 changelog: [ 18257 { 18258 version: "0.0.0" 18259 } 18260 ] 18261 }, 18262 "url.same_origin": { 18263 brief: "Indicates that a URL has the same origin as the current page's origin in the browser.", 18264 type: "boolean", 18265 applyScrubbing: { 18266 key: "manual" 18267 }, 18268 isInOtel: !1, 18269 visibility: "public", 18270 example: !0, 18271 deprecation: { 18272 replacement: "http.request.same_origin",
18273 reason: "This attribute is being deprecated in favor of http.request.same_origin." 18274 }, 18275 aliases: [ 18276 "http.request.same_origin" 18277 ], 18278 changelog: [ 18279 { 18280 version: "0.16.0", 18281 prs: [ 18282 456 18283 ], 18284 description: "Added url.same_origin attribute, deprecated in favor of http.request.same_origin" 18285 } 18286 ] 18287 }, 18288 "url.scheme": { 18289 brief: "The URI scheme component identifying the used protocol.", 18290 type: "string", 18291 applyScrubbing: { 18292 key: "manual" 18293 }, 18294 isInOtel: !0, 18295 visibility: "public", 18296 example: "https", 18297 aliases: [ 18298 "http.scheme" 18299 ], 18300 changelog: [ 18301 { 18302 version: "0.1.0", 18303 prs: [ 18304 127 18305 ] 18306 }, 18307 { 18308 version: "0.0.0" 18309 } 18310 ] 18311 }, 18312 "url.template": { 18313 brief: "The low-cardinality template of an absolute path reference.", 18314 type: "string", 18315 applyScrubbing: { 18316 key: "manual" 18317 }, 18318 isInOtel: !0, 18319 visibility: "public", 18320 example: "/users/:id", 18321 aliases: [ 18322 "http.route" 18323 ], 18324 changelog: [ 18325 { 18326 version: "0.1.0", 18327 prs: [ 18328 127 18329 ] 18330 }, 18331 { 18332 version: "0.0.0" 18333 } 18334 ] 18335 }, 18336 "user_agent.original": { 18337 brief: "Value of the HTTP User-Agent header sent by the client.", 18338 type: "string", 18339 applyScrubbing: { 18340 key: "manual" 18341 }, 18342 isInOtel: !0, 18343 visibility: "public", 18344 example: "Mozilla/5.0 (iPhone; CPU iPhone OS 14_7_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.2 Mobile/15E148 Safari/604.1", 18345 aliases: [ 18346 "http.user_agent" 18347 ], 18348 changelog: [ 18349 { 18350 version: "0.1.0", 18351 prs: [ 18352 127 18353 ] 18354 }, 18355 { 18356 version: "0.0.0" 18357 } 18358 ] 18359 }, 18360 "user.email": { 18361 brief: "User email address.", 18362 type: "string", 18363 applyScrubbing: { 18364 key: "auto" 18365 }, 18366 isInOtel: !0, 18367 visibility: "public", 18368 example: "[email protected]", 18369 aliases: [ 18370 "sentry.user.email" 18371 ], 18372 changelog: [ 18373 { 18374 version: "0.0.0" 18375 } 18376 ] 18377 }, 18378 "user.full_name": { 18379 brief: "User's full name.", 18380 type: "string", 18381 applyScrubbing: { 18382 key: "auto" 18383 }, 18384 isInOtel: !0, 18385 visibility: "public", 18386 example: "John Smith", 18387 changelog: [ 18388 { 18389 version: "0.0.0" 18390 } 18391 ] 18392 }, 18393 "user.geo.city": { 18394 brief: "Human readable city name.", 18395 type: "string", 18396 applyScrubbing: { 18397 key: "manual" 18398 }, 18399 isInOtel: !1, 18400 visibility: "public", 18401 example: "Toronto", 18402 aliases: [ 18403 "sentry.user.geo.city" 18404 ], 18405 changelog: [ 18406 { 18407 version: "0.0.0" 18408 } 18409 ] 18410 }, 18411 "user.geo.country_code": { 18412 brief: "Two-letter country code (ISO 3166-1 alpha-2).", 18413 type: "string", 18414 applyScrubbing: { 18415 key: "manual" 18416 }, 18417 isInOtel: !1, 18418 visibility: "public", 18419 example: "CA", 18420 aliases: [ 18421 "sentry.user.geo.country_code" 18422 ], 18423 changelog: [ 18424 { 18425 version: "0.0.0" 18426 } 18427 ] 18428 }, 18429 "user.geo.region": { 18430 brief: "Human readable region name or code.", 18431 type: "string", 18432 applyScrubbing: { 18433 key: "manual" 18434 }, 18435 isInOtel: !1, 18436 visibility: "public", 18437 example: "Canada", 18438 aliases: [ 18439 "sentry.user.geo.region" 18440 ], 18441 changelog: [ 18442 { 18443 version: "0.0.0" 18444 } 18445 ] 18446 }, 18447 "user.geo.subdivision": { 18448 brief: "Human readable subdivision name.", 18449 type: "string", 18450 applyScrubbing: { 18451 key: "manual" 18452 }, 18453 isInOtel: !1, 18454 visibility: "public", 18455 example: "Ontario", 18456 aliases: [ 18457 "sentry.user.geo.subdivision" 18458 ], 18459 changelog: [ 18460 { 18461 version: "0.0.0" 18462 } 18463 ] 18464 }, 18465 "user.hash": { 18466 brief: "Unique user hash to correlate information for a user in anonymized form.", 18467 type: "string", 18468 applyScrubbing: { 18469 key: "auto" 18470 }, 18471 isInOtel: !0, 18472 visibility: "public", 18473 example: "8ae4c2993e0f4f3b8b2d1b1f3b5e8f4d", 18474 changelog: [ 18475 { 18476 version: "0.0.0" 18477 } 18478 ] 18479 }, 18480 "user.id": { 18481 brief: "Unique identifier of the user.", 18482 type: "string", 18483 applyScrubbing: { 18484 key: "auto" 18485 }, 18486 isInOtel: !0, 18487 visibility: "public", 18488 example: "S-1-5-21-202424912787-2692429404-2351956786-1000", 18489 aliases: [ 18490 "sentry.user.id" 18491 ], 18492 changelog: [ 18493 { 18494 version: "0.0.0" 18495 } 18496 ] 18497 }, 18498 "user.ip_address": { 18499 brief: "The IP address of the user.", 18500 type: "string", 18501 applyScrubbing: { 18502 key: "auto" 18503 }, 18504 isInOtel: !1, 18505 visibility: "public", 18506 example: "192.168.1.1", 18507 aliases: [ 18508 "sentry.user.ip" 18509 ], 18510 changelog: [ 18511 { 18512 version: "0.1.0", 18513 prs: [ 18514 75 18515 ] 18516 } 18517 ] 18518 }, 18519 "user.name": { 18520 brief: "Short name or login/username of the user.", 18521 type: "string", 18522 applyScrubbing: { 18523 key: "auto" 18524 }, 18525 isInOtel: !0, 18526 visibility: "public", 18527 example: "j.smith", 18528 aliases: [ 18529 "sentry.user.username" 18530 ], 18531 changelog: [ 18532 { 18533 version: "0.0.0" 18534 } 18535 ] 18536 }, 18537 "user.roles": { 18538 brief: "Array of user roles at the time of the event.", 18539 type: "string[]", 18540 applyScrubbing: { 18541 key: "auto" 18542 }, 18543 isInOtel: !0, 18544 visibility: "public", 18545 example: [ 18546 "admin", 18547 "editor" 18548 ], 18549 changelog: [ 18550 { 18551 version: "0.0.0" 18552 } 18553 ] 18554 }, 18555 "vercel.branch": { 18556 brief: "Git branch name for Vercel project", 18557 type: "string", 18558 applyScrubbing: { 18559 key: "manual" 18560 }, 18561 isInOtel: !1, 18562 visibility: "public", 18563 example: "main", 18564 changelog: [ 18565 { 18566 version: "0.2.0", 18567 prs: [ 18568 163 18569 ] 18570 } 18571 ] 18572 }, 18573 "vercel.build_id": { 18574 brief: "Identifier for the Vercel build (only present on build logs)", 18575 type: "string", 18576 applyScrubbing: { 18577 key: "manual" 18578 }, 18579 isInOtel: !1, 18580 visibility: "public", 18581 example: "bld_cotnkcr76", 18582 changelog: [ 18583 { 18584 version: "0.2.0", 18585 prs: [ 18586 163 18587 ] 18588 } 18589 ] 18590 }, 18591 "vercel.deployment_id": { 18592 brief: "Identifier for the Vercel deployment", 18593 type: "string", 18594 applyScrubbing: { 18595 key: "manual" 18596 }, 18597 isInOtel: !1, 18598 visibility: "public", 18599 example: "dpl_233NRGRjVZX1caZrXWtz5g1TAksD", 18600 changelog: [ 18601 { 18602 version: "0.2.0", 18603 prs: [ 18604 163 18605 ] 18606 } 18607 ] 18608 },
18609 "vercel.destination": { 18610 brief: "Origin of the external content in Vercel (only on external logs)", 18611 type: "string", 18612 applyScrubbing: { 18613 key: "manual" 18614 }, 18615 isInOtel: !1, 18616 visibility: "public", 18617 example: "https://vitals.vercel-insights.com/v1", 18618 changelog: [ 18619 { 18620 version: "0.2.0", 18621 prs: [ 18622 163 18623 ] 18624 } 18625 ] 18626 }, 18627 "vercel.edge_type": { 18628 brief: "Type of edge runtime in Vercel", 18629 type: "string", 18630 applyScrubbing: { 18631 key: "manual" 18632 }, 18633 isInOtel: !1, 18634 visibility: "public", 18635 example: "edge-function", 18636 changelog: [ 18637 { 18638 version: "0.2.0", 18639 prs: [ 18640 163 18641 ] 18642 } 18643 ] 18644 }, 18645 "vercel.entrypoint": { 18646 brief: "Entrypoint for the request in Vercel", 18647 type: "string", 18648 applyScrubbing: { 18649 key: "manual" 18650 }, 18651 isInOtel: !1, 18652 visibility: "public", 18653 example: "api/index.js", 18654 changelog: [ 18655 { 18656 version: "0.2.0", 18657 prs: [ 18658 163 18659 ] 18660 } 18661 ] 18662 }, 18663 "vercel.execution_region": { 18664 brief: "Region where the request is executed", 18665 type: "string", 18666 applyScrubbing: { 18667 key: "manual" 18668 }, 18669 isInOtel: !1, 18670 visibility: "public", 18671 example: "sfo1", 18672 changelog: [ 18673 { 18674 version: "0.2.0", 18675 prs: [ 18676 163 18677 ] 18678 } 18679 ] 18680 }, 18681 "vercel.id": { 18682 brief: "Unique identifier for the log entry in Vercel", 18683 type: "string", 18684 applyScrubbing: { 18685 key: "manual" 18686 }, 18687 isInOtel: !1, 18688 visibility: "public", 18689 example: "1573817187330377061717300000", 18690 changelog: [ 18691 { 18692 version: "0.2.0", 18693 prs: [ 18694 163 18695 ] 18696 } 18697 ] 18698 }, 18699 "vercel.ja3_digest": { 18700 brief: "JA3 fingerprint digest of Vercel request", 18701 type: "string", 18702 applyScrubbing: { 18703 key: "auto" 18704 }, 18705 isInOtel: !1, 18706 visibility: "public", 18707 example: "769,47-53-5-10-49161-49162-49171-49172-50-56-19-4,0-10-11,23-24-25,0", 18708 changelog: [ 18709 { 18710 version: "0.2.0", 18711 prs: [ 18712 163 18713 ] 18714 } 18715 ] 18716 }, 18717 "vercel.ja4_digest": { 18718 brief: "JA4 fingerprint digest", 18719 type: "string", 18720 applyScrubbing: { 18721 key: "auto" 18722 }, 18723 isInOtel: !1, 18724 visibility: "public", 18725 example: "t13d1516h2_8daaf6152771_02713d6af862", 18726 changelog: [ 18727 { 18728 version: "0.2.0", 18729 prs: [ 18730 163 18731 ] 18732 } 18733 ] 18734 }, 18735 "vercel.log_type": { 18736 brief: "Vercel log output type", 18737 type: "string", 18738 applyScrubbing: { 18739 key: "manual" 18740 }, 18741 isInOtel: !1, 18742 visibility: "public", 18743 example: "stdout", 18744 changelog: [ 18745 { 18746 version: "0.2.0", 18747 prs: [ 18748 163 18749 ] 18750 } 18751 ] 18752 }, 18753 "vercel.path": { 18754 brief: "Function or dynamic path of the request in Vercel.", 18755 type: "string", 18756 applyScrubbing: { 18757 key: "manual" 18758 }, 18759 isInOtel: !1, 18760 visibility: "public", 18761 example: "/dynamic/[route].json", 18762 changelog: [ 18763 { 18764 version: "0.6.0", 18765 prs: [ 18766 349 18767 ], 18768 description: "Added vercel.path attribute" 18769 } 18770 ] 18771 }, 18772 "vercel.project_id": { 18773 brief: "Identifier for the Vercel project", 18774 type: "string", 18775 applyScrubbing: { 18776 key: "manual" 18777 }, 18778 isInOtel: !1, 18779 visibility: "public", 18780 example: "gdufoJxB6b9b1fEqr1jUtFkyavUU", 18781 changelog: [ 18782 { 18783 version: "0.2.0", 18784 prs: [ 18785 163 18786 ] 18787 } 18788 ] 18789 }, 18790 "vercel.project_name": { 18791 brief: "Name of the Vercel project", 18792 type: "string", 18793 applyScrubbing: { 18794 key: "manual" 18795 }, 18796 isInOtel: !1, 18797 visibility: "public", 18798 example: "my-app", 18799 changelog: [ 18800 { 18801 version: "0.2.0", 18802 prs: [ 18803 163 18804 ] 18805 } 18806 ] 18807 }, 18808 "vercel.proxy.cache_id": { 18809 brief: "Original request ID when request is served from cache", 18810 type: "string", 18811 applyScrubbing: { 18812 key: "manual" 18813 }, 18814 isInOtel: !1, 18815 visibility: "public",
18816 example: "pdx1::v8g4b-1744143786684-93dafbc0f70d", 18817 changelog: [ 18818 { 18819 version: "0.2.0", 18820 prs: [ 18821 163 18822 ] 18823 } 18824 ] 18825 }, 18826 "vercel.proxy.client_ip": { 18827 brief: "Client IP address", 18828 type: "string", 18829 applyScrubbing: { 18830 key: "auto" 18831 }, 18832 isInOtel: !1, 18833 visibility: "public", 18834 example: "120.75.16.101", 18835 changelog: [ 18836 { 18837 version: "0.2.0", 18838 prs: [ 18839 163 18840 ] 18841 } 18842 ] 18843 }, 18844 "vercel.proxy.host": { 18845 brief: "Hostname of the request", 18846 type: "string", 18847 applyScrubbing: { 18848 key: "manual" 18849 }, 18850 isInOtel: !1, 18851 visibility: "public", 18852 example: "test.vercel.app", 18853 changelog: [ 18854 { 18855 version: "0.2.0", 18856 prs: [ 18857 163 18858 ] 18859 } 18860 ] 18861 }, 18862 "vercel.proxy.lambda_region": { 18863 brief: "Region where lambda function executed", 18864 type: "string", 18865 applyScrubbing: { 18866 key: "manual" 18867 }, 18868 isInOtel: !1, 18869 visibility: "public", 18870 example: "sfo1", 18871 changelog: [ 18872 { 18873 version: "0.2.0", 18874 prs: [ 18875 163 18876 ] 18877 } 18878 ] 18879 }, 18880 "vercel.proxy.method": { 18881 brief: "HTTP method of the request", 18882 type: "string", 18883 applyScrubbing: { 18884 key: "manual" 18885 }, 18886 isInOtel: !1, 18887 visibility: "public", 18888 example: "GET", 18889 changelog: [ 18890 { 18891 version: "0.2.0", 18892 prs: [ 18893 163 18894 ] 18895 } 18896 ] 18897 }, 18898 "vercel.proxy.path": { 18899 brief: "Request path with query parameters", 18900 type: "string", 18901 applyScrubbing: { 18902 key: "auto" 18903 }, 18904 isInOtel: !1, 18905 visibility: "public", 18906 example: "/dynamic/some-value.json?route=some-value", 18907 changelog: [ 18908 { 18909 version: "0.2.0", 18910 prs: [ 18911 163 18912 ] 18913 } 18914 ] 18915 }, 18916 "vercel.proxy.path_type": { 18917 brief: "How the request was served based on its path and project configuration", 18918 type: "string", 18919 applyScrubbing: { 18920 key: "manual" 18921 }, 18922 isInOtel: !1, 18923 visibility: "public", 18924 example: "func", 18925 changelog: [ 18926 { 18927 version: "0.2.0", 18928 prs: [ 18929 163 18930 ] 18931 } 18932 ] 18933 }, 18934 "vercel.proxy.path_type_variant": { 18935 brief: "Variant of the path type", 18936 type: "string", 18937 applyScrubbing: { 18938 key: "manual" 18939 }, 18940 isInOtel: !1, 18941 visibility: "public", 18942 example: "api", 18943 changelog: [ 18944 { 18945 version: "0.2.0", 18946 prs: [ 18947 163 18948 ] 18949 } 18950 ] 18951 }, 18952 "vercel.proxy.referer": { 18953 brief: "Referer of the request", 18954 type: "string", 18955 applyScrubbing: { 18956 key: "auto" 18957 }, 18958 isInOtel: !1, 18959 visibility: "public", 18960 example: "*.vercel.app", 18961 changelog: [ 18962 { 18963 version: "0.2.0", 18964 prs: [ 18965 163 18966 ] 18967 } 18968 ] 18969 }, 18970 "vercel.proxy.region": { 18971 brief: "Region where the request is processed", 18972 type: "string", 18973 applyScrubbing: { 18974 key: "manual" 18975 }, 18976 isInOtel: !1, 18977 visibility: "public", 18978 example: "sfo1", 18979 changelog: [ 18980 { 18981 version: "0.2.0", 18982 prs: [ 18983 163 18984 ] 18985 } 18986 ] 18987 }, 18988 "vercel.proxy.response_byte_size": { 18989 brief: "Size of the response in bytes", 18990 type: "integer", 18991 applyScrubbing: { 18992 key: "manual" 18993 }, 18994 isInOtel: !1, 18995 visibility: "public", 18996 example: 1024, 18997 changelog: [ 18998 { 18999 version: "0.4.0", 19000 prs: [ 19001 228 19002 ] 19003 }, 19004 { 19005 version: "0.2.0", 19006 prs: [ 19007 163 19008 ] 19009 } 19010 ] 19011 }, 19012 "vercel.proxy.scheme": { 19013 brief: "Protocol of the request", 19014 type: "string", 19015 applyScrubbing: { 19016 key: "manual" 19017 }, 19018 isInOtel: !1, 19019 visibility: "public", 19020 example: "https", 19021 changelog: [ 19022 { 19023 version: "0.2.0", 19024 prs: [ 19025 163 19026 ] 19027 } 19028 ] 19029 }, 19030 "vercel.proxy.status_code": { 19031 brief: "HTTP status code of the proxy request", 19032 type: "integer", 19033 applyScrubbing: { 19034 key: "manual" 19035 }, 19036 isInOtel: !1, 19037 visibility: "public", 19038 example: 200, 19039 changelog: [ 19040 { 19041 version: "0.4.0", 19042 prs: [ 19043 228 19044 ] 19045 }, 19046 { 19047 version: "0.2.0", 19048 prs: [ 19049 163 19050 ] 19051 } 19052 ] 19053 }, 19054 "vercel.proxy.timestamp": { 19055 brief: "Unix timestamp when the proxy request was made", 19056 type: "integer", 19057 applyScrubbing: { 19058 key: "manual" 19059 }, 19060 isInOtel: !1, 19061 visibility: "public", 19062 example: 1573817250172, 19063 changelog: [ 19064 { 19065 version: "0.4.0", 19066 prs: [ 19067 228 19068 ] 19069 }, 19070 { 19071 version: "0.2.0", 19072 prs: [ 19073 163 19074 ] 19075 } 19076 ] 19077 }, 19078 "vercel.proxy.user_agent": { 19079 brief: "User agent strings of the request", 19080 type: "string[]", 19081 applyScrubbing: { 19082 key: "manual" 19083 }, 19084 isInOtel: !1, 19085 visibility: "public", 19086 example: [ 19087 "Mozilla/5.0..." 19088 ], 19089 changelog: [ 19090 { 19091 version: "0.2.0", 19092 prs: [ 19093 163 19094 ] 19095 } 19096 ] 19097 }, 19098 "vercel.proxy.vercel_cache": { 19099 brief: "Cache status sent to the browser", 19100 type: "string", 19101 applyScrubbing: { 19102 key: "manual" 19103 }, 19104 isInOtel: !1, 19105 visibility: "public", 19106 example: "REVALIDATED", 19107 changelog: [ 19108 { 19109 version: "0.2.0", 19110 prs: [ 19111 163 19112 ] 19113 } 19114 ] 19115 }, 19116 "vercel.proxy.vercel_id": { 19117 brief: "Vercel-specific identifier", 19118 type: "string", 19119 applyScrubbing: { 19120 key: "manual" 19121 }, 19122 isInOtel: !1, 19123 visibility: "public", 19124 example: "sfo1::abc123", 19125 changelog: [ 19126 { 19127 version: "0.2.0", 19128 prs: [ 19129 163 19130 ] 19131 } 19132 ] 19133 }, 19134 "vercel.proxy.waf_action": { 19135 brief: "Action taken by firewall rules", 19136 type: "string", 19137 applyScrubbing: { 19138 key: "manual" 19139 }, 19140 isInOtel: !1, 19141 visibility: "public", 19142 example: "deny", 19143 changelog: [ 19144 { 19145 version: "0.2.0", 19146 prs: [ 19147 163 19148 ] 19149 } 19150 ] 19151 }, 19152 "vercel.proxy.waf_rule_id": { 19153 brief: "ID of the firewall rule that matched", 19154 type: "string", 19155 applyScrubbing: { 19156 key: "manual" 19157 }, 19158 isInOtel: !1, 19159 visibility: "public", 19160 example: "rule_gAHz8jtSB1Gy", 19161 changelog: [ 19162 { 19163 version: "0.2.0", 19164 prs: [ 19165 163 19166 ] 19167 } 19168 ] 19169 }, 19170 "vercel.request_id": { 19171 brief: "Identifier of the Vercel request", 19172 type: "string", 19173 applyScrubbing: { 19174 key: "manual" 19175 }, 19176 isInOtel: !1, 19177 visibility: "public", 19178 example: "643af4e3-975a-4cc7-9e7a-1eda11539d90", 19179 changelog: [ 19180 { 19181 version: "0.2.0", 19182 prs: [ 19183 163 19184 ] 19185 } 19186 ] 19187 }, 19188 "vercel.source": { 19189 brief: "Origin of the Vercel log (build, edge, lambda, static, external, or firewall)", 19190 type: "string", 19191 applyScrubbing: { 19192 key: "manual" 19193 }, 19194 isInOtel: !1, 19195 visibility: "public", 19196 example: "build", 19197 changelog: [ 19198 { 19199 version: "0.2.0", 19200 prs: [ 19201 163 19202 ] 19203 } 19204 ] 19205 }, 19206 "vercel.status_code": { 19207 brief: "HTTP status code of the request (-1 means no response returned and the lambda crashed)", 19208 type: "integer", 19209 applyScrubbing: { 19210 key: "manual" 19211 }, 19212 isInOtel: !1, 19213 visibility: "public", 19214 example: 200, 19215 changelog: [ 19216 { 19217 version: "0.4.0", 19218 prs: [ 19219 228 19220 ] 19221 }, 19222 { 19223 version: "0.2.0", 19224 prs: [ 19225 163 19226 ] 19227 } 19228 ] 19229 } 19230}; 19231; 19232var __TURBOPACK__imported__module__519988__5 = __TURBOPACK__imported__module__519988__; 19233; 19234; 19235const DEFAULT_BASE_URL = "thismessage:/"; 19236function isURLObjectRelative(url) { 19237 return "isRelative" in url; 19238} 19239function parseStringToURLObject(url, urlBase) { 19240 const isRelative = url.indexOf("://") <= 0 && url.indexOf("//") !== 0; 19241 const base = urlBase !== null && urlBase !== void 0 ? urlBase : isRelative ? DEFAULT_BASE_URL : void 0; 19242 try { 19243 if ("canParse" in URL && !URL.canParse(url, base)) { 19244 return void 0; 19245 } 19246 const fullUrlObject = new URL(url, base); 19247 if (isRelative) { 19248 return { 19249 isRelative, 19250 pathname: fullUrlObject.pathname, 19251 search: fullUrlObject.search, 19252 hash: fullUrlObject.hash 19253 }; 19254 } 19255 return fullUrlObject; 19256 } catch (unused) {} 19257 return void 0; 19258} 19259function getSanitizedUrlStringFromUrlObject(url) { 19260 if (isURLObjectRelative(url)) { 19261 return url.pathname; 19262 } 19263 const newUrl = new URL(url); 19264 newUrl.search = ""; 19265 newUrl.hash = ""; 19266 if ([ 19267 "80", 19268 "443" 19269 ].includes(newUrl.port)) { 19270 newUrl.port = ""; 19271 } 19272 if (newUrl.password) { 19273 newUrl.password = "%filtered%"; 19274 } 19275 if (newUrl.username) { 19276 newUrl.username = "%filtered%"; 19277 } 19278 return newUrl.toString(); 19279} 19280function getHttpSpanNameFromUrlObject(urlObject, kind, request, routeName) { 19281 var _ref; 19282 var _request_method; 19283 const method = (_ref = request === null || request === void 0 ? void 0 : (_request_method = request.method) === null || _request_method === void 0 ? void 0 : _request_method.toUpperCase()) !== null && _ref !== void 0 ? _ref : "GET"; 19284 const route = routeName ? routeName : urlObject ? kind === "client" ? getSanitizedUrlStringFromUrlObject(urlObject) : urlObject.pathname : "/"; 19285 return "".concat(method, " ").concat(route); 19286}
19287function getHttpSpanDetailsFromUrlObject(urlObject, kind, spanOrigin, request, routeName) { 19288 const attributes = { 19289 [__TURBOPACK__imported__module__519988__5["SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN"]]: spanOrigin, 19290 [__TURBOPACK__imported__module__519988__5["SEMANTIC_ATTRIBUTE_SENTRY_SOURCE"]]: "url" 19291 }; 19292 if (routeName) { 19293 attributes[kind === "server" ? "http.route" : "url.template"] = routeName; 19294 attributes[__TURBOPACK__imported__module__519988__5["SEMANTIC_ATTRIBUTE_SENTRY_SOURCE"]] = "route"; 19295 } 19296 if (request === null || request === void 0 ? void 0 : request.method) { 19297 attributes[__TURBOPACK__imported__module__519988__5["SEMANTIC_ATTRIBUTE_HTTP_REQUEST_METHOD"]] = request.method.toUpperCase(); 19298 } 19299 if (urlObject) { 19300 if (urlObject.search) { 19301 attributes["url.query"] = urlObject.search; 19302 } 19303 if (urlObject.hash) { 19304 attributes["url.fragment"] = urlObject.hash; 19305 } 19306 if (urlObject.pathname) { 19307 attributes["url.path"] = urlObject.pathname; 19308 if (urlObject.pathname === "/") { 19309 attributes[__TURBOPACK__imported__module__519988__5["SEMANTIC_ATTRIBUTE_SENTRY_SOURCE"]] = "route"; 19310 } 19311 } 19312 if (!isURLObjectRelative(urlObject)) { 19313 attributes[Yu] = urlObject.href; 19314 if (urlObject.port) { 19315 attributes["url.port"] = urlObject.port; 19316 } 19317 if (urlObject.protocol) { 19318 attributes["url.scheme"] = urlObject.protocol; 19319 } 19320 if (urlObject.hostname) { 19321 attributes[kind === "server" ? "server.address" : "url.domain"] = urlObject.hostname; 19322 } 19323 } 19324 } 19325 return [ 19326 getHttpSpanNameFromUrlObject(urlObject, kind, request, routeName), 19327 attributes 19328 ]; 19329} 19330function parseUrl(url) { 19331 if (!url) { 19332 return {}; 19333 } 19334 const match = url.match(/^(([^:/?#]+):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/); 19335 if (!match) { 19336 return {}; 19337 } 19338 const query = match[6] || ""; 19339 const fragment = match[8] || ""; 19340 return { 19341 host: match[4], 19342 path: match[5], 19343 protocol: match[2], 19344 search: query, 19345 hash: fragment, 19346 relative: match[5] + query + fragment 19347 }; 19348} 19349function stripUrlQueryAndFragment(urlPath) { 19350 return urlPath.split(/[?#]/, 1)[0]; 19351} 19352function getSanitizedUrlString(url) { 19353 const { protocol, host, path } = url; 19354 const filteredHost = (host === null || host === void 0 ? void 0 : host.replace(/^.*@/, "[filtered]:[filtered]@").replace(/(:80)$/, "").replace(/(:443)$/, "")) || ""; 19355 return "".concat(protocol ? "".concat(protocol, "://") : "").concat(filteredHost).concat(path); 19356} 19357function stripDataUrlContent(url) { 19358 let includeDataPrefix = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : true; 19359 if (url.startsWith("data:")) { 19360 const match = url.match(/^data:([^;,]+)/); 19361 const mimeType = match ? match[1] : "text/plain"; 19362 const isBase64 = url.includes(";base64,"); 19363 const dataStart = url.indexOf(","); 19364 let dataPrefix = ""; 19365 if (includeDataPrefix && dataStart !== -1) { 19366 const data = url.slice(dataStart + 1); 19367 dataPrefix = data.length > 10 ? "".concat(data.slice(0, 10), "... [truncated]") : data; 19368 } 19369 return "data:".concat(mimeType).concat(isBase64 ? ",base64" : "").concat(dataPrefix ? ",".concat(dataPrefix) : ""); 19370 } 19371 return url; 19372} 19373; 19374// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/tracing/errors.js [app-client] (ecmascript) 19375; 19376var __TURBOPACK__imported__module__901020__7 = __TURBOPACK__imported__module__901020__; 19377// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/instrument/globalError.js [app-client] (ecmascript) 19378; 19379var __TURBOPACK__imported__module__225304__3 = __TURBOPACK__imported__module__225304__; 19380// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/instrument/handlers.js [app-client] (ecmascript) 19381; 19382var __TURBOPACK__imported__module__901020__8 = __TURBOPACK__imported__module__901020__; 19383var __TURBOPACK__imported__module__272598__8 = __TURBOPACK__imported__module__272598__; 19384var __TURBOPACK__imported__module__936032__ = __turbopack_context__.i(936032); 19385; 19386; 19387; 19388const handlers = {}; 19389const instrumented = {}; 19390function addHandler(type, handler) { 19391 handlers[type] = handlers[type] || []; 19392 handlers[type].push(handler); 19393 return ()=>{ 19394 const typeHandlers = handlers[type]; 19395 if (typeHandlers) { 19396 const index = typeHandlers.indexOf(handler); 19397 if (index !== -1) { 19398 typeHandlers.splice(index, 1); 19399 } 19400 } 19401 }; 19402} 19403function resetInstrumentationHandlers() {
19404 Object.keys(handlers).forEach((key)=>{ 19405 handlers[key] = void 0; 19406 }); 19407} 19408function maybeInstrument(type, instrumentFn) { 19409 if (!instrumented[type]) { 19410 instrumented[type] = true; 19411 try { 19412 instrumentFn(); 19413 } catch (e) { 19414 __TURBOPACK__imported__module__901020__8["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__8["debug"].error("Error while instrumenting ".concat(type), e); 19415 } 19416 } 19417} 19418function triggerHandlers(type, data) { 19419 const typeHandlers = type && handlers[type]; 19420 if (!typeHandlers) { 19421 return; 19422 } 19423 for (const handler of typeHandlers){ 19424 try { 19425 handler(data); 19426 } catch (e) { 19427 __TURBOPACK__imported__module__901020__8["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__8["debug"].error("Error while triggering instrumentation handler.\nType: ".concat(type, "\nName: ").concat((0, __TURBOPACK__imported__module__936032__["getFunctionName"])(handler), "\nError:"), e); 19428 } 19429 } 19430} 19431; 19432; 19433; 19434let _oldOnErrorHandler = null; 19435function addGlobalErrorInstrumentationHandler(handler) { 19436 const type = "error"; 19437 addHandler(type, handler); 19438 maybeInstrument(type, instrumentError); 19439} 19440function instrumentError() { 19441 _oldOnErrorHandler = __TURBOPACK__imported__module__225304__3["GLOBAL_OBJ"].onerror; 19442 __TURBOPACK__imported__module__225304__3["GLOBAL_OBJ"].onerror = function(msg, url, line, column, error) { 19443 const handlerData = { 19444 column, 19445 error, 19446 line, 19447 msg, 19448 url 19449 }; 19450 triggerHandlers("error", handlerData); 19451 if (_oldOnErrorHandler) { 19452 return _oldOnErrorHandler.apply(this, arguments); 19453 } 19454 return false; 19455 }; 19456 __TURBOPACK__imported__module__225304__3["GLOBAL_OBJ"].onerror.__SENTRY_INSTRUMENTED__ = true; 19457} 19458; 19459// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/instrument/globalUnhandledRejection.js [app-client] (ecmascript) 19460; 19461var __TURBOPACK__imported__module__225304__4 = __TURBOPACK__imported__module__225304__; 19462; 19463; 19464let _oldOnUnhandledRejectionHandler = null; 19465function addGlobalUnhandledRejectionInstrumentationHandler(handler) { 19466 const type = "unhandledrejection"; 19467 addHandler(type, handler); 19468 maybeInstrument(type, instrumentUnhandledRejection); 19469} 19470function instrumentUnhandledRejection() { 19471 _oldOnUnhandledRejectionHandler = __TURBOPACK__imported__module__225304__4["GLOBAL_OBJ"].onunhandledrejection; 19472 __TURBOPACK__imported__module__225304__4["GLOBAL_OBJ"].onunhandledrejection = function(e) { 19473 const handlerData = e; 19474 triggerHandlers("unhandledrejection", handlerData); 19475 if (_oldOnUnhandledRejectionHandler) { 19476 return _oldOnUnhandledRejectionHandler.apply(this, arguments); 19477 } 19478 return true; 19479 }; 19480 __TURBOPACK__imported__module__225304__4["GLOBAL_OBJ"].onunhandledrejection.__SENTRY_INSTRUMENTED__ = true; 19481} 19482; 19483var __TURBOPACK__imported__module__272598__9 = __TURBOPACK__imported__module__272598__; 19484var __TURBOPACK__imported__module__304661__6 = __TURBOPACK__imported__module__304661__; 19485var __TURBOPACK__imported__module__776710__2 = __TURBOPACK__imported__module__776710__; 19486; 19487; 19488; 19489; 19490; 19491; 19492let errorsInstrumented = false; 19493function registerSpanErrorInstrumentation() { 19494 if (errorsInstrumented) { 19495 return; 19496 } 19497 function errorCallback() { 19498 const activeSpan = (0, __TURBOPACK__imported__module__304661__6["getActiveSpan"])(); 19499 const rootSpan = activeSpan && (0, __TURBOPACK__imported__module__304661__6["getRootSpan"])(activeSpan); 19500 if (rootSpan) { 19501 const message = "internal_error"; 19502 __TURBOPACK__imported__module__901020__7["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__9["debug"].log("[Tracing] Root span: ".concat(message, " -> Global error occurred")); 19503 rootSpan.setStatus({ 19504 code: __TURBOPACK__imported__module__776710__2["SPAN_STATUS_ERROR"], 19505 message 19506 }); 19507 } 19508 } 19509 errorsInstrumented = true; 19510 addGlobalErrorInstrumentationHandler(errorCallback); 19511 addGlobalUnhandledRejectionInstrumentationHandler(errorCallback); 19512} 19513; 19514var __TURBOPACK__imported__module__225304__5 = __TURBOPACK__imported__module__225304__; 19515var __TURBOPACK__imported__module__250804__4 = __TURBOPACK__imported__module__250804__; 19516var __TURBOPACK__imported__module__10008__3 = __TURBOPACK__imported__module__10008__; 19517var __TURBOPACK__imported__module__373382__2 = __TURBOPACK__imported__module__373382__; 19518var __TURBOPACK__imported__module__132584__1 = __TURBOPACK__imported__module__132584__; 19519var __TURBOPACK__imported__module__304661__7 = __TURBOPACK__imported__module__304661__; 19520var __TURBOPACK__imported__module__519988__6 = __TURBOPACK__imported__module__519988__; 19521var __TURBOPACK__imported__module__473753__3 = __TURBOPACK__imported__module__473753__; 19522var __TURBOPACK__imported__module__951497__2 = __TURBOPACK__imported__module__951497__; 19523// MERGED MODULE: [project]/node_modules/@sentry/browser-utils/build/esm/instrument/history.js [app-client] (ecmascript) 19524; 19525// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/utils/supports.js [app-client] (ecmascript) 19526; 19527var __TURBOPACK__imported__module__901020__9 = __TURBOPACK__imported__module__901020__; 19528var __TURBOPACK__imported__module__272598__10 = __TURBOPACK__imported__module__272598__; 19529var __TURBOPACK__imported__module__225304__6 = __TURBOPACK__imported__module__225304__; 19530; 19531; 19532; 19533const WINDOW2 = __TURBOPACK__imported__module__225304__6["GLOBAL_OBJ"]; 19534function supportsErrorEvent() { 19535 try { 19536 new ErrorEvent(""); 19537 return true; 19538 } catch (unused) { 19539 return false;
19540 } 19541} 19542function supportsDOMError() { 19543 try { 19544 new DOMError(""); 19545 return true; 19546 } catch (unused) { 19547 return false; 19548 } 19549} 19550function supportsDOMException() { 19551 try { 19552 new DOMException(""); 19553 return true; 19554 } catch (unused) { 19555 return false; 19556 } 19557} 19558function supportsHistory() { 19559 return "history" in WINDOW2 && !!WINDOW2.history; 19560} 19561const supportsFetch = _isFetchSupported; 19562function _isFetchSupported() { 19563 if (!("fetch" in WINDOW2)) { 19564 return false; 19565 } 19566 try { 19567 new Headers(); 19568 new Request("data:,"); 19569 new Response(); 19570 return true; 19571 } catch (unused) { 19572 return false; 19573 } 19574} 19575function isNativeFunction(func) { 19576 return func && /^function\s+\w+\(\)\s+\{\s+\[native code\]\s+\}$/.test(func.toString()); 19577} 19578function supportsNativeFetch() { 19579 if (typeof EdgeRuntime === "string") { 19580 return true; 19581 } 19582 if (!_isFetchSupported()) { 19583 return false; 19584 } 19585 if (isNativeFunction(WINDOW2.fetch)) { 19586 return true; 19587 } 19588 let result = false;
19589 const doc = WINDOW2.document; 19590 if (doc && typeof doc.createElement === "function") { 19591 try { 19592 var _sandbox_contentWindow; 19593 const sandbox = doc.createElement("iframe"); 19594 sandbox.hidden = true; 19595 doc.head.appendChild(sandbox); 19596 if ((_sandbox_contentWindow = sandbox.contentWindow) === null || _sandbox_contentWindow === void 0 ? void 0 : _sandbox_contentWindow.fetch) { 19597 result = isNativeFunction(sandbox.contentWindow.fetch); 19598 } 19599 doc.head.removeChild(sandbox); 19600 } catch (err) { 19601 __TURBOPACK__imported__module__901020__9["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__10["debug"].warn("Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ", err); 19602 } 19603 } 19604 return result; 19605} 19606function supportsReportingObserver() { 19607 return "ReportingObserver" in WINDOW2; 19608} 19609function supportsReferrerPolicy() { 19610 if (!_isFetchSupported()) { 19611 return false; 19612 } 19613 try { 19614 new Request("_", { 19615 referrerPolicy: "origin" 19616 }); 19617 return true; 19618 } catch (unused) { 19619 return false; 19620 } 19621} 19622; 19623var __TURBOPACK__imported__module__951497__3 = __TURBOPACK__imported__module__951497__; 19624// MERGED MODULE: [project]/node_modules/@sentry/browser-utils/build/esm/types.js [app-client] (ecmascript) 19625; 19626var __TURBOPACK__imported__module__225304__7 = __TURBOPACK__imported__module__225304__; 19627; 19628const WINDOW3 = __TURBOPACK__imported__module__225304__7["GLOBAL_OBJ"]; 19629; 19630; 19631; 19632let lastHref; 19633function addHistoryInstrumentationHandler(handler) { 19634 const type = "history"; 19635 addHandler(type, handler); 19636 maybeInstrument(type, instrumentHistory); 19637} 19638function instrumentHistory() { 19639 WINDOW3.addEventListener("popstate", ()=>{ 19640 const to = WINDOW3.location.href; 19641 const from = lastHref; 19642 lastHref = to; 19643 if (from === to) { 19644 return; 19645 } 19646 const handlerData = { 19647 from, 19648 to 19649 }; 19650 triggerHandlers("history", handlerData); 19651 }); 19652 if (!supportsHistory()) { 19653 return; 19654 } 19655 function historyReplacementFunction(originalHistoryFunction) { 19656 return function() { 19657 for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++){ 19658 args[_key] = arguments[_key]; 19659 } 19660 const url = args.length > 2 ? args[2] : void 0; 19661 if (url) { 19662 const from = lastHref; 19663 const to = getAbsoluteUrl(String(url)); 19664 lastHref = to; 19665 if (from === to) { 19666 return originalHistoryFunction.apply(this, args); 19667 } 19668 const handlerData = { 19669 from, 19670 to 19671 }; 19672 triggerHandlers("history", handlerData); 19673 } 19674 return originalHistoryFunction.apply(this, args); 19675 }; 19676 } 19677 (0, __TURBOPACK__imported__module__951497__3["fill"])(WINDOW3.history, "pushState", historyReplacementFunction); 19678 (0, __TURBOPACK__imported__module__951497__3["fill"])(WINDOW3.history, "replaceState", historyReplacementFunction); 19679} 19680function getAbsoluteUrl(urlOrPath) { 19681 try { 19682 const url = new URL(urlOrPath, WINDOW3.location.origin); 19683 return url.toString(); 19684 } catch (unused) { 19685 return urlOrPath; 19686 } 19687} 19688; 19689// MERGED MODULE: [project]/node_modules/@sentry/browser-utils/build/esm/metrics/browserMetrics.js [app-client] (ecmascript) 19690; 19691var __TURBOPACK__imported__module__605394__4 = __TURBOPACK__imported__module__605394__; 19692var __TURBOPACK__imported__module__304661__8 = __TURBOPACK__imported__module__304661__; 19693var __TURBOPACK__imported__module__821593__1 = __TURBOPACK__imported__module__821593__; 19694var __TURBOPACK__imported__module__272598__11 = __TURBOPACK__imported__module__272598__; 19695var __TURBOPACK__imported__module__519988__7 = __TURBOPACK__imported__module__519988__; 19696var __TURBOPACK__imported__module__453288__2 = __TURBOPACK__imported__module__453288__; 19697// MERGED MODULE: [project]/node_modules/@sentry/browser-utils/build/esm/htmlTreeAsString.js [a
19697pp-client] (ecmascript) 19698; 19699var __TURBOPACK__imported__module__453288__3 = __TURBOPACK__imported__module__453288__; 19700; 19701const DEFAULT_MAX_STRING_LENGTH1 = 80; 19702const accessors = {}; 19703try { 19704 if (typeof Node !== "undefined") { 19705 accessors.parentNode = Object.getOwnPropertyDescriptor(Node.prototype, "parentNode").get; 19706 } 19707 if (typeof Element !== "undefined") { 19708 accessors.tagName = Object.getOwnPropertyDescriptor(Element.prototype, "tagName").get; 19709 accessors.id = Object.getOwnPropertyDescriptor(Element.prototype, "id").get; 19710 accessors.className = Object.getOwnPropertyDescriptor(Element.prototype, "className").get; 19711 accessors.getAttribute = Element.prototype.getAttribute; 19712 } 19713 if (typeof HTMLElement !== "undefined") { 19714 accessors.dataset = Object.getOwnPropertyDescriptor(HTMLElement.prototype, "dataset").get; 19715 } 19716} catch (unused) {} 19717function _safeRead(el, prop, arg) { 19718 const fn = accessors[prop]; 19719 if (fn) { 19720 try { 19721 return fn.call(el, arg); 19722 } catch (unused) {} 19723 } 19724 const val = el[prop]; 19725 return typeof val === "function" ? val.call(el, arg) : val; 19726} 19727function htmlTreeAsString1(elem) { 19728 let options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}; 19729 if (!elem) { 19730 return "<unknown>"; 19731 } 19732 try { 19733 let currentElem = elem; 19734 const MAX_TRAVERSE_HEIGHT = 5; 19735 const out = []; 19736 let height = 0; 19737 let len = 0; 19738 const separator = " > "; 19739 const sepLength = separator.length; 19740 let nextStr; 19741 const keyAttrs = Array.isArray(options) ? options : options.keyAttrs; 19742 const maxStringLength = !Array.isArray(options) && options.maxStringLength || DEFAULT_MAX_STRING_LENGTH1; 19743 while(currentElem && height++ < MAX_TRAVERSE_HEIGHT){ 19744 nextStr = _htmlElementAsString1(currentElem, keyAttrs); 19745 if (nextStr === "html" || height > 1 && len + out.length * sepLength + nextStr.length >= maxStringLength) { 19746 break; 19747 } 19748 out.push(nextStr); 19749 len += nextStr.length; 19750 currentElem = _safeRead(currentElem, "parentNode"); 19751 } 19752 return out.reverse().join(separator); 19753 } catch (unused) { 19754 return "<unknown>"; 19755 } 19756} 19757function _htmlElementAsString1(el, keyAttrs) { 19758 const out = []; 19759 const tagName = _safeRead(el, "tagName"); 19760 if (!tagName) { 19761 return ""; 19762 } 19763 if (typeof HTMLElement !== "undefined") { 19764 if (el instanceof HTMLElement) { 19765 const dataset = _safeRead(el, "dataset"); 19766 if (dataset) { 19767 if (dataset["sentryComponent"]) { 19768 return dataset["sentryComponent"]; 19769 } 19770 if (dataset["sentryElement"]) { 19771 return dataset["sentryElement"]; 19772 } 19773 } 19774 } 19775 } 19776 out.push(tagName.toLowerCase()); 19777 const keyAttrPairs = (keyAttrs === null || keyAttrs === void 0 ? void 0 : keyAttrs.length) ? keyAttrs.filter((keyAttr)=>_safeRead(el, "getAttribute", keyAttr)).map((keyAttr)=>[ 19778 keyAttr, 19779 _safeRead(el, "getAttribute", keyAttr) 19780 ]) : null; 19781 if (keyAttrPairs === null || keyAttrPairs === void 0 ? void 0 : keyAttrPairs.length) { 19782 keyAttrPairs.forEach((keyAttrPair)=>{ 19783 out.push("[".concat(keyAttrPair[0], '="').concat(keyAttrPair[1], '"]')); 19784 }); 19785 } else { 19786 const id = _safeRead(el, "id"); 19787 if (id) { 19788 out.push("#".concat(id)); 19789 } 19790 const className = _safeRead(el, "className"); 19791 if (className && (0, __TURBOPACK__imported__module__453288__3["isString"])(className)) { 19792 const classes = className.split(/\s+/); 19793 for (const c of classes){ 19794 out.push(".".concat(c)); 19795 } 19796 } 19797 } 19798 for (const k of [ 19799 "aria-label", 19800 "type", 19801 "name", 19802 "title", 19803 "alt" 19804 ]){ 19805 const attr = _safeRead(el, "getAttribute", k); 19806 if (attr) { 19807 out.push("[".concat(k, '="').concat(attr, '"]')); 19808 } 19809 } 19810 return out.join(""); 19811} 19812; 19813// MERGED MODULE: [project]/node_modules/@sentry/browser-utils/build/esm/metrics/cls.js [app-client] (ecmascript) 19814; 19815var __TURBOPACK__imported__module__272598__12 = __TURBOPACK__imported__module__272598__; 19816var __TURBOPACK__imported__module__605394__5 = __TURBOPACK__imported__module__605394__; 19817var __TURBOPACK__imported__module__250804__5 = __TURBOPACK__imported__module__250804__; 19818var __TURBOPACK__imported__module__519988__8 = __TURBOPACK__imported__module__519988__; 19819// MERGED MODULE: [project]/node_modules/@sentry/browser-utils/build/esm/debug-build.js [app-client] (ecmascript) 19820; 19821const DEBUG_BUILD = typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__; 19822; 19823// MERGED MODULE: [project]/node_modules/@sentry/browser-utils/build/esm/metrics/instrument.js [app-client] (ecmascript) 19824; 19825var __TURBOPACK__imported__module__272598__13 = __TURBOPACK__imported__module__272598__; 19826var __TURBOPACK__imported__module__936032__1 = __TURBOPACK__imported__module__936032__; 19827// MERGED MODULE: [project]/node_modules/@sentry/browser-utils/build/esm/metrics/web-vitals/getCLS.js [app-client] (ecmascript) 19828; 19829// MERGED MODULE: [project]/node_modules/@sentry/browser-utils/build/esm/metrics/web-vitals/lib/bindReporter.js [app-client] (ecmascript) 19830; 19831const getRating = (value, thresholds)=>{ 19832 if (value > thresholds[1]) { 19833 return "poor"; 19834 } 19835 if (value > thresholds[0]) { 19836 return "needs-improvement"; 19837 } 19838 return "good"; 19839}; 19840const bindReporter = (callback, metric, thresholds, reportAllChanges)=>{ 19841 let prevValue; 19842 let delta; 19843 return (forceReport)=>{ 19844 if (metric.value >= 0) { 19845 if (forceReport || reportAllChanges) { 19846 delta = metric.value - (prevValue !== null && prevValue !== void 0 ? prevValue : 0); 19847 if (delta || prevValue === void 0) { 19848 prevValue = metric.value; 19849 metric.delta = delta; 19850 metric.rating = getRating(metric.value, thresholds); 19851 callback(metric); 19852 } 19853 } 19854 } 19855 }; 19856}; 19857; 19858// MERGED MODULE: [project]/node_modules/@sentry/browser-utils/build/esm/metrics/web-vitals/lib/getVisibilityWatcher.js [app-client] (ecmascript) 19859; 19860// MERGED MODULE: [project]/node_modules/@sentry/browser-utils/build/esm/metrics/web-vitals/lib/getActivationStart.js [app-client] (ecmascript) 19861; 19862// MERGED MODULE: [project]/node_modules/@sentry/browser-utils/build/esm/metrics/web-vitals/lib/getNavigationEntry.js [app-client] (ecmascript) 19863; 19864; 19865const getNavigationEntry = function() {
19866 let checkResponseStart = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true; 19867 var _WINDOW_performance_getEntriesByType, _WINDOW_performance; 19868 const navigationEntry = (_WINDOW_performance = WINDOW3.performance) === null || _WINDOW_performance === void 0 ? void 0 : (_WINDOW_performance_getEntriesByType = _WINDOW_performance.getEntriesByType) === null || _WINDOW_performance_getEntriesByType === void 0 ? void 0 : _WINDOW_performance_getEntriesByType.call(_WINDOW_performance, "navigation")[0]; 19869 if (// sentry-specific change: 19870 // We don't want to check for responseStart for our own use of `getNavigationEntry` 19871 !checkResponseStart || navigationEntry && navigationEntry.responseStart > 0 && navigationEntry.responseStart < performance.now()) { 19872 return navigationEntry; 19873 } 19874}; 19875; 19876; 19877const getActivationStart = ()=>{ 19878 var _ref; 19879 const navEntry = getNavigationEntry(); 19880 return (_ref = navEntry === null || navEntry === void 0 ? void 0 : navEntry.activationStart) !== null && _ref !== void 0 ? _ref : 0; 19881}; 19882; 19883// MERGED MODULE: [project]/node_modules/@sentry/browser-utils/build/esm/metrics/web-vitals/lib/globalListeners.js [app-client] (ecmascript) 19884; 19885; 19886function addPageListener(type, listener, options) { 19887 if (WINDOW3.document) { 19888 WINDOW3.addEventListener(type, listener, options); 19889 } 19890} 19891function removePageListener(type, listener, options) { 19892 if (WINDOW3.document) { 19893 WINDOW3.removeEventListener(type, listener, options); 19894 } 19895} 19896; 19897; 19898; 19899; 19900let firstHiddenTime = -1; 19901const onHiddenFunctions = /* @__PURE__ */ new Set(); 19902const initHiddenTime = ()=>{ 19903 var _WINDOW_document, _WINDOW_document1; 19904 return ((_WINDOW_document = WINDOW3.document) === null || _WINDOW_document === void 0 ? void 0 : _WINDOW_document.visibilityState) === "hidden" && !((_WINDOW_document1 = WINDOW3.document) === null || _WINDOW_document1 === void 0 ? void 0 : _WINDOW_document1.prerendering) ? 0 : Infinity; 19905}; 19906const onVisibilityUpdate = (event)=>{ 19907 if (isPageHidden(event) && firstHiddenTime > -1) { 19908 if (event.type === "visibilitychange" || event.type === "pagehide") { 19909 for (const onHiddenFunction of onHiddenFunctions){ 19910 onHiddenFunction(); 19911 } 19912 } 19913 if (!isFinite(firstHiddenTime)) { 19914 firstHiddenTime = event.type === "visibilitychange" ? event.timeStamp : 0; 19915 removePageListener("prerenderingchange", onVisibilityUpdate, true); 19916 } 19917 } 19918}; 19919const getVisibilityWatcher = ()=>{ 19920 if (WINDOW3.document && firstHiddenTime < 0) { 19921 var _globalThis_performance_getEntriesByType_filter_; 19922 const activationStart = getActivationStart(); 19923 const firstVisibilityStateHiddenTime = !WINDOW3.document.prerendering ? (_globalThis_performance_getEntriesByType_filter_ = globalThis.performance.getEntriesByType("visibility-state").filter((e)=>e.name === "hidden" && e.startTime > activationStart)[0]) === null || _globalThis_performance_getEntriesByType_filter_ === void 0 ? void 0 : _globalThis_performance_getEntriesByType_filter_.startTime : void 0; 19924 firstHiddenTime = firstVisibilityStateHiddenTime !== null && firstVisibilityStateHiddenTime !== void 0 ? firstVisibilityStateHiddenTime : initHiddenTime(); 19925 addPageListener("visibilitychange", onVisibilityUpdate, true); 19926 addPageListener("pagehide", onVisibilityUpdate, true); 19927 addPageListener("prerenderingchange", onVisibilityUpdate, true); 19928 } 19929 return { 19930 get firstHiddenTime () { 19931 return firstHiddenTime; 19932 }, 19933 onHidden (cb) { 19934 onHiddenFunctions.add(cb); 19935 } 19936 }; 19937}; 19938function isPageHidden(event) { 19939 var _WINDOW_document; 19940 return event.type === "pagehide" || ((_WINDOW_document = WINDOW3.document) === null || _WINDOW_document === void 0 ? void 0 : _WINDOW_document.visibilityState) === "hidden"; 19941} 19942; 19943// MERGED MODULE: [project]/node_modules/@sentry/browser-utils/build/esm/metrics/web-vitals/lib/initMetric.js [app-client] (ecmascript) 19944; 19945// MERGED MODULE: [project]/node_modules/@sentry/browser-utils/build/esm/metrics/web-vitals/lib/generateUniqueID.js [app-client] (ecmascript) 19946; 19947const generateUniqueID = ()=>{ 19948 return "v5-".concat(Date.now(), "-").concat(Math.floor(Math.random() * (9e12 - 1)) + 1e12); 19949}; 19950; 19951; 19952; 19953; 19954; 19955const initMetric = function(name) { 19956 let value = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : -1; 19957 const navEntry = getNavigationEntry(); 19958 let navigationType = "navigate"; 19959 if (navEntry) { 19960 var _WINDOW_document, _WINDOW_document1; 19961 if (((_WINDOW_document = WINDOW3.document) === null || _WINDOW_document === void 0 ? void 0 : _WINDOW_document.prerendering) || getActivationStart() > 0) { 19962 navigationType = "prerender"; 19963 } else if ((_WINDOW_document1 = WINDOW3.document) === null || _WINDOW_document1 === void 0 ? void 0 : _WINDOW_document1.wasDiscarded) { 19964 navigationType = "restore"; 19965 } else if (navEntry.type) { 19966 navigationType = navEntry.type.replace(/_/g, "-"); 19967 } 19968 } 19969 const entries = []; 19970 return { 19971 name, 19972 value, 19973 rating: "good", 19974 // If needed, will be updated when reported. `const` to keep the type from widening to `string`. 19975 delta: 0,
19976 entries, 19977 id: generateUniqueID(), 19978 navigationType 19979 }; 19980}; 19981; 19982// MERGED MODULE: [project]/node_modules/@sentry/browser-utils/build/esm/metrics/web-vitals/lib/initUnique.js [app-client] (ecmascript) 19983; 19984const instanceMap = /* @__PURE__ */ new WeakMap(); 19985function initUnique(identityObj, ClassObj) { 19986 try { 19987 if (!instanceMap.get(identityObj)) { 19988 instanceMap.set(identityObj, new ClassObj()); 19989 } 19990 return instanceMap.get(identityObj); 19991 } catch (_e) { 19992 return new ClassObj(); 19993 } 19994} 19995; 19996// MERGED MODULE: [project]/node_modules/@sentry/browser-utils/build/esm/metrics/web-vitals/lib/LayoutShiftManager.js [app-client] (ecmascript) 19997; 19998class LayoutShiftManager { 19999 // eslint-disable-next-line @typescript-eslint/explicit-member-accessibility 20000 _processEntry(entry) { 20001 var _this__onAfterProcessingUnexpectedShift, _this; 20002 if (entry.hadRecentInput) return; 20003 const firstSessionEntry = this._sessionEntries[0]; 20004 const lastSessionEntry = this._sessionEntries[this._sessionEntries.length - 1]; 20005 if (this._sessionValue && firstSessionEntry && lastSessionEntry && entry.startTime - lastSessionEntry.startTime < 1e3 && entry.startTime - firstSessionEntry.startTime < 5e3) { 20006 this._sessionValue += entry.value; 20007 this._sessionEntries.push(entry); 20008 } else { 20009 this._sessionValue = entry.value; 20010 this._sessionEntries = [ 20011 entry 20012 ]; 20013 } 20014 (_this__onAfterProcessingUnexpectedShift = (_this = this)._onAfterProcessingUnexpectedShift) === null || _this__onAfterProcessingUnexpectedShift === void 0 ? void 0 : _this__onAfterProcessingUnexpectedShift.call(_this, entry); 20015 } 20016 constructor(){ 20017 // oxlint-disable-next-line sdk/no-class-field-initializers 20018 this._sessionValue = 0; 20019 // oxlint-disable-next-line sdk/no-class-field-initializers 20020 this._sessionEntries = []; 20021 } 20022} 20023; 20024// MERGED MODULE: [project]/node_modules/@sentry/browser-utils/build/esm/metrics/web-vitals/lib/observe.js [app-client] (ecmascript) 20025; 20026const observe = function(type, callback) { 20027 let opts = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {}; 20028 try { 20029 if (PerformanceObserver.supportedEntryTypes.includes(type)) { 20030 const po = new PerformanceObserver((list)=>{ 20031 Promise.resolve().then(()=>{ 20032 callback(list.getEntries()); 20033 }); 20034 }); 20035 po.observe({ 20036 type, 20037 buffered: true, 20038 ...opts 20039 }); 20040 return po; 20041 } 20042 } catch (unused) {} 20043 return; 20044}; 20045; 20046// MERGED MODULE: [project]/node_modules/@sentry/browser-utils/build/esm/metrics/web-vitals/lib/runOnce.js [app-client] (ecmascript) 20047; 20048const runOnce = (cb)=>{ 20049 let called = false; 20050 return ()=>{ 20051 if (!called) { 20052 cb(); 20053 called = true; 20054 } 20055 }; 20056}; 20057; 20058// MERGED MODULE: [project]/node_modules/@sentry/browser-utils/build/esm/metrics/web-vitals/onFCP.js [app-client] (ecmascript) 20059; 20060// MERGED MODULE: [project]/node_modules/@sentry/browser-utils/build/esm/metrics/web-vitals/lib/whenActivated.js [app-client] (ecmascript) 20061; 20062; 20063const whenActivated = (callback)=>{ 20064 var _WINDOW_document; 20065 if ((_WINDOW_document = WINDOW3.document) === null || _WINDOW_document === void 0 ? void 0 : _WINDOW_document.prerendering) { 20066 addEventListener("prerenderingchange", ()=>callback(), true); 20067 } else { 20068 callback(); 20069 } 20070}; 20071; 20072; 20073; 20074; 20075; 20076; 20077; 20078const FCPThresholds = [ 20079 1800, 20080 3e3 20081]; 20082const onFCP = function(onReport) { 20083 let opts = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}; 20084 whenActivated(()=>{ 20085 const visibilityWatcher = getVisibilityWatcher(); 20086 const metric = initMetric("FCP"); 20087 let report; 20088 const handleEntries = (entries)=>{ 20089 for (const entry of entries){ 20090 if (entry.name === "first-contentful-paint") { 20091 po.disconnect(); 20092 if (entry.startTime < visibilityWatcher.firstHiddenTime) { 20093 metric.value = Math.max(entry.startTime - getActivationStart(), 0); 20094 metric.entries.push(entry); 20095 report(true); 20096 } 20097 } 20098 } 20099 }; 20100 const po = observe("paint", handleEntries); 20101 if (po) { 20102 report = bindReporter(onReport, metric, FCPThresholds, opts.reportAllChanges); 20103 } 20104 }); 20105}; 20106; 20107; 20108; 20109; 20110; 20111; 20112; 20113; 20114; 20115; 20116const CLSThresholds = [ 20117 0.1, 20118 0.25 20119]; 20120const onCLS = function(onReport) { 20121 let opts = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}; 20122 onFCP(runOnce(()=>{ 20123 const metric = initMetric("CLS", 0); 20124 let report; 20125 const visibilityWatcher = getVisibilityWatcher(); 20126 const layoutShiftManager = initUnique(opts, LayoutShiftManager); 20127 const handleEntries = (entries)=>{
20128 for (const entry of entries){ 20129 layoutShiftManager._processEntry(entry); 20130 } 20131 if (layoutShiftManager._sessionValue > metric.value) { 20132 metric.value = layoutShiftManager._sessionValue; 20133 metric.entries = layoutShiftManager._sessionEntries; 20134 report(); 20135 } 20136 }; 20137 const po = observe("layout-shift", handleEntries); 20138 if (po) { 20139 var _WINDOW_setTimeout; 20140 report = bindReporter(onReport, metric, CLSThresholds, opts.reportAllChanges); 20141 visibilityWatcher.onHidden(()=>{ 20142 handleEntries(po.takeRecords()); 20143 report(true); 20144 }); 20145 WINDOW3 === null || WINDOW3 === void 0 ? void 0 : (_WINDOW_setTimeout = WINDOW3.setTimeout) === null || _WINDOW_setTimeout === void 0 ? void 0 : _WINDOW_setTimeout.call(WINDOW3, report); 20146 } 20147 })); 20148}; 20149; 20150// MERGED MODULE: [project]/node_modules/@sentry/browser-utils/build/esm/metrics/web-vitals/getINP.js [app-client] (ecmascript) 20151; 20152// MERGED MODULE: [project]/node_modules/@sentry/browser-utils/build/esm/metrics/web-vitals/lib/InteractionManager.js [app-client] (ecmascript) 20153; 20154// MERGED MODULE: [project]/node_modules/@sentry/browser-utils/build/esm/metrics/web-vitals/lib/polyfills/interactionCountPolyfill.js [app-client] (ecmascript) 20155; 20156; 20157let interactionCountEstimate = 0; 20158let minKnownInteractionId = Infinity; 20159let maxKnownInteractionId = 0; 20160const updateEstimate = (entries)=>{ 20161 entries.forEach((e)=>{ 20162 if (e.interactionId) { 20163 minKnownInteractionId = Math.min(minKnownInteractionId, e.interactionId); 20164 maxKnownInteractionId = Math.max(maxKnownInteractionId, e.interactionId); 20165 interactionCountEstimate = maxKnownInteractionId ? (maxKnownInteractionId - minKnownInteractionId) / 7 + 1 : 0; 20166 } 20167 }); 20168}; 20169let po1; 20170const getInteractionCount = ()=>{ 20171 return po1 ? interactionCountEstimate : performance.interactionCount || 0; 20172}; 20173const initInteractionCountPolyfill = ()=>{ 20174 if ("interactionCount" in performance || po1) return; 20175 po1 = observe("event", updateEstimate, { 20176 type: "event", 20177 buffered: true, 20178 durationThreshold: 0 20179 }); 20180}; 20181; 20182; 20183const MAX_INTERACTIONS_TO_CONSIDER = 10; 20184let prevInteractionCount = 0; 20185const getInteractionCountForNavigation = ()=>{ 20186 return getInteractionCount() - prevInteractionCount; 20187}; 20188class InteractionManager { 20189 // eslint-disable-next-line @typescript-eslint/explicit-member-accessibility, jsdoc/require-jsdoc 20190 _resetInteractions() { 20191 prevInteractionCount = getInteractionCount(); 20192 this._longestInteractionList.length = 0; 20193 this._longestInteractionMap.clear(); 20194 } 20195 /** 20196 * Returns the estimated p98 longest interaction based on the stored 20197 * interaction candidates and the interaction count for the current page. 20198 */ // eslint-disable-next-line @typescript-eslint/explicit-member-accessibility 20199 _estimateP98LongestInteraction() { 20200 const candidateInteractionIndex = Math.min(this._longestInteractionList.length - 1, Math.floor(getInteractionCountForNavigation() / 50)); 20201 return this._longestInteractionList[candidateInteractionIndex]; 20202 } 20203 /** 20204 * Takes a performance entry and adds it to the list of worst interactions 20205 * if its duration is long enough to make it among the worst. If the 20206 * entry is part of an existing interaction, it is merged and the latency 20207 * and entries list is updated as needed. 20208 */ // eslint-disable-next-line @typescript-eslint/explicit-member-accessibility 20209 _processEntry(entry) { 20210 var _this__onBeforeProcessingEntry, _this; 20211 (_this__onBeforeProcessingEntry = (_this = this)._onBeforeProcessingEntry) === null || _this__onBeforeProcessingEntry === void 0 ? void 0 : _this__onBeforeProcessingEntry.call(_this, entry); 20212 if (!(entry.interactionId || entry.entryType === "first-input")) return; 20213 const minLongestInteraction = this._longestInteractionList.at(-1); 20214 let interaction = this._longestInteractionMap.get(entry.interactionId); 20215 if (interaction || this._longestInteractionList.length < MAX_INTERACTIONS_TO_CONSIDER || // If the above conditions are false, `minLongestInteraction` will be set. 20216 entry.duration > minLongestInteraction._latency) { 20217 var _this__onAfterProcessingINPCandidate, _this1; 20218 if (interaction) { 20219 if (entry.duration > interaction._latency) { 20220 interaction.entries = [ 20221 entry 20222 ]; 20223 interaction._latency = entry.duration; 20224 } else if (entry.duration === interaction._latency && entry.startTime === interaction.entries[0].startTime) { 20225 interaction.entries.push(entry); 20226 } 20227 } else { 20228 interaction = { 20229 id: entry.interactionId,
20230 entries: [ 20231 entry 20232 ], 20233 _latency: entry.duration 20234 }; 20235 this._longestInteractionMap.set(interaction.id, interaction); 20236 this._longestInteractionList.push(interaction); 20237 } 20238 this._longestInteractionList.sort((a, b)=>b._latency - a._latency); 20239 if (this._longestInteractionList.length > MAX_INTERACTIONS_TO_CONSIDER) { 20240 const removedInteractions = this._longestInteractionList.splice(MAX_INTERACTIONS_TO_CONSIDER); 20241 for (const interaction2 of removedInteractions){ 20242 this._longestInteractionMap.delete(interaction2.id); 20243 } 20244 } 20245 (_this__onAfterProcessingINPCandidate = (_this1 = this)._onAfterProcessingINPCandidate) === null || _this__onAfterProcessingINPCandidate === void 0 ? void 0 : _this__onAfterProcessingINPCandidate.call(_this1, interaction); 20246 } 20247 } 20248 constructor(){ 20249 /** 20250 * A list of longest interactions on the page (by latency) sorted so the 20251 * longest one is first. The list is at most MAX_INTERACTIONS_TO_CONSIDER 20252 * long. 20253 */ // oxlint-disable-next-line sdk/no-class-field-initializers 20254 this._longestInteractionList = []; 20255 /** 20256 * A mapping of longest interactions by their interaction ID. 20257 * This is used for faster lookup. 20258 */ // oxlint-disable-next-line sdk/no-class-field-initializers 20259 this._longestInteractionMap = /* @__PURE__ */ new Map(); 20260 } 20261} 20262; 20263// MERGED MODULE: [project]/node_modules/@sentry/browser-utils/build/esm/metrics/web-vitals/lib/whenIdleOrHidden.js [app-client] (ecmascript) 20264; 20265; 20266; 20267; 20268const whenIdleOrHidden = (cb)=>{ 20269 var _WINDOW_document; 20270 const rIC = WINDOW3.requestIdleCallback || WINDOW3.setTimeout; 20271 if (((_WINDOW_document = WINDOW3.document) === null || _WINDOW_document === void 0 ? void 0 : _WINDOW_document.visibilityState) === "hidden") { 20272 cb(); 20273 } else { 20274 cb = runOnce(cb); 20275 addPageListener("visibilitychange", cb, { 20276 once: true, 20277 capture: true 20278 }); 20279 addPageListener("pagehide", cb, { 20280 once: true, 20281 capture: true 20282 }); 20283 rIC(()=>{ 20284 cb(); 20285 removePageListener("visibilitychange", cb, { 20286 capture: true 20287 }); 20288 removePageListener("pagehide", cb, { 20289 capture: true 20290 }); 20291 }); 20292 } 20293}; 20294; 20295; 20296; 20297; 20298; 20299; 20300; 20301; 20302; 20303; 20304const INPThresholds = [ 20305 200, 20306 500 20307]; 20308const DEFAULT_DURATION_THRESHOLD = 40; 20309const onINP = function(onReport) { 20310 let opts = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}; 20311 if (!(globalThis.PerformanceEventTiming && "interactionId" in PerformanceEventTiming.prototype)) { 20312 return; 20313 } 20314 const visibilityWatcher = getVisibilityWatcher(); 20315 whenActivated(()=>{ 20316 var _opts_durationThreshold; 20317 initInteractionCountPolyfill(); 20318 const metric = initMetric("INP"); 20319 let report; 20320 const interactionManager = initUnique(opts, InteractionManager); 20321 const handleEntries = (entries)=>{ 20322 whenIdleOrHidden(()=>{ 20323 for (const entry of entries){ 20324 interactionManager._processEntry(entry); 20325 } 20326 const inp = interactionManager._estimateP98LongestInteraction(); 20327 if (inp && inp._latency !== metric.value) { 20328 metric.value = inp._latency; 20329 metric.entries = inp.entries; 20330 report(); 20331 } 20332 }); 20333 }; 20334 const po = observe("event", handleEntries, { 20335 // Event Timing entries have their durations rounded to the nearest 8ms, 20336 // so a duration of 40ms would be any event that spans 2.5 or more frames 20337 // at 60Hz. This threshold is chosen to strike a balance between usefulness 20338 // and performance. Running this callback for any interaction that spans
20339 // just one or two frames is likely not worth the insight that could be 20340 // gained. 20341 durationThreshold: (_opts_durationThreshold = opts.durationThreshold) !== null && _opts_durationThreshold !== void 0 ? _opts_durationThreshold : DEFAULT_DURATION_THRESHOLD 20342 }); 20343 report = bindReporter(onReport, metric, INPThresholds, opts.reportAllChanges); 20344 if (po) { 20345 po.observe({ 20346 type: "first-input", 20347 buffered: true 20348 }); 20349 visibilityWatcher.onHidden(()=>{ 20350 handleEntries(po.takeRecords()); 20351 report(true); 20352 }); 20353 } 20354 }); 20355}; 20356; 20357// MERGED MODULE: [project]/node_modules/@sentry/browser-utils/build/esm/metrics/web-vitals/getLCP.js [app-client] (ecmascript) 20358; 20359// MERGED MODULE: [project]/node_modules/@sentry/browser-utils/build/esm/metrics/web-vitals/lib/LCPEntryManager.js [app-client] (ecmascript) 20360; 20361class LCPEntryManager { 20362 // eslint-disable-next-line @typescript-eslint/explicit-member-accessibility, jsdoc/require-jsdoc 20363 _processEntry(entry) { 20364 var _this__onBeforeProcessingEntry, _this; 20365 (_this__onBeforeProcessingEntry = (_this = this)._onBeforeProcessingEntry) === null || _this__onBeforeProcessingEntry === void 0 ? void 0 : _this__onBeforeProcessingEntry.call(_this, entry); 20366 } 20367} 20368; 20369; 20370; 20371; 20372; 20373; 20374; 20375; 20376; 20377; 20378; 20379; 20380const LCPThresholds = [ 20381 2500, 20382 4e3 20383]; 20384const onLCP = function(onReport) { 20385 let opts = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}; 20386 whenActivated(()=>{ 20387 const visibilityWatcher = getVisibilityWatcher(); 20388 const metric = initMetric("LCP"); 20389 let report; 20390 const lcpEntryManager = initUnique(opts, LCPEntryManager); 20391 const handleEntries = (entries)=>{ 20392 if (!opts.reportAllChanges) { 20393 entries = entries.slice(-1); 20394 } 20395 for (const entry of entries){ 20396 lcpEntryManager._processEntry(entry); 20397 if (entry.startTime < visibilityWatcher.firstHiddenTime) { 20398 metric.value = Math.max(entry.startTime - getActivationStart(), 0); 20399 metric.entries = [ 20400 entry 20401 ]; 20402 report(); 20403 } 20404 } 20405 }; 20406 const po = observe("largest-contentful-paint", handleEntries); 20407 if (po) { 20408 report = bindReporter(onReport, metric, LCPThresholds, opts.reportAllChanges); 20409 const stopListening = runOnce(()=>{ 20410 handleEntries(po.takeRecords()); 20411 po.disconnect(); 20412 report(true); 20413 }); 20414 const stopListeningWrapper = (event)=>{ 20415 if (event.isTrusted) { 20416 whenIdleOrHidden(stopListening); 20417 removePageListener(event.type, stopListeningWrapper, { 20418 capture: true 20419 }); 20420 } 20421 }; 20422 for (const type of [ 20423 "keydown", 20424 "click", 20425 "visibilitychange" 20426 ]){ 20427 addPageListener(type, stopListeningWrapper, { 20428 capture: true 20429 }); 20430 } 20431 } 20432 }); 20433}; 20434; 20435// MERGED MODULE: [project]/node_modules/@sentry/browser-utils/build/esm/metrics/web-vitals/onTTFB.js [app-client] (ecmascript) 20436; 20437; 20438; 20439; 20440; 20441; 20442; 20443const TTFBThresholds = [ 20444 800, 20445 1800 20446]; 20447const whenReady = (callback)=>{ 20448 var _WINDOW_document, _WINDOW_document1; 20449 if ((_WINDOW_document = WINDOW3.document) === null || _WINDOW_document === void 0 ? void 0 : _WINDOW_document.prerendering) { 20450 whenActivated(()=>whenReady(callback)); 20451 } else if (((_WINDOW_document1 = WINDOW3.document) === null || _WINDOW_document1 === void 0 ? void 0 : _WINDOW_document1.readyState) !== "complete") { 20452 addEventListener("load", ()=>whenReady(callback), true); 20453 } else { 20454 setTimeout(callback); 20455 } 20456}; 20457const onTTFB = function(onReport) { 20458 let opts = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}; 20459 const metric = initMetric("TTFB"); 20460 const report = bindReporter(onReport, metric, TTFBThresholds, opts.reportAllChanges); 20461 whenReady(()=>{ 20462 const navigationEntry = getNavigationEntry(); 20463 if (navigationEntry) { 20464 metric.value = Math.max(navigationEntry.responseStart - getActivationStart(), 0); 20465 metric.entries = [ 20466 navigationEntry 20467 ]; 20468 report(true); 20469 } 20470 }); 20471}; 20472; 20473; 20474; 20475; 20476; 20477; 20478; 20479; 20480const handlers1 = {}; 20481const instrumented1 = {}; 20482let _previousCls; 20483let _previousLcp; 20484let _previousTtfb; 20485let _previousInp; 20486function addClsInstrumentationHandler(callback) { 20487 let stopOnCallback = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
20488 return addMetricObserver("cls", callback, instrumentCls, _previousCls, stopOnCallback); 20489} 20490function addLcpInstrumentationHandler(callback) { 20491 let stopOnCallback = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false; 20492 return addMetricObserver("lcp", callback, instrumentLcp, _previousLcp, stopOnCallback); 20493} 20494function addTtfbInstrumentationHandler(callback) { 20495 return addMetricObserver("ttfb", callback, instrumentTtfb, _previousTtfb); 20496} 20497function addInpInstrumentationHandler(callback) { 20498 return addMetricObserver("inp", callback, instrumentInp, _previousInp); 20499} 20500function addPerformanceInstrumentationHandler(type, callback) { 20501 addHandler1(type, callback); 20502 if (!instrumented1[type]) { 20503 instrumentPerformanceObserver(type); 20504 instrumented1[type] = true; 20505 } 20506 return getCleanupCallback(type, callback); 20507} 20508function triggerHandlers1(type, data) { 20509 const typeHandlers = handlers1[type]; 20510 if (!(typeHandlers === null || typeHandlers === void 0 ? void 0 : typeHandlers.length)) { 20511 return; 20512 } 20513 for (const handler of typeHandlers){ 20514 try { 20515 handler(data); 20516 } catch (e) { 20517 DEBUG_BUILD && __TURBOPACK__imported__module__272598__13["debug"].error("Error while triggering instrumentation handler.\nType: ".concat(type, "\nName: ").concat((0, __TURBOPACK__imported__module__936032__1["getFunctionName"])(handler), "\nError:"), e); 20518 } 20519 } 20520} 20521function instrumentCls() { 20522 return onCLS((metric)=>{ 20523 triggerHandlers1("cls", { 20524 metric 20525 }); 20526 _previousCls = metric; 20527 }, // We want the callback to be called whenever the CLS value updates. 20528 // By default, the callback is only called when the tab goes to the background. 20529 { 20530 reportAllChanges: true 20531 }); 20532} 20533function instrumentLcp() { 20534 return onLCP((metric)=>{ 20535 triggerHandlers1("lcp", { 20536 metric 20537 }); 20538 _previousLcp = metric; 20539 }, // We want the callback to be called whenever the LCP value updates. 20540 // By default, the callback is only called when the tab goes to the background. 20541 { 20542 reportAllChanges: true 20543 }); 20544} 20545function instrumentTtfb() { 20546 return onTTFB((metric)=>{ 20547 triggerHandlers1("ttfb", { 20548 metric 20549 }); 20550 _previousTtfb = metric; 20551 }); 20552} 20553function instrumentInp() { 20554 return onINP((metric)=>{ 20555 triggerHandlers1("inp", { 20556 metric 20557 }); 20558 _previousInp = metric; 20559 }); 20560} 20561function addMetricObserver(type, callback, instrumentFn, previousValue) { 20562 let stopOnCallback = arguments.length > 4 && arguments[4] !== void 0 ? arguments[4] : false; 20563 addHandler1(type, callback); 20564 let stopListening; 20565 if (!instrumented1[type]) { 20566 stopListening = instrumentFn(); 20567 instrumented1[type] = true; 20568 } 20569 if (previousValue) { 20570 callback({ 20571 metric: previousValue 20572 }); 20573 } 20574 return getCleanupCallback(type, callback, stopOnCallback ? stopListening : void 0); 20575} 20576function instrumentPerformanceObserver(type) { 20577 const options = {}; 20578 if (type === "event") { 20579 options.durationThreshold = 0; 20580 } 20581 observe(type, (entries)=>{ 20582 triggerHandlers1(type, { 20583 entries 20584 }); 20585 }, options); 20586} 20587function addHandler1(type, handler) { 20588 handlers1[type] = handlers1[type] || []; 20589 handlers1[type].push(handler); 20590} 20591function getCleanupCallback(type, callback, stopListening) { 20592 return ()=>{ 20593 if (stopListening) { 20594 stopListening(); 20595 } 20596 const typeHandlers = handlers1[type]; 20597 if (!typeHandlers) { 20598 return; 20599 } 20600 const index = typeHandlers.indexOf(callback); 20601 if (index !== -1) { 20602 typeHandlers.splice(index, 1); 20603 } 20604 }; 20605} 20606function isPerformanceEventTiming(entry) { 20607 return "duration" in entry; 20608} 20609; 20610// MERGED MODULE: [project]/node_modules/@sentry/browser-utils/build/esm/metrics/utils.js [app-client] (ecmascript) 20611; 20612var __TURBOPACK__imported__module__304661__9 = __TURBOPACK__imported__module__304661__; 20613var __TURBOPACK__imported__module__250804__6 = __TURBOPACK__imported__module__250804__; 20614// MERGED MODULE: [project]/node_modules/@sentry/browser-utils/build/esm/metrics/web-vitals/lib/onHidden.js [app-client] (ecmascript) 20615; 20616; 20617; 20618const onHidden = (cb)=>{ 20619 const onHiddenOrPageHide = (event)=>{ 20620 var _WINDOW_document; 20621 if (event.type === "pagehide" || ((_WINDOW_document = WINDOW3.document) === null || _WINDOW_document === void 0 ? void 0 : _WINDOW_document.visibilityState) === "hidden") { 20622 cb(event); 20623 } 20624 }; 20625 addPageListener("visibilitychange", onHiddenOrPageHide, { 20626 capture: true, 20627 once: true 20628 }); 20629 addPageListener("pagehide", onHiddenOrPageHide, { 20630 capture: true, 20631 once: true 20632 }); 20633}; 20634; 20635; 20636; 20637; 20638function isMeasurementValue(value) { 20639 return typeof value === "number" && isFinite(value); 20640} 20641function startAndEndSpan(parentSpan, startTimeInSeconds, endTime, param) { 20642 let { ...ctx } = param; 20643 const parentStartTime = (0, __TURBOPACK__imported__module__304661__9["spanToJSON"])(parentSpan).start_timestamp; 20644 if (parentStartTime && parentStartTime > startTimeInSeconds) { 20645 if (typeof parentSpan.updateStartTime === "function") { 20646 parentSpan.updateStartTime(startTimeInSeconds); 20647 } 20648 } 20649 return withActiveSpan(parentSpan, ()=>{ 20650 const span = startInactiveSpan({ 20651 startTime: startTimeInSeconds, 20652 ...ctx 20653 }); 20654 if (span) {
20655 span.end(endTime); 20656 } 20657 return span; 20658 }); 20659} 20660function startStandaloneWebVitalSpan(options) { 20661 var _WINDOW_navigator; 20662 const client = (0, __TURBOPACK__imported__module__250804__6["getClient"])(); 20663 if (!client) { 20664 return; 20665 } 20666 const { name, transaction, attributes: passedAttributes, startTime } = options; 20667 const { release, environment } = client.getOptions(); 20668 const { userInfo } = client.getDataCollectionOptions(); 20669 const replay = client.getIntegrationByName("Replay"); 20670 const replayId = replay === null || replay === void 0 ? void 0 : replay.getReplayId(); 20671 const scope = (0, __TURBOPACK__imported__module__250804__6["getCurrentScope"])(); 20672 const user = scope.getUser(); 20673 const userDisplay = user !== void 0 ? user.email || user.id || user.ip_address : void 0; 20674 let profileId; 20675 try { 20676 profileId = scope.getScopeData().contexts.profile.profile_id; 20677 } catch (unused) {} 20678 const attributes = { 20679 release, 20680 environment, 20681 user: userDisplay || void 0, 20682 profile_id: profileId || void 0, 20683 replay_id: replayId || void 0, 20684 transaction, 20685 // Web vital score calculation relies on the user agent to account for different 20686 // browsers setting different thresholds for what is considered a good/meh/bad value. 20687 // For example: Chrome vs. Chrome Mobile 20688 "user_agent.original": (_WINDOW_navigator = WINDOW3.navigator) === null || _WINDOW_navigator === void 0 ? void 0 : _WINDOW_navigator.userAgent, 20689 // This tells Sentry to infer the IP address from the request 20690 "client.address": userInfo ? "{{auto}}" : void 0, 20691 ...passedAttributes 20692 }; 20693 return startInactiveSpan({ 20694 name, 20695 attributes, 20696 startTime, 20697 experimental: { 20698 standalone: true 20699 } 20700 }); 20701} 20702function getBrowserPerformanceAPI() { 20703 return WINDOW3.addEventListener && WINDOW3.performance; 20704} 20705function msToSec(time) { 20706 return time / 1e3; 20707} 20708function extractNetworkProtocol(nextHopProtocol) { 20709 let name = "unknown"; 20710 let version = "unknown"; 20711 let _name = ""; 20712 for (const char of nextHopProtocol){ 20713 if (char === "/") { 20714 [name, version] = nextHopProtocol.split("/"); 20715 break; 20716 } 20717 if (!isNaN(Number(char))) { 20718 name = _name === "h" ? "http" : _name; 20719 version = nextHopProtocol.split(_name)[1]; 20720 break; 20721 } 20722 _name += char; 20723 } 20724 if (_name === nextHopProtocol) { 20725 name = _name; 20726 } 20727 return { 20728 name, 20729 version 20730 }; 20731} 20732function supportsWebVital(entryType) { 20733 try { 20734 return PerformanceObserver.supportedEntryTypes.includes(entryType); 20735 } catch (unused) { 20736 return false; 20737 } 20738} 20739function listenForWebVitalReportEvents(client, collectorCallback) { 20740 let pageloadSpan; 20741 let collected = false; 20742 function _runCollectorCallbackOnce(event) { 20743 if (!collected && pageloadSpan) { 20744 collectorCallback(event, pageloadSpan.spanContext().spanId, pageloadSpan); 20745 } 20746 collected = true; 20747 } 20748 onHidden(()=>{ 20749 _runCollectorCallbackOnce("pagehide"); 20750 }); 20751 const unsubscribeStartNavigation = client.on("beforeStartNavigationSpan", (_, options)=>{ 20752 if (!(options === null || options === void 0 ? void 0 : options.isRedirect)) { 20753 _runCollectorCallbackOnce("navigation"); 20754 unsubscribeStartNavigation(); 20755 unsubscribeAfterStartPageLoadSpan(); 20756 } 20757 }); 20758 const unsubscribeAfterStartPageLoadSpan = client.on("afterStartPageLoadSpan", (span)=>{ 20759 pageloadSpan = span; 20760 unsubscribeAfterStartPageLoadSpan(); 20761 }); 20762} 20763; 20764; 20765; 20766; 20767; 20768; 20769function trackClsAsStandaloneSpan(client) { 20770 let standaloneCLsValue = 0; 20771 let standaloneClsEntry; 20772 if (!supportsWebVital("layout-shift")) { 20773 return; 20774 } 20775 const cleanupClsHandler = addClsInstrumentationHandler((param)=>{ 20776 let { metric } = param; 20777 const entry = metric.entries[metric.entries.length - 1]; 20778 if (!entry) { 20779 return; 20780 } 20781 standaloneCLsValue = metric.value; 20782 standaloneClsEntry = entry; 20783 }, true); 20784 listenForWebVitalReportEvents(client, (reportEvent, pageloadSpanId)=>{ 20785 _sendStandaloneClsSpan(standaloneCLsValue, standaloneClsEntry, pageloadSpanId, reportEvent); 20786 cleanupClsHandler(); 20787 }); 20788} 20789function _sendStandaloneClsSpan(clsValue, entry, pageloadSpanId, reportEvent) { 20790 var _entry_sources_; 20791 DEBUG_BUILD && __TURBOPACK__imported__module__272598__12["debug"].log("Sending CLS span (".concat(clsValue, ")")); 20792 const startTime = entry ? msToSec(((0, __TURBOPACK__imported__module__605394__5["browserPerformanceTimeOrigin"])() || 0) + entry.startTime) : (0, __TURBOPACK__imported__module__605394__5["timestampInSeconds"])(); 20793 const routeName = (0, __TURBOPACK__imported__module__250804__5["getCurrentScope"])().getScopeData().transactionName; 20794 const name = entry ? htmlTreeAsString1((_entry_sources_ = entry.sources[0]) === null || _entry_sources_ === void 0 ? void 0 : _entry_sources_.node) : "Layout shift"; 20795 const attributes = { 20796 [__TURBOPACK__imported__module__519988__8["SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN"]]: "auto.http.browser.cls", 20797 [__TURBOPACK__imported__module__519988__8["SEMANTIC_ATTRIBUTE_SENTRY_OP"]]: "ui.webvital.cls", 20798 [__TURBOPACK__imported__module__519988__8["SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME"]]: 0, 20799 // attach the pageload span id to the CLS span so that we can link them in the UI 20800 "sentry.pageload.span_id": pageloadSpanId, 20801 // describes what triggered the web vital to be reported 20802 "sentry.report_event": reportEvent 20803 }; 20804 if (entry === null || entry === void 0 ? void 0 : entry.sources) {
20805 entry.sources.forEach((source, index)=>{ 20806 attributes["cls.source.".concat(index + 1)] = htmlTreeAsString1(source.node); 20807 }); 20808 } 20809 const span = startStandaloneWebVitalSpan({ 20810 name, 20811 transaction: routeName, 20812 attributes, 20813 startTime 20814 }); 20815 if (span) { 20816 span.addEvent("cls", { 20817 [__TURBOPACK__imported__module__519988__8["SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_UNIT"]]: "", 20818 [__TURBOPACK__imported__module__519988__8["SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_VALUE"]]: clsValue 20819 }); 20820 span.end(startTime); 20821 } 20822} 20823; 20824// MERGED MODULE: [project]/node_modules/@sentry/browser-utils/build/esm/metrics/lcp.js [app-client] (ecmascript) 20825; 20826var __TURBOPACK__imported__module__272598__14 = __TURBOPACK__imported__module__272598__; 20827var __TURBOPACK__imported__module__605394__6 = __TURBOPACK__imported__module__605394__; 20828var __TURBOPACK__imported__module__250804__7 = __TURBOPACK__imported__module__250804__; 20829var __TURBOPACK__imported__module__519988__9 = __TURBOPACK__imported__module__519988__; 20830; 20831; 20832; 20833; 20834; 20835const MAX_PLAUSIBLE_LCP_DURATION = 6e4; 20836function isValidLcpMetric(lcpValue) { 20837 return lcpValue != null && lcpValue > 0 && lcpValue <= MAX_PLAUSIBLE_LCP_DURATION; 20838} 20839function trackLcpAsStandaloneSpan(client) { 20840 let standaloneLcpValue = 0; 20841 let standaloneLcpEntry; 20842 if (!supportsWebVital("largest-contentful-paint")) { 20843 return; 20844 } 20845 const cleanupLcpHandler = addLcpInstrumentationHandler((param)=>{ 20846 let { metric } = param; 20847 const entry = metric.entries[metric.entries.length - 1]; 20848 if (!entry || !isValidLcpMetric(metric.value)) { 20849 return; 20850 } 20851 standaloneLcpValue = metric.value; 20852 standaloneLcpEntry = entry; 20853 }, true); 20854 listenForWebVitalReportEvents(client, (reportEvent, pageloadSpanId)=>{ 20855 _sendStandaloneLcpSpan(standaloneLcpValue, standaloneLcpEntry, pageloadSpanId, reportEvent); 20856 cleanupLcpHandler(); 20857 }); 20858} 20859function _sendStandaloneLcpSpan(lcpValue, entry, pageloadSpanId, reportEvent) { 20860 if (!isValidLcpMetric(lcpValue)) { 20861 return; 20862 } 20863 DEBUG_BUILD && __TURBOPACK__imported__module__272598__14["debug"].log("Sending LCP span (".concat(lcpValue, ")")); 20864 const startTime = msToSec(((0, __TURBOPACK__imported__module__605394__6["browserPerformanceTimeOrigin"])() || 0) + ((entry === null || entry === void 0 ? void 0 : entry.startTime) || 0)); 20865 const routeName = (0, __TURBOPACK__imported__module__250804__7["getCurrentScope"])().getScopeData().transactionName; 20866 const name = entry ? htmlTreeAsString1(entry.element) : "Largest contentful paint"; 20867 const attributes = { 20868 [__TURBOPACK__imported__module__519988__9["SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN"]]: "auto.http.browser.lcp", 20869 [__TURBOPACK__imported__module__519988__9["SEMANTIC_ATTRIBUTE_SENTRY_OP"]]: "ui.webvital.lcp", 20870 [__TURBOPACK__imported__module__519988__9["SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME"]]: 0, 20871 // LCP is a point-in-time metric 20872 // attach the pageload span id to the LCP span so that we can link them in the UI 20873 "sentry.pageload.span_id": pageloadSpanId, 20874 // describes what triggered the web vital to be reported 20875 "sentry.report_event": reportEvent 20876 }; 20877 if (entry) { 20878 entry.element && (attributes["lcp.element"] = htmlTreeAsString1(entry.element)); 20879 entry.id && (attributes["lcp.id"] = entry.id); 20880 entry.url && (attributes["lcp.url"] = entry.url); 20881 entry.loadTime != null && (attributes["lcp.loadTime"] = entry.loadTime); 20882 entry.renderTime != null && (attributes["lcp.renderTime"] = entry.renderTime); 20883 entry.size != null && (attributes["lcp.size"] = entry.size); 20884 } 20885 const span = startStandaloneWebVitalSpan({ 20886 name, 20887 transaction: routeName, 20888 attributes, 20889 startTime 20890 }); 20891 if (span) { 20892 span.addEvent("lcp", { 20893 [__TURBOPACK__imported__module__519988__9["SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_UNIT"]]: "millisecond", 20894 [__TURBOPACK__imported__module__519988__9["SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_VALUE"]]: lcpValue 20895 }); 20896 span.end(startTime); 20897 } 20898} 20899; 20900// MERGED MODULE: [project]/node_modules/@sentry/browser-utils/build/esm/metrics/resourceTiming.js [a
20900pp-client] (ecmascript) 20901; 20902var __TURBOPACK__imported__module__605394__7 = __TURBOPACK__imported__module__605394__; 20903; 20904; 20905function getAbsoluteTime(time) { 20906 return time ? (((0, __TURBOPACK__imported__module__605394__7["browserPerformanceTimeOrigin"])() || performance.timeOrigin) + time) / 1e3 : time; 20907} 20908function resourceTimingToSpanAttributes(resourceTiming) { 20909 var _getBrowserPerformanceAPI; 20910 const timingSpanData = {}; 20911 if (resourceTiming.nextHopProtocol != void 0) { 20912 const { name, version } = extractNetworkProtocol(resourceTiming.nextHopProtocol); 20913 timingSpanData["network.protocol.version"] = version; 20914 timingSpanData["network.protocol.name"] = name; 20915 } 20916 if (!((0, __TURBOPACK__imported__module__605394__7["browserPerformanceTimeOrigin"])() || ((_getBrowserPerformanceAPI = getBrowserPerformanceAPI()) === null || _getBrowserPerformanceAPI === void 0 ? void 0 : _getBrowserPerformanceAPI.timeOrigin))) { 20917 return timingSpanData; 20918 } 20919 return dropUndefinedKeysFromObject({ 20920 ...timingSpanData, 20921 "http.request.redirect_start": getAbsoluteTime(resourceTiming.redirectStart), 20922 "http.request.redirect_end": getAbsoluteTime(resourceTiming.redirectEnd), 20923 "http.request.worker_start": getAbsoluteTime(resourceTiming.workerStart), 20924 "http.request.fetch_start": getAbsoluteTime(resourceTiming.fetchStart), 20925 "http.request.domain_lookup_start": getAbsoluteTime(resourceTiming.domainLookupStart), 20926 "http.request.domain_lookup_end": getAbsoluteTime(resourceTiming.domainLookupEnd), 20927 "http.request.connect_start": getAbsoluteTime(resourceTiming.connectStart), 20928 "http.request.secure_connection_start": getAbsoluteTime(resourceTiming.secureConnectionStart), 20929 "http.request.connection_end": getAbsoluteTime(resourceTiming.connectEnd), 20930 "http.request.request_start": getAbsoluteTime(resourceTiming.requestStart), 20931 "http.request.response_start": getAbsoluteTime(resourceTiming.responseStart), 20932 "http.request.response_end": getAbsoluteTime(resourceTiming.responseEnd), 20933 // For TTFB we actually want the relative time from timeOrigin to responseStart 20934 // This way, TTFB always measures the "first page load" experience. 20935 // see: https://web.dev/articles/ttfb#measure-resource-requests 20936 "http.request.time_to_first_byte": resourceTiming.responseStart != null ? resourceTiming.responseStart / 1e3 : void 0 20937 }); 20938} 20939function dropUndefinedKeysFromObject(attrs) { 20940 return Object.fromEntries(Object.entries(attrs).filter((param)=>{ 20941 let [, value] = param; 20942 return value != null; 20943 })); 20944} 20945; 20946; 20947; 20948; 20949; 20950; 20951; 20952; 20953; 20954; 20955; 20956; 20957; 20958; 20959const MAX_INT_AS_BYTES = 2147483647; 20960let _performanceCursor = 0; 20961let _measurements = {}; 20962let _lcpEntry; 20963let _clsEntry; 20964function startTrackingWebVitals(param) { 20965 let { recordClsStandaloneSpans, recordLcpStandaloneSpans, client } = param; 20966 const performance1 = getBrowserPerformanceAPI(); 20967 if (performance1 && (0, __TURBOPACK__imported__module__605394__4["browserPerformanceTimeOrigin"])()) { 20968 if (performance1.mark) { 20969 WINDOW3.performance.mark("sentry-tracing-init"); 20970 } 20971 const lcpCleanupCallback = recordLcpStandaloneSpans ? trackLcpAsStandaloneSpan(client) : recordLcpStandaloneSpans === false ? _trackLCP() : void 0; 20972 const clsCleanupCallback = recordClsStandaloneSpans ? trackClsAsStandaloneSpan(client) : recordClsStandaloneSpans === false ? _trackCLS() : void 0; 20973 const ttfbCleanupCallback = _trackTtfb(); 20974 const fpFcpCleanupCallback = _trackFpFcp(); 20975 return ()=>{ 20976 ttfbCleanupCallback(); 20977 fpFcpCleanupCallback(); 20978 lcpCleanupCallback === null || lcpCleanupCallback === void 0 ? void 0 : lcpCleanupCallback(); 20979 clsCleanupCallback === null || clsCleanupCallback === void 0 ? void 0 : clsCleanupCallback(); 20980 }; 20981 } 20982 return ()=>void 0; 20983} 20984function startTrackingLongTasks() { 20985 addPerformanceInstrumentationHandler("longtask", (param)=>{ 20986 let { entries } = param; 20987 const parent = (0, __TURBOPACK__imported__module__304661__8["getActiveSpan"])(); 20988 if (!parent) { 20989 return; 20990 } 20991 const { op: parentOp, start_timestamp: parentStartTimestamp } = (0, __TURBOPACK__imported__module__304661__8["spanToJSON"])(parent);
20992 for (const entry of entries){ 20993 const startTime = msToSec((0, __TURBOPACK__imported__module__605394__4["browserPerformanceTimeOrigin"])() + entry.startTime); 20994 const duration = msToSec(entry.duration); 20995 if (parentOp === "navigation" && parentStartTimestamp && startTime < parentStartTimestamp) { 20996 continue; 20997 } 20998 startAndEndSpan(parent, startTime, startTime + duration, { 20999 name: "Main UI thread blocked", 21000 op: "ui.long-task", 21001 attributes: { 21002 [__TURBOPACK__imported__module__519988__7["SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN"]]: "auto.ui.browser.metrics" 21003 } 21004 }); 21005 } 21006 }); 21007} 21008function startTrackingLongAnimationFrames() { 21009 const observer = new PerformanceObserver((list)=>{ 21010 const parent = (0, __TURBOPACK__imported__module__304661__8["getActiveSpan"])(); 21011 if (!parent) { 21012 return; 21013 } 21014 for (const entry of list.getEntries()){ 21015 if (!entry.scripts[0]) { 21016 continue; 21017 } 21018 const startTime = msToSec((0, __TURBOPACK__imported__module__605394__4["browserPerformanceTimeOrigin"])() + entry.startTime); 21019 const { start_timestamp: parentStartTimestamp, op: parentOp } = (0, __TURBOPACK__imported__module__304661__8["spanToJSON"])(parent); 21020 if (parentOp === "navigation" && parentStartTimestamp && startTime < parentStartTimestamp) { 21021 continue; 21022 } 21023 const duration = msToSec(entry.duration); 21024 const attributes = { 21025 [__TURBOPACK__imported__module__519988__7["SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN"]]: "auto.ui.browser.metrics" 21026 }; 21027 const initialScript = entry.scripts[0]; 21028 const { invoker, invokerType, sourceURL, sourceFunctionName, sourceCharPosition } = initialScript; 21029 attributes["browser.script.invoker"] = invoker; 21030 attributes["browser.script.invoker_type"] = invokerType; 21031 if (sourceURL) { 21032 attributes["code.filepath"] = sourceURL; 21033 } 21034 if (sourceFunctionName) { 21035 attributes["code.function"] = sourceFunctionName; 21036 } 21037 if (sourceCharPosition !== -1) { 21038 attributes["browser.script.source_char_position"] = sourceCharPosition; 21039 } 21040 startAndEndSpan(parent, startTime, startTime + duration, { 21041 name: "Main UI thread blocked", 21042 op: "ui.long-animation-frame", 21043 attributes 21044 }); 21045 } 21046 }); 21047 observer.observe({ 21048 type: "long-animation-frame", 21049 buffered: true 21050 }); 21051} 21052function startTrackingInteractions() { 21053 addPerformanceInstrumentationHandler("event", (param)=>{ 21054 let { entries } = param; 21055 const parent = (0, __TURBOPACK__imported__module__304661__8["getActiveSpan"])(); 21056 if (!parent) { 21057 return; 21058 } 21059 for (const entry of entries){ 21060 if (entry.name === "click") { 21061 const startTime = msToSec((0, __TURBOPACK__imported__module__605394__4["browserPerformanceTimeOrigin"])() + entry.startTime); 21062 const duration = msToSec(entry.duration); 21063 const spanOptions = { 21064 name: htmlTreeAsString1(entry.target), 21065 op: "ui.interaction.".concat(entry.name), 21066 startTime, 21067 attributes: { 21068 [__TURBOPACK__imported__module__519988__7["SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN"]]: "auto.ui.browser.metrics" 21069 } 21070 }; 21071 const componentName = getComponentName(entry.target); 21072 if (componentName) { 21073 spanOptions.attributes["ui.component_name"] = componentName; 21074 } 21075 startAndEndSpan(parent, startTime, startTime + duration, spanOptions); 21076 } 21077 } 21078 }); 21079} 21080function _trackCLS() { 21081 return addClsInstrumentationHandler((param)=>{ 21082 let { metric } = param; 21083 const entry = metric.entries[metric.entries.length - 1]; 21084 if (!entry) { 21085 return; 21086 } 21087 _measurements["cls"] = { 21088 value: metric.value, 21089 unit: "" 21090 }; 21091 _clsEntry = entry; 21092 }, true); 21093} 21094function _trackLCP() { 21095 return addLcpInstrumentationHandler((param)=>{ 21096 let { metric } = param; 21097 const entry = metric.entries[metric.entries.length - 1]; 21098 if (!entry || !isValidLcpMetric(metric.value)) { 21099 return; 21100 } 21101 _measurements["lcp"] = { 21102 value: metric.value, 21103 unit: "millisecond" 21104 }; 21105 _lcpEntry = entry; 21106 }, true); 21107} 21108function _trackTtfb() { 21109 return addTtfbInstrumentationHandler((param)=>{ 21110 let { metric } = param; 21111 const entry = metric.entries[metric.entries.length - 1]; 21112 if (!entry) { 21113 return; 21114 } 21115 _measurements["ttfb"] = { 21116 value: metric.value, 21117 unit: "millisecond" 21118 }; 21119 }); 21120} 21121function _trackFpFcp() { 21122 return addPerformanceInstrumentationHandler("paint", (param)=>{ 21123 let { entries } = param; 21124 const firstHidden = getVisibilityWatcher();
21125 for (const entry of entries){ 21126 const shouldRecord = entry.startTime < firstHidden.firstHiddenTime; 21127 if (entry.name === "first-paint" && shouldRecord) { 21128 _measurements["fp"] = { 21129 value: entry.startTime, 21130 unit: "millisecond" 21131 }; 21132 } 21133 if (entry.name === "first-contentful-paint" && shouldRecord) { 21134 _measurements["fcp"] = { 21135 value: entry.startTime, 21136 unit: "millisecond" 21137 }; 21138 } 21139 } 21140 }); 21141} 21142function addPerformanceEntries(span, options) { 21143 const performance1 = getBrowserPerformanceAPI(); 21144 const origin = (0, __TURBOPACK__imported__module__605394__4["browserPerformanceTimeOrigin"])(); 21145 if (!(performance1 === null || performance1 === void 0 ? void 0 : performance1.getEntries) || !origin) { 21146 return; 21147 } 21148 const { spanStreamingEnabled, ignorePerformanceApiSpans, ignoreResourceSpans } = options; 21149 const timeOrigin = msToSec(origin); 21150 const performanceEntries = performance1.getEntries(); 21151 const { op, start_timestamp: transactionStartTime } = (0, __TURBOPACK__imported__module__304661__8["spanToJSON"])(span); 21152 performanceEntries.slice(_performanceCursor).forEach((entry)=>{ 21153 const startTime = msToSec(entry.startTime); 21154 const duration = msToSec(// Inexplicably, Chrome sometimes emits a negative duration. We need to work around this. 21155 // There is a SO post attempting to explain this, but it leaves one with open questions: https://stackoverflow.com/questions/23191918/peformance-getentries-and-negative-duration-display 21156 // The way we clamp the value is probably not accurate, since we have observed this happen for things that may take a while to load, like for example the replay worker. 21157 // TODO: Investigate why this happens and how to properly mitigate. For now, this is a workaround to prevent transactions being dropped due to negative duration spans. 21158 Math.max(0, entry.duration)); 21159 if (op === "navigation" && transactionStartTime && timeOrigin + startTime < transactionStartTime) { 21160 return; 21161 } 21162 switch(entry.entryType){ 21163 case "navigation": 21164 { 21165 _addNavigationSpans(span, entry, timeOrigin); 21166 break; 21167 } 21168 case "mark": 21169 case "paint": 21170 case "measure": 21171 { 21172 _addMeasureSpans(span, entry, startTime, duration, timeOrigin, ignorePerformanceApiSpans); 21173 break; 21174 } 21175 case "resource": 21176 { 21177 _addResourceSpans(span, entry, entry.name, startTime, duration, timeOrigin, ignoreResourceSpans); 21178 break; 21179 } 21180 } 21181 }); 21182 _performanceCursor = Math.max(performanceEntries.length - 1, 0); 21183 _trackNavigator(span, spanStreamingEnabled); 21184} 21185function addWebVitalsToSpan(span, options) { 21186 var _getBrowserPerformanceAPI; 21187 const origin = (0, __TURBOPACK__imported__module__605394__4["browserPerformanceTimeOrigin"])(); 21188 if (!((_getBrowserPerformanceAPI = getBrowserPerformanceAPI()) === null || _getBrowserPerformanceAPI === void 0 ? void 0 : _getBrowserPerformanceAPI.getEntries) || !origin) { 21189 resetWebVitalState(); 21190 return; 21191 } 21192 const { spanStreamingEnabled, recordClsOnPageloadSpan, recordLcpOnPageloadSpan } = options; 21193 const timeOrigin = msToSec(origin); 21194 if ((0, __TURBOPACK__imported__module__304661__8["spanToJSON"])(span).op === "pageload") { 21195 _addTtfbRequestTimeToMeasurements(_measurements); 21196 if (spanStreamingEnabled) { 21197 const setAttr = (shortWebVitalName, value, customAttrName)=>{ 21198 const attrKey = customAttrName !== null && customAttrName !== void 0 ? customAttrName : "browser.web_vital.".concat(shortWebVitalName, ".value"); 21199 span.setAttribute(attrKey, value); 21200 DEBUG_BUILD && __TURBOPACK__imported__module__272598__11["debug"].log("Setting web vital attribute", { 21201 [attrKey]: value 21202 }, "on pageload span"); 21203 }; 21204 [ 21205 "ttfb", 21206 "fp", 21207 "fcp" 21208 ].forEach((measurementName)=>{ 21209 if (_measurements[measurementName]) { 21210 setAttr(measurementName, _measurements[measurementName].value); 21211 } 21212 }); 21213 if (_measurements["ttfb.requestTime"]) { 21214 setAttr("ttfb.requestTime", _measurements["ttfb.requestTime"].value, "browser.web_vital.ttfb.request_time"); 21215 } 21216 } else { 21217 if (!recordClsOnPageloadSpan) { 21218 delete _measurements.cls; 21219 } 21220 if (!recordLcpOnPageloadSpan) { 21221 delete _measurements.lcp; 21222 }
21223 Object.entries(_measurements).forEach((param)=>{ 21224 let [measurementName, measurement] = param; 21225 setMeasurement(measurementName, measurement.value, measurement.unit, span); 21226 }); 21227 _setWebVitalAttributes(span, options); 21228 } 21229 span.setAttribute(spanStreamingEnabled ? "browser.performance.time_origin" : "performance.timeOrigin", timeOrigin); 21230 span.setAttribute(spanStreamingEnabled ? "browser.performance.navigation.activation_start" : "performance.activationStart", getActivationStart()); 21231 } 21232 resetWebVitalState(); 21233} 21234function resetWebVitalState() { 21235 _lcpEntry = void 0; 21236 _clsEntry = void 0; 21237 _measurements = {}; 21238} 21239function isReact19MeasureEntry(entry) { 21240 if ((entry === null || entry === void 0 ? void 0 : entry.entryType) !== "measure") { 21241 return; 21242 } 21243 try { 21244 return entry.detail.devtools.track === "Components \u269B"; 21245 } catch (unused) { 21246 return; 21247 } 21248} 21249function _addMeasureSpans(span, entry, startTime, duration, timeOrigin, ignorePerformanceApiSpans) { 21250 if (isReact19MeasureEntry(entry)) { 21251 return; 21252 } 21253 if ([ 21254 "mark", 21255 "measure" 21256 ].includes(entry.entryType) && (0, __TURBOPACK__imported__module__821593__1["stringMatchesSomePattern"])(entry.name, ignorePerformanceApiSpans)) { 21257 return; 21258 } 21259 const navEntry = getNavigationEntry(false); 21260 const requestTime = msToSec(navEntry ? navEntry.requestStart : 0); 21261 const measureStartTimestamp = timeOrigin + Math.max(startTime, requestTime); 21262 const startTimeStamp = timeOrigin + startTime; 21263 const measureEndTimestamp = startTimeStamp + duration; 21264 const attributes = { 21265 [__TURBOPACK__imported__module__519988__7["SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN"]]: "auto.resource.browser.metrics" 21266 }; 21267 if (measureStartTimestamp !== startTimeStamp) { 21268 attributes["sentry.browser.measure_happened_before_request"] = true; 21269 attributes["sentry.browser.measure_start_time"] = measureStartTimestamp; 21270 } 21271 _addDetailToSpanAttributes(attributes, entry); 21272 if (measureStartTimestamp <= measureEndTimestamp) { 21273 startAndEndSpan(span, measureStartTimestamp, measureEndTimestamp, { 21274 name: entry.name, 21275 op: entry.entryType, 21276 attributes 21277 }); 21278 } 21279} 21280function _addDetailToSpanAttributes(attributes, performanceMeasure) { 21281 try { 21282 const detail = performanceMeasure.detail; 21283 if (!detail) { 21284 return; 21285 } 21286 if (typeof detail === "object") { 21287 for (const [key, value] of Object.entries(detail)){ 21288 if (value && (0, __TURBOPACK__imported__module__453288__2["isPrimitive"])(value)) { 21289 attributes["sentry.browser.measure.detail.".concat(key)] = value; 21290 } else if (value !== void 0) { 21291 try { 21292 attributes["sentry.browser.measure.detail.".concat(key)] = JSON.stringify(value); 21293 } catch (unused) {} 21294 } 21295 } 21296 return; 21297 } 21298 if ((0, __TURBOPACK__imported__module__453288__2["isPrimitive"])(detail)) { 21299 attributes["sentry.browser.measure.detail"] = detail; 21300 return; 21301 } 21302 try { 21303 attributes["sentry.browser.measure.detail"] = JSON.stringify(detail); 21304 } catch (unused) {} 21305 } catch (unused) {} 21306} 21307function _addNavigationSpans(span, entry, timeOrigin) { 21308 [ 21309 "unloadEvent", 21310 "redirect", 21311 "domContentLoadedEvent", 21312 "loadEvent", 21313 "connect" 21314 ].forEach((event)=>{ 21315 _addPerformanceNavigationTiming(span, entry, event, timeOrigin); 21316 }); 21317 _addPerformanceNavigationTiming(span, entry, "secureConnection", timeOrigin, "TLS/SSL"); 21318 _addPerformanceNavigationTiming(span, entry, "fetch", timeOrigin, "cache"); 21319 _addPerformanceNavigationTiming(span, entry, "domainLookup", timeOrigin, "DNS"); 21320 _addRequest(span, entry, timeOrigin); 21321} 21322function _addPerformanceNavigationTiming(span, entry, event, timeOrigin) { 21323 let name = arguments.length > 4 && arguments[4] !== void 0 ? arguments[4] : event; 21324 const eventEnd = _getEndPropertyNameForNavigationTiming(event); 21325 const end = entry[eventEnd]; 21326 const start = entry["".concat(event, "Start")]; 21327 if (!start || !end) { 21328 return; 21329 } 21330 startAndEndSpan(span, timeOrigin + msToSec(start), timeOrigin + msToSec(end), { 21331 op: "browser.".concat(name), 21332 name: entry.name, 21333 attributes: { 21334 [__TURBOPACK__imported__module__519988__7["SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN"]]: "auto.ui.browser.metrics", 21335 ...event === "redirect" && entry.redirectCount != null ? { 21336 "http.redirect_count": entry.redirectCount 21337 } : {} 21338 } 21339 }); 21340} 21341function _getEndPropertyNameForNavigationTiming(event) { 21342 if (event === "secureConnection") { 21343 return "connectEnd"; 21344 } 21345 if (event === "fetch") { 21346 return "domainLookupStart"; 21347 } 21348 return "".concat(event, "End"); 21349} 21350function _addRequest(span, entry, timeOrigin) { 21351 const requestStartTimestamp = timeOrigin + msToSec(entry.requestStart); 21352 const responseEndTimestamp = timeOrigin + msToSec(entry.responseEnd); 21353 const responseStartTimestamp = timeOrigin + msToSec(entry.responseStart); 21354 if (entry.responseEnd) { 21355 startAndEndSpan(span, requestStartTimestamp, responseEndTimestamp, { 21356 op: "browser.request", 21357 name: entry.name, 21358 attributes: { 21359 [__TURBOPACK__imported__module__519988__7["SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN"]]: "auto.ui.browser.metrics" 21360 } 21361 }); 21362 startAndEndSpan(span, responseStartTimestamp, responseEndTimestamp, { 21363 op: "browser.response", 21364 name: entry.name, 21365 attributes: { 21366 [__TURBOPACK__imported__module__519988__7["SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN"]]: "auto.ui.browser.metrics" 21367 } 21368 }); 21369 } 21370} 21371function _addResourceSpans(span, entry, resourceUrl, startTime, duration, timeOrigin, ignoredResourceSpanOps) { 21372 if (entry.initiatorType === "xmlhttprequest" || entry.initiatorType === "fetch") { 21373 return; 21374 } 21375 const op = entry.initiatorType ? "resource.".concat(entry.initiatorType) : "resource.other"; 21376 if (ignoredResourceSpanOps === null || ignoredResourceSpanOps === void 0 ? void 0 : ignoredResourceSpanOps.includes(op)) { 21377 return; 21378 } 21379 const attributes = { 21380 [__TURBOPACK__imported__module__519988__7["SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN"]]: "auto.resource.browser.metrics" 21381 }; 21382 const parsedUrl = parseUrl(resourceUrl); 21383 if (parsedUrl.protocol) { 21384 attributes["url.scheme"] = parsedUrl.protocol.split(":").pop(); 21385 } 21386 if (parsedUrl.host) { 21387 attributes["server.address"] = parsedUrl.host; 21388 } 21389 attributes["url.same_origin"] = resourceUrl.includes(WINDOW3.location.origin); 21390 attributes[Yu] = resourceUrl; 21391 _setResourceRequestAttributes(entry, attributes, [ 21392 // https://developer.mozilla.org/en-US/docs/Web/API/PerformanceResourceTiming/responseStatus 21393 [ 21394 "responseStatus", 21395 "http.response.status_code" 21396 ], 21397 [ 21398 "transferSize", 21399 "http.response_transfer_size" 21400 ], 21401 [ 21402 "encodedBodySize", 21403 "http.response_content_length" 21404 ], 21405 [ 21406 "decodedBodySize", 21407 "http.decoded_response_content_length" 21408 ], 21409 // https://developer.mozilla.org/en-US/docs/Web/API/PerformanceResourceTiming/renderBlockingStatus 21410 [ 21411 "renderBlockingStatus", 21412 "resource.render_blocking_status" 21413 ], 21414 // https://developer.mozilla.org/en-US/docs/Web/API/PerformanceResourceTiming/deliveryType 21415 [ 21416 "deliveryType", 21417 "http.response_delivery_type" 21418 ] 21419 ]); 21420 const attributesWithResourceTiming = { 21421 ...attributes, 21422 ...resourceTimingToSpanAttributes(entry) 21423 }; 21424 const startTimestamp = timeOrigin + startTime; 21425 const endTimestamp = startTimestamp + duration; 21426 startAndEndSpan(span, startTimestamp, endTimestamp, { 21427 name: resourceUrl.replace(WINDOW3.location.origin, ""), 21428 op, 21429 attributes: attributesWithResourceTiming 21430 }); 21431} 21432function _trackNavigator(span, spanStreamingEnabled) { 21433 const navigator1 = WINDOW3.navigator; 21434 if (!navigator1) { 21435 return; 21436 } 21437 const connection = navigator1.connection; 21438 if (connection) { 21439 if (connection.effectiveType) { 21440 span.setAttribute(spanStreamingEnabled ? "network.connection.effective_type" : "effectiveConnectionType", connection.effectiveType); 21441 } 21442 if (connection.type) { 21443 span.setAttribute(spanStreamingEnabled ? "network.connection.type" : "connectionType", connection.type); 21444 } 21445 if (isMeasurementValue(connection.rtt)) { 21446 if (spanStreamingEnabled) { 21447 span.setAttribute("network.connection.rtt", connection.rtt); 21448 } else if ((0, __TURBOPACK__imported__module__304661__8["spanToJSON"])(span).op === "pageload") { 21449 setMeasurement("connection.rtt", connection.rtt, "millisecond"); 21450 } 21451 } 21452 } 21453 if (isMeasurementValue(navigator1.deviceMemory)) { 21454 if (spanStreamingEnabled) { 21455 span.setAttribute("device.memory.estimated_capacity", navigator1.deviceMemory); 21456 } else { 21457 span.setAttribute("deviceMemory", "".concat(navigator1.deviceMemory, " GB")); 21458 } 21459 } 21460 if (isMeasurementValue(navigator1.hardwareConcurrency)) { 21461 if (spanStreamingEnabled) { 21462 span.setAttribute("device.processor_count", navigator1.hardwareConcurrency); 21463 } else { 21464 span.setAttribute("hardwareConcurrency", String(navigator1.hardwareConcurrency)); 21465 } 21466 } 21467} 21468function _setWebVitalAttributes(span, options) { 21469 if (_lcpEntry && options.recordLcpOnPageloadSpan) { 21470 if (_lcpEntry.element) { 21471 span.setAttribute("lcp.element", htmlTreeAsString1(_lcpEntry.element)); 21472 } 21473 if (_lcpEntry.id) { 21474 span.setAttribute("lcp.id", _lcpEntry.id); 21475 } 21476 if (_lcpEntry.url) { 21477 span.setAttribute("lcp.url", _lcpEntry.url.trim().slice(0, 200)); 21478 } 21479 if (_lcpEntry.loadTime != null) { 21480 span.setAttribute("lcp.loadTime", _lcpEntry.loadTime); 21481 } 21482 if (_lcpEntry.renderTime != null) { 21483 span.setAttribute("lcp.renderTime", _lcpEntry.renderTime); 21484 } 21485 span.setAttribute("lcp.size", _lcpEntry.size); 21486 } 21487 if ((_clsEntry === null || _clsEntry === void 0 ? void 0 : _clsEntry.sources) && options.recordClsOnPageloadSpan) {
21488 _clsEntry.sources.forEach((source, index)=>span.setAttribute("cls.source.".concat(index + 1), htmlTreeAsString1(source.node))); 21489 } 21490} 21491function _setResourceRequestAttributes(entry, attributes, properties) { 21492 properties.forEach((param)=>{ 21493 let [entryKey, attributeKey] = param; 21494 const entryVal = entry[entryKey]; 21495 if (entryVal != null && (typeof entryVal === "number" && entryVal < MAX_INT_AS_BYTES || typeof entryVal === "string")) { 21496 attributes[attributeKey] = entryVal; 21497 } 21498 }); 21499} 21500function _addTtfbRequestTimeToMeasurements(_measurements2) { 21501 const navEntry = getNavigationEntry(false); 21502 if (!navEntry) { 21503 return; 21504 } 21505 const { responseStart, requestStart } = navEntry; 21506 if (requestStart <= responseStart) { 21507 _measurements2["ttfb.requestTime"] = { 21508 value: responseStart - requestStart, 21509 unit: "millisecond" 21510 }; 21511 } 21512} 21513; 21514// MERGED MODULE: [project]/node_modules/@sentry/browser/build/npm/esm/prod/debug-build.js [app-client] (ecmascript) 21515; 21516const DEBUG_BUILD1 = typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__; 21517; 21518// MERGED MODULE: [project]/node_modules/@sentry/browser/build/npm/esm/prod/integrations/fetchStreamPerformance.js [app-client] (ecmascript) 21519; 21520// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/integration.js [app-client] (ecmascript) 21521; 21522var __TURBOPACK__imported__module__250804__8 = __TURBOPACK__imported__module__250804__; 21523var __TURBOPACK__imported__module__901020__10 = __TURBOPACK__imported__module__901020__; 21524var __TURBOPACK__imported__module__272598__15 = __TURBOPACK__imported__module__272598__; 21525; 21526; 21527; 21528const installedIntegrations = []; 21529function filterDuplicates(integrations) { 21530 const integrationsByName = {}; 21531 integrations.forEach((currentInstance)=>{ 21532 const { name } = currentInstance; 21533 const existingInstance = integrationsByName[name]; 21534 if (existingInstance && !existingInstance.isDefaultInstance && currentInstance.isDefaultInstance) { 21535 return; 21536 } 21537 integrationsByName[name] = currentInstance; 21538 }); 21539 return Object.values(integrationsByName); 21540} 21541function getIntegrationsToSetup(options) { 21542 const defaultIntegrations = options.defaultIntegrations || []; 21543 const userIntegrations = options.integrations; 21544 defaultIntegrations.forEach((integration)=>{ 21545 integration.isDefaultInstance = true; 21546 }); 21547 let integrations; 21548 if (Array.isArray(userIntegrations)) { 21549 integrations = [ 21550 ...defaultIntegrations, 21551 ...userIntegrations 21552 ]; 21553 } else if (typeof userIntegrations === "function") { 21554 const resolvedUserIntegrations = userIntegrations(defaultIntegrations); 21555 integrations = Array.isArray(resolvedUserIntegrations) ? resolvedUserIntegrations : [ 21556 resolvedUserIntegrations 21557 ]; 21558 } else { 21559 integrations = defaultIntegrations; 21560 } 21561 return filterDuplicates(integrations); 21562} 21563function setupIntegrations(client, integrations) { 21564 const integrationIndex = {}; 21565 integrations.forEach((integration)=>{ 21566 if (integration === null || integration === void 0 ? void 0 : integration.beforeSetup) { 21567 integration.beforeSetup(client); 21568 } 21569 }); 21570 integrations.forEach((integration)=>{ 21571 if (integration) { 21572 setupIntegration(client, integration, integrationIndex); 21573 } 21574 }); 21575 return integrationIndex; 21576} 21577function afterSetupIntegrations(client, integrations) { 21578 for (const integration of integrations){ 21579 if (integration === null || integration === void 0 ? void 0 : integration.afterAllSetup) { 21580 integration.afterAllSetup(client); 21581 } 21582 } 21583} 21584function setupIntegration(client, integration, integrationIndex) { 21585 if (integrationIndex[integration.name]) { 21586 __TURBOPACK__imported__module__901020__10["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__15["debug"].log("Integration skipped because it was already installed: ".concat(integration.name)); 21587 return; 21588 } 21589 integrationIndex[integration.name] = integration; 21590 if (!installedIntegrations.includes(integration.name) && typeof integration.setupOnce === "function") { 21591 integration.setupOnce(); 21592 installedIntegrations.push(integration.name); 21593 } 21594 if (integration.setup && typeof integration.setup === "function") { 21595 integration.setup(client); 21596 } 21597 if (typeof integration.preprocessEvent === "function") { 21598 const callback = integration.preprocessEvent.bind(integration); 21599 client.on("preprocessEvent", (event, hint)=>callback(event, hint, client)); 21600 } 21601 if (typeof integration.processEvent === "function") { 21602 const callback = integration.processEvent.bind(integration); 21603 const processor = Object.assign((event, hint)=>callback(event, hint, client), { 21604 id: integration.name 21605 }); 21606 client.addEventProcessor(processor); 21607 } 21608 [ 21609 "processSpan", 21610 "processSegmentSpan"
21611 ].forEach((hook)=>{ 21612 const callback = integration[hook]; 21613 if (typeof callback === "function") { 21614 client.on(hook, (span)=>callback.call(integration, span, client)); 21615 } 21616 }); 21617 __TURBOPACK__imported__module__901020__10["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__15["debug"].log("Integration installed: ".concat(integration.name)); 21618} 21619function addIntegration(integration) { 21620 const client = (0, __TURBOPACK__imported__module__250804__8["getClient"])(); 21621 if (!client) { 21622 __TURBOPACK__imported__module__901020__10["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__15["debug"].warn('Cannot add integration "'.concat(integration.name, '" because no SDK Client is available.')); 21623 return; 21624 } 21625 client.addIntegration(integration); 21626} 21627function defineIntegration(fn) { 21628 return fn; 21629} 21630function extendIntegration(integration, extendedIntegration) { 21631 const wrappedIntegration = { 21632 ...integration, 21633 ...extendedIntegration 21634 }; 21635 for(const key in extendedIntegration){ 21636 const baseValue = integration[key]; 21637 const extendedValue = extendedIntegration[key]; 21638 if (typeof baseValue === "function" && typeof extendedValue === "function") { 21639 const wrappedFunction = new Proxy(baseValue, { 21640 apply: (target, thisArg, args)=>{ 21641 Reflect.apply(target, thisArg, args); 21642 return Reflect.apply(extendedValue, thisArg, args); 21643 } 21644 }); 21645 wrappedIntegration[key] = wrappedFunction; 21646 } 21647 } 21648 return wrappedIntegration; 21649} 21650; 21651// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/instrument/fetch.js [app-client] (ecmascript) 21652; 21653var __TURBOPACK__imported__module__250804__9 = __TURBOPACK__imported__module__250804__; 21654var __TURBOPACK__imported__module__453288__4 = __TURBOPACK__imported__module__453288__; 21655var __TURBOPACK__imported__module__951497__4 = __TURBOPACK__imported__module__951497__; 21656var __TURBOPACK__imported__module__605394__8 = __TURBOPACK__imported__module__605394__; 21657var __TURBOPACK__imported__module__225304__8 = __TURBOPACK__imported__module__225304__; 21658; 21659; 21660; 21661; 21662; 21663; 21664; 21665function addFetchInstrumentationHandler(handler, skipNativeFetchCheck) { 21666 const type = "fetch"; 21667 const removeHandler = addHandler(type, handler); 21668 maybeInstrument(type, ()=>instrumentFetch(void 0, skipNativeFetchCheck)); 21669 return removeHandler; 21670} 21671function addFetchEndInstrumentationHandler(handler) { 21672 const type = "fetch-body-resolved"; 21673 const removeHandler = addHandler(type, handler); 21674 maybeInstrument(type, ()=>instrumentFetch(streamHandler)); 21675 return removeHandler; 21676} 21677function instrumentFetch(onFetchResolved) { 21678 let skipNativeFetchCheck = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false; 21679 if (skipNativeFetchCheck && !supportsNativeFetch()) { 21680 return; 21681 } 21682 (0, __TURBOPACK__imported__module__951497__4["fill"])(__TURBOPACK__imported__module__225304__8["GLOBAL_OBJ"], "fetch", function(originalFetch) { 21683 return function() { 21684 for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++){ 21685 args[_key] = arguments[_key]; 21686 } 21687 const virtualError = new Error(); 21688 const { method, url } = parseFetchArgs(args); 21689 const handlerData = { 21690 args, 21691 fetchData: { 21692 method, 21693 url 21694 }, 21695 startTimestamp: (0, __TURBOPACK__imported__module__605394__8["timestampInSeconds"])() * 1e3, 21696 // // Adding the error to be able to fingerprint the failed fetch event in HttpClient instrumentation 21697 virtualError, 21698 headers: getHeadersFromFetchArgs(args) 21699 }; 21700 if (!onFetchResolved) { 21701 triggerHandlers("fetch", { 21702 ...handlerData 21703 }); 21704 } 21705 return originalFetch.apply(__TURBOPACK__imported__module__225304__8["GLOBAL_OBJ"], args).then(async (response)=>{ 21706 if (onFetchResolved) { 21707 onFetchResolved(response); 21708 } else { 21709 triggerHandlers("fetch", { 21710 ...handlerData, 21711 endTimestamp: (0, __TURBOPACK__imported__module__605394__8["timestampInSeconds"])() * 1e3, 21712 response 21713 }); 21714 } 21715 return response; 21716 }, (error)=>{ 21717 var _ref; 21718 triggerHandlers("fetch", { 21719 ...handlerData, 21720 endTimestamp: (0, __TURBOPACK__imported__module__605394__8["timestampInSeconds"])() * 1e3, 21721 error 21722 }); 21723 if ((0, __TURBOPACK__imported__module__453288__4["isError"])(error) && error.stack === void 0) { 21724 error.stack = virtualError.stack; 21725 (0, __TURBOPACK__imported__module__951497__4["addNonEnumerableProperty"])(error, "framesToPop", 1); 21726 } 21727 const client = (0, __TURBOPACK__imported__module__250804__9["getClient"])(); 21728 const enhanceOption = (_ref = client === null || client === void 0 ? void 0 : client.getOptions().enhanceFetchErrorMessages) !== null && _ref !== void 0 ? _ref : "always"; 21729 const shouldEnhance = enhanceOption !== false; 21730 if (shouldEnhance && (0, __TURBOPACK__imported__module__453288__4["isError"])(error) && error.
21730name === "TypeError" && (error.message === "Failed to fetch" || error.message === "Load failed" || error.message === "NetworkError when attempting to fetch resource.")) { 21731 try { 21732 const url2 = new URL(handlerData.fetchData.url); 21733 const hostname = url2.host; 21734 if (enhanceOption === "always") { 21735 error.message = "".concat(error.message, " (").concat(hostname, ")"); 21736 } else { 21737 (0, __TURBOPACK__imported__module__951497__4["addNonEnumerableProperty"])(error, "__sentry_fetch_url_host__", hostname); 21738 } 21739 } catch (unused) {} 21740 } 21741 throw error; 21742 }); 21743 }; 21744 }); 21745} 21746async function resolveResponse(res, onFinishedResolving) { 21747 if (res === null || res === void 0 ? void 0 : res.body) { 21748 const body = res.body; 21749 const responseReader = body.getReader(); 21750 const maxFetchDurationTimeout = setTimeout(()=>{ 21751 body.cancel().then(null, ()=>{}); 21752 }, 90 * 1e3); 21753 let readingActive = true; 21754 while(readingActive){ 21755 let chunkTimeout; 21756 try { 21757 chunkTimeout = setTimeout(()=>{ 21758 body.cancel().then(null, ()=>{}); 21759 }, 5e3); 21760 const { done } = await responseReader.read(); 21761 clearTimeout(chunkTimeout); 21762 if (done) { 21763 onFinishedResolving(); 21764 readingActive = false; 21765 } 21766 } catch (unused) { 21767 readingActive = false; 21768 } finally{ 21769 clearTimeout(chunkTimeout); 21770 } 21771 } 21772 clearTimeout(maxFetchDurationTimeout); 21773 responseReader.releaseLock(); 21774 body.cancel().then(null, ()=>{}); 21775 } 21776} 21777function streamHandler(response) { 21778 let clonedResponseForResolving; 21779 try { 21780 clonedResponseForResolving = response.clone(); 21781 } catch (unused) { 21782 return; 21783 } 21784 resolveResponse(clonedResponseForResolving, ()=>{ 21785 triggerHandlers("fetch-body-resolved", { 21786 endTimestamp: (0, __TURBOPACK__imported__module__605394__8["timestampInSeconds"])() * 1e3, 21787 response 21788 }); 21789 }); 21790} 21791function hasProp(obj, prop) { 21792 return (0, __TURBOPACK__imported__module__453288__4["isObjectLike"])(obj) && !!obj[prop]; 21793} 21794function getUrlFromResource(resource) { 21795 if (typeof resource === "string") { 21796 return resource; 21797 } 21798 if (!resource) { 21799 return ""; 21800 } 21801 if (hasProp(resource, "url")) { 21802 return resource.url; 21803 } 21804 if (resource.toString) { 21805 return resource.toString(); 21806 } 21807 return ""; 21808} 21809function parseFetchArgs(fetchArgs) { 21810 if (fetchArgs.length === 0) { 21811 return { 21812 method: "GET", 21813 url: "" 21814 }; 21815 } 21816 if (fetchArgs.length === 2) { 21817 const [resource, options] = fetchArgs; 21818 return { 21819 url: getUrlFromResource(resource), 21820 method: hasProp(options, "method") ? String(options.method).toUpperCase() : // Request object as first argument 21821 (0, __TURBOPACK__imported__module__453288__4["isRequest"])(resource) && hasProp(resource, "method") ? String(resource.method).toUpperCase() : "GET" 21822 }; 21823 } 21824 const arg = fetchArgs[0]; 21825 return { 21826 url: getUrlFromResource(arg), 21827 method: hasProp(arg, "method") ? String(arg.method).toUpperCase() : "GET" 21828 }; 21829} 21830function getHeadersFromFetchArgs(fetchArgs) { 21831 const [requestArgument, optionsArgument] = fetchArgs; 21832 try { 21833 if (typeof optionsArgument === "object" && optionsArgument !== null && "headers" in optionsArgument && optionsArgument.headers) { 21834 return new Headers(optionsArgument.headers); 21835 } 21836 if ((0, __TURBOPACK__imported__module__453288__4["isRequest"])(requestArgument)) { 21837 return new Headers(requestArgument.headers); 21838 } 21839 } catch (unused) {} 21840 return; 21841} 21842; 21843var __TURBOPACK__imported__module__519988__10 = __TURBOPACK__imported__module__519988__; 21844; 21845const responseToStreamSpan = /* @__PURE__ */ new WeakMap(); 21846const responseToFallbackTimeout = /* @__PURE__ */ new WeakMap(); 21847const STREAM_RESOLVE_FALLBACK_MS = 9e4; 21848const STREAMING_CONTENT_TYPES = [ 21849 "text/event-stream", 21850 "application/x-ndjson", 21851 "application/stream+json" 21852]; 21853const fetchStreamPerformanceIntegration = defineIntegration(()=>{ 21854 return { 21855 name: "FetchStreamPerformance", 21856 setup () { 21857 addFetchEndInstrumentationHandler((handlerData)=>{ 21858 if (handlerData.response) { 21859 const streamSpan = responseToStreamSpan.get(handlerData.response); 21860 if (streamSpan && handlerData.endTimestamp) { 21861 streamSpan.end(handlerData.endTimestamp); 21862 const fallbackTimeout = responseToFallbackTimeout.get(handlerData.response); 21863 if (fallbackTimeout) { 21864 clearTimeout(fallbackTimeout); 21865 } 21866 } 21867 } 21868 }); 21869 addFetchInstrumentationHandler((handlerData)=>{ 21870 if (handlerData.endTimestamp && handlerData.response) { 21871 var _handlerData_response_headers, _handlerData_response_headers1, _handlerData_fetchData, _handlerData_fetchData1; 21872 const contentType = ((_handlerData_response_headers = handlerData.response.headers) === null || _handlerData_response_headers === void 0 ? void 0 : _handlerData_response_headers.get("content-type")) || ""; 21873 if (((_handlerData_response_headers1 = handlerData.response.headers) === null || _handlerData_response_headers1 === void 0 ? void 0 : _handlerData_response_headers1.get("content-length")) || !STREAMING_CONTENT_TYPES.some((t)=>contentType.startsWith(t))) { 21874 return; 21875 } 21876 const url = ((_handlerData_fetchData = handlerData.fetchData) === null || _handlerData_fetchData === void 0 ? void 0 : _handlerData_fetchData.url) || ""; 21877 const method = ((_handlerData_fetchData1 = handlerData.fetchData) === null || _handlerData_fetchData1 === void 0 ? void 0 : _handlerData_fetchData1.method) || "GET"; 21878 const parsedUrl = parseStringToURLObject(url); 21879 const sanitizedUrl = url.startsWith("data:") ? stripDataUrlContent(url) : parsedUrl ? getSanitizedUrlStringFromUrlObject(parsedUrl) : url; 21880 const streamSpan = startInactiveSpan({ 21881 name: "".concat(method, " ").concat(sanitizedUrl), 21882 startTime: handlerData.endTimestamp, 21883 attributes: { 21884 url: stripDataUrlContent(url), 21885 "http.method": method, 21886 type: "fetch", 21887 [__TURBOPACK__imported__module__519988__10["SEMANTIC_ATTRIBUTE_SENTRY_OP"]]: "http.client.stream", 21888 [__TURBOPACK__imported__module__519988__10["SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN"]]: "auto.http.browser.stream" 21889 } 21890 }); 21891 responseToStreamSpan.set(handlerData.response, streamSpan); 21892 const fallbackTimeout = setTimeout(()=>{ 21893 if (streamSpan.isRecording()) { 21894 streamSpan.end(); 21895 } 21896 }, STREAM_RESOLVE_FALLBACK_MS); 21897 responseToFallbackTimeout.set(handlerData.response, fallbackTimeout); 21898 } 21899 }); 21900 } 21901 }; 21902}); 21903; 21904// MERGED MODULE: [project]/node_modules/@sentry/browser/build/npm/esm/prod/integrations/webVitals.js [app-client] (ecmascript) 21905; 21906// MERGED MODULE: [project]/node_modules/@sentry/browser-utils/build/esm/metrics/inp.js [app-client] (ecmascript) 21907; 21908var __TURBOPACK__imported__module__901538__ = __turbopack_context__.i(901538); 21909var __TURBOPACK__imported__module__605394__9 = __TURBOPACK__imported__module__605394__; 21910var __TURBOPACK__imported__module__304661__10 = __TURBOPACK__imported__module__304661__; 21911var __TURBOPACK__imported__module__250804__10 = __TURBOPACK__imported__module__250804__; 21912var __TURBOPACK__imported__module__519988__11 = __TURBOPACK__imported__module__519988__; 21913; 21914; 21915; 21916; 21917; 21918const LAST_INTERACTIONS = []; 21919const INTERACTIONS_SPAN_MAP = /* @__PURE__ */ new Map(); 21920const ELEMENT_NAME_TIMESTAMP_MAP = /* @__PURE__ */ new Map(); 21921const MAX_PLAUSIBLE_INP_DURATION = 60; 21922function startTrackingINP() { 21923 const performance1 = getBrowserPerformanceAPI(); 21924 if (performance1 && (0, __TURBOPACK__imported__module__605394__9["browserPerformanceTimeOrigin"])()) { 21925 const inpCallback = _trackINP(); 21926 return ()=>{ 21927 inpCallback(); 21928 }; 21929 } 21930 return ()=>void 0; 21931} 21932const INP_ENTRY_MAP = { 21933 click: "click", 21934 pointerdown: "click", 21935 pointerup: "click", 21936 mousedown: "click", 21937 mouseup: "click", 21938 touchstart: "click", 21939 touchend: "click", 21940 mouseover: "hover", 21941 mouseout: "hover", 21942 mouseenter: "hover", 21943 mouseleave: "hover", 21944 pointerover: "hover", 21945 pointerout: "hover", 21946 pointerenter: "hover", 21947 pointerleave: "hover", 21948 dragstart: "drag", 21949 dragend: "drag", 21950 drag: "drag", 21951 dragenter: "drag", 21952 dragleave: "drag", 21953 dragover: "drag", 21954 drop: "drag", 21955 keydown: "press", 21956 keyup: "press", 21957 keypress: "press", 21958 input: "press" 21959}; 21960function _trackINP() { 21961 return addInpInstrumentationHandler(_onInp); 21962} 21963const _onInp = (param)=>{ 21964 let { metric } = param; 21965 if (metric.value == void 0) { 21966 return; 21967 } 21968 const duration = msToSec(metric.value); 21969 if (duration > MAX_PLAUSIBLE_INP_DURATION) { 21970 return; 21971 } 21972 const entry = metric.entries.find((entry2)=>entry2.duration === metric.value && INP_ENTRY_MAP[entry2.name]); 21973 if (!entry) { 21974 return; 21975 } 21976 const { interactionId } = entry; 21977 const interactionType = INP_ENTRY_MAP[entry.name]; 21978 const startTime = msToSec((0, __TURBOPACK__imported__module__605394__9["browserPerformanceTimeOrigin"])() + entry.startTime); 21979 const activeSpan = (0, __TURBOPACK__imported__module__304661__10["getActiveSpan"])(); 21980 const rootSpan = activeSpan ? (0, __TURBOPACK__imported__module__304661__10["getRootSpan"])(activeSpan) : void 0; 21981 const cachedInteractionContext = interactionId != null ? INTERACTIONS_SPAN_MAP.get(interactionId) : void 0; 21982 const spanToUse = (cachedInteractionContext === null || cachedInteractionContext === void 0 ? void 0 : cachedInteractionContext.span) || rootSpan; 21983 const routeName = spanToUse ? (0, __TURBOPACK__imported__module__304661__10["spanToJSON"])(spanToUse).description : (0, __TURBOPACK__imported__module__250804__10["getCurrentScope"])().getScopeData().transactionName; 21984 const name = (cachedInteractionContext === null || cachedInteractionContext === void 0 ? void 0 : cachedInteractionContext.elementName) || htmlTreeAsString1(e
21984ntry.target); 21985 const attributes = { 21986 [__TURBOPACK__imported__module__519988__11["SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN"]]: "auto.http.browser.inp", 21987 [__TURBOPACK__imported__module__519988__11["SEMANTIC_ATTRIBUTE_SENTRY_OP"]]: "ui.interaction.".concat(interactionType), 21988 [__TURBOPACK__imported__module__519988__11["SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME"]]: entry.duration 21989 }; 21990 const span = startStandaloneWebVitalSpan({ 21991 name, 21992 transaction: routeName, 21993 attributes, 21994 startTime 21995 }); 21996 if (span) { 21997 span.addEvent("inp", { 21998 [__TURBOPACK__imported__module__519988__11["SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_UNIT"]]: "millisecond", 21999 [__TURBOPACK__imported__module__519988__11["SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_VALUE"]]: metric.value 22000 }); 22001 span.end(startTime + duration); 22002 } 22003}; 22004function getCachedInteractionContext(interactionId) { 22005 return interactionId != null ? INTERACTIONS_SPAN_MAP.get(interactionId) : void 0; 22006} 22007function registerInpInteractionListener() { 22008 const interactionEvents = Object.keys(INP_ENTRY_MAP); 22009 if ((0, __TURBOPACK__imported__module__901538__["isBrowser"])()) { 22010 interactionEvents.forEach((eventType)=>{ 22011 WINDOW3.addEventListener(eventType, captureElementFromEvent, { 22012 capture: true, 22013 passive: true 22014 }); 22015 }); 22016 } 22017 function captureElementFromEvent(event) { 22018 const target = event.target; 22019 if (!target) { 22020 return; 22021 } 22022 const elementName = htmlTreeAsString1(target); 22023 const timestamp = Math.round(event.timeStamp); 22024 ELEMENT_NAME_TIMESTAMP_MAP.set(timestamp, elementName); 22025 if (ELEMENT_NAME_TIMESTAMP_MAP.size > 50) { 22026 const firstKey = ELEMENT_NAME_TIMESTAMP_MAP.keys().next().value; 22027 if (firstKey !== void 0) { 22028 ELEMENT_NAME_TIMESTAMP_MAP.delete(firstKey); 22029 } 22030 } 22031 } 22032 function resolveElementNameFromEntry(entry) { 22033 const timestamp = Math.round(entry.startTime); 22034 let elementName = ELEMENT_NAME_TIMESTAMP_MAP.get(timestamp); 22035 if (!elementName) { 22036 for(let offset = -5; offset <= 5; offset++){ 22037 const nearbyName = ELEMENT_NAME_TIMESTAMP_MAP.get(timestamp + offset); 22038 if (nearbyName) { 22039 elementName = nearbyName; 22040 break; 22041 } 22042 } 22043 } 22044 return elementName || "<unknown>"; 22045 } 22046 const handleEntries = (param)=>{ 22047 let { entries } = param; 22048 const activeSpan = (0, __TURBOPACK__imported__module__304661__10["getActiveSpan"])(); 22049 const activeRootSpan = activeSpan && (0, __TURBOPACK__imported__module__304661__10["getRootSpan"])(activeSpan); 22050 entries.forEach((entry)=>{ 22051 if (!isPerformanceEventTiming(entry)) { 22052 return; 22053 } 22054 const interactionId = entry.interactionId; 22055 if (interactionId == null) { 22056 return; 22057 } 22058 if (INTERACTIONS_SPAN_MAP.has(interactionId)) { 22059 return; 22060 } 22061 const elementName = entry.target ? htmlTreeAsString1(entry.target) : resolveElementNameFromEntry(entry); 22062 if (LAST_INTERACTIONS.length > 10) { 22063 const last = LAST_INTERACTIONS.shift(); 22064 INTERACTIONS_SPAN_MAP.delete(last); 22065 } 22066 LAST_INTERACTIONS.push(interactionId); 22067 INTERACTIONS_SPAN_MAP.set(interactionId, { 22068 span: activeRootSpan, 22069 elementName 22070 }); 22071 }); 22072 }; 22073 addPerformanceInstrumentationHandler("event", handleEntries); 22074 addPerformanceInstrumentationHandler("first-input", handleEntries); 22075} 22076; 22077// MERGED MODULE: [project]/node_modules/@sentry/browser-utils/build/esm/metrics/webVitalSpans.js [app-client] (ecmascript) 22078; 22079var __TURBOPACK__imported__module__605394__10 = __TURBOPACK__imported__module__605394__; 22080var __TURBOPACK__imported__module__272598__16 = __TURBOPACK__imported__module__272598__; 22081var __TURBOPACK__imported__module__250804__11 = __TURBOPACK__imported__module__250804__; 22082var __TURBOPACK__imported__module__304661__11 = __TURBOPACK__imported__module__304661__; 22083var __TURBOPACK__imported__module__519988__12 = __TURBOPACK__imported__module__519988__; 22084; 22085; 22086; 22087; 22088; 22089; 22090; 22091; 22092; 22093function _emitWebVitalSpan(options) { 22094 var _WINDOW_navigator, _spanToStreamedSpanJSON_attributes; 22095 const { name, op, origin, metricName, value, attributes: passedAttributes, parentSpan, reportEvent, startTime, endTime } = options; 22096 const routeName = (0, __TURBOPACK__imported__module__250804__11["getCurrentScope"])().getScopeData().transactionName; 22097 const attributes = { 22098 [__TURBOPACK__imported__module__519988__12["SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN"]]: origin, 22099 [__TURBOPACK__imported__module__519988__12["SEMANTIC_ATTRIBUTE_SENTRY_OP"]]: op, 22100 [__TURBOPACK__imported__module__519988__12["SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME"]]: 0, 22101 ["browser.web_vital.".concat(metricName, ".value")]: value, 22102 // oxlint-disable-next-line typescript-eslint/no-deprecated 22103 [Xc]: routeName, 22104 [Lc]: routeName, 22105 // Web vital score calculation relies on the user agent 22106 "user_agent.original": (_WINDOW_navigator = WINDOW3.navigator) === null || _WINDOW_navigator === void 0 ? void 0 : _WINDOW_navigator.userAgent, 22107 ...passedAttributes 22108 }; 22109 if (parentSpan && ((_spanToStreamedSpanJSON_attributes = (0, __TURBOPACK__imported__module__304661__11["spanToStreamedSpanJSON"])(parentSpan).attributes) === null || _spanToStreamedSpanJSON_attributes === void 0 ? void 0 : _spanToStreamedSpanJSON_attributes[__TURBOPACK__imported__module__519988__12["SEMANTIC_ATTRIBUTE_SENTRY_OP"]]) === "pageload") { 22110 attributes["sentry.pageload.span_id"] = parentSpan.spanContext().spanId; 22111 } 22112 if (reportEvent) { 22113 attributes["browser.web_vital.".concat(metricName, ".report_event")] = reportEvent; 22114 } 22115 const span = startInactiveSpan({ 22116 name, 22117 attributes, 22118 startTime, 22119 // if we have a pageload span, we let the web vital span start as its parent. This ensures that 22120 // it is not started as a segment span, without having to manually set it to a "standalone" v2 span 22121 // that has `segment: false` but no actual parent span. 22122 parentSpan 22123 }); 22124 if (span) {
22125 span.end(endTime !== null && endTime !== void 0 ? endTime : startTime); 22126 } 22127} 22128function trackLcpAsSpan(client) { 22129 let lcpValue = 0; 22130 let lcpEntry; 22131 if (!supportsWebVital("largest-contentful-paint")) { 22132 return; 22133 } 22134 const cleanupLcpHandler = addLcpInstrumentationHandler((param)=>{ 22135 let { metric } = param; 22136 const entry = metric.entries[metric.entries.length - 1]; 22137 if (!entry || !isValidLcpMetric(metric.value)) { 22138 return; 22139 } 22140 lcpValue = metric.value; 22141 lcpEntry = entry; 22142 }, true); 22143 listenForWebVitalReportEvents(client, (reportEvent, _, pageloadSpan)=>{ 22144 _sendLcpSpan(lcpValue, lcpEntry, pageloadSpan, reportEvent); 22145 cleanupLcpHandler(); 22146 }); 22147} 22148function _sendLcpSpan(lcpValue, entry, pageloadSpan, reportEvent) { 22149 if (!isValidLcpMetric(lcpValue)) { 22150 return; 22151 } 22152 DEBUG_BUILD && __TURBOPACK__imported__module__272598__16["debug"].log("Sending LCP span (".concat(lcpValue, ")")); 22153 const performanceTimeOrigin = (0, __TURBOPACK__imported__module__605394__10["browserPerformanceTimeOrigin"])() || 0; 22154 const timeOrigin = msToSec(performanceTimeOrigin); 22155 const endTime = msToSec(performanceTimeOrigin + ((entry === null || entry === void 0 ? void 0 : entry.startTime) || 0)); 22156 const name = entry ? htmlTreeAsString1(entry.element) : "Largest contentful paint"; 22157 const attributes = {}; 22158 (entry === null || entry === void 0 ? void 0 : entry.element) && (attributes["browser.web_vital.lcp.element"] = htmlTreeAsString1(entry.element)); 22159 (entry === null || entry === void 0 ? void 0 : entry.id) && (attributes["browser.web_vital.lcp.id"] = entry.id); 22160 (entry === null || entry === void 0 ? void 0 : entry.url) && (attributes["browser.web_vital.lcp.url"] = entry.url); 22161 (entry === null || entry === void 0 ? void 0 : entry.loadTime) != null && (attributes["browser.web_vital.lcp.load_time"] = entry.loadTime); 22162 (entry === null || entry === void 0 ? void 0 : entry.renderTime) != null && (attributes["browser.web_vital.lcp.render_time"] = entry.renderTime); 22163 (entry === null || entry === void 0 ? void 0 : entry.size) != null && (attributes["browser.web_vital.lcp.size"] = entry.size); 22164 _emitWebVitalSpan({ 22165 name, 22166 op: "ui.webvital.lcp", 22167 origin: "auto.http.browser.lcp", 22168 metricName: "lcp", 22169 value: lcpValue, 22170 attributes, 22171 parentSpan: pageloadSpan, 22172 reportEvent, 22173 startTime: timeOrigin, 22174 endTime 22175 }); 22176} 22177function trackClsAsSpan(client) { 22178 let clsValue = 0; 22179 let clsEntry; 22180 if (!supportsWebVital("layout-shift")) { 22181 return; 22182 } 22183 const cleanupClsHandler = addClsInstrumentationHandler((param)=>{ 22184 let { metric } = param; 22185 const entry = metric.entries[metric.entries.length - 1]; 22186 if (!entry) { 22187 return; 22188 } 22189 clsValue = metric.value; 22190 clsEntry = entry; 22191 }, true); 22192 listenForWebVitalReportEvents(client, (reportEvent, _, pageloadSpan)=>{ 22193 _sendClsSpan(clsValue, clsEntry, pageloadSpan, reportEvent); 22194 cleanupClsHandler(); 22195 }); 22196} 22197function _sendClsSpan(clsValue, entry, pageloadSpan, reportEvent) { 22198 var _entry_sources_; 22199 DEBUG_BUILD && __TURBOPACK__imported__module__272598__16["debug"].log("Sending CLS span (".concat(clsValue, ")")); 22200 const startTime = entry ? msToSec(((0, __TURBOPACK__imported__module__605394__10["browserPerformanceTimeOrigin"])() || 0) + entry.startTime) : (0, __TURBOPACK__imported__module__605394__10["timestampInSeconds"])(); 22201 const name = entry ? htmlTreeAsString1((_entry_sources_ = entry.sources[0]) === null || _entry_sources_ === void 0 ? void 0 : _entry_sources_.node) : "Layout shift"; 22202 const attributes = {}; 22203 if (entry === null || entry === void 0 ? void 0 : entry.sources) { 22204 entry.sources.forEach((source, index)=>{ 22205 attributes["browser.web_vital.cls.source.".concat(index + 1)] = htmlTreeAsString1(source.node); 22206 }); 22207 } 22208 _emitWebVitalSpan({ 22209 name, 22210 op: "ui.webvital.cls", 22211 origin: "auto.http.browser.cls", 22212 metricName: "cls", 22213 value: clsValue, 22214 attributes, 22215 parentSpan: pageloadSpan, 22216 reportEvent, 22217 startTime 22218 }); 22219} 22220function trackInpAsSpan() { 22221 const performance1 = getBrowserPerformanceAPI(); 22222 if (!performance1 || !(0, __TURBOPACK__imported__module__605394__10["browserPerformanceTimeOrigin"])()) { 22223 return; 22224 } 22225 const onInp = (param)=>{ 22226 let { metric } = param; 22227 if (metric.value == null) { 22228 return; 22229 } 22230 const duration = msToSec(metric.value); 22231 if (duration > MAX_PLAUSIBLE_INP_DURATION) { 22232 return; 22233 } 22234 const entry = metric.entries.find((e)=>e.duration === metric.value && INP_ENTRY_MAP[e.name]); 22235 if (!entry) { 22236 return; 22237 } 22238 _sendInpSpan(metric.value, entry); 22239 }; 22240 addInpInstrumentationHandler(onInp); 22241} 22242function _sendInpSpan(inpValue, entry) { 22243 DEBUG_BUILD && __TURBOPACK__imported__module__272598__16["debug"].log("Sending INP span (".concat(inpValue, ")")); 22244 const startTime = msToSec((0, __TURBOPACK__imported__module__605394__10["browserPerformanceTimeOrigin"])() + entry.startTime); 22245 const duration = msToSec(inpValue); 22246 const interactionType = INP_ENTRY_MAP[entry.name]; 22247 const cachedContext = getCachedInteractionContext(entry.interactionId); 22248 const activeSpan = (0, __TURBOPACK__imported__module__304661__11["getActiveSpan"])(); 22249 const rootSpan = activeSpan ? (0, __TURBOPACK__imported__module__304661__11["getRootSpan"])(activeSpan) : void 0; 22250 const spanToUse = (cachedContext === null || cachedContext === void 0 ? void 0 : cachedContext.span) || rootSpan; 22251 const routeName = spanToUse ? (0, __TURBOPACK__imported__module__304661__11["spanToStreamedSpanJSON"])(spanToUse).name : (0, __TURBOPACK__imported__module__250804__11["getCurrentScope"])().getScopeData().transactionName; 22252 const name = (cachedContext === null || cachedContext === void 0 ? void 0 : cachedContext.elementName) || htmlTreeAsString1(e
22252ntry.target); 22253 _emitWebVitalSpan({ 22254 name, 22255 op: "ui.interaction.".concat(interactionType), 22256 origin: "auto.http.browser.inp", 22257 metricName: "inp", 22258 value: inpValue, 22259 attributes: { 22260 [__TURBOPACK__imported__module__519988__12["SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME"]]: entry.duration, 22261 // oxlint-disable-next-line typescript-eslint/no-deprecated 22262 [Xc]: routeName, 22263 [Lc]: routeName 22264 }, 22265 startTime, 22266 endTime: startTime + duration, 22267 parentSpan: spanToUse 22268 }); 22269} 22270; 22271; 22272; 22273const WEB_VITALS_INTEGRATION_NAME = "WebVitals"; 22274const webVitalsIntegration = defineIntegration(function() { 22275 let options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}; 22276 var _options_ignore; 22277 const ignored = new Set((_options_ignore = options.ignore) !== null && _options_ignore !== void 0 ? _options_ignore : []); 22278 return { 22279 name: WEB_VITALS_INTEGRATION_NAME, 22280 setup (client) { 22281 var _options__experiments; 22282 const spanStreamingEnabled = hasSpanStreamingEnabled(client); 22283 const { enableStandaloneClsSpans, enableStandaloneLcpSpans } = (_options__experiments = options._experiments) !== null && _options__experiments !== void 0 ? _options__experiments : {}; 22284 const recordClsStandaloneSpans = spanStreamingEnabled || ignored.has("cls") ? void 0 : enableStandaloneClsSpans || false; 22285 const recordLcpStandaloneSpans = spanStreamingEnabled || ignored.has("lcp") ? void 0 : enableStandaloneLcpSpans || false; 22286 const finalizeWebVitals = startTrackingWebVitals({ 22287 recordClsStandaloneSpans, 22288 recordLcpStandaloneSpans, 22289 client 22290 }); 22291 const pageloadSpans = /* @__PURE__ */ new WeakSet(); 22292 client.on("afterStartPageLoadSpan", (span)=>{ 22293 pageloadSpans.add(span); 22294 }); 22295 client.on("spanEnd", (span)=>{ 22296 if (!pageloadSpans.delete(span)) { 22297 return; 22298 } 22299 finalizeWebVitals(); 22300 addWebVitalsToSpan(span, { 22301 // CLS/LCP are recorded as pageload span measurements only when they're neither 22302 // tracked as standalone spans nor handled by span streaming (and not ignored). 22303 recordClsOnPageloadSpan: recordClsStandaloneSpans === false, 22304 recordLcpOnPageloadSpan: recordLcpStandaloneSpans === false, 22305 spanStreamingEnabled 22306 }); 22307 }); 22308 if (spanStreamingEnabled) { 22309 if (!ignored.has("lcp")) { 22310 trackLcpAsSpan(client); 22311 } 22312 if (!ignored.has("cls")) { 22313 trackClsAsSpan(client); 22314 } 22315 if (!ignored.has("inp")) { 22316 trackInpAsSpan(); 22317 } 22318 } else if (!ignored.has("inp")) { 22319 startTrackingINP(); 22320 } 22321 }, 22322 afterAllSetup () { 22323 if (!ignored.has("inp")) { 22324 registerInpInteractionListener(); 22325 } 22326 } 22327 }; 22328}); 22329; 22330// MERGED MODULE: [project]/node_modules/@sentry/browser/build/npm/esm/prod/tracing/backgroundtab.js [app-client] (ecmascript) 22331; 22332var __TURBOPACK__imported__module__304661__12 = __TURBOPACK__imported__module__304661__; 22333var __TURBOPACK__imported__module__272598__17 = __TURBOPACK__imported__module__272598__; 22334var __TURBOPACK__imported__module__776710__3 = __TURBOPACK__imported__module__776710__; 22335; 22336; 22337; 22338function registerBackgroundTabDetection() { 22339 if (WINDOW1.document) { 22340 WINDOW1.document.addEventListener("visibilitychange", ()=>{ 22341 const activeSpan = (0, __TURBOPACK__imported__module__304661__12["getActiveSpan"])(); 22342 if (!activeSpan) { 22343 return; 22344 } 22345 const rootSpan = (0, __TURBOPACK__imported__module__304661__12["getRootSpan"])(activeSpan); 22346 if (WINDOW1.document.hidden && rootSpan) { 22347 const cancelledStatus = "cancelled"; 22348 const { op, status } = (0, __TURBOPACK__imported__module__304661__12["spanToJSON"])(rootSpan); 22349 if (DEBUG_BUILD1) { 22350 __TURBOPACK__imported__module__272598__17["debug"].log("[Tracing] Transaction: ".concat(cancelledStatus, " -> since tab moved to the background, op: ").concat(op)); 22351 } 22352 if (!status) { 22353 rootSpan.setStatus({
22354 code: __TURBOPACK__imported__module__776710__3["SPAN_STATUS_ERROR"], 22355 message: cancelledStatus 22356 }); 22357 } 22358 rootSpan.setAttribute("sentry.cancellation_reason", "document.hidden"); 22359 rootSpan.end(); 22360 } 22361 }); 22362 } else { 22363 DEBUG_BUILD1 && __TURBOPACK__imported__module__272598__17["debug"].warn("[Tracing] Could not set up background tab detection due to lack of global document"); 22364 } 22365} 22366; 22367// MERGED MODULE: [project]/node_modules/@sentry/browser/build/npm/esm/prod/tracing/linkedTraces.js [app-client] (ecmascript) 22368; 22369var __TURBOPACK__imported__module__304661__13 = __TURBOPACK__imported__module__304661__; 22370var __TURBOPACK__imported__module__250804__12 = __TURBOPACK__imported__module__250804__; 22371var __TURBOPACK__imported__module__519988__13 = __TURBOPACK__imported__module__519988__; 22372var __TURBOPACK__imported__module__272598__18 = __TURBOPACK__imported__module__272598__; 22373; 22374; 22375; 22376; 22377; 22378; 22379; 22380; 22381; 22382; 22383; 22384; 22385const PREVIOUS_TRACE_MAX_DURATION = 3600; 22386const PREVIOUS_TRACE_KEY = "sentry_previous_trace"; 22387const PREVIOUS_TRACE_TMP_SPAN_ATTRIBUTE = "sentry.previous_trace"; 22388function linkTraces(client, param) { 22389 let { linkPreviousTrace, consistentTraceSampling } = param; 22390 const useSessionStorage = linkPreviousTrace === "session-storage"; 22391 let inMemoryPreviousTraceInfo = useSessionStorage ? getPreviousTraceFromSessionStorage() : void 0; 22392 client.on("spanStart", (span)=>{ 22393 if ((0, __TURBOPACK__imported__module__304661__13["getRootSpan"])(span) !== span) { 22394 return; 22395 } 22396 const oldPropagationContext = (0, __TURBOPACK__imported__module__250804__12["getCurrentScope"])().getPropagationContext(); 22397 inMemoryPreviousTraceInfo = addPreviousTraceSpanLink(inMemoryPreviousTraceInfo, span, oldPropagationContext); 22398 if (useSessionStorage) { 22399 storePreviousTraceInSessionStorage(inMemoryPreviousTraceInfo); 22400 } 22401 }); 22402 let isFirstTraceOnPageload = true; 22403 if (consistentTraceSampling) { 22404 client.on("beforeSampling", (mutableSamplingContextData)=>{ 22405 if (!inMemoryPreviousTraceInfo) { 22406 return; 22407 } 22408 const scope = (0, __TURBOPACK__imported__module__250804__12["getCurrentScope"])(); 22409 const currentPropagationContext = scope.getPropagationContext(); 22410 if (isFirstTraceOnPageload && currentPropagationContext.parentSpanId) { 22411 isFirstTraceOnPageload = false; 22412 return; 22413 } 22414 scope.setPropagationContext({ 22415 ...currentPropagationContext, 22416 dsc: { 22417 ...currentPropagationContext.dsc,
22418 sample_rate: String(inMemoryPreviousTraceInfo.sampleRate), 22419 sampled: String(spanContextSampled(inMemoryPreviousTraceInfo.spanContext)) 22420 }, 22421 sampleRand: inMemoryPreviousTraceInfo.sampleRand 22422 }); 22423 mutableSamplingContextData.parentSampled = spanContextSampled(inMemoryPreviousTraceInfo.spanContext); 22424 mutableSamplingContextData.parentSampleRate = inMemoryPreviousTraceInfo.sampleRate; 22425 mutableSamplingContextData.spanAttributes = { 22426 ...mutableSamplingContextData.spanAttributes, 22427 [__TURBOPACK__imported__module__519988__13["SEMANTIC_ATTRIBUTE_SENTRY_PREVIOUS_TRACE_SAMPLE_RATE"]]: inMemoryPreviousTraceInfo.sampleRate 22428 }; 22429 }); 22430 } 22431} 22432function addPreviousTraceSpanLink(previousTraceInfo, span, oldPropagationContext) { 22433 const spanJson = (0, __TURBOPACK__imported__module__304661__13["spanToJSON"])(span); 22434 function getSampleRate() { 22435 try { 22436 var _ref; 22437 var _spanJson_data, _oldPropagationContext_dsc; 22438 const oldSampleRate = Number((_ref = (_spanJson_data = spanJson.data) === null || _spanJson_data === void 0 ? void 0 : _spanJson_data[__TURBOPACK__imported__module__519988__13["SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE"]]) !== null && _ref !== void 0 ? _ref : (_oldPropagationContext_dsc = oldPropagationContext.dsc) === null || _oldPropagationContext_dsc === void 0 ? void 0 : _oldPropagationContext_dsc.sample_rate); 22439 return Number.isNaN(oldSampleRate) ? 0 : oldSampleRate; 22440 } catch (unused) { 22441 return 0; 22442 } 22443 } 22444 const updatedPreviousTraceInfo = { 22445 spanContext: span.spanContext(), 22446 startTimestamp: spanJson.start_timestamp, 22447 sampleRate: getSampleRate(), 22448 sampleRand: oldPropagationContext.sampleRand 22449 }; 22450 if (!previousTraceInfo) { 22451 return updatedPreviousTraceInfo; 22452 } 22453 const previousTraceSpanCtx = previousTraceInfo.spanContext; 22454 if (previousTraceSpanCtx.traceId === spanJson.trace_id) { 22455 return previousTraceInfo; 22456 } 22457 if (Date.now() / 1e3 - previousTraceInfo.startTimestamp <= PREVIOUS_TRACE_MAX_DURATION) { 22458 if (DEBUG_BUILD1) { 22459 __TURBOPACK__imported__module__272598__18["debug"].log("Adding previous_trace `".concat(JSON.stringify(previousTraceSpanCtx), "` link to span `").concat(JSON.stringify({ 22460 op: spanJson.op, 22461 ...span.spanContext() 22462 }), "`")); 22463 } 22464 span.addLink({ 22465 context: previousTraceSpanCtx, 22466 attributes: { 22467 [__TURBOPACK__imported__module__519988__13["SEMANTIC_LINK_ATTRIBUTE_LINK_TYPE"]]: "previous_trace" 22468 } 22469 }); 22470 span.setAttribute(PREVIOUS_TRACE_TMP_SPAN_ATTRIBUTE, "".concat(previousTraceSpanCtx.traceId, "-").concat(previousTraceSpanCtx.spanId, "-").concat(spanContextSampled(previousTraceSpanCtx) ? 1 : 0)); 22471 } 22472 return updatedPreviousTraceInfo; 22473} 22474function storePreviousTraceInSessionStorage(previousTraceInfo) { 22475 try { 22476 WINDOW1.sessionStorage.setItem(PREVIOUS_TRACE_KEY, JSON.stringify(previousTraceInfo)); 22477 } catch (e) { 22478 DEBUG_BUILD1 && __TURBOPACK__imported__module__272598__18["debug"].warn("Could not store previous trace in sessionStorage", e); 22479 } 22480} 22481function getPreviousTraceFromSessionStorage() { 22482 try { 22483 var _WINDOW_sessionStorage; 22484 const previousTraceInfo = (_WINDOW_sessionStorage = WINDOW1.sessionStorage) === null || _WINDOW_sessionStorage === void 0 ? void 0 : _WINDOW_sessionStorage.getItem(PREVIOUS_TRACE_KEY); 22485 return JSON.parse(previousTraceInfo); 22486 } catch (unused) { 22487 return void 0; 22488 } 22489} 22490function spanContextSampled(ctx) { 22491 return ctx.traceFlags === 1; 22492} 22493; 22494// MERGED MODULE: [project]/node_modules/@sentry/browser/build/npm/esm/prod/tracing/request.js [app-client] (ecmascript) 22495; 22496// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/fetch.js [app-client] (ecmascript) 22497; 22498var __TURBOPACK__imported__module__250804__13 = __TURBOPACK__imported__module__250804__; 22499var __TURBOPACK__imported__module__519988__14 = __TURBOPACK__imported__module__519988__; 22500var __TURBOPACK__imported__module__304661__14 = __TURBOPACK__imported__module__304661__;
22501var __TURBOPACK__imported__module__776710__4 = __TURBOPACK__imported__module__776710__; 22502var __TURBOPACK__imported__module__453288__5 = __TURBOPACK__imported__module__453288__; 22503var __TURBOPACK__imported__module__10008__4 = __TURBOPACK__imported__module__10008__; 22504var __TURBOPACK__imported__module__728469__2 = __TURBOPACK__imported__module__728469__; 22505var __TURBOPACK__imported__module__602309__1 = __TURBOPACK__imported__module__602309__; 22506// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/utils/traceData.js [app-client] (ecmascript) 22507; 22508var __TURBOPACK__imported__module__301263__1 = __TURBOPACK__imported__module__301263__; 22509var __TURBOPACK__imported__module__923288__2 = __TURBOPACK__imported__module__923288__; 22510var __TURBOPACK__imported__module__250804__14 = __TURBOPACK__imported__module__250804__; 22511var __TURBOPACK__imported__module__662537__1 = __TURBOPACK__imported__module__662537__; 22512var __TURBOPACK__imported__module__272598__19 = __TURBOPACK__imported__module__272598__; 22513var __TURBOPACK__imported__module__304661__15 = __TURBOPACK__imported__module__304661__; 22514var __TURBOPACK__imported__module__10008__5 = __TURBOPACK__imported__module__10008__; 22515var __TURBOPACK__imported__module__728469__3 = __TURBOPACK__imported__module__728469__; 22516var __TURBOPACK__imported__module__473753__4 = __TURBOPACK__imported__module__473753__; 22517var __TURBOPACK__imported__module__602309__2 = __TURBOPACK__imported__module__602309__; 22518var __TURBOPACK__imported__module__132584__2 = __TURBOPACK__imported__module__132584__; 22519; 22520; 22521; 22522; 22523; 22524; 22525; 22526; 22527; 22528; 22529; 22530function getTraceData() { 22531 let options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}; 22532 const client = options.client || (0, __TURBOPACK__imported__module__250804__14["getClient"])(); 22533 if (!(0, __TURBOPACK__imported__module__662537__1["isEnabled"])() || !client) { 22534 return {}; 22535 } 22536 const carrier = (0, __TURBOPACK__imported__module__923288__2["getMainCarrier"])(); 22537 const acs = (0, __TURBOPACK__imported__module__301263__1["getAsyncContextStrategy"])(carrier); 22538 if (acs.getTraceData) { 22539 return acs.getTraceData(options); 22540 } 22541 const scope = options.scope || (0, __TURBOPACK__imported__module__250804__14["getCurrentScope"])(); 22542 const span = options.span || (0, __TURBOPACK__imported__module__304661__15["getActiveSpan"])(); 22543 const isTwpPlaceholder = (0, __TURBOPACK__imported__module__728469__3["spanIsNonRecordingSpan"])(span) && !(0, __TURBOPACK__imported__module__10008__5["hasSpansEnabled"])(client.getOptions()); 22544 if (!span && (0, __TURBOPACK__imported__module__250804__14["hasExternalPropagationContext"])()) { 22545 return {}; 22546 } 22547 const sentryTrace = span && !isTwpPlaceholder ? (0, __TURBOPACK__imported__module__304661__15["spanToTraceHeader"])(span) : scopeToTraceHeader(scope); 22548 const dsc = span ? (0, __TURBOPACK__imported__module__473753__4["getDynamicSamplingContextFromSpan"])(span) : (0, __TURBOPACK__imported__module__473753__4["getDynamicSamplingContextFromScope"])(client, scope); 22549 const baggage = (0, __TURBOPACK__imported__module__602309__2["dynamicSamplingContextToSentryBaggageHeader"])(dsc); 22550 const isValidSentryTraceHeader = __TURBOPACK__imported__module__132584__2["TRACEPARENT_REGEXP"].test(sentryTrace); 22551 if (!isValidSentryTraceHeader) { 22552 __TURBOPACK__imported__module__272598__19["debug"].warn("Invalid sentry-trace data. Cannot generate trace data"); 22553 return {}; 22554 } 22555 const traceData = { 22556 "sentry-trace": sentryTrace, 22557 baggage 22558 }; 22559 if (options.propagateTraceparent) { 22560 traceData.traceparent = span && !isTwpPlaceholder ? (0, __TURBOPACK__imported__module__304661__15["spanToTraceparentHeader"])(span) : scopeToTraceparentHeader(scope); 22561 } 22562 return traceData; 22563} 22564function scopeToTraceHeader(scope) { 22565 const { traceId, sampled, propagationSpanId } = scope.getPropagationContext(); 22566 return (0, __TURBOPACK__imported__module__132584__2["generateSentryTraceHeader"])(traceId, propagationSpanId, sampled); 22567} 22568function scopeToTraceparentHeader(scope) { 22569 const { traceId, sampled, propagationSpanId } = scope.getPropagationContext(); 22570 return (0, __TURBOPACK__imported__module__132584__2["generateTraceparentHeader"])(traceId, propagationSpanId, sampled); 22571} 22572; 22573; 22574; 22575; 22576; 22577; 22578; 22579; 22580; 22581; 22582; 22583; 22584; 22585; 22586function instrumentFetchRequest(handlerData, shouldCreateSpan, shouldAttachHeaders, spans, spanOriginOrOptions) { 22587 if (!handlerData.fetchData) { 22588 return void 0; 22589 } 22590 const { method, url } = handlerData.fetchData; 22591 const shouldCreateSpanResult = (0, __TURBOPACK__imported__module__10008__4["hasSpansEnabled"])() && shouldCreateSpan(url); 22592 if (handlerData.endTimestamp) { 22593 const spanId = handlerData.fetchData.__span; 22594 if (!spanId) return; 22595 const span2 = spans[spanId]; 22596 if (span2) { 22597 if (shouldCreateSpanResult) { 22598 endSpan(span2, handlerData); 22599 _callOnRequestSpanEnd(span2, handlerData, spanOriginOrOptions); 22600 } 22601 delete spans[spanId]; 22602 } 22603 return void 0; 22604 } 22605 const { spanOrigin = "auto.http.browser", propagateTraceparent = false } = typeof spanOriginOrOptions === "object" ? spanOriginOrOptions : { 22606 spanOrigin: spanOriginOrOptions 22607 }; 22608 const client = (0, __TURBOPACK__imported__module__250804__13["getClient"])(); 22609 const hasParent = !!(0, __TURBOPACK__imported__module__304661__14["getActiveSpan"])(); 22610 const shouldEmitSpan = hasParent || !!client && hasSpanStreamingEnabled(client); 22611 const span = shouldCreateSpanResult && shouldEmitSpan ? startInactiveSpan(getSpanStartOptions(url, method, spanOrigin)) : new __TURBOPACK__imported__module__728469__2["SentryNonRecordingSpan"](); 22612 const spanForTraceHeaders = spanIsIgnored(span) && hasParent ? void 0 : span; 22613 if (shouldCreateSpanResult && !shouldEmitSpan) { 22614 client === null || client === void 0 ? void 0 : client.re
22614cordDroppedEvent("no_parent_span", "span"); 22615 } 22616 handlerData.fetchData.__span = span.spanContext().spanId; 22617 spans[span.spanContext().spanId] = span; 22618 if (shouldAttachHeaders(handlerData.fetchData.url)) { 22619 const request = handlerData.args[0]; 22620 const options = { 22621 ...handlerData.args[1] || {} 22622 }; 22623 const headers = _INTERNAL_getTracingHeadersForFetchRequest(request, options, // If performance is disabled (TWP) or there's no active root span (pageload/navigation/interaction), 22624 // we do not want to use the span as base for the trace headers, 22625 // which means that the headers will be generated from the scope and the sampling decision is deferred 22626 (0, __TURBOPACK__imported__module__10008__4["hasSpansEnabled"])() && shouldEmitSpan ? spanForTraceHeaders : void 0, propagateTraceparent); 22627 if (headers) { 22628 handlerData.args[1] = options; 22629 options.headers = headers; 22630 } 22631 } 22632 if (client) { 22633 const fetchHint = { 22634 input: handlerData.args, 22635 response: handlerData.response, 22636 startTimestamp: handlerData.startTimestamp, 22637 endTimestamp: handlerData.endTimestamp 22638 }; 22639 client.emit("beforeOutgoingRequestSpan", span, fetchHint); 22640 } 22641 return span; 22642} 22643function _callOnRequestSpanEnd(span, handlerData, spanOriginOrOptions) { 22644 var _handlerData_response; 22645 const onRequestSpanEnd = typeof spanOriginOrOptions === "object" && spanOriginOrOptions !== null ? spanOriginOrOptions.onRequestSpanEnd : void 0; 22646 onRequestSpanEnd === null || onRequestSpanEnd === void 0 ? void 0 : onRequestSpanEnd(span, { 22647 headers: (_handlerData_response = handlerData.response) === null || _handlerData_response === void 0 ? void 0 : _handlerData_response.headers, 22648 error: handlerData.error 22649 }); 22650} 22651function _INTERNAL_getTracingHeadersForFetchRequest(request, fetchOptionsObj, span, propagateTraceparent) { 22652 const traceHeaders = getTraceData({ 22653 span, 22654 propagateTraceparent 22655 }); 22656 const sentryTrace = traceHeaders["sentry-trace"]; 22657 const baggage = traceHeaders.baggage; 22658 const traceparent = traceHeaders.traceparent; 22659 if (!sentryTrace) { 22660 return void 0; 22661 } 22662 const originalHeaders = fetchOptionsObj.headers || ((0, __TURBOPACK__imported__module__453288__5["isRequest"])(request) ? request.headers : void 0); 22663 if (!originalHeaders) { 22664 return { 22665 "sentry-trace": sentryTrace, 22666 ...baggage && { 22667 baggage 22668 }, 22669 ...traceparent && { 22670 traceparent 22671 } 22672 }; 22673 } else if (isHeaders(originalHeaders)) { 22674 const newHeaders = new Headers(originalHeaders); 22675 if (!newHeaders.get("sentry-trace")) { 22676 newHeaders.set("sentry-trace", sentryTrace); 22677 } 22678 if (propagateTraceparent && traceparent && !newHeaders.get("traceparent")) { 22679 newHeaders.set("traceparent", traceparent); 22680 } 22681 if (baggage) { 22682 const prevBaggageHeader = newHeaders.get("baggage"); 22683 if (!prevBaggageHeader) { 22684 newHeaders.set("baggage", baggage); 22685 } else if (!baggageHeaderHasSentryBaggageValues(prevBaggageHeader)) { 22686 newHeaders.set("baggage", "".concat(prevBaggageHeader, ",").concat(baggage)); 22687 } 22688 } 22689 return newHeaders; 22690 } else if (isHeadersInitTupleArray(originalHeaders)) { 22691 const newHeaders = [ 22692 ...originalHeaders 22693 ]; 22694 if (!newHeaders.find((header)=>header[0] === "sentry-trace")) { 22695 newHeaders.push([ 22696 "sentry-trace", 22697 sentryTrace 22698 ]); 22699 } 22700 if (propagateTraceparent && traceparent && !newHeaders.find((header)=>header[0] === "traceparent")) { 22701 newHeaders.push([ 22702 "traceparent", 22703 traceparent 22704 ]); 22705 } 22706 const prevBaggageHeaderWithSentryValues = originalHeaders.find((header)=>header[0] === "baggage" && typeof header[1] === "string" && baggageHeaderHasSentryBaggageValues(header[1])); 22707 if (baggage && !prevBaggageHeaderWithSentryValues) { 22708 newHeaders.push([ 22709 "baggage", 22710 baggage 22711 ]); 22712 } 22713 return newHeaders; 22714 } else { 22715 const existingSentryTraceHeader = "sentry-trace" in originalHeaders ? originalHeaders["sentry-trace"] : void 0; 22716 const existingTraceparentHeader = "traceparent" in originalHeaders ? originalHeaders.traceparent : void 0; 22717 const existingBaggageHeader = "baggage" in originalHeaders ? originalHeaders.baggage : void 0; 22718 const newBaggageHeaders = existingBaggageHeader ? Array.isArray(existingBaggageHeader) ? [ 22719 ...existingBaggageHeader 22720 ] : [ 22721 existingBaggageHeader 22722 ] : []; 22723 const prevBaggageHeaderWithSentryValues = existingBaggageHeader && (Array.isArray(existingBaggageHeader) ? existingBaggageHeader.find((headerItem)=>baggageHeaderHasSentryBaggageValues(headerItem)) : baggageHeaderHasSentryBaggageValues(existingBaggageHeader)); 22724 if (baggage && !prevBaggageHeaderWithSentryValues) { 22725 newBaggageHeaders.push(baggage); 22726 } 22727 const newHeaders = Object.assign({}, originalHeaders, { 22728 "sentry-trace": existingSentryTraceHeader !== null && existingSentryTraceHeader !== void 0 ? existingSentryTraceHeader : sentryTrace, 22729 ...newBaggageHeaders.length > 0 && { 22730 baggage: newBaggageHeaders.join(",") 22731 } 22732 }); 22733 if (propagateTraceparent && traceparent && !existingTraceparentHeader) { 22734 newHeaders.traceparent = traceparent; 22735 } 22736 return newHeaders; 22737 } 22738} 22739function endSpan(span, handlerData) { 22740 if (handlerData.response) { 22741 var _handlerData_response_headers, _handlerData_response;
22742 (0, __TURBOPACK__imported__module__776710__4["setHttpStatus"])(span, handlerData.response.status); 22743 const contentLength = (_handlerData_response = handlerData.response) === null || _handlerData_response === void 0 ? void 0 : (_handlerData_response_headers = _handlerData_response.headers) === null || _handlerData_response_headers === void 0 ? void 0 : _handlerData_response_headers.get("content-length"); 22744 if (contentLength) { 22745 const contentLengthNum = parseInt(contentLength); 22746 if (contentLengthNum > 0) { 22747 span.setAttribute("http.response_content_length", contentLengthNum); 22748 } 22749 } 22750 } else if (handlerData.error) { 22751 span.setStatus({ 22752 code: __TURBOPACK__imported__module__776710__4["SPAN_STATUS_ERROR"], 22753 message: "internal_error" 22754 }); 22755 } 22756 span.end(); 22757} 22758function baggageHeaderHasSentryBaggageValues(baggageHeader) { 22759 if (typeof baggageHeader !== "string") { 22760 return false; 22761 } 22762 return baggageHeader.split(",").some((baggageEntry)=>baggageEntry.trim().startsWith(__TURBOPACK__imported__module__602309__1["SENTRY_BAGGAGE_KEY_PREFIX"])); 22763} 22764function isHeaders(headers) { 22765 return typeof Headers !== "undefined" && (0, __TURBOPACK__imported__module__453288__5["isInstanceOf"])(headers, Headers); 22766} 22767function isHeadersInitTupleArray(headers) { 22768 if (!Array.isArray(headers)) { 22769 return false; 22770 } 22771 return headers.every((item)=>Array.isArray(item) && item.length === 2 && typeof item[0] === "string"); 22772} 22773function getSpanStartOptions(url, method, spanOrigin) { 22774 if (url.startsWith("data:")) { 22775 const sanitizedUrl2 = stripDataUrlContent(url); 22776 return { 22777 name: "".concat(method, " ").concat(sanitizedUrl2), 22778 attributes: getFetchSpanAttributes(url, void 0, method, spanOrigin) 22779 }; 22780 } 22781 const parsedUrl = parseStringToURLObject(url); 22782 const sanitizedUrl = parsedUrl ? getSanitizedUrlStringFromUrlObject(parsedUrl) : url; 22783 return { 22784 name: "".concat(method, " ").concat(sanitizedUrl), 22785 attributes: getFetchSpanAttributes(url, parsedUrl, method, spanOrigin) 22786 }; 22787} 22788function getFetchSpanAttributes(url, parsedUrl, method, spanOrigin) { 22789 const attributes = { 22790 url: stripDataUrlContent(url), 22791 type: "fetch", 22792 "http.method": method, 22793 [__TURBOPACK__imported__module__519988__14["SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN"]]: spanOrigin, 22794 [__TURBOPACK__imported__module__519988__14["SEMANTIC_ATTRIBUTE_SENTRY_OP"]]: "http.client" 22795 }; 22796 if (parsedUrl) { 22797 if (!isURLObjectRelative(parsedUrl)) { 22798 attributes[ws] = stripDataUrlContent(parsedUrl.href); 22799 attributes[Yu] = stripDataUrlContent(parsedUrl.href); 22800 attributes["server.address"] = parsedUrl.host; 22801 } 22802 if (parsedUrl.search) { 22803 attributes["http.query"] = parsedUrl.search; 22804 } 22805 if (parsedUrl.hash) { 22806 attributes["http.fragment"] = parsedUrl.hash; 22807 } 22808 } 22809 return attributes; 22810} 22811; 22812var __TURBOPACK__imported__module__304661__16 = __TURBOPACK__imported__module__304661__; 22813var __TURBOPACK__imported__module__605394__11 = __TURBOPACK__imported__module__605394__; 22814var __TURBOPACK__imported__module__10008__6 = __TURBOPACK__imported__module__10008__; 22815var __TURBOPACK__imported__module__776710__5 = __TURBOPACK__imported__module__776710__; 22816var __TURBOPACK__imported__module__250804__15 = __TURBOPACK__imported__module__250804__; 22817var __TURBOPACK__imported__module__519988__15 = __TURBOPACK__imported__module__519988__; 22818var __TURBOPACK__imported__module__728469__4 = __TURBOPACK__imported__module__728469__; 22819var __TURBOPACK__imported__module__821593__2 = __TURBOPACK__imported__module__821593__; 22820// MERGED MODULE: [project]/node_modules/@sentry/browser-utils/build/esm/instrument/xhr.js [app-client] (ecmascript) 22821; 22822var __TURBOPACK__imported__module__605394__12 = __TURBOPACK__imported__module__605394__; 22823var __TURBOPACK__imported__module__453288__6 = __TURBOPACK__imported__module__453288__; 22824; 22825; 22826const SENTRY_XHR_DATA_KEY = "__sentry_xhr_v3__"; 22827function addXhrInstrumentationHandler(handler) { 22828 const type = "xhr"; 22829 addHandler(type, handler); 22830 maybeInstrument(type, instrumentXHR); 22831} 22832function instrumentXHR() { 22833 if (!WINDOW3.XMLHttpRequest) { 22834 return; 22835 } 22836 const xhrproto = XMLHttpRequest.prototype; 22837 xhrproto.open = new Proxy(xhrproto.open, { 22838 apply (originalOpen, xhrOpenThisArg, xhrOpenArgArray) { 22839 const virtualError = new Error(); 22840 const startTimestamp = (0, __TURBOPACK__imported__module__605394__12["timestampInSeconds"])() * 1e3; 22841 const method = (0, __TURBOPACK__imported__module__453288__6["isString"])(xhrOpenArgArray[0]) ? xhrOpenArgArray[0].toUpperCase() : void 0; 22842 const url = parseXhrUrlArg(xhrOpenArgArray[1]); 22843 if (!method || !url) { 22844 return originalOpen.apply(xhrOpenThisArg, xhrOpenArgArray); 22845 } 22846 xhrOpenThisArg[SENTRY_XHR_DATA_KEY] = { 22847 method, 22848 url, 22849 request_headers: {} 22850 };
22851 if (method === "POST" && url.match(/sentry_key/)) { 22852 xhrOpenThisArg.__sentry_own_request__ = true; 22853 } 22854 const onreadystatechangeHandler = ()=>{ 22855 const xhrInfo = xhrOpenThisArg[SENTRY_XHR_DATA_KEY]; 22856 if (!xhrInfo) { 22857 return; 22858 } 22859 if (xhrOpenThisArg.readyState === 4) { 22860 try { 22861 xhrInfo.status_code = xhrOpenThisArg.status; 22862 } catch (unused) {} 22863 const handlerData = { 22864 endTimestamp: (0, __TURBOPACK__imported__module__605394__12["timestampInSeconds"])() * 1e3, 22865 startTimestamp, 22866 xhr: xhrOpenThisArg, 22867 virtualError 22868 }; 22869 triggerHandlers("xhr", handlerData); 22870 xhrOpenThisArg.removeEventListener("readystatechange", onreadystatechangeHandler); 22871 } 22872 }; 22873 if ("onreadystatechange" in xhrOpenThisArg && typeof xhrOpenThisArg.onreadystatechange === "function") { 22874 xhrOpenThisArg.onreadystatechange = new Proxy(xhrOpenThisArg.onreadystatechange, { 22875 apply (originalOnreadystatechange, onreadystatechangeThisArg, onreadystatechangeArgArray) { 22876 onreadystatechangeHandler(); 22877 return originalOnreadystatechange.apply(onreadystatechangeThisArg, onreadystatechangeArgArray); 22878 } 22879 }); 22880 } else { 22881 xhrOpenThisArg.addEventListener("readystatechange", onreadystatechangeHandler); 22882 } 22883 xhrOpenThisArg.setRequestHeader = new Proxy(xhrOpenThisArg.setRequestHeader, { 22884 apply (originalSetRequestHeader, setRequestHeaderThisArg, setRequestHeaderArgArray) { 22885 const [header, value] = setRequestHeaderArgArray; 22886 const xhrInfo = setRequestHeaderThisArg[SENTRY_XHR_DATA_KEY]; 22887 if (xhrInfo && (0, __TURBOPACK__imported__module__453288__6["isString"])(header) && (0, __TURBOPACK__imported__module__453288__6["isString"])(value)) { 22888 xhrInfo.request_headers[header.toLowerCase()] = value; 22889 } 22890 return originalSetRequestHeader.apply(setRequestHeaderThisArg, setRequestHeaderArgArray); 22891 } 22892 }); 22893 return originalOpen.apply(xhrOpenThisArg, xhrOpenArgArray); 22894 } 22895 }); 22896 xhrproto.send = new Proxy(xhrproto.send, { 22897 apply (originalSend, sendThisArg, sendArgArray) { 22898 const sentryXhrData = sendThisArg[SENTRY_XHR_DATA_KEY]; 22899 if (!sentryXhrData) { 22900 return originalSend.apply(sendThisArg, sendArgArray); 22901 } 22902 if (sendArgArray[0] !== void 0) { 22903 sentryXhrData.body = sendArgArray[0]; 22904 } 22905 const handlerData = { 22906 startTimestamp: (0, __TURBOPACK__imported__module__605394__12["timestampInSeconds"])() * 1e3, 22907 xhr: sendThisArg 22908 }; 22909 triggerHandlers("xhr", handlerData); 22910 return originalSend.apply(sendThisArg, sendArgArray); 22911 } 22912 }); 22913} 22914function parseXhrUrlArg(url) { 22915 if ((0, __TURBOPACK__imported__module__453288__6["isString"])(url)) { 22916 return url; 22917 } 22918 try { 22919 return url.toString(); 22920 } catch (unused) {} 22921 return void 0; 22922} 22923; 22924// MERGED MODULE: [project]/node_modules/@sentry/browser-utils/build/esm/networkUtils.js [app-client] (ecmascript) 22925; 22926var __TURBOPACK__imported__module__272598__20 = __TURBOPACK__imported__module__272598__; 22927; 22928; 22929const ORIGINAL_REQ_BODY = /* @__PURE__ */ Symbol.for("sentry__originalRequestBody"); 22930function serializeFormData(formData) { 22931 return new URLSearchParams(formData).toString(); 22932} 22933function getBodyString(body) { 22934 let _debug = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : __TURBOPACK__imported__module__272598__20["debug"]; 22935 try { 22936 if (typeof body === "string") { 22937 return [ 22938 body 22939 ]; 22940 } 22941 if (body instanceof URLSearchParams) { 22942 return [ 22943 body.toString() 22944 ]; 22945 } 22946 if (body instanceof FormData) { 22947 return [ 22948 serializeFormData(body) 22949 ]; 22950 } 22951 if (!body) { 22952 return [ 22953 void 0 22954 ]; 22955 } 22956 } catch (error) { 22957 DEBUG_BUILD && _debug.error(error, "Failed to serialize body", body); 22958 return [ 22959 void 0, 22960 "BODY_PARSE_ERROR" 22961 ]; 22962 } 22963 DEBUG_BUILD && _debug.log("Skipping network body because of body type", body); 22964 return [ 22965 void 0, 22966 "UNPARSEABLE_BODY_TYPE" 22967 ]; 22968} 22969function getFetchRequestArgBody() { 22970 let fetchArgs = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : []; 22971 if (fetchArgs.length >= 2 && fetchArgs[1] && typeof fetchArgs[1] === "object" && "body" in fetchArgs[1]) { 22972 return fetchArgs[1].body; 22973 } 22974 if (fetchArgs.length >= 1 && fetchArgs[0] instanceof Request) { 22975 const request = fetchArgs[0]; 22976 const originalBody = request[ORIGINAL_REQ_BODY]; 22977 if (originalBody !== void 0) { 22978 return originalBody; 22979 } 22980 return void 0; 22981 } 22982 return void 0; 22983} 22984function parseXhrResponseHeaders(xhr) { 22985 let headers; 22986 try { 22987 headers = xhr.getAllResponseHeaders(); 22988 } catch (error) { 22989 DEBUG_BUILD && __TURBOPACK__imported__module__272598__20["debug"].error(error, "Failed to get xhr response headers", xhr); 22990 return {}; 22991 } 22992 if (!headers) { 22993 return {}; 22994 } 22995 return headers.split("\r\n").reduce((acc, line)=>{ 22996 const [key, value] = line.split(": "); 22997 if (value) { 22998 acc[key.toLowerCase()] = value; 22999 } 23000 return acc; 23001 }, {}); 23002} 23003; 23004// MERGED MODULE: [project]/node_modules/@sentry/browser/build/npm/esm/prod/tracing/utils.js [app-client] (ecmascript) 23005; 23006; 23007function baggageHeaderHasSentryValues(baggageHeader) { 23008 return baggageHeader.split(",").some((value)=>value.trim().startsWith("sentry-")); 23009} 23010function getFullURL(url) { 23011 try { 23012 const parsed = new URL(url, WINDOW1.location.origin); 23013 return parsed.href; 23014 } catch (unused) { 23015 return void 0; 23016 } 23017} 23018function isPerformanceResourceTiming(entry) { 23019 return entry.entryType === "resource" && "initiatorType" in entry && typeof entry.nextHopProtocol === "string" && (entry.initiatorType === "fetch" || entry.initiatorType === "xmlhttprequest"); 23020} 23021function createHeadersSafely(headers) { 23022 try { 23023 return new Headers(headers); 23024 } catch (unused) { 23025 return void 0; 23026 } 23027} 23028; 23029; 23030; 23031; 23032; 23033const defaultRequestInstrumentationOptions = { 23034 traceFetch: true, 23035 traceXHR: true, 23036 enableHTTPTimings: true, 23037 trackFetchStreamPerformance: false 23038}; 23039function instrumentOutgoingRequests(client, _options) { 23040 const { traceFetch, traceXHR, shouldCreateSpanForRequest, enableHTTPTimings, tracePropagationTargets, onRequestSpanStart, onRequestSpanEnd } = { 23041 ...defaultRequestInstrumentationOptions, 23042 ..._options 23043 }; 23044 const shouldCreateSpan = typeof shouldCreateSpanForRequest === "function" ? shouldCreateSpanForRequest : (_)=>true; 23045 const shouldAttachHeadersWithTargets = (url)=>shouldAttachHeaders(url, tracePropagationTargets); 23046 const spans = {}; 23047 const propagateTraceparent = client.getOptions().propagateTraceparent; 23048 if (traceFetch) { 23049 addFetchInstrumentationHandler((handlerData)=>{ 23050 const createdSpan = instrumentFetchRequest(handlerData, shouldCreateSpan, shouldAttachHeadersWithTargets, spans, { 23051 propagateTraceparent, 23052 onRequestSpanEnd 23053 }); 23054 if (createdSpan) { 23055 const fullUrl = getFullURL(handlerData.fetchData.url); 23056 const host = fullUrl ? parseUrl(fullUrl).host : void 0;
23057 const sanitizedFullUrl = fullUrl ? stripDataUrlContent(fullUrl) : void 0; 23058 createdSpan.setAttributes({ 23059 // oxlint-disable-next-line typescript/no-deprecated 23060 [ws]: sanitizedFullUrl, 23061 // `url.full` must match `http.url`. Setting it here ensures parentless `http.client` 23062 // segment spans don't get `url.full` backfilled with the host page URL (see httpContextIntegration). 23063 [Yu]: sanitizedFullUrl, 23064 "server.address": host 23065 }); 23066 if (enableHTTPTimings) { 23067 addHTTPTimings(createdSpan, client); 23068 } 23069 onRequestSpanStart === null || onRequestSpanStart === void 0 ? void 0 : onRequestSpanStart(createdSpan, { 23070 headers: handlerData.headers 23071 }); 23072 } 23073 }); 23074 } 23075 if (traceXHR) { 23076 addXhrInstrumentationHandler((handlerData)=>{ 23077 const createdSpan = xhrCallback(handlerData, shouldCreateSpan, shouldAttachHeadersWithTargets, spans, propagateTraceparent, onRequestSpanEnd); 23078 if (createdSpan) { 23079 var _handlerData_xhr___sentry_xhr_v3__; 23080 if (enableHTTPTimings) { 23081 addHTTPTimings(createdSpan, client); 23082 } 23083 onRequestSpanStart === null || onRequestSpanStart === void 0 ? void 0 : onRequestSpanStart(createdSpan, { 23084 headers: createHeadersSafely((_handlerData_xhr___sentry_xhr_v3__ = handlerData.xhr.__sentry_xhr_v3__) === null || _handlerData_xhr___sentry_xhr_v3__ === void 0 ? void 0 : _handlerData_xhr___sentry_xhr_v3__.request_headers) 23085 }); 23086 } 23087 }); 23088 } 23089} 23090const HTTP_TIMING_WAIT_MS = 300; 23091function addHTTPTimings(span, client) { 23092 const { url } = (0, __TURBOPACK__imported__module__304661__16["spanToJSON"])(span).data; 23093 if (!url || typeof url !== "string") { 23094 return; 23095 } 23096 let onEntryFound = ()=>void setTimeout(unsubscribePerformanceObsever); 23097 if (hasSpanStreamingEnabled(client)) { 23098 const originalEnd = span.end.bind(span); 23099 span.end = (endTimestamp)=>{ 23100 const capturedEndTimestamp = endTimestamp !== null && endTimestamp !== void 0 ? endTimestamp : (0, __TURBOPACK__imported__module__605394__11["timestampInSeconds"])(); 23101 let isEnded = false; 23102 const endSpanAndCleanup = ()=>{ 23103 if (isEnded) { 23104 return; 23105 } 23106 isEnded = true; 23107 setTimeout(unsubscribePerformanceObsever); 23108 originalEnd(capturedEndTimestamp); 23109 clearTimeout(fallbackTimeout); 23110 }; 23111 onEntryFound = endSpanAndCleanup; 23112 const fallbackTimeout = setTimeout(endSpanAndCleanup, HTTP_TIMING_WAIT_MS); 23113 }; 23114 } 23115 const unsubscribePerformanceObsever = addPerformanceInstrumentationHandler("resource", (param)=>{ 23116 let { entries } = param; 23117 entries.forEach((entry)=>{ 23118 if (isPerformanceResourceTiming(entry) && entry.name.endsWith(url)) { 23119 span.setAttributes(resourceTimingToSpanAttributes(entry)); 23120 onEntryFound(); 23121 } 23122 }); 23123 }); 23124} 23125function shouldAttachHeaders(targetUrl, tracePropagationTargets) { 23126 const href = getLocationHref(); 23127 if (!href) { 23128 const isRelativeSameOriginRequest = !!targetUrl.match(/^\/(?!\/)/); 23129 if (!tracePropagationTargets) { 23130 return isRelativeSameOriginRequest; 23131 } else { 23132 return (0, __TURBOPACK__imported__module__821593__2["stringMatchesSomePattern"])(targetUrl, tracePropagationTargets); 23133 } 23134 } else { 23135 let resolvedUrl; 23136 let currentOrigin; 23137 try { 23138 resolvedUrl = new URL(targetUrl, href); 23139 currentOrigin = new URL(href).origin; 23140 } catch (unused) { 23141 return false; 23142 } 23143 const isSameOriginRequest = resolvedUrl.origin === currentOrigin; 23144 if (!tracePropagationTargets) { 23145 return isSameOriginRequest; 23146 } else { 23147 return (0, __TURBOPACK__imported__module__821593__2["stringMatchesSomePattern"])(resolvedUrl.toString(), tracePropagationTargets) || isSameOriginRequest && (0, __TURBOPACK__imported__module__821593__2["stringMatchesSomePattern"])(resolvedUrl.pathname, tracePropagationTargets); 23148 } 23149 } 23150}
23151function xhrCallback(handlerData, shouldCreateSpan, shouldAttachHeaders2, spans, propagateTraceparent, onRequestSpanEnd) { 23152 const xhr = handlerData.xhr; 23153 const sentryXhrData = xhr === null || xhr === void 0 ? void 0 : xhr[SENTRY_XHR_DATA_KEY]; 23154 if (!xhr || xhr.__sentry_own_request__ || !sentryXhrData) { 23155 return void 0; 23156 } 23157 const { url, method } = sentryXhrData; 23158 const shouldCreateSpanResult = (0, __TURBOPACK__imported__module__10008__6["hasSpansEnabled"])() && shouldCreateSpan(url); 23159 if (handlerData.endTimestamp) { 23160 const spanId = xhr.__sentry_xhr_span_id__; 23161 if (!spanId) return; 23162 const span2 = spans[spanId]; 23163 if (span2) { 23164 if (shouldCreateSpanResult && sentryXhrData.status_code !== void 0) { 23165 (0, __TURBOPACK__imported__module__776710__5["setHttpStatus"])(span2, sentryXhrData.status_code); 23166 span2.end(); 23167 onRequestSpanEnd === null || onRequestSpanEnd === void 0 ? void 0 : onRequestSpanEnd(span2, { 23168 headers: createHeadersSafely(parseXhrResponseHeaders(xhr)), 23169 error: handlerData.error 23170 }); 23171 } 23172 delete spans[spanId]; 23173 } 23174 return void 0; 23175 } 23176 const fullUrl = getFullURL(url); 23177 const parsedUrl = fullUrl ? parseUrl(fullUrl) : parseUrl(url); 23178 const sanitizedFullUrl = fullUrl ? stripDataUrlContent(fullUrl) : void 0; 23179 const urlForSpanName = stripDataUrlContent(stripUrlQueryAndFragment(url)); 23180 const client = (0, __TURBOPACK__imported__module__250804__15["getClient"])(); 23181 const hasParent = !!(0, __TURBOPACK__imported__module__304661__16["getActiveSpan"])(); 23182 const shouldEmitSpan = hasParent || !!client && hasSpanStreamingEnabled(client); 23183 const span = shouldCreateSpanResult && shouldEmitSpan ? startInactiveSpan({ 23184 name: "".concat(method, " ").concat(urlForSpanName), 23185 attributes: { 23186 url: stripDataUrlContent(url), 23187 type: "xhr", 23188 "http.method": method, 23189 "http.url": sanitizedFullUrl, 23190 // `url.full` must match `http.url`. Setting it here ensures parentless `http.client` 23191 // segment spans don't get `url.full` backfilled with the host page URL (see httpContextIntegration). 23192 [Yu]: sanitizedFullUrl, 23193 "server.address": parsedUrl === null || parsedUrl === void 0 ? void 0 : parsedUrl.host, 23194 [__TURBOPACK__imported__module__519988__15["SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN"]]: "auto.http.browser", 23195 [__TURBOPACK__imported__module__519988__15["SEMANTIC_ATTRIBUTE_SENTRY_OP"]]: "http.client", 23196 ...(parsedUrl === null || parsedUrl === void 0 ? void 0 : parsedUrl.search) && { 23197 "http.query": parsedUrl === null || parsedUrl === void 0 ? void 0 : parsedUrl.search 23198 }, 23199 ...(parsedUrl === null || parsedUrl === void 0 ? void 0 : parsedUrl.hash) && { 23200 "http.fragment": parsedUrl === null || parsedUrl === void 0 ? void 0 : parsedUrl.hash 23201 } 23202 } 23203 }) : new __TURBOPACK__imported__module__728469__4["SentryNonRecordingSpan"](); 23204 const spanForTraceHeaders = spanIsIgnored(span) && hasParent ? void 0 : span; 23205 if (shouldCreateSpanResult && !shouldEmitSpan) { 23206 client === null || client === void 0 ? void 0 : client.recordDroppedEvent("no_parent_span", "span"); 23207 } 23208 xhr.__sentry_xhr_span_id__ = span.spanContext().spanId; 23209 spans[xhr.__sentry_xhr_span_id__] = span; 23210 if (shouldAttachHeaders2(url)) { 23211 addTracingHeadersToXhrRequest(xhr, // If performance is disabled (TWP) or there's no active root span (pageload/navigation/interaction), 23212 // we do not want to use the span as base for the trace headers, 23213 // which means that the headers will be generated from the scope and the sampling decision is deferred 23214 (0, __TURBOPACK__imported__module__10008__6["hasSpansEnabled"])() && shouldEmitSpan ? spanForTraceHeaders : void 0, propagateTraceparent); 23215 } 23216 if (client) { 23217 client.emit("beforeOutgoingRequestSpan", span, handlerData); 23218 } 23219 return span; 23220} 23221function addTracingHeadersToXhrRequest(xhr, span, propagateTraceparent) { 23222 const { "sentry-trace": sentryTrace, baggage, traceparent } = getTraceData({ 23223 span, 23224 propagateTraceparent 23225 }); 23226 if (sentryTrace) { 23227 setHeaderOnXhr(xhr, sentryTrace, baggage, traceparent); 23228 } 23229} 23230function setHeaderOnXhr(xhr, sentryTraceHeader, sentryBaggageHeader, traceparentHeader) { 23231 var _xhr___sentry_xhr_v3__; 23232 const originalHeaders = (_xhr___sentry_xhr_v3__ = xhr.__sentry_xhr_v3__) === null || _xhr___sentry_xhr_v3__ === void 0 ? void 0 : _xhr___sentry_xhr_v3__.request_headers; 23233 if ((originalHeaders === null || originalHeaders === void 0 ? void 0 : originalHeaders["sentry-trace"]) || !xhr.setRequestHeader) { 23234 return; 23235 } 23236 try { 23237 xhr.setRequestHeader("sentry-trace", sentryTraceHeader); 23238 if (traceparentHeader && !(originalHeaders === null || originalHeaders === void 0 ? void 0 : originalHeaders["traceparent"])) { 23239 xhr.setRequestHeader("traceparent", traceparentHeader); 23240 } 23241 if (sentryBaggageHeader) { 23242 const originalBaggageHeader = originalHeaders === null || originalHeaders === void 0 ? void 0 : originalHeaders["baggage"]; 23243 if (!originalBaggageHeader || !baggageHeaderHasSentryValues(originalBaggageHeader)) { 23244 xhr.setRequestHeader("baggage", sentryBaggageHeader); 23245 } 23246 } 23247 } catch (unused) {} 23248} 23249; 23250; 23251; 23252; 23253; 23254; 23255; 23256; 23257; 23258; 23259; 23260const BROWSER_TRACING_INTEGRATION_ID = "BrowserTracing"; 23261const BOT_USER_AGENT_RE = /Googlebot|Google-InspectionTool|Storebot-Google|Bingbot|Slurp|DuckDuckBot|Baiduspider|YandexBot|Facebot|facebookexternalhit|LinkedInBot|Twitterbot|Applebot/i; 23262function isBotUserAgent() { 23263 const nav = WINDOW1.navigator; 23264 if (!(nav === null || nav === void 0 ? void 0 : nav.userAgent)) { 23265 return false;
23266 } 23267 return BOT_USER_AGENT_RE.test(nav.userAgent); 23268} 23269const DEFAULT_BROWSER_TRACING_OPTIONS = { 23270 ...TRACING_DEFAULTS, 23271 instrumentNavigation: true, 23272 instrumentPageLoad: true, 23273 markBackgroundSpan: true, 23274 enableLongTask: true, 23275 enableLongAnimationFrame: true, 23276 enableInp: true, 23277 ignoreResourceSpans: [], 23278 ignorePerformanceApiSpans: [], 23279 detectRedirects: true, 23280 linkPreviousTrace: "in-memory", 23281 consistentTraceSampling: false, 23282 enableReportPageLoaded: false, 23283 _experiments: {}, 23284 ...defaultRequestInstrumentationOptions 23285}; 23286const browserTracingIntegration = function() { 23287 let options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}; 23288 if ("enableElementTiming" in options) { 23289 (0, __TURBOPACK__imported__module__272598__7["consoleSandbox"])(()=>{ 23290 console.warn("[Sentry] `enableElementTiming` is deprecated and no longer has any effect. Use the standalone `elementTimingIntegration` instead."); 23291 }); 23292 } 23293 const latestRoute = { 23294 name: void 0, 23295 source: void 0 23296 }; 23297 const optionalWindowDocument = WINDOW1.document; 23298 const { enableInp, enableLongTask, enableLongAnimationFrame, _experiments: { enableInteractions, enableStandaloneClsSpans, enableStandaloneLcpSpans }, beforeStartSpan, idleTimeout, finalTimeout, childSpanTimeout, markBackgroundSpan, traceFetch, traceXHR, // eslint-disable-next-line typescript/no-deprecated 23299 trackFetchStreamPerformance, shouldCreateSpanForRequest, enableHTTPTimings, ignoreResourceSpans, ignorePerformanceApiSpans, instrumentPageLoad, instrumentNavigation, detectRedirects, linkPreviousTrace, consistentTraceSampling, enableReportPageLoaded, onRequestSpanStart, onRequestSpanEnd } = { 23300 ...DEFAULT_BROWSER_TRACING_OPTIONS, 23301 ...options 23302 }; 23303 const _isBot = isBotUserAgent(); 23304 let lastInteractionTimestamp; 23305 let _pageloadSpan; 23306 function _createRouteSpan(client, startSpanOptions) { 23307 let makeActive = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : true, url = arguments.length > 3 ? arguments[3] : void 0; 23308 const isPageloadSpan = startSpanOptions.op === "pageload"; 23309 const initialSpanName = startSpanOptions.name; 23310 const finalStartSpanOptions = beforeStartSpan ? beforeStartSpan(startSpanOptions) : startSpanOptions; 23311 const urlObject = parseStringToURLObject(url || getLocationHref()); 23312 const attributes = { 23313 ...(urlObject === null || urlObject === void 0 ? void 0 : urlObject.pathname) && { 23314 [Vu]: urlObject.pathname 23315 }, 23316 ...urlObject && !isURLObjectRelative(urlObject) && { 23317 [Yu]: urlObject.href 23318 }, 23319 ...finalStartSpanOptions.attributes 23320 }; 23321 if (initialSpanName !== finalStartSpanOptions.name) { 23322 attributes[__TURBOPACK__imported__module__519988__6["SEMANTIC_ATTRIBUTE_SENTRY_SOURCE"]] = "custom"; 23323 } 23324 finalStartSpanOptions.attributes = attributes; 23325 if (!makeActive) { 23326 const now = (0, __TURBOPACK__imported__module__605394__3["dateTimestampInSeconds"])(); 23327 startInactiveSpan({ 23328 ...finalStartSpanOptions, 23329 startTime: now 23330 }).end(now); 23331 return; 23332 } 23333 latestRoute.name = finalStartSpanOptions.name; 23334 latestRoute.source = attributes[__TURBOPACK__imported__module__519988__6["SEMANTIC_ATTRIBUTE_SENTRY_SOURCE"]]; 23335 const idleSpan = startIdleSpan(finalStartSpanOptions, { 23336 idleTimeout, 23337 finalTimeout, 23338 childSpanTimeout, 23339 // should wait for finish signal if it's a pageload transaction 23340 disableAutoFinish: isPageloadSpan, 23341 beforeSpanEnd: (span)=>{ 23342 addPerformanceEntries(span, { 23343 ignoreResourceSpans, 23344 ignorePerformanceApiSpans, 23345 spanStreamingEnabled: hasSpanStreamingEnabled(client) 23346 });
23347 setActiveIdleSpan(client, void 0); 23348 const scope = (0, __TURBOPACK__imported__module__250804__4["getCurrentScope"])(); 23349 const oldPropagationContext = scope.getPropagationContext(); 23350 scope.setPropagationContext({ 23351 ...oldPropagationContext, 23352 traceId: idleSpan.spanContext().traceId, 23353 sampled: (0, __TURBOPACK__imported__module__304661__7["spanIsSampled"])(idleSpan), 23354 dsc: (0, __TURBOPACK__imported__module__473753__3["getDynamicSamplingContextFromSpan"])(span) 23355 }); 23356 if (isPageloadSpan) { 23357 _pageloadSpan = void 0; 23358 } 23359 }, 23360 trimIdleSpanEndTimestamp: !enableReportPageLoaded 23361 }); 23362 if (isPageloadSpan && enableReportPageLoaded) { 23363 _pageloadSpan = idleSpan; 23364 } 23365 setActiveIdleSpan(client, idleSpan); 23366 function emitFinish() { 23367 if (optionalWindowDocument && [ 23368 "interactive", 23369 "complete" 23370 ].includes(optionalWindowDocument.readyState)) { 23371 client.emit("idleSpanEnableAutoFinish", idleSpan); 23372 optionalWindowDocument.removeEventListener("readystatechange", emitFinish); 23373 } 23374 } 23375 if (isPageloadSpan && !enableReportPageLoaded && optionalWindowDocument) { 23376 optionalWindowDocument.addEventListener("readystatechange", emitFinish); 23377 emitFinish(); 23378 } 23379 } 23380 return { 23381 name: BROWSER_TRACING_INTEGRATION_ID, 23382 setup (client) { 23383 var _PerformanceObserver_supportedEntryTypes; 23384 if (_isBot) { 23385 DEBUG_BUILD1 && __TURBOPACK__imported__module__272598__7["debug"].log("[Tracing] Skipping browserTracingIntegration setup for bot user agent."); 23386 return; 23387 } 23388 registerSpanErrorInstrumentation(); 23389 if (enableLongAnimationFrame && __TURBOPACK__imported__module__225304__5["GLOBAL_OBJ"].PerformanceObserver && ((_PerformanceObserver_supportedEntryTypes = PerformanceObserver.supportedEntryTypes) === null || _PerformanceObserver_supportedEntryTypes === void 0 ? void 0 : _PerformanceObserver_supportedEntryTypes.includes("long-animation-frame"))) { 23390 startTrackingLongAnimationFrames(); 23391 } else if (enableLongTask) { 23392 startTrackingLongTasks(); 23393 } 23394 if (enableInteractions) { 23395 startTrackingInteractions(); 23396 } 23397 if (detectRedirects && optionalWindowDocument) { 23398 const interactionHandler = ()=>{ 23399 lastInteractionTimestamp = (0, __TURBOPACK__imported__module__605394__3["timestampInSeconds"])(); 23400 }; 23401 addEventListener("click", interactionHandler, { 23402 capture: true 23403 }); 23404 addEventListener("keydown", interactionHandler, { 23405 capture: true, 23406 passive: true 23407 }); 23408 } 23409 function maybeEndActiveSpan() { 23410 const activeSpan = getActiveIdleSpan(client); 23411 if (activeSpan && !(0, __TURBOPACK__imported__module__304661__7["spanToJSON"])(activeSpan).timestamp) { 23412 DEBUG_BUILD1 && __TURBOPACK__imported__module__272598__7["debug"].log("[Tracing] Finishing current active span with op: ".concat((0, __TURBOPACK__imported__module__304661__7["spanToJSON"])(activeSpan).op)); 23413 activeSpan.setAttribute(__TURBOPACK__imported__module__519988__6["SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON"], "cancelled"); 23414 activeSpan.end(); 23415 } 23416 } 23417 client.on("startNavigationSpan", (startSpanOptions, navigationOptions)=>{ 23418 if ((0, __TURBOPACK__imported__module__250804__4["getClient"])() !== client) { 23419 return; 23420 } 23421 if (navigationOptions === null || navigationOptions === void 0 ? void 0 : navigationOptions.isRedirect) { 23422 DEBUG_BUILD1 && __TURBOPACK__imported__module__272598__7["debug"].warn("[Tracing] Detected redirect, navigation span will not be the root span, but a child span."); 23423 _createRouteSpan(client, { 23424 op: "navigation.redirect", 23425 ...startSpanOptions 23426 }, false, navigationOptions.url); 23427 return; 23428 } 23429 lastInteractionTimestamp = void 0; 23430 maybeEndActiveSpan(); 23431 const scope = (0, __TURBOPACK__imported__module__250804__4["getCurrentScope"])(); 23432 scope.setPropagationContext({ 23433 traceId: (0, __TURBOPACK__imported__module__373382__2["generateTraceId"])(), 23434 sampleRand: Math.random(), 23435 propagationSpanId: (0, __TURBOPACK__imported__module__10008__3["hasSpansEnabled"])() ? void 0 : (0, __TURBOPACK__imported__module__373382__2["generateSpanId"])() 23436 }); 23437 scope.setSDKProcessingMetadata({ 23438 normalizedRequest: void 0 23439 }); 23440 _createRouteSpan(client, { 23441 op: "navigation", 23442 ...startSpanOptions, 23443 // Navigation starts a new trace and is NOT parented under any active interaction (e.g. ui.action.click) 23444 parentSpan: null, 23445 forceTransaction: true 23446 }, true, navigationOptions === null || navigationOptions === void 0 ? void 0 : navigationOptions.url); 23447 });
23448 client.on("startPageLoadSpan", function(startSpanOptions) { 23449 let traceOptions = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}; 23450 if ((0, __TURBOPACK__imported__module__250804__4["getClient"])() !== client) { 23451 return; 23452 } 23453 maybeEndActiveSpan(); 23454 const sentryTrace = traceOptions.sentryTrace || getMetaContent("sentry-trace") || getServerTiming("sentry-trace"); 23455 const baggage = traceOptions.baggage || getMetaContent("baggage") || getServerTiming("baggage"); 23456 const propagationContext = (0, __TURBOPACK__imported__module__132584__1["propagationContextFromHeaders"])(sentryTrace, baggage); 23457 const scope = (0, __TURBOPACK__imported__module__250804__4["getCurrentScope"])(); 23458 scope.setPropagationContext(propagationContext); 23459 if (!(0, __TURBOPACK__imported__module__10008__3["hasSpansEnabled"])()) { 23460 scope.getPropagationContext().propagationSpanId = (0, __TURBOPACK__imported__module__373382__2["generateSpanId"])(); 23461 } 23462 scope.setSDKProcessingMetadata({ 23463 normalizedRequest: getHttpRequestData() 23464 }); 23465 _createRouteSpan(client, { 23466 op: "pageload", 23467 ...startSpanOptions 23468 }); 23469 }); 23470 client.on("endPageloadSpan", ()=>{ 23471 if (enableReportPageLoaded && _pageloadSpan) { 23472 _pageloadSpan.setAttribute(__TURBOPACK__imported__module__519988__6["SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON"], "reportPageLoaded"); 23473 _pageloadSpan.end(); 23474 } 23475 }); 23476 }, 23477 afterAllSetup (client) { 23478 var _client_getIntegrationByName; 23479 if (_isBot) { 23480 return; 23481 } 23482 if (client.addIntegration && !((_client_getIntegrationByName = client.getIntegrationByName) === null || _client_getIntegrationByName === void 0 ? void 0 : _client_getIntegrationByName.call(client, WEB_VITALS_INTEGRATION_NAME))) { 23483 client.addIntegration(webVitalsIntegration({ 23484 ignore: enableInp ? [] : [ 23485 "inp" 23486 ], 23487 _experiments: { 23488 enableStandaloneClsSpans, 23489 enableStandaloneLcpSpans 23490 } 23491 })); 23492 } 23493 let startingUrl = getLocationHref(); 23494 if (linkPreviousTrace !== "off") { 23495 linkTraces(client, { 23496 linkPreviousTrace, 23497 consistentTraceSampling 23498 }); 23499 } 23500 if (WINDOW1.location) { 23501 if (instrumentPageLoad) { 23502 const origin = (0, __TURBOPACK__imported__module__605394__3["browserPerformanceTimeOrigin"])(); 23503 startBrowserTracingPageLoadSpan(client, { 23504 name: WINDOW1.location.pathname, 23505 // pageload should always start at timeOrigin (and needs to be in s, not ms) 23506 startTime: origin ? origin / 1e3 : void 0, 23507 attributes: { 23508 [__TURBOPACK__imported__module__519988__6["SEMANTIC_ATTRIBUTE_SENTRY_SOURCE"]]: "url", 23509 [__TURBOPACK__imported__module__519988__6["SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN"]]: "auto.pageload.browser" 23510 } 23511 }); 23512 } 23513 if (instrumentNavigation) { 23514 addHistoryInstrumentationHandler((param)=>{ 23515 let { to, from } = param; 23516 if (from === void 0 && (startingUrl === null || startingUrl === void 0 ? void 0 : startingUrl.indexOf(to)) !== -1) { 23517 startingUrl = void 0; 23518 return; 23519 } 23520 startingUrl = void 0; 23521 const parsed = parseStringToURLObject(to); 23522 const activeSpan = getActiveIdleSpan(client); 23523 const navigationIsRedirect = activeSpan && detectRedirects && isRedirect(activeSpan, lastInteractionTimestamp); 23524 startBrowserTracingNavigationSpan(client, { 23525 name: (parsed === null || parsed === void 0 ? void 0 : parsed.pathname) || WINDOW1.location.pathname, 23526 attributes: { 23527 [__TURBOPACK__imported__module__519988__6["SEMANTIC_ATTRIBUTE_SENTRY_SOURCE"]]: "url", 23528 [__TURBOPACK__imported__module__519988__6["SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN"]]: "auto.navigation.browser" 23529 } 23530 }, { 23531 url: to, 23532 isRedirect: navigationIsRedirect 23533 }); 23534 }); 23535 } 23536 }
23537 if (markBackgroundSpan) { 23538 registerBackgroundTabDetection(); 23539 } 23540 if (enableInteractions) { 23541 registerInteractionListener(client, idleTimeout, finalTimeout, childSpanTimeout, latestRoute); 23542 } 23543 instrumentOutgoingRequests(client, { 23544 traceFetch, 23545 traceXHR, 23546 tracePropagationTargets: client.getOptions().tracePropagationTargets, 23547 shouldCreateSpanForRequest, 23548 enableHTTPTimings, 23549 onRequestSpanStart, 23550 onRequestSpanEnd 23551 }); 23552 if (trackFetchStreamPerformance) { 23553 client.addIntegration(fetchStreamPerformanceIntegration()); 23554 } 23555 } 23556 }; 23557}; 23558function startBrowserTracingPageLoadSpan(client, spanOptions, traceOptions) { 23559 client.emit("startPageLoadSpan", spanOptions, traceOptions); 23560 (0, __TURBOPACK__imported__module__250804__4["getCurrentScope"])().setTransactionName(spanOptions.name); 23561 const pageloadSpan = getActiveIdleSpan(client); 23562 if (pageloadSpan) { 23563 client.emit("afterStartPageLoadSpan", pageloadSpan); 23564 } 23565 return pageloadSpan; 23566} 23567function startBrowserTracingNavigationSpan(client, spanOptions, options) { 23568 const { url, isRedirect: isRedirect2 } = options || {}; 23569 client.emit("beforeStartNavigationSpan", spanOptions, { 23570 isRedirect: isRedirect2, 23571 url 23572 }); 23573 client.emit("startNavigationSpan", spanOptions, { 23574 isRedirect: isRedirect2, 23575 url 23576 }); 23577 const scope = (0, __TURBOPACK__imported__module__250804__4["getCurrentScope"])(); 23578 scope.setTransactionName(spanOptions.name); 23579 if (url && !isRedirect2) { 23580 scope.setSDKProcessingMetadata({ 23581 normalizedRequest: { 23582 ...getHttpRequestData(), 23583 url 23584 } 23585 }); 23586 } 23587 return getActiveIdleSpan(client); 23588} 23589function getMetaContent(metaName) { 23590 const optionalWindowDocument = WINDOW1.document; 23591 const metaTag = optionalWindowDocument === null || optionalWindowDocument === void 0 ? void 0 : optionalWindowDocument.querySelector("meta[name=".concat(metaName, "]")); 23592 return (metaTag === null || metaTag === void 0 ? void 0 : metaTag.getAttribute("content")) || void 0; 23593} 23594function getServerTiming(name) { 23595 var _WINDOW_performance_getEntriesByType, _WINDOW_performance, _navigation_serverTiming; 23596 const navigation = (_WINDOW_performance = WINDOW1.performance) === null || _WINDOW_performance === void 0 ? void 0 : (_WINDOW_performance_getEntriesByType = _WINDOW_performance.getEntriesByType) === null || _WINDOW_performance_getEntriesByType === void 0 ? void 0 : _WINDOW_performance_getEntriesByType.call(_WINDOW_performance, "navigation")[0]; 23597 const entry = navigation === null || navigation === void 0 ? void 0 : (_navigation_serverTiming = navigation.serverTiming) === null || _navigation_serverTiming === void 0 ? void 0 : _navigation_serverTiming.find((entry2)=>entry2.name === name); 23598 return entry === null || entry === void 0 ? void 0 : entry.description; 23599} 23600function registerInteractionListener(client, idleTimeout, finalTimeout, childSpanTimeout, latestRoute) { 23601 const optionalWindowDocument = WINDOW1.document; 23602 let inflightInteractionSpan; 23603 const registerInteractionTransaction = ()=>{ 23604 const op = "ui.action.click"; 23605 const activeIdleSpan = getActiveIdleSpan(client); 23606 if (activeIdleSpan) { 23607 const currentRootSpanOp = (0, __TURBOPACK__imported__module__304661__7["spanToJSON"])(activeIdleSpan).op; 23608 if ([ 23609 "navigation", 23610 "pageload" 23611 ].includes(currentRootSpanOp)) { 23612 DEBUG_BUILD1 && __TURBOPACK__imported__module__272598__7["debug"].warn("[Tracing] Did not create ".concat(op, " span because a pageload or navigation span is in progress.")); 23613 return void 0; 23614 } 23615 } 23616 if (inflightInteractionSpan) { 23617 inflightInteractionSpan.setAttribute(__TURBOPACK__imported__module__519988__6["SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON"], "interactionInterrupted"); 23618 inflightInteractionSpan.end(); 23619 inflightInteractionSpan = void 0; 23620 } 23621 if (!latestRoute.name) { 23622 DEBUG_BUILD1 && __TURBOPACK__imported__module__272598__7["debug"].warn("[Tracing] Did not create ".concat(op, " transaction because _latestRouteName is missing.")); 23623 return void 0; 23624 } 23625 inflightInteractionSpan = startIdleSpan({ 23626 name: latestRoute.name, 23627 op, 23628 attributes: { 23629 [__TURBOPACK__imported__module__519988__6["SEMANTIC_ATTRIBUTE_SENTRY_SOURCE"]]: latestRoute.source || "url" 23630 } 23631 }, { 23632 idleTimeout, 23633 finalTimeout, 23634 childSpanTimeout 23635 }); 23636 }; 23637 if (optionalWindowDocument) { 23638 addEventListener("click", registerInteractionTransaction, { 23639 capture: true 23640 }); 23641 } 23642} 23643const ACTIVE_IDLE_SPAN_PROPERTY = "_sentry_idleSpan"; 23644function getActiveIdleSpan(client) { 23645 return client[ACTIVE_IDLE_SPAN_PROPERTY]; 23646} 23647function setActiveIdleSpan(client, span) { 23648 (0, __TURBOPACK__imported__module__951497__2["addNonEnumerableProperty"])(client, ACTIVE_IDLE_SPAN_PROPERTY, span); 23649} 23650const REDIRECT_THRESHOLD = 1.5; 23651function isRedirect(activeSpan, lastInteractionTimestamp) { 23652 const spanData = (0, __TURBOPACK__imported__module__304661__7["spanToJSON"])(activeSpan); 23653 const now = (0, __TURBOPACK__imported__module__605394__3["dateTimestampInSeconds"])(); 23654 const startTimestamp = spanData.start_timestamp; 23655 if (now - startTimestamp > REDIRECT_THRESHOLD) { 23656 return false;
23657 } 23658 if (lastInteractionTimestamp && now - lastInteractionTimestamp <= REDIRECT_THRESHOLD) { 23659 return false; 23660 } 23661 return true; 23662} 23663; 23664// MERGED MODULE: [project]/node_modules/@sentry/browser-utils/build/esm/instrument/location.js [app-client] (ecmascript) 23665; 23666; 23667function getAbsoluteUrl1(urlOrPath) { 23668 try { 23669 const url = new URL(urlOrPath, WINDOW3.location.origin); 23670 return url.toString(); 23671 } catch (unused) { 23672 return urlOrPath; 23673 } 23674} 23675; 23676// MERGED MODULE: [project]/node_modules/@sentry/nextjs/build/esm/client/routing/parameterization.js [app-client] (ecmascript) 23677; 23678var __TURBOPACK__imported__module__225304__9 = __TURBOPACK__imported__module__225304__; 23679var __TURBOPACK__imported__module__272598__21 = __TURBOPACK__imported__module__272598__; 23680// MERGED MODULE: [project]/node_modules/@sentry/nextjs/build/esm/common/debug-build.js [app-client] (ecmascript) 23681; 23682const DEBUG_BUILD2 = typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__; 23683; 23684; 23685; 23686const globalWithInjectedManifest = __TURBOPACK__imported__module__225304__9["GLOBAL_OBJ"]; 23687let cachedManifest = null; 23688let cachedManifestString = void 0; 23689const compiledRegexCache = /* @__PURE__ */ new Map(); 23690const routeResultCache = /* @__PURE__ */ new Map(); 23691function getRouteSpecificity(routePath) { 23692 const segments = routePath.split("/").filter(Boolean); 23693 let score = 0; 23694 for (const segment of segments){ 23695 if (segment.startsWith(":")) { 23696 const paramName = segment.substring(1); 23697 if (paramName.endsWith("*?")) { 23698 score += 1e3; 23699 } else if (paramName.endsWith("*")) { 23700 score += 100; 23701 } else { 23702 score += 10; 23703 } 23704 } 23705 } 23706 if (segments.length > 0) { 23707 const segmentCountPenalty = 1 / segments.length; 23708 score += segmentCountPenalty; 23709 } 23710 return score; 23711} 23712function getCompiledRegex(regexString) { 23713 if (compiledRegexCache.has(regexString)) { 23714 var _compiledRegexCache_get; 23715 return (_compiledRegexCache_get = compiledRegexCache.get(regexString)) !== null && _compiledRegexCache_get !== void 0 ? _compiledRegexCache_get : null; 23716 } 23717 try { 23718 const regex = new RegExp(regexString); 23719 compiledRegexCache.set(regexString, regex); 23720 return regex; 23721 } catch (error) { 23722 DEBUG_BUILD2 && __TURBOPACK__imported__module__272598__21["debug"].warn("Could not compile regex", { 23723 regexString, 23724 error 23725 }); 23726 return null; 23727 } 23728} 23729function getManifest() { 23730 if (!(globalWithInjectedManifest === null || globalWithInjectedManifest === void 0 ? void 0 : globalWithInjectedManifest._sentryRouteManifest) || typeof globalWithInjectedManifest._sentryRouteManifest !== "string") { 23731 return null; 23732 } 23733 const currentManifestString = globalWithInjectedManifest._sentryRouteManifest; 23734 if (cachedManifest && cachedManifestString === currentManifestString) { 23735 return cachedManifest; 23736 } 23737 compiledRegexCache.clear(); 23738 routeResultCache.clear(); 23739 let manifest = { 23740 staticRoutes: [], 23741 dynamicRoutes: [], 23742 isrRoutes: [] 23743 }; 23744 try { 23745 manifest = JSON.parse(currentManifestString); 23746 if (!Array.isArray(manifest.staticRoutes) || !Array.isArray(manifest.dynamicRoutes)) { 23747 return null; 23748 } 23749 cachedManifest = manifest; 23750 cachedManifestString = currentManifestString; 23751 return manifest; 23752 } catch (unused) { 23753 DEBUG_BUILD2 && __TURBOPACK__imported__module__272598__21["debug"].warn("Could not extract route manifest"); 23754 return null; 23755 } 23756} 23757function findMatchingRoutes(route, staticRoutes, dynamicRoutes) { 23758 const matches = []; 23759 if (staticRoutes.some((r)=>r.path === route)) { 23760 return matches; 23761 } 23762 for (const dynamicRoute of dynamicRoutes){ 23763 if (dynamicRoute.regex) { 23764 const regex = getCompiledRegex(dynamicRoute.regex); 23765 if (regex === null || regex === void 0 ? void 0 : regex.test(route)) { 23766 matches.push(dynamicRoute.path); 23767 } 23768 } 23769 } 23770 if (!route.startsWith("/:")) { 23771 for (const dynamicRoute of dynamicRoutes){ 23772 if (dynamicRoute.hasOptionalPrefix && dynamicRoute.regex) { 23773 const routeWithPrefix = route === "/" ? "/SENTRY_OPTIONAL_PREFIX" : "/SENTRY_OPTIONAL_PREFIX".concat(route); 23774 const regex = getCompiledRegex(dynamicRoute.regex); 23775 if (regex === null || regex === void 0 ? void 0 : regex.test(routeWithPrefix)) { 23776 matches.push(dynamicRoute.path); 23777 } 23778 } 23779 } 23780 } 23781 return matches; 23782} 23783const maybeParameterizeRoute = (route)=>{ 23784 const manifest = getManifest(); 23785 if (!manifest) { 23786 return void 0; 23787 } 23788 const normalizedRoute = route.length > 1 && route.endsWith("/") ? route.slice(0, -1) : route; 23789 if (routeResultCache.has(normalizedRoute)) { 23790 return routeResultCache.get(normalizedRoute); 23791 } 23792 const { staticRoutes, dynamicRoutes } = manifest; 23793 if (!Array.isArray(staticRoutes) || !Array.isArray(dynamicRoutes)) { 23794 return void 0; 23795 } 23796 const matches = findMatchingRoutes(normalizedRoute, staticRoutes, dynamicRoutes); 23797 const result = matches.sort((a, b)=>getRouteSpecificity(a) - getRouteSpecificity(b))[0]; 23798 routeResultCache.set(normalizedRoute, result); 23799 return result; 23800}; 23801; 23802; 23803; 23804; 23805; 23806function stripTrailingSlash(pathname) { 23807 return pathname.length > 1 && pathname.endsWith("/") ? pathname.slice(0, -1) : pathname; 23808} 23809function setNavigationSpanUrlAttributes(span, urlPath, urlOrPath) { 23810 span.setAttributes({ 23811 [Vu]: urlPath, 23812 [Yu]: getAbsoluteUrl1(urlOrPath) 23813 }); 23814} 23815const INCOMPLETE_APP_ROUTER_INSTRUMENTATION_TRANSACTION_NAME = "incomplete-app-router-transaction"; 23816let navigationRoutingMode = "router-patch"; 23817const currentRouterPatchingNavigationSpanRef = { 23818 current: void 0 23819}; 23820function appRouterInstrumentPageLoad(client) { 23821 const pathname = stripTrailingSlash(WINDOW1.location.pathname); 23822 const parameterizedPathname = maybeParameterizeRoute(pathname); 23823 const origin = (0, __TURBOPACK__imported__module__605394__["browserPerformanceTimeOrigin"])(); 23824 startBrowserTracingPageLoadSpan(client, { 23825 name: parameterizedPathname !== null && parameterizedPathname !== void 0 ? parameterizedPathname : pathname, 23826 // pageload should always start at timeOrigin (and needs to be in s, not ms) 23827 startTime: origin ? origin / 1e3 : void 0, 23828 attributes: { 23829 [__TURBOPACK__imported__module__519988__["SEMANTIC_ATTRIBUTE_SENTRY_OP"]]: "pageload", 23830 [__TURBOPACK__imported__module__519988__["SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN"]]: "auto.pageload.nextjs.app_router_instrumentation", 23831 [__TURBOPACK__imported__module__519988__["SEMANTIC_ATTRIBUTE_SENTRY_SOURCE"]]: parameterizedPathname ? "route" : "url", 23832 ...parameterizedPathname && { 23833 [ju]: parameterizedPathname 23834 } 23835 } 23836 }); 23837} 23838const GLOBAL_OBJ_WITH_NEXT_ROUTER = __TURBOPACK__imported__module__225304__["GLOBAL_OBJ"]; 23839const globalWithInjectedBasePath = __TURBOPACK__imported__module__225304__["GLOBAL_OBJ"]; 23840function appRouterInstrumentNavigation(client) { 23841 routerTransitionHandler = (href, navigationType)=>{ 23842 var _process_env__sentryBasePath; 23843 const basePath = (_process_env__sentryBasePath = __TURBOPACK__imported__module__247167__1["default"].env._sentryBasePath) !== null && _process_env__sentryBasePath !== void 0 ? _process_env__sentryBasePath : globalWithInjectedBasePath._sentryBasePath; 23844 const normalizedHref = basePath && !href.startsWith(basePath) ? "".concat(basePath).concat(href) : href; 23845 const unparameterizedPathname = stripTrailingSlash(new URL(normalizedHref, WINDOW1.location.href).pathname); 23846 const parameterizedPathname = maybeParameterizeRoute(unparameterizedPathname); 23847 const pathname = parameterizedPathname !== null && parameterizedPathname !== void 0 ? parameterizedPathname : unparameterizedPathname; 23848 if (navigationRoutingMode === "router-patch") { 23849 navigationRoutingMode = "transition-start-hook"; 23850 } 23851 const currentNavigationSpan = currentRouterPatchingNavigationSpanRef.current; 23852 if (currentNavigationSpan) { 23853 currentNavigationSpan.updateName(pathname); 23854 currentNavigationSpan.setAttributes({ 23855 "navigation.type": "router.".concat(navigationType), 23856 [__TURBOPACK__imported__module__519988__["SEMANTIC_ATTRIBUTE_SENTRY_SOURCE"]]: parameterizedPathname ? "route" : "url", 23857 ...parameterizedPathname && { 23858 [ju]: parameterizedPathname 23859 } 23860 }); 23861 setNavigationSpanUrlAttributes(currentNavigationSpan, unparameterizedPathname, normalizedHref); 23862 currentRouterPatchingNavigationSpanRef.current = void 0; 23863 } else { 23864 startBrowserTracingNavigationSpan(client, { 23865 name: pathname, 23866 attributes: { 23867 [__TURBOPACK__imported__module__519988__["SEMANTIC_ATTRIBUTE_SENTRY_OP"]]: "navigation", 23868 [__TURBOPACK__imported__module__519988__["SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN"]]: "auto.navigation.nextjs.app_router_instrumentation", 23869 [__TURBOPACK__imported__module__519988__["SEMANTIC_ATTRIBUTE_SENTRY_SOURCE"]]: parameterizedPathname ? "route" : "url", 23870 "navigation.type": "router.".concat(navigationType), 23871 ...parameterizedPathname && { 23872 [ju]: parameterizedPathname 23873 } 23874 } 23875 }, { 23876 url: getAbsoluteUrl1(normalizedHref) 23877 }); 23878 } 23879 }; 23880 WINDOW1.addEventListener("popstate", ()=>{ 23881 var _currentRouterPatchingNavigationSpanRef_current; 23882 const pathname = stripTrailingSlash(WINDOW1.location.pathname); 23883 const parameterizedPathname = maybeParameterizeRoute(pathname); 23884 if ((_currentRouterPatchingNavigationSpanRef_current = currentRouterPatchingNavigationSpanRef.current) === null || _currentRouterPatchingNavigationSpanRef_current === void 0 ? void 0 : _currentRouterPatchingNavigationSpanRef_current.isRecording()) { 23885 currentRouterPatchingNavigationSpanRef.current.updateName(parameterizedPathname !== null && parameterizedPathname !== void 0 ? parameterizedPathname : pathname); 23886 currentRouterPatchingNavigationSpanRef.current.setAttribute(__TURBOPACK__imported__module__519988__["SEMANTIC_ATTRIBUTE_SENTRY_SOURCE"], parameterizedPathname ? "route" : "url"); 23887 if (parameterizedPathname) { 23888 currentRouterPatchingNavigationSpanRef.current.setAttribute(ju, parameterizedPathname); 23889 } 23890 setNavigationSpanUrlAttributes(currentRouterPatchingNavigationSpanRef.current, pathname, WINDOW1.location.href); 23891 } else { 23892 currentRouterPatchingNavigationSpanRef.current = startBrowserTracingNavigationSpan(client, { 23893 name: parameterizedPathname !== null && parameterizedPathname !== void 0 ? parameterizedPathname : pathname, 23894 attributes: { 23895 [__TURBOPACK__imported__module__519988__["SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN"]]: "auto.navigation.nextjs.app_router_instrumentation", 23896 [__TURBOPACK__imported__module__519988__["SEMANTIC_ATTRIBUTE_SENTRY_SOURCE"]]: parameterizedPathname ? "route" : "url", 23897 "navigation.type": "browser.popstate", 23898 ...parameterizedPathname && { 23899 [ju]: parameterizedPathname 23900 } 23901 } 23902 }, { 23903 url: getAbsoluteUrl1(pathname) 23904 }); 23905 } 23906 }); 23907 let routerPatched = false;
23908 let triesToFindRouter = 0; 23909 const MAX_TRIES_TO_FIND_ROUTER = 500; 23910 const ROUTER_AVAILABILITY_CHECK_INTERVAL_MS = 20; 23911 const checkForRouterAvailabilityInterval = setInterval(()=>{ 23912 var _ref; 23913 var _GLOBAL_OBJ_WITH_NEXT_ROUTER_next, _GLOBAL_OBJ_WITH_NEXT_ROUTER_nd; 23914 triesToFindRouter++; 23915 const router = (_ref = GLOBAL_OBJ_WITH_NEXT_ROUTER === null || GLOBAL_OBJ_WITH_NEXT_ROUTER === void 0 ? void 0 : (_GLOBAL_OBJ_WITH_NEXT_ROUTER_next = GLOBAL_OBJ_WITH_NEXT_ROUTER.next) === null || _GLOBAL_OBJ_WITH_NEXT_ROUTER_next === void 0 ? void 0 : _GLOBAL_OBJ_WITH_NEXT_ROUTER_next.router) !== null && _ref !== void 0 ? _ref : GLOBAL_OBJ_WITH_NEXT_ROUTER === null || GLOBAL_OBJ_WITH_NEXT_ROUTER === void 0 ? void 0 : (_GLOBAL_OBJ_WITH_NEXT_ROUTER_nd = GLOBAL_OBJ_WITH_NEXT_ROUTER.nd) === null || _GLOBAL_OBJ_WITH_NEXT_ROUTER_nd === void 0 ? void 0 : _GLOBAL_OBJ_WITH_NEXT_ROUTER_nd.router; 23916 if (routerPatched || triesToFindRouter > MAX_TRIES_TO_FIND_ROUTER) { 23917 clearInterval(checkForRouterAvailabilityInterval); 23918 } else if (router) { 23919 clearInterval(checkForRouterAvailabilityInterval); 23920 routerPatched = true; 23921 patchRouter(client, router, currentRouterPatchingNavigationSpanRef); 23922 [ 23923 "nd", 23924 "next" 23925 ].forEach((globalValueName)=>{ 23926 const globalValue = GLOBAL_OBJ_WITH_NEXT_ROUTER[globalValueName]; 23927 if (globalValue) { 23928 GLOBAL_OBJ_WITH_NEXT_ROUTER[globalValueName] = new Proxy(globalValue, { 23929 set (target, p, newValue) { 23930 if (p === "router" && typeof newValue === "object" && newValue !== null) { 23931 patchRouter(client, newValue, currentRouterPatchingNavigationSpanRef); 23932 } 23933 target[p] = newValue; 23934 return true; 23935 } 23936 }); 23937 } 23938 }); 23939 } 23940 }, ROUTER_AVAILABILITY_CHECK_INTERVAL_MS); 23941} 23942function transactionNameifyRouterArgument(target) { 23943 try { 23944 return new URL(target, "http://example.com/").pathname; 23945 } catch (unused) { 23946 return "/"; 23947 } 23948} 23949const patchedRouters = /* @__PURE__ */ new WeakSet(); 23950function patchRouter(client, router, currentNavigationSpanRef) { 23951 if (patchedRouters.has(router)) { 23952 return; 23953 } 23954 patchedRouters.add(router); 23955 [ 23956 "back", 23957 "forward", 23958 "push", 23959 "replace" 23960 ].forEach((routerFunctionName)=>{ 23961 if (router === null || router === void 0 ? void 0 : router[routerFunctionName]) { 23962 router[routerFunctionName] = new Proxy(router[routerFunctionName], { 23963 apply (target, thisArg, argArray) { 23964 var _process_env__sentryBasePath; 23965 if (navigationRoutingMode !== "router-patch") { 23966 return target.apply(thisArg, argArray); 23967 } 23968 let transactionName = INCOMPLETE_APP_ROUTER_INSTRUMENTATION_TRANSACTION_NAME; 23969 const transactionAttributes = { 23970 [__TURBOPACK__imported__module__519988__["SEMANTIC_ATTRIBUTE_SENTRY_OP"]]: "navigation", 23971 [__TURBOPACK__imported__module__519988__["SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN"]]: "auto.navigation.nextjs.app_router_instrumentation", 23972 [__TURBOPACK__imported__module__519988__["SEMANTIC_ATTRIBUTE_SENTRY_SOURCE"]]: "url" 23973 }; 23974 const href = argArray[0]; 23975 const basePath = (_process_env__sentryBasePath = __TURBOPACK__imported__module__247167__1["default"].env._sentryBasePath) !== null && _process_env__sentryBasePath !== void 0 ? _process_env__sentryBasePath : globalWithInjectedBasePath._sentryBasePath; 23976 const normalizedHref = basePath && typeof href === "string" && !href.startsWith(basePath) ? "".concat(basePath).concat(href) : href; 23977 if (routerFunctionName === "push") { 23978 transactionName = stripTrailingSlash(transactionNameifyRouterArgument(normalizedHref)); 23979 transactionAttributes["navigation.type"] = "router.push"; 23980 } else if (routerFunctionName === "replace") { 23981 transactionName = stripTrailingSlash(transactionNameifyRouterArgument(normalizedHref)); 23982 transactionAttributes["navigation.type"] = "router.replace"; 23983 } else if (routerFunctionName === "back") { 23984 transactionAttributes["navigation.type"] = "router.back"; 23985 } else if (routerFunctionName === "forward") { 23986 transactionAttributes["navigation.type"] = "router.forward"; 23987 } 23988 const parameterizedPathname = maybeParameterizeRoute(transactionName); 23989 const navigationUrl = routerFunctionName === "back" || routerFunctionName === "forward" ? void 0 : getAbsoluteUrl1(normalizedHref); 23990 currentNavigationSpanRef.current = startBrowserTracingNavigationSpan(client, { 23991 name: parameterizedPathname !== null && parameterizedPathname !== void 0 ? parameterizedPathname : transactionName, 23992 attributes: { 23993 ...transactionAttributes, 23994 [__TURBOPACK__imported__module__519988__["SEMANTIC_ATTRIBUTE_SENTRY_SOURCE"]]: parameterizedPathname ? "route" : "url", 23995 ...parameterizedPathname && { 23996 [ju]: parameterizedPathname 23997 } 23998 } 23999 }, navigationUrl ? { 24000 url: navigationUrl 24001 } : void 0); 24002 return target.apply(thisArg, argArray); 24003 } 24004 }); 24005 } 24006 }); 24007} 24008let routerTransitionHandler = void 0; 24009function captureRouterTransitionStart(href, navigationType) { 24010 if (routerTransitionHandler) { 24011 routerTransitionHandler(href, navigationType); 24012 } 24013} 24014; 24015// MERGED MODULE: [project]/node_modules/@sentry/nextjs/build/esm/client/index.js [app-client] (ecmascript) <locals> 24016; 24017var __TURBOPACK__imported__module__247167__2 = __TURBOPACK__imported__module__247167__; 24018var __TURBOPACK__imported__module__272598__22 = __TURBOPACK__imported__module__272598__; 24019var __TURBOPACK__imported__module__225304__10 = __TURBOPACK__imported__module__225304__; 24020// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/utils/sdkMetadata.js [app-client] (ecmascript) 24021; 24022var __TURBOPACK__imported__module__591401__ = __turbopack_context__.i(591401); 24023; 24024function applySdkMetadata(options, name) { 24025 let names = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : [ 24026 name 24027 ], source = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : "npm"; 24028 const sdk = (options._metadata = options._metadata || {}).sdk = options._metadata.sdk || {}; 24029 if (!sdk.name) { 24030 sdk.name = "sentry.javascript.".concat(name); 24031 sdk.packages = names.map((name2)=>({ 24032 name: "".concat(source, ":@sentry/").concat(name2), 24033 version: __TURBOPACK__imported__module__591401__["SDK_VERSION"] 24034 })); 24035 sdk.version = __TURBOPACK__imported__module__591401__["SDK_VERSION"]; 24036 } 24037} 24038; 24039var __TURBOPACK__imported__module__662537__2 = __TURBOPACK__imported__module__662537__; 24040var __TURBOPACK__imported__module__250804__16 = __TURBOPACK__imported__module__250804__; 24041// MERGED MODULE: [project]/node_modules/@sentry/nextjs/node_modules/@sentry/react/build/esm/sdk.js [app-client] (ecmascript) 24042; 24043var __TURBOPACK__imported__module__662537__3 = __TURBOPACK__imported__module__662537__; 24044// MERGED MODULE: [project]/node_modules/@sentry/browser/build/npm/esm/prod/sdk.js [app-client] (ecmascript) 24045; 24046// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/integrations/eventFilters.js [app-client] (ecmascript) 24047; 24048var __TURBOPACK__imported__module__901020__11 = __TURBOPACK__imported__module__901020__; 24049var __TURBOPACK__imported__module__272598__23 = __TURBOPACK__imported__module__272598__; 24050// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/utils/eventUtils.js [app-client] (ecmascript) 24051; 24052function getPossibleEventMessages(event) { 24053 const possibleMessages = []; 24054 if (event.message) { 24055 possibleMessages.push(event.message); 24056 } 24057 try { 24058 const lastException = event.exception.values[event.exception.values.length - 1]; 24059 if (lastException === null || lastException === void 0 ? void 0 : lastException.value) {
24060 possibleMessages.push(lastException.value); 24061 if (lastException.type) { 24062 possibleMessages.push("".concat(lastException.type, ": ").concat(lastException.value)); 24063 } 24064 } 24065 } catch (unused) {} 24066 return possibleMessages; 24067} 24068; 24069var __TURBOPACK__imported__module__682564__1 = __TURBOPACK__imported__module__682564__; 24070var __TURBOPACK__imported__module__821593__3 = __TURBOPACK__imported__module__821593__; 24071; 24072; 24073; 24074; 24075; 24076; 24077const DEFAULT_IGNORE_ERRORS = [ 24078 /^Script error\.?$/, 24079 /^Javascript error: Script error\.? on line 0$/, 24080 /^ResizeObserver loop completed with undelivered notifications.$/, 24081 // The browser logs this when a ResizeObserver handler takes a bit longer. Usually this is not an actual issue though. It indicates slowness. 24082 /^Cannot redefine property: googletag$/, 24083 // This is thrown when google tag manager is used in combination with an ad blocker 24084 /^Can't find variable: gmo$/, 24085 // Error from Google Search App https://issuetracker.google.com/issues/396043331 24086 /^undefined is not an object \(evaluating 'a\.[A-Z]'\)$/, 24087 // Random error that happens but not actionable or noticeable to end-users. 24088 /can't redefine non-configurable property "solana"/, 24089 // Probably a browser extension or custom browser (Brave) throwing this error 24090 /vv\(\)\.getRestrictions is not a function/, 24091 // Error thrown by GTM, seemingly not affecting end-users 24092 /Can't find variable: _AutofillCallbackHandler/, 24093 // Unactionable error in instagram webview https://developers.facebook.com/community/threads/320013549791141/ 24094 /Object Not Found Matching Id:\d+, MethodName:simulateEvent/, 24095 // unactionable error from CEFSharp, a .NET library that embeds chromium in .NET apps 24096 /Java exception was raised during method invocation$/, 24097 // error from Facebook Mobile browser (https://github.com/getsentry/sentry-javascript/issues/15065, https://github.com/getsentry/sentry-javascript/issues/23733) 24098 /Java object is gone$/ 24099]; 24100const INTEGRATION_NAME = "EventFilters"; 24101const eventFiltersIntegration = defineIntegration(function() { 24102 let options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}; 24103 let mergedOptions; 24104 return { 24105 name: INTEGRATION_NAME, 24106 setup (client) { 24107 const clientOptions = client.getOptions(); 24108 mergedOptions = _mergeOptions(options, clientOptions); 24109 }, 24110 processEvent (event, _hint, client) { 24111 if (!mergedOptions) { 24112 const clientOptions = client.getOptions(); 24113 mergedOptions = _mergeOptions(options, clientOptions); 24114 } 24115 return _shouldDropEvent(event, mergedOptions) ? null : event; 24116 } 24117 }; 24118}); 24119const inboundFiltersIntegration = defineIntegration(function() { 24120 let options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}; 24121 return { 24122 ...eventFiltersIntegration(options), 24123 name: "InboundFilters" 24124 }; 24125}); 24126function _mergeOptions() { 24127 let internalOptions = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}, clientOptions = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}; 24128 return { 24129 allowUrls: [ 24130 ...internalOptions.allowUrls || [], 24131 ...clientOptions.allowUrls || [] 24132 ], 24133 denyUrls: [ 24134 ...internalOptions.denyUrls || [], 24135 ...clientOptions.denyUrls || [] 24136 ], 24137 ignoreErrors: [ 24138 ...internalOptions.ignoreErrors || [], 24139 ...clientOptions.ignoreErrors || [], 24140 ...internalOptions.disableErrorDefaults ? [] : DEFAULT_IGNORE_ERRORS 24141 ], 24142 ignoreTransactions: [ 24143 ...internalOptions.ignoreTransactions || [], 24144 ...clientOptions.ignoreTransactions || [] 24145 ] 24146 }; 24147} 24148function _shouldDropEvent(event, options) { 24149 if (!event.type) { 24150 if (_isIgnoredError(event, options.ignoreErrors)) { 24151 __TURBOPACK__imported__module__901020__11["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__23["debug"].warn("Event dropped due to being matched by `ignoreErrors` option.\nEvent: ".concat((0, __TURBOPACK__imported__module__682564__1["getEventDescription"])(event))); 24152 return true; 24153 } 24154 if (_isUselessError(event)) { 24155 __TURBOPACK__imported__module__901020__11["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__23["debug"].warn("Event dropped due to not having an error message, error type or stacktrace.\nEvent: ".concat((0, __TURBOPACK__imported__module__682564__1["getEventDescription"])(event))); 24156 return true; 24157 } 24158 if (_isDeniedUrl(event, options.denyUrls)) { 24159 __TURBOPACK__imported__module__901020__11["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__23["debug"].warn("Event dropped due to being matched by `denyUrls` option.\nEvent: ".concat((0, __TURBOPACK__imported__module__682564__1["getEventDescription"])(event), ".\nUrl: ").concat(_getEventFilterUrl(event))); 24160 return true; 24161 } 24162 if (!_isAllowedUrl(event, options.allowUrls)) { 24163 __TURBOPACK__imported__module__901020__11["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__23["debug"].warn("Event dropped due to not being matched by `allowUrls` option.\nEvent: ".concat((0, __TURBOPACK__imported__module__682564__1["getEventDescription"])(event), ".\nUrl: ").concat(_getEventFilterUrl(event))); 24164 return true; 24165 } 24166 } else if (event.type === "transaction") { 24167 if (_isIgnoredTransaction(event, options.ignoreTransactions)) { 24168 __TURBOPACK__imported__module__901020__11["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__23["debug"].warn("Event dropped due to being matched by `ignoreTransactions` option.\nEvent: ".concat((0, __TURBOPACK__imported__module__682564__1["getEventDescription"])(event))); 24169 return true; 24170 } 24171 } 24172 return false;
24173} 24174function _isIgnoredError(event, ignoreErrors) { 24175 if (!(ignoreErrors === null || ignoreErrors === void 0 ? void 0 : ignoreErrors.length)) { 24176 return false; 24177 } 24178 return getPossibleEventMessages(event).some((message)=>(0, __TURBOPACK__imported__module__821593__3["stringMatchesSomePattern"])(message, ignoreErrors)); 24179} 24180function _isIgnoredTransaction(event, ignoreTransactions) { 24181 if (!(ignoreTransactions === null || ignoreTransactions === void 0 ? void 0 : ignoreTransactions.length)) { 24182 return false; 24183 } 24184 const name = event.transaction; 24185 return name ? (0, __TURBOPACK__imported__module__821593__3["stringMatchesSomePattern"])(name, ignoreTransactions) : false; 24186} 24187function _isDeniedUrl(event, denyUrls) { 24188 if (!(denyUrls === null || denyUrls === void 0 ? void 0 : denyUrls.length)) { 24189 return false; 24190 } 24191 const url = _getEventFilterUrl(event); 24192 return !url ? false : (0, __TURBOPACK__imported__module__821593__3["stringMatchesSomePattern"])(url, denyUrls); 24193} 24194function _isAllowedUrl(event, allowUrls) { 24195 if (!(allowUrls === null || allowUrls === void 0 ? void 0 : allowUrls.length)) { 24196 return true; 24197 } 24198 const url = _getEventFilterUrl(event); 24199 return !url ? true : (0, __TURBOPACK__imported__module__821593__3["stringMatchesSomePattern"])(url, allowUrls); 24200} 24201function _getLastValidUrl() { 24202 let frames = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : []; 24203 for(let i = frames.length - 1; i >= 0; i--){ 24204 const frame = frames[i]; 24205 if (frame && frame.filename !== "<anonymous>" && frame.filename !== "[native code]") { 24206 return frame.filename || null; 24207 } 24208 } 24209 return null; 24210} 24211function _getEventFilterUrl(event) { 24212 try { 24213 var _ref; 24214 var _event_exception, _rootException_stacktrace; 24215 const rootException = [ 24216 ...(_ref = (_event_exception = event.exception) === null || _event_exception === void 0 ? void 0 : _event_exception.values) !== null && _ref !== void 0 ? _ref : [] 24217 ].reverse().find((value)=>{ 24218 var _value_mechanism, _value_stacktrace_frames, _value_stacktrace; 24219 return ((_value_mechanism = value.mechanism) === null || _value_mechanism === void 0 ? void 0 : _value_mechanism.parent_id) === void 0 && ((_value_stacktrace = value.stacktrace) === null || _value_stacktrace === void 0 ? void 0 : (_value_stacktrace_frames = _value_stacktrace.frames) === null || _value_stacktrace_frames === void 0 ? void 0 : _value_stacktrace_frames.length); 24220 }); 24221 const frames = rootException === null || rootException === void 0 ? void 0 : (_rootException_stacktrace = rootException.stacktrace) === null || _rootException_stacktrace === void 0 ? void 0 : _rootException_stacktrace.frames; 24222 return frames ? _getLastValidUrl(frames) : null; 24223 } catch (unused) { 24224 __TURBOPACK__imported__module__901020__11["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__23["debug"].error("Cannot extract url for event ".concat((0, __TURBOPACK__imported__module__682564__1["getEventDescription"])(event))); 24225 return null; 24226 } 24227} 24228function _isUselessError(event) { 24229 var _event_exception_values, _event_exception; 24230 if (!((_event_exception = event.exception) === null || _event_exception === void 0 ? void 0 : (_event_exception_values = _event_exception.values) === null || _event_exception_values === void 0 ? void 0 : _event_exception_values.length)) { 24231 return false; 24232 } 24233 return(// No top-level message 24234 !event.message && // There are no exception values that have a stacktrace, a non-generic-Error type or value 24235 !event.exception.values.some((value)=>value.stacktrace || value.type && value.type !== "Error" || value.value)); 24236} 24237; 24238// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/integrations/functiontostring.js [app-client] (ecmascript) 24239; 24240var __TURBOPACK__imported__module__250804__17 = __TURBOPACK__imported__module__250804__; 24241var __TURBOPACK__imported__module__951497__5 = __TURBOPACK__imported__module__951497__; 24242; 24243; 24244; 24245const INTEGRATION_NAME1 = "FunctionToString"; 24246const SETUP_CLIENTS = /* @__PURE__ */ new WeakMap(); 24247const _functionToStringIntegration = ()=>{ 24248 return { 24249 name: INTEGRATION_NAME1, 24250 setupOnce () { 24251 const originalFunctionToString = Function.prototype.toString; 24252 try { 24253 Function.prototype.toString = function() { 24254 for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++){ 24255 args[_key] = arguments[_key]; 24256 } 24257 const originalFunction = (0, __TURBOPACK__imported__module__951497__5["getOriginalFunction"])(this); 24258 let unwrappedFunction; 24259 try {
24260 if (SETUP_CLIENTS.has((0, __TURBOPACK__imported__module__250804__17["getClient"])()) && originalFunction !== void 0) { 24261 unwrappedFunction = originalFunction; 24262 } 24263 } catch (unused) {} 24264 return originalFunctionToString.apply(unwrappedFunction !== null && unwrappedFunction !== void 0 ? unwrappedFunction : this, args); 24265 }; 24266 } catch (unused) {} 24267 }, 24268 setup (client) { 24269 SETUP_CLIENTS.set(client, true); 24270 } 24271 }; 24272}; 24273const functionToStringIntegration = defineIntegration(_functionToStringIntegration); 24274; 24275// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/integrations/conversationId.js [app-client] (ecmascript) 24276; 24277var __TURBOPACK__imported__module__250804__18 = __TURBOPACK__imported__module__250804__; 24278var __TURBOPACK__imported__module__519988__16 = __TURBOPACK__imported__module__519988__; 24279var __TURBOPACK__imported__module__304661__17 = __TURBOPACK__imported__module__304661__; 24280; 24281; 24282; 24283; 24284const INTEGRATION_NAME2 = "ConversationId"; 24285const _conversationIdIntegration = ()=>{ 24286 return { 24287 name: INTEGRATION_NAME2, 24288 setup (client) { 24289 client.on("spanStart", (span)=>{ 24290 const scopeData = (0, __TURBOPACK__imported__module__250804__18["getCurrentScope"])().getScopeData(); 24291 const isolationScopeData = (0, __TURBOPACK__imported__module__250804__18["getIsolationScope"])().getScopeData(); 24292 const conversationId = scopeData.conversationId || isolationScopeData.conversationId; 24293 if (conversationId) { 24294 const { op, data: attributes, description: name } = (0, __TURBOPACK__imported__module__304661__17["spanToJSON"])(span); 24295 if (!(op === null || op === void 0 ? void 0 : op.startsWith("gen_ai.")) && !attributes["ai.operationId"] && !(name === null || name === void 0 ? void 0 : name.startsWith("ai."))) { 24296 return; 24297 } 24298 span.setAttribute(__TURBOPACK__imported__module__519988__16["GEN_AI_CONVERSATION_ID_ATTRIBUTE"], conversationId); 24299 } 24300 }); 24301 } 24302 }; 24303}; 24304const conversationIdIntegration = defineIntegration(_conversationIdIntegration); 24305; 24306// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/integrations/dedupe.js [app-client] (ecmascript) 24307; 24308var __TURBOPACK__imported__module__901020__12 = __TURBOPACK__imported__module__901020__; 24309var __TURBOPACK__imported__module__272598__24 = __TURBOPACK__imported__module__272598__; 24310var __TURBOPACK__imported__module__936032__2 = __TURBOPACK__imported__module__936032__; 24311; 24312; 24313; 24314; 24315const INTEGRATION_NAME3 = "Dedupe"; 24316const _dedupeIntegration = ()=>{ 24317 let previousEvent; 24318 return { 24319 name: INTEGRATION_NAME3, 24320 processEvent (currentEvent) { 24321 if (currentEvent.type) { 24322 return currentEvent; 24323 } 24324 try { 24325 if (_shouldDropEvent1(currentEvent, previousEvent)) { 24326 __TURBOPACK__imported__module__901020__12["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__24["debug"].warn("Event dropped due to being a duplicate of previously captured event."); 24327 return null; 24328 } 24329 } catch (unused) {} 24330 return previousEvent = currentEvent; 24331 } 24332 }; 24333}; 24334const dedupeIntegration = defineIntegration(_dedupeIntegration); 24335function _shouldDropEvent1(currentEvent, previousEvent) { 24336 if (!previousEvent) { 24337 return false; 24338 } 24339 if (_isSameMessageEvent(currentEvent, previousEvent)) { 24340 return true; 24341 } 24342 if (_isSameExceptionEvent(currentEvent, previousEvent)) { 24343 return true; 24344 } 24345 return false; 24346} 24347function _isSameMessageEvent(currentEvent, previousEvent) { 24348 const currentMessage = currentEvent.message; 24349 const previousMessage = previousEvent.message; 24350 if (!currentMessage && !previousMessage) { 24351 return false; 24352 } 24353 if (currentMessage && !previousMessage || !currentMessage && previousMessage) { 24354 return false;
24355 } 24356 if (currentMessage !== previousMessage) { 24357 return false; 24358 } 24359 if (!_isSameFingerprint(currentEvent, previousEvent)) { 24360 return false; 24361 } 24362 if (!_isSameStacktrace(currentEvent, previousEvent)) { 24363 return false; 24364 } 24365 return true; 24366} 24367function _isSameExceptionEvent(currentEvent, previousEvent) { 24368 const previousException = _getExceptionFromEvent(previousEvent); 24369 const currentException = _getExceptionFromEvent(currentEvent); 24370 if (!previousException || !currentException) { 24371 return false; 24372 } 24373 if (previousException.type !== currentException.type || previousException.value !== currentException.value) { 24374 return false; 24375 } 24376 if (!_isSameFingerprint(currentEvent, previousEvent)) { 24377 return false; 24378 } 24379 if (!_isSameStacktrace(currentEvent, previousEvent)) { 24380 return false; 24381 } 24382 return true; 24383} 24384function _isSameStacktrace(currentEvent, previousEvent) { 24385 let currentFrames = (0, __TURBOPACK__imported__module__936032__2["getFramesFromEvent"])(currentEvent); 24386 let previousFrames = (0, __TURBOPACK__imported__module__936032__2["getFramesFromEvent"])(previousEvent); 24387 if (!currentFrames && !previousFrames) { 24388 return true; 24389 } 24390 if (currentFrames && !previousFrames || !currentFrames && previousFrames) { 24391 return false; 24392 } 24393 currentFrames = currentFrames; 24394 previousFrames = previousFrames; 24395 if (previousFrames.length !== currentFrames.length) { 24396 return false; 24397 } 24398 for(let i = 0; i < previousFrames.length; i++){ 24399 const frameA = previousFrames[i]; 24400 const frameB = currentFrames[i]; 24401 if (frameA.filename !== frameB.filename || frameA.lineno !== frameB.lineno || frameA.colno !== frameB.colno || frameA.function !== frameB.function) { 24402 return false; 24403 } 24404 } 24405 return true; 24406} 24407function _isSameFingerprint(currentEvent, previousEvent) { 24408 let currentFingerprint = currentEvent.fingerprint; 24409 let previousFingerprint = previousEvent.fingerprint; 24410 if (!currentFingerprint && !previousFingerprint) { 24411 return true; 24412 } 24413 if (currentFingerprint && !previousFingerprint || !currentFingerprint && previousFingerprint) { 24414 return false; 24415 } 24416 currentFingerprint = currentFingerprint; 24417 previousFingerprint = previousFingerprint; 24418 try { 24419 return !!(currentFingerprint.join("") === previousFingerprint.join("")); 24420 } catch (unused) { 24421 return false; 24422 } 24423} 24424function _getExceptionFromEvent(event) { 24425 var _event_exception_values, _event_exception; 24426 return (_event_exception = event.exception) === null || _event_exception === void 0 ? void 0 : (_event_exception_values = _event_exception.values) === null || _event_exception_values === void 0 ? void 0 : _event_exception_values[0]; 24427} 24428; 24429var __TURBOPACK__imported__module__936032__3 = __TURBOPACK__imported__module__936032__; 24430var __TURBOPACK__imported__module__45968__ = __turbopack_context__.i(45968); 24431// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/sdk.js [app-client] (ecmascript) 24432; 24433var __TURBOPACK__imported__module__250804__19 = __TURBOPACK__imported__module__250804__; 24434var __TURBOPACK__imported__module__901020__13 = __TURBOPACK__imported__module__901020__; 24435var __TURBOPACK__imported__module__272598__25 = __TURBOPACK__imported__module__272598__; 24436; 24437; 24438; 24439function initAndBind(clientClass, options) { 24440 if (options.debug === true) { 24441 if (__TURBOPACK__imported__module__901020__13["DEBUG_BUILD"]) { 24442 __TURBOPACK__imported__module__272598__25["debug"].enable(); 24443 } else { 24444 (0, __TURBOPACK__imported__module__272598__25["consoleSandbox"])(()=>{ 24445 console.warn("[Sentry] Cannot initialize SDK with `debug` option using a non-debug bundle."); 24446 }); 24447 } 24448 } 24449 const scope = (0, __TURBOPACK__imported__module__250804__19["getCurrentScope"])(); 24450 scope.update(options.initialScope); 24451 const client = new clientClass(options); 24452 setCurrentClient(client); 24453 client.init(); 24454 return client; 24455} 24456function setCurrentClient(client) { 24457 (0, __TURBOPACK__imported__module__250804__19["getCurrentScope"])().setClient(client); 24458} 24459; 24460// MERGED MODULE: [project]/node_modules/@sentry/browser/build/npm/esm/prod/client.js [app-client] (ecmascript) 24461; 24462// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/client.js [app-client] (ecmascript) 24463; 24464// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/api.js [app-client] (ecmascript) 24465; 24466var __TURBOPACK__imported__module__339435__1 = __TURBOPACK__imported__module__339435__; 24467; 24468const SENTRY_API_VERSION = "7"; 24469function getBaseApiEndpoint(dsn) { 24470 const protocol = dsn.protocol ? "".concat(dsn.protocol, ":") : ""; 24471 const port = dsn.port ? ":".concat(dsn.port) : ""; 24472 return "".concat(protocol, "//").concat(dsn.host).concat(port).concat(dsn.path ? "/".concat(dsn.path) : "", "/api/"); 24473} 24474function _getIngestEndpoint(dsn) { 24475 return "".concat(getBaseApiEndpoint(dsn)).concat(dsn.projectId, "/envelope/"); 24476} 24477function _encodedAuth(dsn, sdkInfo) { 24478 const params = { 24479 sentry_version: SENTRY_API_VERSION 24480 }; 24481 if (dsn.publicKey) { 24482 params.sentry_key = dsn.publicKey; 24483 } 24484 if (sdkInfo) { 24485 params.sentry_client = "".concat(sdkInfo.name, "/").concat(sdkInfo.version); 24486 } 24487 return new URLSearchParams(params).toString(); 24488} 24489function getEnvelopeEndpointWithUrlEncodedAuth(dsn, tunnel, sdkInfo) { 24490 return tunnel ? tunnel : "".concat(_getIngestEndpoint(dsn), "?").concat(_encodedAuth(dsn, sdkInfo)); 24491} 24492function getReportDialogEndpoint(dsnLike, dialogOptions) {
24493 const dsn = (0, __TURBOPACK__imported__module__339435__1["makeDsn"])(dsnLike); 24494 if (!dsn) { 24495 return ""; 24496 } 24497 const endpoint = "".concat(getBaseApiEndpoint(dsn), "embed/error-page/"); 24498 let encodedOptions = "dsn=".concat((0, __TURBOPACK__imported__module__339435__1["dsnToString"])(dsn)); 24499 for(const key in dialogOptions){ 24500 if (key === "dsn") { 24501 continue; 24502 } 24503 if (key === "onClose") { 24504 continue; 24505 } 24506 if (key === "user") { 24507 const user = dialogOptions.user; 24508 if (!user) { 24509 continue; 24510 } 24511 if (user.name) { 24512 encodedOptions += "&name=".concat(encodeURIComponent(user.name)); 24513 } 24514 if (user.email) { 24515 encodedOptions += "&email=".concat(encodeURIComponent(user.email)); 24516 } 24517 } else { 24518 encodedOptions += "&".concat(encodeURIComponent(key), "=").concat(encodeURIComponent(dialogOptions[key])); 24519 } 24520 } 24521 return "".concat(endpoint, "?").concat(encodedOptions); 24522} 24523; 24524var __TURBOPACK__imported__module__373250__ = __turbopack_context__.i(373250); 24525var __TURBOPACK__imported__module__250804__20 = __TURBOPACK__imported__module__250804__; 24526var __TURBOPACK__imported__module__901020__14 = __TURBOPACK__imported__module__901020__; 24527var __TURBOPACK__imported__module__224339__ = __turbopack_context__.i(224339); 24528// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/metrics/internal.js [app-client] (ecmascript) 24529; 24530var __TURBOPACK__imported__module__759075__ = __turbopack_context__.i(759075); 24531var __TURBOPACK__imported__module__923288__3 = __TURBOPACK__imported__module__923288__; 24532var __TURBOPACK__imported__module__250804__21 = __TURBOPACK__imported__module__250804__; 24533var __TURBOPACK__imported__module__901020__15 = __TURBOPACK__imported__module__901020__; 24534var __TURBOPACK__imported__module__272598__26 = __TURBOPACK__imported__module__272598__; 24535var __TURBOPACK__imported__module__571993__ = __turbopack_context__.i(571993); 24536var __TURBOPACK__imported__module__821061__2 = __TURBOPACK__imported__module__821061__; 24537var __TURBOPACK__imported__module__605394__13 = __TURBOPACK__imported__module__605394__; 24538var __TURBOPACK__imported__module__948826__ = __turbopack_context__.i(948826); 24539var __TURBOPACK__imported__module__805107__ = __turbopack_context__.i(805107); 24540// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/metrics/envelope.js [app-client] (ecmascript) 24541; 24542var __TURBOPACK__imported__module__339435__2 = __TURBOPACK__imported__module__339435__; 24543var __TURBOPACK__imported__module__67486__1 = __TURBOPACK__imported__module__67486__; 24544var __TURBOPACK__imported__module__901538__1 = __TURBOPACK__imported__module__901538__; 24545; 24546; 24547; 24548function createMetricContainerEnvelopeItem(items, inferUserData) { 24549 const inferSetting = inferUserData ? "auto" : "never"; 24550 return [ 24551 { 24552 type: "trace_metric", 24553 item_count: items.length, 24554 content_type: "application/vnd.sentry.items.trace-metric+json" 24555 }, 24556 { 24557 version: 2, 24558 ...(0, __TURBOPACK__imported__module__901538__1["isBrowser"])() && { 24559 ingest_settings: { 24560 infer_ip: inferSetting, 24561 infer_user_agent: inferSetting 24562 } 24563 }, 24564 items 24565 } 24566 ]; 24567} 24568function createMetricEnvelope(metrics, metadata, tunnel, dsn, inferUserData) { 24569 const headers = {}; 24570 if (metadata === null || metadata === void 0 ? void 0 : metadata.sdk) { 24571 headers.sdk = { 24572 name: metadata.sdk.name, 24573 version: metadata.sdk.version 24574 }; 24575 } 24576 if (!!tunnel && !!dsn) { 24577 headers.dsn = (0, __TURBOPACK__imported__module__339435__2["dsnToString"])(dsn); 24578 } 24579 return (0, __TURBOPACK__imported__module__67486__1["createEnvelope"])(headers, [ 24580 createMetricContainerEnvelopeItem(metrics, inferUserData) 24581 ]); 24582} 24583; 24584; 24585; 24586; 24587; 24588; 24589; 24590; 24591; 24592; 24593; 24594; 24595const MAX_METRIC_BUFFER_SIZE = 1e3; 24596function setMetricAttribute(metricAttributes, key, value) { 24597 let setEvenIfPresent = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : true; 24598 if (value && (setEvenIfPresent || !(key in metricAttributes))) { 24599 metricAttributes[key] = value; 24600 } 24601} 24602function _INTERNAL_captureSerializedMetric(client, serializedMetric) { 24603 const bufferMap = _getBufferMap(); 24604 const metricBuffer = _INTERNAL_getMetricBuffer(client); 24605 if (metricBuffer === void 0) { 24606 bufferMap.set(client, [ 24607 serializedMetric 24608 ]); 24609 } else { 24610 if (metricBuffer.length >= MAX_METRIC_BUFFER_SIZE) { 24611 _INTERNAL_flushMetricsBuffer(client, metricBuffer); 24612 bufferMap.set(client, [ 24613 serializedMetric 24614 ]); 24615 } else { 24616 bufferMap.set(client, [ 24617 ...metricBuffer, 24618 serializedMetric 24619 ]); 24620 } 24621 } 24622} 24623function _enrichMetricAttributes(beforeMetric, client, user) { 24624 var _ref; 24625 var _client_getSdkMetadata; 24626 const { release, environment } = client.getOptions(); 24627 const processedMetricAttributes = { 24628 ...beforeMetric.attributes 24629 }; 24630 setMetricAttribute(processedMetricAttributes, "user.id", user.id, false); 24631 setMetricAttribute(processedMetricAttributes, "user.email", user.email, false); 24632 setMetricAttribute(processedMetricAttributes, "user.name", user.username, false); 24633 setMetricAttribute(processedMetricAttributes, "sentry.release", release); 24634 setMetricAttribute(processedMetricAttributes, "sentry.environment", environment); 24635 const { name, version } = (_ref = (_client_getSdkMetadata = client.getSdkMetadata()) === null || _client_getSdkMetadata === void 0 ? void 0 : _client_getSdkMetadata.sdk) !== null && _ref !== void 0 ? _ref : {}; 24636 setMetricAttribute(processedMetricAttributes, "sentry.sdk.name", name); 24637 setMetricAttribute(processedMetricAttributes, "sentry.sdk.version", version); 24638 const replay = client.getIntegrationByName("Replay"); 24639 const replayId = replay === null || replay === void 0 ? void 0 : replay.getReplayId(true); 24640 setMetricAttribute(processedMetricAttributes, "sentry.replay_id", replayId); 24641 if (replayId && (replay === null || replay === void 0 ? void 0 : replay.getRecordingMode()) === "buffer") { 24642 setMetricAttribute(processedMetricAttributes, "sentry._internal.replay_is_buffering", true); 24643 } 24644 return { 24645 ...beforeMetric, 24646 attributes: processedMetricAttributes 24647 }; 24648} 24649function _buildSerializedMetric(metric, client, currentScope, scopeAttributes) { 24650 const [, traceContext] = (0, __TURBOPACK__imported__module__805107__["_getTraceInfoFromScope"])(client, currentScope); 24651 const span = (0, __TURBOPACK__imported__module__821061__2["_getSpanForScope"])(currentScope); 24652 const traceId = span ? span.spanContext().traceId : traceContext === null || traceContext === void 0 ? void 0 : traceContext.trace_id; 24653 const spanId = span ? span.spanContext().spanId : void 0; 24654 const timestamp = (0, __TURBOPACK__imported__module__605394__13["timestampInSeconds"])(); 24655 const sequenceAttr = (0, __TURBOPACK__imported__module__948826__["getSequenceAttribute"])(timestamp); 24656 return { 24657 timestamp, 24658 trace_id: traceId !== null && traceId !== void 0 ? traceId : "", 24659 span_id: spanId, 24660 name: metric.name, 24661 type: metric.type, 24662 unit: metric.unit, 24663 value: metric.value, 24664 attributes: { 24665 ...(0, __TURBOPACK__imported__module__759075__["serializeAttributes"])(scopeAttributes), 24666 ...(0, __TURBOPACK__imported__module__759075__["serializeAttributes"])(metric.attributes, "skip-undefined"), 24667 [sequenceAttr.key]: sequenceAttr.value 24668 } 24669 }; 24670} 24671function _INTERNAL_captureMetric(beforeMetric, options) { 24672 var _ref, _ref1, _ref2, _ref3; 24673 const currentScope = (_ref = options === null || options === void 0 ? void 0 : options.scope) !== null && _ref !== void 0 ? _ref : (0, __TURBOPACK__imported__module__250804__21["getCurrentScope"])(); 24674 const captureSerializedMetric = (_ref1 = options === null || options === void 0 ? void 0 : options.captureSerializedMetric) !== null && _ref1 !== void 0 ? _ref1 : _INTERNAL_captureSerializedMetric; 24675 const client = (_ref2 = currentScope === null || currentScope === void 0 ? void 0 : currentScope.getClient()) !== null && _ref2 !== void 0 ? _ref2 : (0, __TURBOPACK__imported__module__250804__21["getClient"])(); 24676 if (!client) { 24677 __TURBOPACK__imported__module__901020__15["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__26["debug"].warn("No client available to capture metric."); 24678 return; 24679 } 24680 const { _experiments, enableMetrics, beforeSendMetric } = client.getOptions(); 24681 const metricsEnabled = (_ref3 = enableMetrics !== null && enableMetrics !== void 0 ? enableMetrics : _experiments === null || _experiments === void 0 ? void 0 : _experiments.enableMetrics) !== null && _ref3 !== void 0 ? _ref3 : true; 24682 if (!metricsEnabled) { 24683 __TURBOPACK__imported__module__901020__15["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__26["debug"].warn("metrics option not enabled, metric will not be captured."); 24684 return; 24685 } 24686 const { user, attributes: scopeAttributes } = (0, __TURBOPACK__imported__module__571993__["getCombinedScopeData"])((0, __TURBOPACK__imported__module__250804__21["getIsolationScope"])(), currentScope); 24687 const enrichedMetric = _enrichMetricAttributes(beforeMetric, client, user); 24688 client.emit("processMetric", enrichedMetric); 24689 const beforeSendCallback = beforeSendMetric || (_experiments === null || _experiments === void 0 ? void 0 : _experiments.beforeSendMetric); 24690 const processedMetric = beforeSendCallback ? beforeSendCallback(enrichedMetric) : enrichedMetric; 24691 if (!processedMetric) { 24692 __TURBOPACK__imported__module__901020__15["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__26["debug"].log("`beforeSendMetric` returned `null`, will not send metric."); 24693 return; 24694 } 24695 const serializedMetric = _buildSerializedMetric(processedMetric, client, currentScope, scopeAttributes); 24696 __TURBOPACK__imported__module__901020__15["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__26["debug"].log("[Metric]", serializedMetric); 24697 captureSerializedMetric(client, serializedMetric); 24698 client.emit("afterCaptureMetric", processedMetric); 24699} 24700function _INTERNAL_flushMetricsBuffer(client, maybeMetricBuffer) { 24701 var _ref; 24702 const metricBuffer = (_ref = maybeMetricBuffer !== null && maybeMetricBuffer !== void 0 ? maybeMetricBuffer : _INTERNAL_getMetricBuffer(client)) !== null && _ref !== void 0 ? _ref : []; 24703 if (metricBuffer.length === 0) { 24704 return; 24705 } 24706 const clientOptions = client.getOptions(); 24707 const envelope = createMetricEnvelope(metricBuffer, clientOptions._metadata, clientOptions.tunnel, client.getDsn(), client.getDataCollectionOptions().userInfo); 24708 _getBufferMap().set(client, []); 24709 client.emit("flushMetrics"); 24710 client.sendEnvelope(envelope); 24711} 24712function _INTERNAL_getMetricBuffer(client) { 24713 return _getBufferMap().get(client); 24714} 24715function _getBufferMap() { 24716 return (0, __TURBOPACK__imported__module__923288__3["getGlobalSingleton"])("clientToMetricBufferMap", ()=>/* @__PURE__ */ new WeakMap()); 24717} 24718; 24719var __TURBOPACK__imported__module__341041__ = __turbopack_context__.i(341041); 24720var __TURBOPACK__imported__module__473753__5 = __TURBOPACK__imported__module__473753__; 24721// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/tracing/spans/extractGenAiSpans.js [app-client] (ecmascript) 24722; 24723var __TURBOPACK__imported__module__901538__2 = __TURBOPACK__imported__module__901538__; 24724// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/tracing/spans/spanJsonToStreamedSpan.js [app-client] (ecmascript) 24725; 24726var __TURBOPACK__imported__module__304661__18 = __TURBOPACK__imported__module__304661__; 24727; 24728function spanJsonToSerializedStreamedSpan(span) { 24729 const streamedSpan = { 24730 trace_id: span.trace_id, 24731 span_id: span.span_id, 24732 parent_span_id: span.parent_span_id, 24733 name: span.description || "", 24734 start_timestamp: span.start_timestamp, 24735 end_timestamp: span.timestamp || span.start_timestamp, 24736 status: !span.status || span.status === "ok" || span.status === "cancelled" ? "ok" : "error", 24737 is_segment: false, 24738 attributes: { 24739 ...span.data 24740 }, 24741 links: span.links 24742 }; 24743 return (0, __TURBOPACK__imported__module__304661__18["streamedSpanJsonToSerializedSpan"])(streamedSpan); 24744} 24745; 24746; 24747; 24748; 24749function extractGenAiSpansFromEvent(event, client) { 24750 var _event_spans, _event_sdkProcessingMetadata; 24751 if (event.type !== "transaction" || !((_event_spans = event.spans) === null || _event_spans === void 0 ? void 0 : _event_spans.length) || !((_event_sdkProcessingMetadata = event.sdkProcessingMetadata) === null || _event_sdkProcessingMetadata === void 0 ? void 0 : _event_sdkProcessingMetadata.hasGenAiSpans) || client.getOptions().streamGenAiSpans === false || hasSpanStreamingEnabled(client)) { 24752 return void 0; 24753 } 24754 const genAiSpans = []; 24755 const remainingSpans = []; 24756 for (const span of event.spans){ 24757 var _span_op; 24758 if ((_span_op = span.op) === null || _span_op === void 0 ? void 0 : _span_op.startsWith("gen_ai.")) { 24759 genAiSpans.push(spanJsonToSerializedStreamedSpan(span)); 24760 } else { 24761 remainingSpans.push(span); 24762 } 24763 } 24764 if (genAiSpans.length === 0) { 24765 return void 0; 24766 } 24767 event.spans = remainingSpans; 24768 const inferSetting = client.getDataCollectionOptions().userInfo ? "auto" : "never"; 24769 return [ 24770 { 24771 type: "span", 24772 item_count: genAiSpans.length, 24773 content_type: "application/vnd.sentry.items.span.v2+json" 24774 }, 24775 { 24776 version: 2, 24777 ...(0, __TURBOPACK__imported__module__901538__2["isBrowser"])() && { 24778 ingest_settings: { 24779 infer_ip: inferSetting, 24780 infer_user_agent: inferSetting 24781 } 24782 }, 24783 items: genAiSpans 24784 } 24785 ]; 24786} 24787; 24788// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/transports/base.js [app-client] (ecmascript) 24789; 24790var __TURBOPACK__imported__module__901020__16 = __TURBOPACK__imported__module__901020__; 24791var __TURBOPACK__imported__module__272598__27 = __TURBOPACK__imported__module__272598__; 24792var __TURBOPACK__imported__module__67486__2 = __TURBOPACK__imported__module__67486__; 24793// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/utils/promisebuffer.js [app-client] (ecmascript) 24794; 24795var __TURBOPACK__imported__module__580611__ = __turbopack_context__.i(580611); 24796// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/utils/timer.js [app-client] (ecmascript) 24797; 24798function safeUnref(timer) { 24799 if (typeof timer === "object" && typeof timer.unref === "function") { 24800 timer.unref(); 24801 } 24802 return timer; 24803} 24804; 24805; 24806; 24807const SENTRY_BUFFER_FULL_ERROR = /* @__PURE__ */ Symbol.for("SentryBufferFullError"); 24808function makePromiseBuffer() { 24809 let limit = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 100; 24810 const buffer = /* @__PURE__ */ new Set(); 24811 function isReady() { 24812 return buffer.size < limit; 24813 } 24814 function remove(task) { 24815 buffer.delete(task); 24816 } 24817 function add(taskProducer) { 24818 if (!isReady()) { 24819 return (0, __TURBOPACK__imported__module__580611__["rejectedSyncPromise"])(SENTRY_BUFFER_FULL_ERROR); 24820 } 24821 const task = taskProducer(); 24822 buffer.add(task); 24823 void task.then(()=>remove(task), ()=>remove(task)); 24824 return task; 24825 } 24826 function drain(timeout) { 24827 if (!buffer.size) { 24828 return (0, __TURBOPACK__imported__module__580611__["resolvedSyncPromise"])(true); 24829 } 24830 const drainPromise = Promise.allSettled(Array.from(buffer)).then(()=>true); 24831 if (!timeout) { 24832 return drainPromise; 24833 } 24834 const promises = [ 24835 drainPromise, 24836 new Promise((resolve)=>safeUnref(setTimeout(()=>resolve(false), timeout))) 24837 ]; 24838 return Promise.race(promises); 24839 } 24840 return { 24841 get $ () { 24842 return Array.from(buffer); 24843 }, 24844 add, 24845
24845 drain 24846 }; 24847} 24848; 24849// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/utils/ratelimit.js [app-client] (ecmascript) 24850; 24851var __TURBOPACK__imported__module__111139__2 = __TURBOPACK__imported__module__111139__; 24852; 24853const DEFAULT_RETRY_AFTER = 60 * 1e3; 24854function parseRetryAfterHeader(header) { 24855 let now = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : (0, __TURBOPACK__imported__module__111139__2["safeDateNow"])(); 24856 const headerDelay = parseInt("".concat(header), 10); 24857 if (!isNaN(headerDelay)) { 24858 return headerDelay * 1e3; 24859 } 24860 const headerDate = Date.parse("".concat(header)); 24861 if (!isNaN(headerDate)) { 24862 return headerDate - now; 24863 } 24864 return DEFAULT_RETRY_AFTER; 24865} 24866function disabledUntil(limits, dataCategory) { 24867 return limits[dataCategory] || limits.all || 0; 24868} 24869function isRateLimited(limits, dataCategory) { 24870 let now = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : (0, __TURBOPACK__imported__module__111139__2["safeDateNow"])(); 24871 return disabledUntil(limits, dataCategory) > now; 24872} 24873function updateRateLimits(limits, param) { 24874 let { statusCode, headers } = param, now = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : (0, __TURBOPACK__imported__module__111139__2["safeDateNow"])(); 24875 const updatedRateLimits = { 24876 ...limits 24877 }; 24878 const rateLimitHeader = headers === null || headers === void 0 ? void 0 : headers["x-sentry-rate-limits"]; 24879 const retryAfterHeader = headers === null || headers === void 0 ? void 0 : headers["retry-after"]; 24880 if (rateLimitHeader) { 24881 for (const limit of rateLimitHeader.trim().split(",")){ 24882 const [retryAfter, categories, , , namespaces] = limit.split(":", 5); 24883 const headerDelay = parseInt(retryAfter, 10); 24884 const delay = (!isNaN(headerDelay) ? headerDelay : 60) * 1e3; 24885 if (!categories) { 24886 updatedRateLimits.all = now + delay; 24887 } else { 24888 for (const category of categories.split(";")){ 24889 if (category === "metric_bucket") { 24890 if (!namespaces || namespaces.split(";").includes("custom")) { 24891 updatedRateLimits[category] = now + delay; 24892 } 24893 } else { 24894 updatedRateLimits[category] = now + delay; 24895 } 24896 } 24897 } 24898 } 24899 } else if (retryAfterHeader) { 24900 updatedRateLimits.all = now + parseRetryAfterHeader(retryAfterHeader, now); 24901 } else if (statusCode === 429) { 24902 updatedRateLimits.all = now + 60 * 1e3; 24903 } 24904 return updatedRateLimits; 24905} 24906; 24907; 24908; 24909; 24910; 24911; 24912const DEFAULT_TRANSPORT_BUFFER_SIZE = 64; 24913function createTransport(options, makeRequest) { 24914 let buffer = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : makePromiseBuffer(options.bufferSize || DEFAULT_TRANSPORT_BUFFER_SIZE); 24915 let rateLimits = {}; 24916 const flush = (timeout)=>buffer.drain(timeout); 24917 function send(envelope) { 24918 const filteredEnvelopeItems = []; 24919 (0, __TURBOPACK__imported__module__67486__2["forEachEnvelopeItem"])(envelope, (item, type)=>{ 24920 const dataCategory = (0, __TURBOPACK__imported__module__67486__2["envelopeItemTypeToDataCategory"])(type); 24921 if (isRateLimited(rateLimits, dataCategory)) { 24922 options.recordDroppedEvent("ratelimit_backoff", dataCategory); 24923 } else { 24924 filteredEnvelopeItems.push(item); 24925 } 24926 }); 24927 if (filteredEnvelopeItems.length === 0) { 24928 return Promise.resolve({}); 24929 } 24930 const filteredEnvelope = (0, __TURBOPACK__imported__module__67486__2["createEnvelope"])(envelope[0], filteredEnvelopeItems); 24931 const recordEnvelopeLoss = (reason)=>{ 24932 if ((0, __TURBOPACK__imported__module__67486__2["envelopeContainsItemType"])(filteredEnvelope, [ 24933 "client_report" 24934 ])) { 24935 __TURBOPACK__imported__module__901020__16["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__27["debug"].warn("Dropping client report. Will not send outcomes (reason: ".concat(reason, ").")); 24936 return; 24937 } 24938 (0, __TURBOPACK__imported__module__67486__2["forEachEnvelopeItem"])(filteredEnvelope, (item, type)=>{ 24939 options.recordDroppedEvent(reason, (0, __TURBOPACK__imported__module__67486__2["envelopeItemTypeToDataCategory"])(type)); 24940 }); 24941 }; 24942 const requestTask = ()=>
24942makeRequest({ 24943 body: (0, __TURBOPACK__imported__module__67486__2["serializeEnvelope"])(filteredEnvelope) 24944 }).then((response)=>{ 24945 if (response.statusCode === 413) { 24946 __TURBOPACK__imported__module__901020__16["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__27["debug"].error("Sentry responded with status code 413. Envelope was discarded due to exceeding size limits."); 24947 recordEnvelopeLoss("send_error"); 24948 return response; 24949 } 24950 if (__TURBOPACK__imported__module__901020__16["DEBUG_BUILD"] && response.statusCode !== void 0 && (response.statusCode < 200 || response.statusCode >= 300)) { 24951 __TURBOPACK__imported__module__272598__27["debug"].warn("Sentry responded with status code ".concat(response.statusCode, " to sent event.")); 24952 } 24953 rateLimits = updateRateLimits(rateLimits, response); 24954 return response; 24955 }, (error)=>{ 24956 recordEnvelopeLoss("network_error"); 24957 __TURBOPACK__imported__module__901020__16["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__27["debug"].error("Encountered error running transport request:", error); 24958 throw error; 24959 }); 24960 return buffer.add(requestTask).then((result)=>result, (error)=>{ 24961 if (error === SENTRY_BUFFER_FULL_ERROR) { 24962 __TURBOPACK__imported__module__901020__16["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__27["debug"].error("Skipped sending event because buffer is full."); 24963 recordEnvelopeLoss("queue_overflow"); 24964 return Promise.resolve({}); 24965 } else { 24966 throw error; 24967 } 24968 }); 24969 } 24970 return { 24971 send, 24972 flush 24973 }; 24974} 24975; 24976// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/utils/clientreport.js [app-client] (ecmascript) 24977; 24978var __TURBOPACK__imported__module__67486__3 = __TURBOPACK__imported__module__67486__; 24979var __TURBOPACK__imported__module__605394__14 = __TURBOPACK__imported__module__605394__; 24980; 24981; 24982function createClientReportEnvelope(discarded_events, dsn, timestamp) { 24983 const clientReportItem = [ 24984 { 24985 type: "client_report" 24986 }, 24987 { 24988 timestamp: timestamp || (0, __TURBOPACK__imported__module__605394__14["dateTimestampInSeconds"])(), 24989 discarded_events 24990 } 24991 ]; 24992 return (0, __TURBOPACK__imported__module__67486__3["createEnvelope"])(dsn ? { 24993 dsn 24994 } : {}, [ 24995 clientReportItem 24996 ]); 24997} 24998; 24999var __TURBOPACK__imported__module__272598__28 = __TURBOPACK__imported__module__272598__; 25000var __TURBOPACK__imported__module__339435__3 = __TURBOPACK__imported__module__339435__; 25001var __TURBOPACK__imported__module__67486__4 = __TURBOPACK__imported__module__67486__; 25002var __TURBOPACK__imported__module__453288__7 = __TURBOPACK__imported__module__453288__; 25003var __TURBOPACK__imported__module__318746__ = __turbopack_context__.i(318746); 25004var __TURBOPACK__imported__module__682564__2 = __TURBOPACK__imported__module__682564__; 25005var __TURBOPACK__imported__module__170637__2 = __TURBOPACK__imported__module__170637__; 25006var __TURBOPACK__imported__module__213186__ = __turbopack_context__.i(213186); 25007var __TURBOPACK__imported__module__111139__3 = __TURBOPACK__imported__module__111139__; 25008var __TURBOPACK__imported__module__304661__19 = __TURBOPACK__imported__module__304661__; 25009// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/utils/transactionEvent.js [app-client] (ecmascript) 25010; 25011var __TURBOPACK__imported__module__519988__17 = __TURBOPACK__imported__module__519988__; 25012; 25013function convertTransactionEventToSpanJson(event) { 25014 var _ref, _event_start_timestamp; 25015 var _event_contexts; 25016 const { trace_id, parent_span_id, span_id, status, origin, data, op } = (_ref = (_event_contexts = event.contexts) === null || _event_contexts === void 0 ? void 0 : _event_contexts.trace) !== null && _ref !== void 0 ? _ref : {}; 25017 return { 25018 data: data !== null && data !== void 0 ? data : {}, 25019 description: event.transaction, 25020 op, 25021 parent_span_id, 25022 span_id: span_id !== null && span_id !== void 0 ? span_id : "", 25023 start_timestamp: (_event_start_timestamp = event.start_timestamp) !== null && _event_start_timestamp !== void 0 ? _event_start_timestamp : 0, 25024 status, 25025 timestamp: event.timestamp, 25026 trace_id: trace_id !== null && trace_id !== void 0 ? trace_id : "", 25027 origin, 25028 profile_id: data === null || data === void 0 ? void 0 : data[__TURBOPACK__imported__module__519988__17["SEMANTIC_ATTRIBUTE_PROFILE_ID"]], 25029 exclusive_time: data === null || data === void 0 ? void 0 : data[__TURBOPACK__imported__module__519988__17["SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME"]], 25030 measurements: event.measurements, 25031 is_segment: true 25032 }; 25033} 25034function convertSpanJsonToTransactionEvent(span) { 25035 return { 25036 type: "transaction", 25037 timestamp: span.timestamp, 25038 start_timestamp: span.start_timestamp, 25039 transaction: span.description, 25040 contexts: { 25041 trace: { 25042 trace_id: span.trace_id, 25043 span_id: span.span_id, 25044 parent_span_id: span.parent_span_id, 25045 op: span.op, 25046 status: span.status, 25047 origin: span.origin, 25048 data: { 25049 ...span.data, 25050 ...span.profile_id && { 25051 [__TURBOPACK__imported__module__519988__17["SEMANTIC_ATTRIBUTE_PROFILE_ID"]]: span.profile_id 25052 }, 25053 ...span.exclusive_time && { 25054 [__TURBOPACK__imported__module__519988__17["SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME"]]: span.exclusive_time 25055 } 25056 } 25057 } 25058 }, 25059 measurements: span.measurements 25060 }; 25061} 25062; 25063// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/utils/data-collection/resolveDataCollectionOptions.js [app-client] (ecmascript) 25064; 25065// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/utils/data-collection/defaultPiiToCollectionOptions.js [app-client] (ecmascript) 25066; 25067// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/utils/data-collection/filtering-snippets.js [app-client] (ecmascript) 25068; 25069const FILTERED_VALUE = "[Filtered]"; 25070const PII_HEADER_SNIPPETS = [ 25071 "forwarded", 25072 "-ip", 25073 "remote-", 25074 "via", 25075 "-user" 25076]; 25077const SENSITIVE_KEY_SNIPPETS = [ 25078 "auth", 25079 "token", 25080 "secret", 25081 "session", 25082 // for the user_session cookie 25083 "password", 25084 "passwd", 25085 "pwd",
25086 "key", 25087 "jwt", 25088 "bearer", 25089 "sso", 25090 "saml", 25091 "csrf", 25092 "xsrf", 25093 "credentials", 25094 "sid", 25095 "identity", 25096 // Always treat cookie headers as sensitive in case individual key-value cookie pairs cannot properly be extracted 25097 "set-cookie", 25098 "cookie" 25099]; 25100const SENSITIVE_COOKIE_NAME_SNIPPETS = [ 25101 // Express / Connect default session cookie 25102 ".sid", 25103 // Opaque session ids (PHPSESSID, ASPSESSIONID*, BIGipServer*, *sessid*, â¦) 25104 "sessid", 25105 // Laravel etc. "remember me" tokens 25106 "remember", 25107 // OIDC / OAuth auxiliary (`oauth*` covered by header snippet `auth`) 25108 "oidc", 25109 "pkce", 25110 "nonce", 25111 // RFC 6265bis high-security cookie name prefixes 25112 "__secure-", 25113 "__host-", 25114 // Load balancer / CDN sticky-session cookies (opaque routing tokens) 25115 "awsalb", 25116 "awselb", 25117 "akamai", 25118 // BaaS / IdP session cookies (names often omit "session") 25119 "__stripe", 25120 "cognito", 25121 "firebase", 25122 "supabase", 25123 "sb-", 25124 // Step-up / MFA cookies 25125 "mfa", 25126 "2fa" 25127]; 25128; 25129; 25130function defaultPiiToCollectionOptions(sendDefaultPii) { 25131 return sendDefaultPii === true ? { 25132 userInfo: true, 25133 cookies: true, 25134 httpHeaders: { 25135 request: true, 25136 response: true 25137 }, 25138 httpBodies: [ 25139 "incomingRequest", 25140 "outgoingRequest", 25141 "incomingResponse", 25142 "outgoingResponse" 25143 ], 25144 urlQueryParams: true, 25145 graphQL: { 25146 document: true, 25147 variables: true 25148 }, 25149 genAI: { 25150 inputs: true, 25151 outputs: true 25152 }, 25153 databaseQueryData: true, 25154 stackFrameVariables: true, 25155 frameContextLines: 7 25156 } : { 25157 userInfo: false, 25158 cookies: { 25159 deny: PII_HEADER_SNIPPETS 25160 }, 25161 httpHeaders: { 25162 request: { 25163 deny: PII_HEADER_SNIPPETS 25164 }, 25165 response: { 25166 deny: PII_HEADER_SNIPPETS 25167 } 25168 }, 25169 httpBodies: [], 25170 urlQueryParams: { 25171 deny: PII_HEADER_SNIPPETS 25172 }, 25173 // The GraphQL document has literal values redacted at collection time, so it was historically 25174 // always attached regardless of `sendDefaultPii`; keep it on to preserve that behavior. 25175 graphQL: { 25176 document: true, 25177 variables: true 25178 }, 25179 genAI: { 25180 inputs: false, 25181 outputs: false 25182 }, 25183 // Database query values were only sent with `sendDefaultPii: true` (e.g. Supabase gated on it), 25184 // so map the legacy "off" state to `false`. 25185 databaseQueryData: false, 25186 stackFrameVariables: true, 25187 frameContextLines: 7 25188 }; 25189} 25190; 25191; 25192const DEFAULTS = { 25193 userInfo: true, 25194 cookies: true, 25195 httpHeaders: { 25196 request: true, 25197 response: true 25198 }, 25199 httpBodies: [ 25200 "incomingRequest", 25201 "outgoingRequest", 25202 "incomingResponse", 25203 "outgoingResponse" 25204 ], 25205 urlQueryParams: true, 25206 graphQL: { 25207 document: true, 25208 variables: true 25209 }, 25210 genAI: { 25211 inputs: true, 25212 outputs: true 25213 }, 25214 databaseQueryData: true, 25215 stackFrameVariables: true, 25216 frameContextLines: 5 25217}; 25218function resolveDataCollectionOptions(options) { 25219 var _options_dataCollection, _dc_userInfo, _dc_cookies, _ref, _ref1, _dc_httpBodies, _ref2, _dc_urlQueryParams, _ref3, _ref4, _ref5, _ref6, _dc_databaseQueryData, _dc_stackFrame
25219Variables, _dc_frameContextLines; 25220 var _dc_httpHeaders, _dc_httpHeaders1, _dc_graphQL, _dc_graphQL1, _dc_genAI, _dc_genAI1; 25221 const base = options.dataCollection != null ? DEFAULTS : defaultPiiToCollectionOptions(options.sendDefaultPii); 25222 const dc = (_options_dataCollection = options.dataCollection) !== null && _options_dataCollection !== void 0 ? _options_dataCollection : {}; 25223 return { 25224 userInfo: (_dc_userInfo = dc.userInfo) !== null && _dc_userInfo !== void 0 ? _dc_userInfo : base.userInfo, 25225 cookies: (_dc_cookies = dc.cookies) !== null && _dc_cookies !== void 0 ? _dc_cookies : base.cookies, 25226 httpHeaders: { 25227 request: (_ref = (_dc_httpHeaders = dc.httpHeaders) === null || _dc_httpHeaders === void 0 ? void 0 : _dc_httpHeaders.request) !== null && _ref !== void 0 ? _ref : base.httpHeaders.request, 25228 response: (_ref1 = (_dc_httpHeaders1 = dc.httpHeaders) === null || _dc_httpHeaders1 === void 0 ? void 0 : _dc_httpHeaders1.response) !== null && _ref1 !== void 0 ? _ref1 : base.httpHeaders.response 25229 }, 25230 httpBodies: (_dc_httpBodies = dc.httpBodies) !== null && _dc_httpBodies !== void 0 ? _dc_httpBodies : base.httpBodies, 25231 // oxlint-disable-next-line typescript/no-deprecated 25232 urlQueryParams: (_ref2 = (_dc_urlQueryParams = dc.urlQueryParams) !== null && _dc_urlQueryParams !== void 0 ? _dc_urlQueryParams : dc.queryParams) !== null && _ref2 !== void 0 ? _ref2 : base.urlQueryParams, 25233 graphQL: { 25234 document: (_ref3 = (_dc_graphQL = dc.graphQL) === null || _dc_graphQL === void 0 ? void 0 : _dc_graphQL.document) !== null && _ref3 !== void 0 ? _ref3 : base.graphQL.document, 25235 variables: (_ref4 = (_dc_graphQL1 = dc.graphQL) === null || _dc_graphQL1 === void 0 ? void 0 : _dc_graphQL1.variables) !== null && _ref4 !== void 0 ? _ref4 : base.graphQL.variables 25236 }, 25237 genAI: { 25238 inputs: (_ref5 = (_dc_genAI = dc.genAI) === null || _dc_genAI === void 0 ? void 0 : _dc_genAI.inputs) !== null && _ref5 !== void 0 ? _ref5 : base.genAI.inputs, 25239 outputs: (_ref6 = (_dc_genAI1 = dc.genAI) === null || _dc_genAI1 === void 0 ? void 0 : _dc_genAI1.outputs) !== null && _ref6 !== void 0 ? _ref6 : base.genAI.outputs 25240 }, 25241 databaseQueryData: (_dc_databaseQueryData = dc.databaseQueryData) !== null && _dc_databaseQueryData !== void 0 ? _dc_databaseQueryData : base.databaseQueryData,
25242 stackFrameVariables: (_dc_stackFrameVariables = dc.stackFrameVariables) !== null && _dc_stackFrameVariables !== void 0 ? _dc_stackFrameVariables : base.stackFrameVariables, 25243 frameContextLines: (_dc_frameContextLines = dc.frameContextLines) !== null && _dc_frameContextLines !== void 0 ? _dc_frameContextLines : base.frameContextLines 25244 }; 25245} 25246; 25247; 25248; 25249; 25250; 25251; 25252; 25253; 25254; 25255; 25256; 25257; 25258; 25259; 25260; 25261; 25262; 25263; 25264; 25265; 25266; 25267; 25268; 25269; 25270; 25271; 25272; 25273; 25274; 25275; 25276; 25277const ALREADY_SEEN_ERROR = "Not capturing exception because it's already been captured."; 25278const MISSING_RELEASE_FOR_SESSION_ERROR = "Discarded session because of missing or non-string release"; 25279const INTERNAL_ERROR_SYMBOL = /* @__PURE__ */ Symbol.for("SentryInternalError"); 25280const DO_NOT_SEND_EVENT_SYMBOL = /* @__PURE__ */ Symbol.for("SentryDoNotSendEventError"); 25281const DEFAULT_FLUSH_INTERVAL = 5e3; 25282function _makeInternalError(message) { 25283 return { 25284 message, 25285 [INTERNAL_ERROR_SYMBOL]: true 25286 }; 25287} 25288function _makeDoNotSendEventError(message) { 25289 return { 25290 message, 25291 [DO_NOT_SEND_EVENT_SYMBOL]: true 25292 }; 25293} 25294function _isInternalError(error) { 25295 return (0, __TURBOPACK__imported__module__453288__7["isObjectLike"])(error) && INTERNAL_ERROR_SYMBOL in error; 25296} 25297function _isDoNotSendEventError(error) { 25298 return (0, __TURBOPACK__imported__module__453288__7["isObjectLike"])(error) && DO_NOT_SEND_EVENT_SYMBOL in error; 25299} 25300function setupWeightBasedFlushing(client, afterCaptureHook, flushHook, estimateSizeFn, flushFn) { 25301 let weight = 0; 25302 let flushTimeout; 25303 let isTimerActive = false; 25304 client.on(flushHook, ()=>{ 25305 weight = 0; 25306 clearTimeout(flushTimeout); 25307 isTimerActive = false; 25308 }); 25309 client.on(afterCaptureHook, (item)=>{ 25310 weight += estimateSizeFn(item); 25311 if (weight >= 8e5) { 25312 flushFn(client); 25313 } else if (!isTimerActive) { 25314 var _client_getOptions__flushInterval; 25315 const flushInterval = (_client_getOptions__flushInterval = client.getOptions()._flushInterval) !== null && _client_getOptions__flushInterval !== void 0 ? _client_getOptions__flushInterval : DEFAULT_FLUSH_INTERVAL; 25316 if (flushInterval > 0) { 25317 isTimerActive = true; 25318 flushTimeout = safeUnref(setTimeout(()=>{ 25319 flushFn(client); 25320 }, flushInterval)); 25321 } 25322 } 25323 }); 25324 client.on("flush", ()=>{ 25325 flushFn(client); 25326 }); 25327} 25328class Client { 25329 /** 25330 * Captures an exception event and sends it to Sentry. 25331 * 25332 * Unlike `captureException` exported from every SDK, this method requires that you pass it the current scope. 25333 */ captureException(exception, hint, scope) { 25334 const eventId = (0, __TURBOPACK__imported__module__682564__2["uuid4"])(); 25335 if ((0, __TURBOPACK__imported__module__682564__2["checkOrSetAlreadyCaught"])(exception)) { 25336 __TURBOPACK__imported__module__901020__14["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__28["debug"].log(ALREADY_SEEN_ERROR); 25337 return eventId; 25338 } 25339 const hintWithEventId = { 25340 event_id: eventId, 25341 ...hint 25342 }; 25343 this._process(()=>this.eventFromException(exception, hintWithEventId).then((event)=>this._captureEvent(event, hintWithEventId, scope)).then((res)=>res), "error"); 25344 return hintWithEventId.event_id; 25345 } 25346 /** 25347 * Captures a message event and sends it to Sentry. 25348 * 25349 * Unlike `captureMessage` exported from every SDK, this method requires that you pass it the current scope. 25350 */ captureMessage(message, level, hint, currentScope) { 25351 const hintWithEventId = { 25352 event_id: (0, __TURBOPACK__imported__module__682564__2["uuid4"])(), 25353 ...hint 25354 }; 25355 const eventMessage = (0, __TURBOPACK__imported__module__453288__7["isParameterizedString"])(message) ? message : String(message); 25356 const isMessage = (0, __TURBOPACK__imported__module__453288__7["isPrimitive"])(message); 25357 const promisedEvent = isMessage ? this.eventFromMessage(eventMessage, level, hintWithEventId) : this.eventFromException(message, hintWithEventId); 25358 this._process(()=>promisedEvent.then((event)=>this._captureEvent(event, hintWithEventId, currentScope)), isMessage ? "unknown" : "error"); 25359 return hintWithEventId.event_id; 25360 } 25361 /** 25362 * Captures a manually created event and sends it to Sentry. 25363 * 25364 * Unlike `captureEvent` exported from every SDK, this method requires that you pass it the current scope. 25365 */ captureEvent(event, hint, currentScope) { 25366 const eventId = (0, __TURBOPACK__imported__module__682564__2["uuid4"])(); 25367 if ((hint === null || hint === void 0 ? void 0 : hint.originalException) && (0, __TURBOPACK__imported__module__682564__2["checkOrSetAlreadyCaught"])(hint.originalException)) { 25368 __TURBOPACK__imported__module__901020__14["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__28["debug"].log(ALREADY_SEEN_E
25368RROR); 25369 return eventId; 25370 } 25371 const hintWithEventId = { 25372 event_id: eventId, 25373 ...hint 25374 }; 25375 const sdkProcessingMetadata = event.sdkProcessingMetadata || {}; 25376 const capturedSpanScope = sdkProcessingMetadata.capturedSpanScope; 25377 const capturedSpanIsolationScope = sdkProcessingMetadata.capturedSpanIsolationScope; 25378 const dataCategory = getDataCategoryByType(event.type); 25379 this._process(()=>this._captureEvent(event, hintWithEventId, capturedSpanScope || currentScope, capturedSpanIsolationScope), dataCategory); 25380 return hintWithEventId.event_id; 25381 } 25382 /** 25383 * Captures a session. 25384 */ captureSession(session) { 25385 this.sendSession(session); 25386 (0, __TURBOPACK__imported__module__341041__["updateSession"])(session, { 25387 init: false 25388 }); 25389 } 25390 /** 25391 * Get the current Dsn. 25392 */ getDsn() { 25393 return this._dsn; 25394 } 25395 /** 25396 * Get the current options. 25397 */ getOptions() { 25398 return this._options; 25399 } 25400 /** 25401 * Get the resolved data collection configuration. 25402 */ getDataCollectionOptions() { 25403 return this._dataCollection; 25404 } 25405 /** 25406 * Get the SDK metadata. 25407 * @see SdkMetadata 25408 */ getSdkMetadata() { 25409 return this._options._metadata; 25410 } 25411 /** 25412 * Returns the transport that is used by the client. 25413 * Please note that the transport gets lazy initialized so it will only be there once the first event has been sent. 25414 */ getTransport() { 25415 return this._transport; 25416 } 25417 /** 25418 * Wait for all events to be sent or the timeout to expire, whichever comes first. 25419 * 25420 * @param timeout Maximum time in ms the client should wait for events to be flushed. Omitting this parameter will 25421 * cause the client to wait until all events are sent before resolving the promise. 25422 * @returns A promise that will resolve with `true` if all events are sent before the timeout, or `false` if there are 25423 * still events in the queue when the timeout is reached. 25424 */ // @ts-expect-error - PromiseLike is a subset of Promise 25425 async flush(timeout) { 25426 const transport = this._transport; 25427 this.emit("flush"); 25428 if (!transport) { 25429 return true; 25430 } 25431 const clientFinished = await this._isClientDoneProcessing(timeout); 25432 const transportFlushed = await transport.flush(timeout); 25433 return clientFinished && transportFlushed; 25434 } 25435 /** 25436 * Flush the event queue and set the client to `enabled = false`. See {@link Client.flush}. 25437 * 25438 * @param {number} timeout Maximum time in ms the client should wait before shutting down. Omitting this parameter will cause 25439 * the client to wait until all events are sent before disabling itself. 25440 * @returns {Promise<boolean>} A promise which resolves to `true` if the flush completes successfully before the timeout, or `false` if 25441 * it doesn't. 25442 */ // @ts-expect-error - PromiseLike is a subset of Promise 25443 async close(timeout) { 25444 const result = await this.flush(timeout); 25445 this.getOptions().enabled = false; 25446 this.emit("close"); 25447 return result; 25448 } 25449 /** 25450 * Get all installed event processors. 25451 */ getEventProcessors() { 25452 return this._eventProcessors; 25453 } 25454 /** 25455 * Adds an event processor that applies to any event processed by this client. 25456 */ addEventProcessor(eventProcessor) { 25457 this._eventProcessors.push(eventProcessor); 25458 } 25459 /** 25460 * Initialize this client. 25461 * Call this after the client was set on a scope. 25462 */ init() { 25463 if (this._isEnabled() || // Force integrations to be setup even if no DSN was set when we have 25464 // Spotlight enabled. This is particularly important for browser as we 25465 // don't support the `spotlight` option there and rely on the users 25466 // adding the `spotlightBrowserIntegration()` to their integrations which 25467 // wouldn't get initialized with the check below when there's no DSN set. 25468 this._options.integrations.some((param)=>{ 25469 let { name } = param; 25470 return name.startsWith("Spotlight"); 25471 })) { 25472 this._setupIntegrations(); 25473 } 25474 } 25475 /** 25476 * Gets an installed integration by its name. 25477 * 25478 * @returns {Integration|undefined} The installed integration or `undefined` if no integration with that `name` was installed. 25479 */ getIntegrationByName(integrationName) { 25480 return this._integrations[integrationName]; 25481 } 25482 /** 25483 * Returns the names of all installed integrations. 25484 */ getIntegrationNames() { 25485 return Object.keys(this._integrations); 25486 } 25487 /** 25488 * Add an integration to the client. 25489 * This can be used to e.g. lazy load integrations. 25490 * In most cases, this should not be necessary, 25491 * and you're better off just passing the integrations via `integrations: []` at initialization time. 25492 * However, if you find the need to conditionally load & add an integration, you can use `addIntegration` to do so. 25493 */ addIntegration(integration) { 25494 const isAlreadyInstalled = this._integrations[integration.name]; 25495 if (!isAlreadyInstalled && integration.beforeSetup) { 25496 integration.beforeSetup(this); 25497 } 25498 setupIntegration(this, integration, this._integrations); 25499 if (!isAlreadyInstalled) { 25500 afterSetupIntegrations(this, [ 25501 integration 25502 ]); 25503 } 25504 } 25505 /** 25506 * Send a fully prepared event to Sentry. 25507 */ sendEvent(event) { 25508 let hint = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
25509 this.emit("beforeSendEvent", event, hint); 25510 const genAiSpanItem = extractGenAiSpansFromEvent(event, this); 25511 let env = createEventEnvelope(event, this._dsn, this._options._metadata, this._options.tunnel); 25512 for (const attachment of hint.attachments || []){ 25513 env = (0, __TURBOPACK__imported__module__67486__4["addItemToEnvelope"])(env, (0, __TURBOPACK__imported__module__67486__4["createAttachmentEnvelopeItem"])(attachment)); 25514 } 25515 if (genAiSpanItem) { 25516 env = (0, __TURBOPACK__imported__module__67486__4["addItemToEnvelope"])(env, genAiSpanItem); 25517 } 25518 this.sendEnvelope(env).then((sendResponse)=>this.emit("afterSendEvent", event, sendResponse)); 25519 } 25520 /** 25521 * Send a session or session aggregrates to Sentry. 25522 */ sendSession(session) { 25523 const { release: clientReleaseOption, environment: clientEnvironmentOption = __TURBOPACK__imported__module__373250__["DEFAULT_ENVIRONMENT"] } = this._options; 25524 if ("aggregates" in session) { 25525 const sessionAttrs = session.attrs || {}; 25526 if (!sessionAttrs.release && !clientReleaseOption) { 25527 __TURBOPACK__imported__module__901020__14["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__28["debug"].warn(MISSING_RELEASE_FOR_SESSION_ERROR); 25528 return; 25529 } 25530 sessionAttrs.release = sessionAttrs.release || clientReleaseOption; 25531 sessionAttrs.environment = sessionAttrs.environment || clientEnvironmentOption; 25532 session.attrs = sessionAttrs; 25533 } else { 25534 if (!session.release && !clientReleaseOption) { 25535 __TURBOPACK__imported__module__901020__14["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__28["debug"].warn(MISSING_RELEASE_FOR_SESSION_ERROR); 25536 return; 25537 } 25538 session.release = session.release || clientReleaseOption; 25539 session.environment = session.environment || clientEnvironmentOption; 25540 } 25541 this.emit("beforeSendSession", session); 25542 const env = createSessionEnvelope(session, this._dsn, this._options._metadata, this._options.tunnel); 25543 this.sendEnvelope(env); 25544 } 25545 /** 25546 * Record on the client that an event got dropped (ie, an event that will not be sent to Sentry). 25547 */ recordDroppedEvent(reason, category) { 25548 let count = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : 1; 25549 if (this._options.sendClientReports) { 25550 const key = "".concat(reason, ":").concat(category); 25551 __TURBOPACK__imported__module__901020__14["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__28["debug"].log('Recording outcome: "'.concat(key, '"').concat(count > 1 ? " (".concat(count, " times)") : "")); 25552 this._outcomes[key] = (this._outcomes[key] || 0) + count; 25553 } 25554 } 25555 /** 25556 * Register a hook on this client. 25557 */ on(hook, callback) { 25558 const hookCallbacks = this._hooks[hook] = this._hooks[hook] || /* @__PURE__ */ new Set(); 25559 const uniqueCallback = function() { 25560 for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++){ 25561 args[_key] = arguments[_key]; 25562 } 25563 return callback(...args); 25564 }; 25565 hookCallbacks.add(uniqueCallback); 25566 return ()=>{ 25567 hookCallbacks.delete(uniqueCallback); 25568 }; 25569 } 25570 /** 25571 * Emit a hook that was previously registered via `on()`. 25572 */ emit(hook) { 25573 for(var _len = arguments.length, rest = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++){ 25574 rest[_key - 1] = arguments[_key]; 25575 } 25576 const callbacks = this._hooks[hook]; 25577 if (callbacks) { 25578 callbacks.forEach((callback)=>callback(...rest)); 25579 } 25580 } 25581 /** 25582 * Send an envelope to Sentry. 25583 */ // @ts-expect-error - PromiseLike is a subset of Promise 25584 async sendEnvelope(envelope) { 25585 this.emit("beforeEnvelope", envelope); 25586 if (this._isEnabled() && this._transport) { 25587 try { 25588 return await this._transport.send(envelope); 25589 } catch (reason) { 25590 __TURBOPACK__imported__module__901020__14["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__28["debug"].error("Error while sending envelope:", reason); 25591 return {}; 25592 } 25593 } 25594 __TURBOPACK__imported__module__901020__14["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__28["debug"].error("Transport disabled"); 25595 return {}; 25596 } 25597 /** 25598 * Register a cleanup function to be called when the client is disposed. 25599 * This is useful for integrations that need to clean up global state. 25600 * 25601 * NOTE: This is a no-op in the base `Client` class. Subclasses like `ServerRuntimeClient` 25602 * override this method to actually register and execute cleanup callbacks. 25603 */ // eslint-disable-next-line @typescript-eslint/no-unused-vars 25604 registerCleanup(callback) {} 25605 /** 25606 * Disposes of the client and releases all resources. 25607 * 25608 * Subclasses should override this method to clean up their own resources, including invoking 25609 * any callbacks registered via {@link Client.registerCleanup}. The base implementation is a 25610 * no-op and does NOT execute registered cleanup callbacks. 25611 * 25612 * After calling dispose(), the client should not be used anymore. 25613 */ dispose() {}
25614 /* eslint-enable @typescript-eslint/unified-signatures */ /** Setup integrations for this client. */ _setupIntegrations() { 25615 const { integrations } = this._options; 25616 this._integrations = setupIntegrations(this, integrations); 25617 afterSetupIntegrations(this, integrations); 25618 } 25619 /** Updates existing session based on the provided event */ _updateSessionFromEvent(session, event) { 25620 var _event_exception; 25621 let crashed = event.level === "fatal"; 25622 let errored = false; 25623 const exceptions = (_event_exception = event.exception) === null || _event_exception === void 0 ? void 0 : _event_exception.values; 25624 if (exceptions) { 25625 errored = true; 25626 crashed = false; 25627 for (const ex of exceptions){ 25628 var _ex_mechanism; 25629 if (((_ex_mechanism = ex.mechanism) === null || _ex_mechanism === void 0 ? void 0 : _ex_mechanism.handled) === false) { 25630 crashed = true; 25631 break; 25632 } 25633 } 25634 } 25635 const sessionNonTerminal = session.status === "ok"; 25636 const shouldUpdateAndSend = sessionNonTerminal && session.errors === 0 || sessionNonTerminal && crashed; 25637 if (shouldUpdateAndSend) { 25638 (0, __TURBOPACK__imported__module__341041__["updateSession"])(session, { 25639 ...crashed && { 25640 status: "crashed" 25641 }, 25642 errors: session.errors || Number(errored || crashed) 25643 }); 25644 this.captureSession(session); 25645 } 25646 } 25647 /** 25648 * Determine if the client is finished processing. Returns a promise because it will wait `timeout` ms before saying 25649 * "no" (resolving to `false`) in order to give the client a chance to potentially finish first. 25650 * 25651 * @param timeout The time, in ms, after which to resolve to `false` if the client is still busy. Passing `0` (or not 25652 * passing anything) will make the promise wait as long as it takes for processing to finish before resolving to 25653 * `true`. 25654 * @returns A promise which will resolve to `true` if processing is already done or finishes before the timeout, and 25655 * `false` otherwise 25656 */ async _isClientDoneProcessing(timeout) { 25657 let ticked = 0; 25658 while(!timeout || ticked < timeout){ 25659 await new Promise((resolve)=>setTimeout(resolve, 1)); 25660 if (!this._numProcessing) { 25661 return true; 25662 } 25663 ticked++; 25664 } 25665 return false; 25666 } 25667 /** Determines whether this SDK is enabled and a transport is present. */ _isEnabled() { 25668 return this.getOptions().enabled !== false && this._transport !== void 0; 25669 } 25670 /** 25671 * Adds common information to events. 25672 * 25673 * The information includes release and environment from `options`, 25674 * breadcrumbs and context (extra, tags and user) from the scope. 25675 * 25676 * Information that is already present in the event is never overwritten. For 25677 * nested objects, such as the context, keys are merged. 25678 * 25679 * @param event The original event. 25680 * @param hint May contain additional information about the original exception. 25681 * @param currentScope A scope containing event metadata. 25682 * @returns A new event with more information. 25683 */ _prepareEvent(event, hint, currentScope, isolationScope) { 25684 const options = this.getOptions(); 25685 const integrations = this.getIntegrationNames(); 25686 if (!hint.integrations && integrations.length) { 25687 hint.integrations = integrations; 25688 } 25689 this.emit("preprocessEvent", event, hint); 25690 if (!event.type) { 25691 isolationScope.setLastEventId(event.event_id || hint.event_id); 25692 } 25693 return (0, __TURBOPACK__imported__module__213186__["prepareEvent"])(options, event, hint, currentScope, this, isolationScope).then((evt)=>{ 25694 var _evt_contexts; 25695 if (evt === null) { 25696 return evt; 25697 } 25698 this.emit("postprocessEvent", evt, hint); 25699 evt.contexts = { 25700 trace: { 25701 ...(_evt_contexts = evt.contexts) === null || _evt_contexts === void 0 ? void 0 : _evt_contexts.trace, 25702 ...(0, __TURBOPACK__imported__module__250804__20["getTraceContextFromScope"])(currentScope) 25703 }, 25704 ...evt.contexts 25705 }; 25706 const dynamicSamplingContext = (0, __TURBOPACK__imported__module__473753__5["getDynamicSamplingContextFromScope"])(this, currentScope); 25707 evt.sdkProcessingMetadata = { 25708 dynamicSamplingContext, 25709 ...evt.sdkProcessingMetadata 25710 }; 25711 return evt; 25712 }); 25713 } 25714 /** 25715 * Processes the event and logs an error in case of rejection 25716 * @param event 25717 * @param hint 25718 * @param scope 25719 */ _captureEvent(event) { 25720 let hint = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, currentScope = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : (0, __TURBOPACK__imported__module__250804__20["getCurrentScope"])(), isolationScope = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : (0, __TURBOPACK__imported__module__250804__20["getIsolationScope"])(); 25721 if (__TURBOPACK__imported__module__901020__14["DEBUG_BUILD"] && isErrorEvent(event)) { 25722 __TURBOPACK__imported__module__272598__28["debug"].log("Captured error event `".concat(getPossibleEventMessages(event)[0] || "<unknown>", "`")); 25723 } 25724 return this._processEvent(event, hint, currentScope, isolationScope).then((finalEvent)=>{ 25725 return finalEvent.event_id; 25726 }, (reason)=>{ 25727 if (__TURBOPACK__imported__module__901020__14["DEBUG_BUILD"]) { 25728 if (_isDoNotSendEventError(reason)) { 25729 __TURBOPACK__imported__module__272598__28["debug"].log(reason.message); 25730 } else if (_isInternalError(reason)) { 25731 __TURBOPACK__imported__module__272598__28["debug"].warn(reason.message); 25732 } else { 25733 __TURBOPACK__imported__module__272598__28["debug"].warn(reason); 25734 } 25735 } 25736 return void 0; 25737 }); 25738 } 25739 /** 25740 * Processes an event (either error or message) and sends it to Sentry. 25741 *
25742 * This also adds breadcrumbs and context information to the event. However, 25743 * platform specific meta data (such as the User's IP address) must be added 25744 * by the SDK implementor. 25745 * 25746 * 25747 * @param event The event to send to Sentry. 25748 * @param hint May contain additional information about the original exception. 25749 * @param currentScope A scope containing event metadata. 25750 * @returns A SyncPromise that resolves with the event or rejects in case event was/will not be send. 25751 */ _processEvent(event, hint, currentScope, isolationScope) { 25752 const options = this.getOptions(); 25753 const { sampleRate } = options; 25754 const isTransaction = isTransactionEvent(event); 25755 const isError = isErrorEvent(event); 25756 const eventType = event.type || "error"; 25757 const beforeSendLabel = "before send for type `".concat(eventType, "`"); 25758 const parsedSampleRate = typeof sampleRate === "undefined" ? void 0 : (0, __TURBOPACK__imported__module__170637__2["parseSampleRate"])(sampleRate); 25759 const dataCategory = getDataCategoryByType(event.type); 25760 return this._prepareEvent(event, hint, currentScope, isolationScope).then((prepared)=>{ 25761 var _hint_data; 25762 if (prepared === null) { 25763 this.recordDroppedEvent("event_processor", dataCategory); 25764 throw _makeDoNotSendEventError("An event processor returned `null`, will not send event."); 25765 } 25766 const isInternalException = ((_hint_data = hint.data) === null || _hint_data === void 0 ? void 0 : _hint_data.__sentry__) === true; 25767 if (isInternalException) { 25768 return prepared; 25769 } 25770 const result = processBeforeSend(this, options, prepared, hint); 25771 return _validateBeforeSendResult(result, beforeSendLabel); 25772 }).then((processedEvent)=>{ 25773 if (processedEvent === null) { 25774 this.recordDroppedEvent("before_send", dataCategory); 25775 if (isTransaction) { 25776 const spans = event.spans || []; 25777 const spanCount = 1 + spans.length; 25778 this.recordDroppedEvent("before_send", "span", spanCount); 25779 } 25780 throw _makeDoNotSendEventError("".concat(beforeSendLabel, " returned `null`, will not send event.")); 25781 } 25782 const session = currentScope.getSession() || isolationScope.getSession(); 25783 if (isError && session) { 25784 this._updateSessionFromEvent(session, processedEvent); 25785 } 25786 if (isError && typeof parsedSampleRate === "number" && (0, __TURBOPACK__imported__module__111139__3["safeMathRandom"])() > parsedSampleRate) { 25787 this.recordDroppedEvent("sample_rate", "error"); 25788 throw _makeDoNotSendEventError("Discarding event because it's not included in the random sample (sampling rate = ".concat(sampleRate, ")")); 25789 } 25790 if (isTransaction) { 25791 var _processedEvent_sdkProcessingMetadata; 25792 const spanCountBefore = ((_processedEvent_sdkProcessingMetadata = processedEvent.sdkProcessingMetadata) === null || _processedEvent_sdkProcessingMetadata === void 0 ? void 0 : _processedEvent_sdkProcessingMetadata.spanCountBeforeProcessing) || 0; 25793 const spanCountAfter = processedEvent.spans ? processedEvent.spans.length : 0; 25794 const droppedSpanCount = spanCountBefore - spanCountAfter; 25795 if (droppedSpanCount > 0) { 25796 this.recordDroppedEvent("before_send", "span", droppedSpanCount); 25797 } 25798 } 25799 const transactionInfo = processedEvent.transaction_info; 25800 if (isTransaction && transactionInfo && processedEvent.transaction !== event.transaction) { 25801 const source = "custom"; 25802 processedEvent.transaction_info = { 25803 ...transactionInfo, 25804 source 25805 }; 25806 } 25807 this.sendEvent(processedEvent, hint); 25808 return processedEvent; 25809 }).then(null, (reason)=>{ 25810 if (_isDoNotSendEventError(reason) || _isInternalError(reason)) { 25811 throw reason; 25812 } 25813 this.captureException(reason, { 25814 mechanism: { 25815 handled: false, 25816 type: "internal" 25817 }, 25818 data: { 25819 __sentry__: true 25820 }, 25821 originalException: reason 25822 }); 25823 throw _makeInternalError("Event processing pipeline threw an error, original event will not be sent. Details have been sent as a new event.\nReason: ".concat(reason)); 25824 }); 25825 } 25826 /** 25827 * Occupies the client with processing and event 25828 */ _process(taskProducer, dataCategory) { 25829 this._numProcessing++; 25830 void this._promiseBuffer.add(taskProducer).then((value)=>{ 25831 this._numProcessing--; 25832 return value; 25833 }, (reason)=>{ 25834 this._numProcessing--; 25835 if (reason === SENTRY_BUFFER_FULL_ERROR) { 25836 this.recordDroppedEvent("queue_overflow", dataCategory); 25837 } 25838 return reason; 25839 }); 25840 } 25841 /** 25842 * Clears outcomes on this client and returns them. 25843 */ _clearOutcomes() { 25844 const outcomes = this._outcomes; 25845 this._outcomes = {}; 25846 return Object.entries(outcomes).map((param)=>{ 25847 let [key, quantity] = param; 25848 const [reason, category] = key.split(":"); 25849 return { 25850 reason, 25851 category, 25852 quantity 25853 }; 25854 }); 25855 } 25856 /** 25857 * Sends client reports as an envelope. 25858 */ _flushOutcomes() { 25859 __TURBOPACK__imported__module__901020__14["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__28["debug"].log("Flushing outcomes..."); 25860 const outcomes = this._clearOutcomes(); 25861 if (outcomes.length === 0) { 25862 __TURBOPACK__imported__module__901020__14["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__28["debug"].log("No outcomes to send"); 25863 return; 25864 } 25865 if (!this._dsn) { 25866 __TURBOPACK__imported__module__901020__14["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__28["debug"].log("No dsn provided, will not send outcomes"); 25867 return; 25868 } 25869 __TURBOPACK__imported__module__901020__14["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__28["debug"].log("Sending outcomes:", outcomes); 25870 const envelope = createClientReportEnvelope(outcomes, this._options.tunnel && (0, __TURBOPACK__imported__module__339435__3["dsnToString"])(this._dsn)); 25871 this.sendEnvelope(envelope); 25872 } 25873 /** 25874 * Initializes this client instance. 25875 * 25876 * @param options Options for the client. 25877 */ constructor(options){ 25878 var _ref, _ref1, _this__options_enableLogs, _ref2, _this__options_enableMetrics; 25879 var _options_transportOptions, _this__options__experiments, _this__options__experiments1; 25880 this._options = options; 25881 this._integrations = {}; 25882 this._numProcessing = 0; 25883 this._outcomes = {}; 25884 this._hooks = {}; 25885 this._eventProcessors = []; 25886 this._promiseBuffer = makePromiseBuffer((_ref = (_options_transportOptions = options.transportOptions) === null || _options_transportOptions === void 0 ? void 0 : _options_transportOptions.bufferSize) !== null && _ref !== void 0 ? _ref : DEFAULT_TRANSPORT_BUFFER_SIZE); 25887 this._dataCollection = resolveDataCollectionOptions(options); 25888 if (options.dsn) { 25889 this._dsn = (0, __TURBOPACK__imported__module__339435__3["makeDsn"])(options.dsn); 25890 } else { 25891 __TURBOPACK__imported__module__901020__14["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__28["debug"].warn("No DSN provided, client will not send events."); 25892 } 25893 if (this._dsn) { 25894 const url = getEnvelopeEndpointWithUrlEncodedAuth(this._dsn, options.tunnel, options._metadata ? options._metadata.sdk : void 0); 25895 this._transport = options.transport({ 25896 tunnel: this._options.tunnel, 25897 recordDroppedEvent: this.recordDroppedEvent.bind(this), 25898 ...options.transportOptions, 25899 url 25900 }); 25901 } 25902 this._options.enableLogs = (_ref1 = (_this__options_enableLogs = this._options.enableLogs) !== null && _this__options_enableLogs !== void 0 ? _this__options_enableLogs : (_this__options__experiments = this._options._experiments) === null || _this__options__experiments === void 0 ? void 0 : _this__options__experiments.enableLogs) !== null && _ref1 !== void 0 ? _ref1 : true; 25903 if (this._options.enableLogs) { 25904 setupWeightBasedFlushing(this, "afterCaptureLog", "flushLogs", estimateLogSizeInBytes, __TURBOPACK__imported__module__224339__["_INTERNAL_flushLogsBuffer"]); 25905 } 25906 const enableMetrics = (_ref2 = (_this__options_enableMetrics = this._options.enableMetrics) !== null && _this__options_enableMetrics !== void 0 ? _this__options_enableMetrics : (_this__options__experiments1 = this._options._experiments) === null || _this__options__experiments1 === void 0 ? void 0 : _this__options__experiments1.enableMetrics) !== null && _ref2 !== void 0 ? _ref2 : true; 25907 if (enableMetrics) { 25908 setupWeightBasedFlushing(this, "afterCaptureMetric", "flushMetrics", estimateMetricSizeInBytes, _INTERNAL_flushMetricsBuffer); 25909 } 25910 } 25911} 25912function getDataCategoryByType(type) { 25913 return type === "replay_event" ? "replay" : type || "error"; 25914} 25915function _validateBeforeSendResult(beforeSendResult, beforeSendLabel) { 25916 const invalidValueError = "".concat(beforeSendLabel, " must return `null` or a valid event."); 25917 if ((0, __TURBOPACK__imported__module__453288__7["isThenable"])(beforeSendResult)) { 25918 return beforeSendResult.then((event)=>{ 25919 if (!(0, __TURBOPACK__imported__module__453288__7["isPlainObject"])(event) && event !== null) { 25920 throw _makeInternalError(invalidValueError); 25921 } 25922 return event; 25923 }, (e)=>{ 25924 throw _makeInternalError("".concat(beforeSendLabel, " rejected with ").concat(e)); 25925 }); 25926 } else if (!(0, __TURBOPACK__imported__module__453288__7["isPlainObject"])(beforeSendResult) && beforeSendResult !== null) { 25927 throw _makeInternalError(invalidValueError); 25928 } 25929 return beforeSendResult; 25930} 25931function processBeforeSend(client, options, event, hint) { 25932 const { beforeSend, beforeSendTransaction, ignoreSpans } = options; 25933 const beforeSendSpan = !isStreamedBeforeSendSpanCallback(options.beforeSendSpan) && options.beforeSendSpan; 25934 let processedEvent = event; 25935 if (isErrorEvent(processedEvent) && beforeSend) { 25936 return beforeSend(processedEvent, hint); 25937 } 25938 if (isTransactionEvent(processedEvent)) { 25939 if (beforeSendSpan || ignoreSpans) { 25940 const rootSpanJson = convertTransactionEventToSpanJson(processedEvent); 25941 if ((ignoreSpans === null || ignoreSpans === void 0 ? void 0 : ignoreSpans.length) && shouldIgnoreSpan({ 25942 description: rootSpanJson.description, 25943 op: rootSpanJson.op, 25944 attributes: rootSpanJson.data 25945 }, ignoreSpans)) { 25946 return null; 25947 } 25948 if (beforeSendSpan) { 25949 const processedRootSpanJson = beforeSendSpan(rootSpanJson); 25950 if (!processedRootSpanJson) { 25951 (0, __TURBOPACK__imported__module__304661__19["showSpanDropWarning"])(); 25952 } else { 25953 processedEvent = (0, __TURBOPACK__imported__module__318746__["merge"])(event, convertSpanJsonToTransactionEvent(processedRootSpanJson)); 25954 } 25955 } 25956 if (processedEvent.spans) { 25957 const processedSpans = []; 25958 const initialSpans = processedEvent.spans; 25959 for (const span of initialSpans){ 25960 if ((ignoreSpans === null || ignoreSpans === void 0 ? void 0 : ignoreSpans.length) && shouldIgnoreSpan({ 25961 description: span.description, 25962 op: span.op, 25963 attributes: span.data 25964 }, ignoreSpans)) { 25965 reparentChildSpans(initialSpans, span); 25966 continue; 25967 } 25968 if (beforeSendSpan) { 25969 const processedSpan = beforeSendSpan(span); 25970 if (!processedSpan) { 25971 (0, __TURBOPACK__imported__module__304661__19["showSpanDropWarning"])(); 25972 processedSpans.push(span); 25973 } else { 25974 processedSpans.push(processedSpan); 25975 } 25976 } else { 25977 processedSpans.push(span); 25978 } 25979 } 25980 const droppedSpans = processedEvent.spans.length - processedSpans.length; 25981 if (droppedSpans) {
25982 client.recordDroppedEvent("before_send", "span", droppedSpans); 25983 } 25984 processedEvent.spans = processedSpans; 25985 } 25986 } 25987 if (beforeSendTransaction) { 25988 if (processedEvent.spans) { 25989 const spanCountBefore = processedEvent.spans.length; 25990 processedEvent.sdkProcessingMetadata = { 25991 ...event.sdkProcessingMetadata, 25992 spanCountBeforeProcessing: spanCountBefore 25993 }; 25994 } 25995 return beforeSendTransaction(processedEvent, hint); 25996 } 25997 } 25998 return processedEvent; 25999} 26000function isErrorEvent(event) { 26001 return event.type === void 0; 26002} 26003function isTransactionEvent(event) { 26004 return event.type === "transaction"; 26005} 26006function estimateMetricSizeInBytes(metric) { 26007 let weight = 0; 26008 if (metric.name) { 26009 weight += metric.name.length * 2; 26010 } 26011 weight += 8; 26012 return weight + estimateAttributesSizeInBytes(metric.attributes); 26013} 26014function estimateLogSizeInBytes(log) { 26015 let weight = 0; 26016 if (log.message) { 26017 weight += log.message.length * 2; 26018 } 26019 return weight + estimateAttributesSizeInBytes(log.attributes); 26020} 26021function estimateAttributesSizeInBytes(attributes) { 26022 if (!attributes) { 26023 return 0; 26024 } 26025 let weight = 0; 26026 Object.values(attributes).forEach((value)=>{ 26027 if (Array.isArray(value)) { 26028 weight += value.length * estimatePrimitiveSizeInBytes(value[0]); 26029 } else if ((0, __TURBOPACK__imported__module__453288__7["isPrimitive"])(value)) { 26030 weight += estimatePrimitiveSizeInBytes(value); 26031 } else { 26032 weight += 100; 26033 } 26034 }); 26035 return weight; 26036} 26037function estimatePrimitiveSizeInBytes(value) { 26038 if (typeof value === "string") { 26039 return value.length * 2; 26040 } else if (typeof value === "number") { 26041 return 8; 26042 } else if (typeof value === "boolean") { 26043 return 4; 26044 } 26045 return 0; 26046} 26047; 26048var __TURBOPACK__imported__module__858384__ = __turbopack_context__.i(858384); 26049// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/utils/ipAddress.js [app-client] (ecmascript) 26050; 26051function addAutoIpAddressToUser(objWithMaybeUser) { 26052 var _objWithMaybeUser_user; 26053 if (((_objWithMaybeUser_user = objWithMaybeUser.user) === null || _objWithMaybeUser_user === void 0 ? void 0 : _objWithMaybeUser_user.ip_address) === void 0) { 26054 objWithMaybeUser.user = { 26055 ...objWithMaybeUser.user, 26056 ip_address: "{{auto}}" 26057 }; 26058 } 26059} 26060function addAutoIpAddressToSession(session) { 26061 if ("aggregates" in session) { 26062 var _session_attrs; 26063 if (((_session_attrs = session.attrs) === null || _session_attrs === void 0 ? void 0 : _session_attrs["ip_address"]) === void 0) { 26064 session.attrs = { 26065 ...session.attrs, 26066 ip_address: "{{auto}}" 26067 }; 26068 } 26069 } else { 26070 if (session.ipAddress === void 0) { 26071 session.ipAddress = "{{auto}}"; 26072 } 26073 } 26074} 26075; 26076// MERGED MODULE: [project]/node_modules/@sentry/browser/build/npm/esm/prod/eventbuilder.js [app-client] (ecmascript) 26077; 26078var __TURBOPACK__imported__module__453288__8 = __TURBOPACK__imported__module__453288__; 26079var __TURBOPACK__imported__module__682564__3 = __TURBOPACK__imported__module__682564__; 26080var __TURBOPACK__imported__module__250804__22 = __TURBOPACK__imported__module__250804__; 26081var __TURBOPACK__imported__module__45968__1 = __TURBOPACK__imported__module__45968__; 26082var __TURBOPACK__imported__module__951497__6 = __TURBOPACK__imported__module__951497__; 26083// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/utils/eventbuilder.js [app-client] (ecmascript) <export _enhanceErrorWithSentryInfo as _INTERNAL_enhanceErrorWithSentryInfo> 26084; 26085// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/utils/eventbuilder.js [app-client] (ecmascript) 26086; 26087var __TURBOPACK__imported__module__453288__9 = __TURBOPACK__imported__module__453288__; 26088var __TURBOPACK__imported__module__682564__4 = __TURBOPACK__imported__module__682564__; 26089var __TURBOPACK__imported__module__45968__2 = __TURBOPACK__imported__module__45968__; 26090var __TURBOPACK__imported__module__951497__7 = __TURBOPACK__imported__module__951497__; 26091; 26092; 26093; 26094; 26095function parseStackFrames(stackParser, error) { 26096 return stackParser(error.stack || "", 1); 26097} 26098function hasSentryFetchUrlHost(error) { 26099 return (0, __TURBOPACK__imported__module__453288__9["isError"])(error) && "__sentry_fetch_url_host__" in error && typeof error.__sentry_fetch_url_host__ === "string"; 26100} 26101function _enhanceErrorWithSentryInfo(error) { 26102 if (hasSentryFetchUrlHost(error)) { 26103 return "".concat(error.message, " (").concat(error.__sentry_fetch_url_host__, ")"); 26104 } 26105 return error.message; 26106} 26107function exceptionFromError(stackParser, error) { 26108 const exception = { 26109 type: error.name || error.constructor.name, 26110 value: _enhanceErrorWithSentryInfo(error) 26111 }; 26112 const frames = parseStackFrames(stackParser, error); 26113 if (frames.length) { 26114 exception.stacktrace = { 26115 frames 26116 }; 26117 } 26118 return exception; 26119} 26120function getErrorPropertyFromObject(obj) { 26121 for(const prop in obj){ 26122 if (Object.prototype.hasOwnProperty.call(obj, prop)) { 26123 const value = obj[prop]; 26124 if ((0, __TURBOPACK__imported__module__453288__9["isError"])(value)) { 26125 return value; 26126 } 26127 } 26128 } 26129 return void 0; 26130}
26131function getMessageForObject(exception) { 26132 if ("name" in exception && typeof exception.name === "string") { 26133 let message = "'".concat(exception.name, "' captured as exception"); 26134 if ("message" in exception && typeof exception.message === "string") { 26135 message += " with message '".concat(exception.message, "'"); 26136 } 26137 return message; 26138 } else if ("message" in exception && typeof exception.message === "string") { 26139 return exception.message; 26140 } 26141 const keys = (0, __TURBOPACK__imported__module__951497__7["extractExceptionKeysForMessage"])(exception); 26142 if ((0, __TURBOPACK__imported__module__453288__9["isErrorEvent"])(exception)) { 26143 return "Event `ErrorEvent` captured as exception with message `".concat(exception.message, "`"); 26144 } 26145 const className = getObjectClassName(exception); 26146 return "".concat(className && className !== "Object" ? "'".concat(className, "'") : "Object", " captured as exception with keys: ").concat(keys); 26147} 26148function getObjectClassName(obj) { 26149 try { 26150 const prototype = Object.getPrototypeOf(obj); 26151 return prototype ? prototype.constructor.name : void 0; 26152 } catch (unused) {} 26153} 26154function getException(client, mechanism, exception, hint) { 26155 if ((0, __TURBOPACK__imported__module__453288__9["isError"])(exception)) { 26156 return [ 26157 exception, 26158 void 0 26159 ]; 26160 } 26161 mechanism.synthetic = true; 26162 if ((0, __TURBOPACK__imported__module__453288__9["isPlainObject"])(exception)) { 26163 const normalizeDepth = client === null || client === void 0 ? void 0 : client.getOptions().normalizeDepth; 26164 const extras = { 26165 ["__serialized__"]: (0, __TURBOPACK__imported__module__45968__2["normalizeToSize"])(exception, normalizeDepth) 26166 }; 26167 const errorFromProp = getErrorPropertyFromObject(exception); 26168 if (errorFromProp) { 26169 return [ 26170 errorFromProp, 26171 extras 26172 ]; 26173 } 26174 const message = getMessageForObject(exception); 26175 const ex2 = (hint === null || hint === void 0 ? void 0 : hint.syntheticException) || new Error(message); 26176 ex2.message = message; 26177 return [ 26178 ex2, 26179 extras 26180 ]; 26181 } 26182 const ex = (hint === null || hint === void 0 ? void 0 : hint.syntheticException) || new Error(exception); 26183 ex.message = "".concat(exception); 26184 return [ 26185 ex, 26186 void 0 26187 ]; 26188} 26189function eventFromUnknownInput(client, stackParser, exception, hint) { 26190 const providedMechanism = (hint === null || hint === void 0 ? void 0 : hint.data) && hint.data.mechanism; 26191 const mechanism = providedMechanism || { 26192 handled: true, 26193 type: "generic" 26194 }; 26195 const [ex, extras] = getException(client, mechanism, exception, hint); 26196 const event = { 26197 exception: { 26198 values: [ 26199 exceptionFromError(stackParser, ex) 26200 ] 26201 } 26202 }; 26203 if (extras) { 26204 event.extra = extras; 26205 } 26206 (0, __TURBOPACK__imported__module__682564__4["addExceptionTypeValue"])(event, void 0, void 0); 26207 (0, __TURBOPACK__imported__module__682564__4["addExceptionMechanism"])(event, mechanism); 26208 return { 26209 ...event, 26210 event_id: hint === null || hint === void 0 ? void 0 : hint.event_id 26211 }; 26212} 26213function eventFromMessage(stackParser, message) { 26214 let level = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : "info", hint = arguments.length > 3 ? arguments[3] : void 0, attachStacktrace = arguments.length > 4 ? arguments[4] : void 0; 26215 const event = { 26216 event_id: hint === null || hint === void 0 ? void 0 : hint.event_id, 26217 level 26218 }; 26219 if (attachStacktrace && (hint === null || hint === void 0 ? void 0 : hint.syntheticException)) { 26220 const frames = parseStackFrames(stackParser, hint.syntheticException); 26221 if (frames.length) { 26222 event.exception = { 26223 values: [ 26224 { 26225 value: message, 26226 stacktrace: { 26227 frames 26228 } 26229 } 26230 ] 26231 }; 26232 (0, __TURBOPACK__imported__module__682564__4["addExceptionMechanism"])(event, { 26233 synthetic: true 26234 }); 26235 } 26236 } 26237 if ((0, __TURBOPACK__imported__module__453288__9["isParameterizedString"])(message)) {
26238 const { __sentry_template_string__, __sentry_template_values__ } = message; 26239 event.logentry = { 26240 message: __sentry_template_string__, 26241 params: __sentry_template_values__ 26242 }; 26243 return event; 26244 } 26245 event.message = message; 26246 return event; 26247} 26248; 26249var __TURBOPACK__imported__module__580611__1 = __TURBOPACK__imported__module__580611__; 26250; 26251function exceptionFromError1(stackParser, ex) { 26252 const frames = parseStackFrames1(stackParser, ex); 26253 const exception = { 26254 type: extractType(ex), 26255 value: extractMessage(ex) 26256 }; 26257 if (frames.length) { 26258 exception.stacktrace = { 26259 frames 26260 }; 26261 } 26262 if (exception.type === void 0 && exception.value === "") { 26263 exception.value = "Unrecoverable error caught"; 26264 } 26265 return exception; 26266} 26267function eventFromPlainObject(stackParser, exception, syntheticException, isUnhandledRejection) { 26268 const client = (0, __TURBOPACK__imported__module__250804__22["getClient"])(); 26269 const normalizeDepth = client === null || client === void 0 ? void 0 : client.getOptions().normalizeDepth; 26270 const errorFromProp = getErrorPropertyFromObject1(exception); 26271 const extra = { 26272 __serialized__: (0, __TURBOPACK__imported__module__45968__1["normalizeToSize"])(exception, normalizeDepth) 26273 }; 26274 if (errorFromProp) { 26275 return { 26276 exception: { 26277 values: [ 26278 exceptionFromError1(stackParser, errorFromProp) 26279 ] 26280 }, 26281 extra 26282 }; 26283 } 26284 const event = { 26285 exception: { 26286 values: [ 26287 { 26288 type: (0, __TURBOPACK__imported__module__453288__8["isEvent"])(exception) ? exception.constructor.name : isUnhandledRejection ? "UnhandledRejection" : "Error", 26289 value: getNonErrorObjectExceptionValue(exception, { 26290 isUnhandledRejection 26291 }) 26292 } 26293 ] 26294 }, 26295 extra 26296 }; 26297 if (syntheticException) { 26298 const frames = parseStackFrames1(stackParser, syntheticException); 26299 if (frames.length) { 26300 event.exception.values[0].stacktrace = { 26301 frames 26302 }; 26303 } 26304 } 26305 return event; 26306} 26307function eventFromError(stackParser, ex) { 26308 return { 26309 exception: { 26310 values: [ 26311 exceptionFromError1(stackParser, ex) 26312 ] 26313 } 26314 }; 26315} 26316function parseStackFrames1(stackParser, ex) { 26317 const stacktrace = ex.stacktrace || ex.stack || ""; 26318 const skipLines = getSkipFirstStackStringLines(ex); 26319 const framesToPop = getPopFirstTopFrames(ex); 26320 try { 26321 return stackParser(stacktrace, skipLines, framesToPop); 26322 } catch (unused) {} 26323 return []; 26324} 26325const reactMinifiedRegexp = /Minified React error #\d+;/i; 26326function getSkipFirstStackStringLines(ex) { 26327 if (ex && reactMinifiedRegexp.test(ex.message)) { 26328 return 1; 26329 } 26330 return 0; 26331} 26332function getPopFirstTopFrames(ex) { 26333 if (typeof ex.framesToPop === "number") { 26334 return ex.framesToPop; 26335 } 26336 return 0; 26337} 26338function isWebAssemblyException(exception) { 26339 if (typeof WebAssembly !== "undefined" && typeof WebAssembly.Exception !== "undefined") { 26340 return exception instanceof WebAssembly.Exception; 26341 } else { 26342 return false; 26343 } 26344} 26345function extractType(ex) { 26346 const name = ex === null || ex === void 0 ? void 0 : ex.name; 26347 if (!name && isWebAssemblyException(ex)) { 26348 const hasTypeInMessage = ex.message && Array.isArray(ex.message) && ex.message.length == 2; 26349 return hasTypeInMessage ? ex.message[0] : "WebAssembly.Exception"; 26350 } 26351 return name; 26352} 26353function extractMessage(ex) { 26354 const message = ex === null || ex === void 0 ? void 0 : ex.message; 26355 if (isWebAssemblyException(ex)) { 26356 if (Array.isArray(ex.message) && ex.message.length == 2) { 26357 return ex.message[1]; 26358 } 26359 return "wasm exception"; 26360 } 26361 if (!message) { 26362 return "No error message"; 26363 } 26364 if (message.error && typeof message.error.message === "string") { 26365 return _enhanceErrorWithSentryInfo(message.error); 26366 } 26367 return _enhanceErrorWithSentryInfo(ex); 26368} 26369function eventFromException(stackParser, exception, hint, attachStacktrace) { 26370 const syntheticException = (hint === null || hint === void 0 ? void 0 : hint.syntheticException) || void 0; 26371 const event = eventFromUnknownInput1(stackParser, exception, syntheticException, attachStacktrace); 26372 (0, __TURBOPACK__imported__module__682564__3["addExceptionMechanism"])(event); 26373 event.level = "error"; 26374 if (hint === null || hint === void 0 ? void 0 : hint.event_id) { 26375 event.event_id = hint.event_id; 26376 } 26377 return (0, __TURBOPACK__imported__module__580611__1["resolvedSyncPromise"])(event); 26378} 26379function eventFromMessage1(stackParser, message) { 26380 let level = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : "info", hint = arguments.length > 3 ? arguments[3] : void 0, attachStacktrace = arguments.length > 4 ? arguments[4] : void 0; 26381 const syntheticException = (hint === null || hint === void 0 ? void 0 : hint.syntheticException) || void 0; 26382 const event = eventFromString(stackParser, message, syntheticException, attachStacktrace); 26383 event.level = level; 26384 if (hint === null || hint === void 0 ? void 0 : hint.event_id) { 26385 event.event_id = hint.event_id; 26386 } 26387 return (0, __TURBOPACK__imported__module__580611__1["resolvedSyncPromise"])(event); 26388} 26389function eventFromUnknownInput1(stackParser, exception, syntheticException, attachStacktrace, isUn
26389handledRejection) { 26390 let event; 26391 if ((0, __TURBOPACK__imported__module__453288__8["isErrorEvent"])(exception) && exception.error) { 26392 const errorEvent = exception; 26393 return eventFromError(stackParser, errorEvent.error); 26394 } 26395 if ((0, __TURBOPACK__imported__module__453288__8["isDOMError"])(exception) || (0, __TURBOPACK__imported__module__453288__8["isDOMException"])(exception)) { 26396 const domException = exception; 26397 if ("stack" in exception) { 26398 var _event_exception_values, _event_exception; 26399 event = eventFromError(stackParser, exception); 26400 const firstException = (_event_exception = event.exception) === null || _event_exception === void 0 ? void 0 : (_event_exception_values = _event_exception.values) === null || _event_exception_values === void 0 ? void 0 : _event_exception_values[0]; 26401 if (attachStacktrace && syntheticException && firstException && !firstException.stacktrace) { 26402 const frames = parseStackFrames1(stackParser, syntheticException); 26403 if (frames.length) { 26404 firstException.stacktrace = { 26405 frames 26406 }; 26407 (0, __TURBOPACK__imported__module__682564__3["addExceptionMechanism"])(event, { 26408 synthetic: true 26409 }); 26410 } 26411 } 26412 } else { 26413 const name = domException.name || ((0, __TURBOPACK__imported__module__453288__8["isDOMError"])(domException) ? "DOMError" : "DOMException"); 26414 const message = domException.message ? "".concat(name, ": ").concat(domException.message) : name; 26415 event = eventFromString(stackParser, message, syntheticException, attachStacktrace); 26416 (0, __TURBOPACK__imported__module__682564__3["addExceptionTypeValue"])(event, message); 26417 } 26418 if ("code" in domException) { 26419 event.tags = { 26420 ...event.tags, 26421 "DOMException.code": "".concat(domException.code) 26422 }; 26423 } 26424 return event; 26425 } 26426 if ((0, __TURBOPACK__imported__module__453288__8["isError"])(exception)) { 26427 return eventFromError(stackParser, exception); 26428 } 26429 if ((0, __TURBOPACK__imported__module__453288__8["isPlainObject"])(exception) || (0, __TURBOPACK__imported__module__453288__8["isEvent"])(exception)) { 26430 const objectException = exception; 26431 event = eventFromPlainObject(stackParser, objectException, syntheticException, isUnhandledRejection); 26432 (0, __TURBOPACK__imported__module__682564__3["addExceptionMechanism"])(event, { 26433 synthetic: true 26434 }); 26435 return event; 26436 } 26437 event = eventFromString(stackParser, exception, syntheticException, attachStacktrace); 26438 (0, __TURBOPACK__imported__module__682564__3["addExceptionTypeValue"])(event, "".concat(exception), void 0); 26439 (0, __TURBOPACK__imported__module__682564__3["addExceptionMechanism"])(event, { 26440 synthetic: true 26441 }); 26442 return event; 26443} 26444function eventFromString(stackParser, message, syntheticException, attachStacktrace) { 26445 const event = {}; 26446 if (attachStacktrace && syntheticException) { 26447 const frames = parseStackFrames1(stackParser, syntheticException); 26448 if (frames.length) { 26449 event.exception = { 26450 values: [ 26451 { 26452 value: message, 26453 stacktrace: { 26454 frames 26455 } 26456 } 26457 ] 26458 }; 26459 } 26460 (0, __TURBOPACK__imported__module__682564__3["addExceptionMechanism"])(event, { 26461 synthetic: true 26462 }); 26463 } 26464 if ((0, __TURBOPACK__imported__module__453288__8["isParameterizedString"])(message)) { 26465 const { __sentry_template_string__, __sentry_template_values__ } = message; 26466 event.logentry = { 26467 message: __sentry_template_string__, 26468 params: __sentry_template_values__ 26469 }; 26470 return event; 26471 } 26472 event.message = message; 26473 return event; 26474} 26475function getNonErrorObjectExceptionValue(exception, param) { 26476 let { isUnhandledRejection } = param;
26477 const keys = (0, __TURBOPACK__imported__module__951497__6["extractExceptionKeysForMessage"])(exception); 26478 const captureType = isUnhandledRejection ? "promise rejection" : "exception"; 26479 if ((0, __TURBOPACK__imported__module__453288__8["isErrorEvent"])(exception)) { 26480 return "Event `ErrorEvent` captured as ".concat(captureType, " with message `").concat(exception.message, "`"); 26481 } 26482 if ((0, __TURBOPACK__imported__module__453288__8["isEvent"])(exception)) { 26483 const className = getObjectClassName1(exception); 26484 return "Event `".concat(className, "` (type=").concat(exception.type, ") captured as ").concat(captureType); 26485 } 26486 return "Object captured as ".concat(captureType, " with keys: ").concat(keys); 26487} 26488function getObjectClassName1(obj) { 26489 try { 26490 const prototype = Object.getPrototypeOf(obj); 26491 return prototype ? prototype.constructor.name : void 0; 26492 } catch (unused) {} 26493} 26494function getErrorPropertyFromObject1(obj) { 26495 return Object.values(obj).find(__TURBOPACK__imported__module__453288__8["isError"]); 26496} 26497; 26498; 26499; 26500; 26501class BrowserClient extends Client { 26502 /** 26503 * @inheritDoc 26504 */ eventFromException(exception, hint) { 26505 return eventFromException(this._options.stackParser, exception, hint, this._options.attachStacktrace); 26506 } 26507 /** 26508 * @inheritDoc 26509 */ eventFromMessage(message) { 26510 let level = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "info", hint = arguments.length > 2 ? arguments[2] : void 0; 26511 return eventFromMessage1(this._options.stackParser, message, level, hint, this._options.attachStacktrace); 26512 } 26513 /** 26514 * @inheritDoc 26515 */ _prepareEvent(event, hint, currentScope, isolationScope) { 26516 event.platform = event.platform || "javascript"; 26517 return super._prepareEvent(event, hint, currentScope, isolationScope); 26518 } 26519 /** 26520 * Creates a new Browser SDK instance. 26521 * 26522 * @param options Configuration options for this SDK. 26523 */ constructor(options){ 26524 var _opts__metadata; 26525 const opts = applyDefaultOptions(options); 26526 const sdkSource = WINDOW1.SENTRY_SDK_SOURCE || (0, __TURBOPACK__imported__module__858384__["getSDKSource"])(); 26527 applySdkMetadata(opts, "browser", [ 26528 "browser" 26529 ], sdkSource); 26530 super(opts); 26531 const { userInfo } = this.getDataCollectionOptions(); 26532 if ((_opts__metadata = opts._metadata) === null || _opts__metadata === void 0 ? void 0 : _opts__metadata.sdk) { 26533 opts._metadata.sdk.settings = { 26534 // Only allow IP inferral by Relay if the user opted in via dataCollection 26535 infer_ip: userInfo ? "auto" : "never", 26536 // purposefully allowing already passed settings to override the default 26537 ...opts._metadata.sdk.settings 26538 }; 26539 } 26540 const { sendClientReports } = this._options; 26541 if (WINDOW1.document) { 26542 WINDOW1.document.addEventListener("visibilitychange", ()=>{ 26543 if (WINDOW1.document.visibilityState === "hidden") { 26544 if (sendClientReports) { 26545 this._flushOutcomes(); 26546 } 26547 queueMicrotask(()=>{ 26548 void this.flush(); 26549 }); 26550 } 26551 }); 26552 } 26553 if (userInfo) { 26554 this.on("beforeSendSession", addAutoIpAddressToSession); 26555 } 26556 } 26557} 26558function applyDefaultOptions(optionsArg) { 26559 var _WINDOW_SENTRY_RELEASE; 26560 return { 26561 release: typeof __SENTRY_RELEASE__ === "string" ? __SENTRY_RELEASE__ : (_WINDOW_SENTRY_RELEASE = WINDOW1.SENTRY_RELEASE) === null || _WINDOW_SENTRY_RELEASE === void 0 ? void 0 : _WINDOW_SENTRY_RELEASE.id, 26562 // This supports the variable that sentry-webpack-plugin injects 26563 sendClientReports: true, 26564 // We default this to true, as it is the safer scenario 26565 parentSpanIsAlwaysRootSpan: true, 26566 ...optionsArg 26567 }; 26568} 26569; 26570// MERGED MODULE: [project]/node_modules/@sentry/browser/build/npm/esm/prod/integrations/breadcrumbs.js [app-client] (ecmascript) 26571; 26572// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/instrument/console.js [app-client] (ecmascript) 26573; 26574var __TURBOPACK__imported__module__901020__17 = __TURBOPACK__imported__module__901020__; 26575var __TURBOPACK__imported__module__272598__29 = __TURBOPACK__imported__module__272598__; 26576var __TURBOPACK__imported__module__951497__8 = __TURBOPACK__imported__module__951497__; 26577var __TURBOPACK__imported__module__821593__4 = __TURBOPACK__imported__module__821593__; 26578var __TURBOPACK__imported__module__225304__11 = __TURBOPACK__imported__module__225304__; 26579; 26580; 26581; 26582; 26583; 26584; 26585const _filter = /* @__PURE__ */ new Set([]); 26586function addConsoleInstrumentationHandler(handler) { 26587 const type = "console"; 26588 const removeHandler = addHandler(type, handler); 26589 maybeInstrument(type, instrumentConsole); 26590 return removeHandler; 26591} 26592function addConsoleInstrumentationFilter(filter) { 26593 for (const f of filter){ 26594 _filter.add(f); 26595 } 26596 return ()=>{ 26597 for (const f of filter){ 26598 _filter.delete(f); 26599 } 26600 }; 26601} 26602const instrumentedLevels = /* @__PURE__ */ new Set(); 26603function instrumentConsole() { 26604 if (!("console" in __TURBOPACK__imported__module__225304__11["GLOBAL_OBJ"])) { 26605 return; 26606 } 26607 __TURBOPACK__imported__module__272598__29["CONSOLE_LEVELS"].forEach(function(level) { 26608 if (instrumentedLevels.has(level) || !(level in __TURBOPACK__imported__module__225304__11["GLOBAL_OBJ"].console)) { 26609 return; 26610 } 26611 instrumentedLevels.add(level); 26612 (0, __TURBOPACK__imported__module__951497__8["fill"])(__TURBOPACK__imported__module__225304__11["GLOBAL_OBJ"].console, level, function(originalConsoleMethod) { 26613 __TURBOPACK__imported__module__272598__29["originalConsoleMethods"][level] = originalConsoleMethod; 26614 return function() { 26615 for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++){ 26616 args[_key] = arguments[_key]; 26617 } 26618 const firstArg = args[0]; 26619 const log = __TURBOPACK__imported__module__272598__29["originalConsoleMethods"][level]; 26620 const isFiltered = _filter.size && typeof firstArg === "string" && (0, __TURBOPACK__imported__module__821593__4["stringMatchesSomePattern"])(firstArg, _filter); 26621 if (!isFiltered) { 26622 triggerHandlers("console", { 26623 args, 26624 level 26625 }); 26626 } 26627 if (!isFiltered || __TURBOPACK__imported__module__901020__17["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__29["debug"].isEnabled()) { 26628 log === null || log === void 0 ? void 0 : log.apply(__TURBOPACK__imported__module__225304__11["GLOBAL_OBJ"].console, args); 26629 } 26630 }; 26631 }); 26632 }); 26633} 26634; 26635var __TURBOPACK__imported__module__250804__23 = __TURBOPACK__imported__module__250804__; 26636var __TURBOPACK__imported__module__821593__5 = __TURBOPACK__imported__module__821593__; 26637// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/utils/severity.js [app-client] (ecmascript) 26638; 26639function severityLevelFromString(level) { 26640 return level === "warn" ? "warning" : [ 26641 "fatal", 26642 "error", 26643 "warning", 26644 "log", 26645 "info", 26646 "debug" 26647 ].includes(level) ? level : "log"; 26648} 26649; 26650var __TURBOPACK__imported__module__183330__ = __turbopack_context__.i(183330); 26651var __TURBOPACK__imported__module__272598__30 = __TURBOPACK__imported__module__272598__; 26652// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/utils/breadcrumb-log-level.js [a
26652pp-client] (ecmascript) 26653; 26654function getBreadcrumbLogLevelFromHttpStatusCode(statusCode) { 26655 if (statusCode === void 0) { 26656 return void 0; 26657 } else if (statusCode >= 400 && statusCode < 500) { 26658 return "warning"; 26659 } else if (statusCode >= 500) { 26660 return "error"; 26661 } else { 26662 return void 0; 26663 } 26664} 26665; 26666var __TURBOPACK__imported__module__682564__5 = __TURBOPACK__imported__module__682564__; 26667// MERGED MODULE: [project]/node_modules/@sentry/browser-utils/build/esm/instrument/dom.js [app-client] (ecmascript) 26668; 26669var __TURBOPACK__imported__module__951497__9 = __TURBOPACK__imported__module__951497__; 26670var __TURBOPACK__imported__module__682564__6 = __TURBOPACK__imported__module__682564__; 26671; 26672; 26673const DEBOUNCE_DURATION = 1e3; 26674let debounceTimerID; 26675let lastCapturedEventType; 26676let lastCapturedEventTargetId; 26677function addClickKeypressInstrumentationHandler(handler) { 26678 const type = "dom"; 26679 addHandler(type, handler); 26680 maybeInstrument(type, instrumentDOM); 26681} 26682function instrumentDOM() { 26683 if (!WINDOW3.document) { 26684 return; 26685 } 26686 const triggerDOMHandler = triggerHandlers.bind(null, "dom"); 26687 const globalDOMEventHandler = makeDOMEventHandler(triggerDOMHandler, true); 26688 WINDOW3.document.addEventListener("click", globalDOMEventHandler, false); 26689 WINDOW3.document.addEventListener("keypress", globalDOMEventHandler, false); 26690 [ 26691 "EventTarget", 26692 "Node" 26693 ].forEach((target)=>{ 26694 var _globalObject_target, _proto_hasOwnProperty; 26695 const globalObject = WINDOW3; 26696 const proto = (_globalObject_target = globalObject[target]) === null || _globalObject_target === void 0 ? void 0 : _globalObject_target.prototype; 26697 if (!(proto === null || proto === void 0 ? void 0 : (_proto_hasOwnProperty = proto.hasOwnProperty) === null || _proto_hasOwnProperty === void 0 ? void 0 : _proto_hasOwnProperty.call(proto, "addEventListener"))) { 26698 return; 26699 } 26700 (0, __TURBOPACK__imported__module__951497__9["fill"])(proto, "addEventListener", function(originalAddEventListener) { 26701 return function(type, listener, options) { 26702 if (type === "click" || type == "keypress") { 26703 try { 26704 const handlers = this.__sentry_instrumentation_handlers__ = this.__sentry_instrumentation_handlers__ || {}; 26705 const handlerForType = handlers[type] = handlers[type] || { 26706 refCount: 0 26707 }; 26708 if (!handlerForType.handler) { 26709 const handler = makeDOMEventHandler(triggerDOMHandler); 26710 handlerForType.handler = handler; 26711 originalAddEventListener.call(this, type, handler, options); 26712 } 26713 handlerForType.refCount++; 26714 } catch (unused) {} 26715 } 26716 return originalAddEventListener.call(this, type, listener, options); 26717 }; 26718 }); 26719 (0, __TURBOPACK__imported__module__951497__9["fill"])(proto, "removeEventListener", function(originalRemoveEventListener) { 26720 return function(type, listener, options) { 26721 if (type === "click" || type == "keypress") { 26722 try { 26723 const handlers = this.__sentry_instrumentation_handlers__ || {}; 26724 const handlerForType = handlers[type]; 26725 if (handlerForType) { 26726 handlerForType.refCount--; 26727 if (handlerForType.refCount <= 0) { 26728 originalRemoveEventListener.call(this, type, handlerForType.handler, options); 26729 handlerForType.handler = void 0; 26730 delete handlers[type]; 26731 } 26732 if (Object.keys(handlers).length === 0) { 26733 delete this.__sentry_instrumentation_handlers__; 26734 } 26735 } 26736 } catch (unused) {} 26737 } 26738 return originalRemoveEventListener.call(this, type, listener, options); 26739 }; 26740 }); 26741 }); 26742} 26743function isSimilarToLastCapturedEvent(event) { 26744 if (event.type !== lastCapturedEventType) { 26745 return false;
26746 } 26747 try { 26748 if (!event.target || event.target._sentryId !== lastCapturedEventTargetId) { 26749 return false; 26750 } 26751 } catch (unused) {} 26752 return true; 26753} 26754function shouldSkipDOMEvent(eventType, target) { 26755 if (eventType !== "keypress") { 26756 return false; 26757 } 26758 if (!(target === null || target === void 0 ? void 0 : target.tagName)) { 26759 return true; 26760 } 26761 if (target.tagName === "INPUT" || target.tagName === "TEXTAREA" || target.isContentEditable) { 26762 return false; 26763 } 26764 return true; 26765} 26766function makeDOMEventHandler(handler) { 26767 let globalListener = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false; 26768 return (event)=>{ 26769 if (!event || event["_sentryCaptured"]) { 26770 return; 26771 } 26772 const target = getEventTarget(event); 26773 if (shouldSkipDOMEvent(event.type, target)) { 26774 return; 26775 } 26776 (0, __TURBOPACK__imported__module__951497__9["addNonEnumerableProperty"])(event, "_sentryCaptured", true); 26777 if (target && !target._sentryId) { 26778 (0, __TURBOPACK__imported__module__951497__9["addNonEnumerableProperty"])(target, "_sentryId", (0, __TURBOPACK__imported__module__682564__6["uuid4"])()); 26779 } 26780 const name = event.type === "keypress" ? "input" : event.type; 26781 if (!isSimilarToLastCapturedEvent(event)) { 26782 const handlerData = { 26783 event, 26784 name, 26785 global: globalListener 26786 }; 26787 handler(handlerData); 26788 lastCapturedEventType = event.type; 26789 lastCapturedEventTargetId = target ? target._sentryId : void 0; 26790 } 26791 clearTimeout(debounceTimerID); 26792 debounceTimerID = WINDOW3.setTimeout(()=>{ 26793 lastCapturedEventTargetId = void 0; 26794 lastCapturedEventType = void 0; 26795 }, DEBOUNCE_DURATION); 26796 }; 26797} 26798function getEventTarget(event) { 26799 try { 26800 return event.target; 26801 } catch (unused) { 26802 return null; 26803 } 26804} 26805; 26806; 26807; 26808; 26809; 26810const MAX_ALLOWED_STRING_LENGTH = 1024; 26811const INTEGRATION_NAME4 = "Breadcrumbs"; 26812const _breadcrumbsIntegration = function() { 26813 let options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}; 26814 const _options = { 26815 console: true, 26816 dom: true, 26817 fetch: true, 26818 history: true, 26819 sentry: true, 26820 xhr: true, 26821 ...options 26822 }; 26823 return { 26824 name: INTEGRATION_NAME4, 26825 setup (client) { 26826 if (_options.console) { 26827 addConsoleInstrumentationHandler(_getConsoleBreadcrumbHandler(client)); 26828 } 26829 if (_options.dom) { 26830 addClickKeypressInstrumentationHandler(_getDomBreadcrumbHandler(client, _options.dom)); 26831 } 26832 if (_options.xhr) { 26833 addXhrInstrumentationHandler(_getXhrBreadcrumbHandler(client)); 26834 } 26835 if (_options.fetch) { 26836 addFetchInstrumentationHandler(_getFetchBreadcrumbHandler(client)); 26837 } 26838 if (_options.history) { 26839 addHistoryInstrumentationHandler(_getHistoryBreadcrumbHandler(client)); 26840 } 26841 if (_options.sentry) { 26842 client.on("beforeSendEvent", _getSentryBreadcrumbHandler(client)); 26843 } 26844 } 26845 }; 26846}; 26847const breadcrumbsIntegration = defineIntegration(_breadcrumbsIntegration); 26848function _getSentryBreadcrumbHandler(client) { 26849 return function addSentryBreadcrumb(event) { 26850 if ((0, __TURBOPACK__imported__module__250804__23["getClient"])() !== client) { 26851 return; 26852 } 26853 (0, __TURBOPACK__imported__module__183330__["addBreadcrumb"])({ 26854 category: "sentry.".concat(event.type === "transaction" ? "transaction" : "event"), 26855 event_id: event.event_id, 26856 level: event.level, 26857 message: (0, __TURBOPACK__imported__module__682564__5["getEventDescription"])(event) 26858 }, { 26859 event 26860 }); 26861 }; 26862} 26863function _getDomBreadcrumbHandler(client, dom) { 26864 return function _innerDomBreadcrumb(handlerData) { 26865 if ((0, __TURBOPACK__imported__module__250804__23["getClient"])() !== client) { 26866 return; 26867 } 26868 let target; 26869 let componentName; 26870 let keyAttrs = typeof dom === "object" ? dom.serializeAttribute : void 0; 26871 let maxStringLength = typeof dom === "object" && typeof dom.maxStringLength === "number" ? dom.maxStringLength : void 0; 26872 if (maxStringLength && maxStringLength > MAX_ALLOWED_STRING_LENGTH) { 26873 DEBUG_BUILD1 && __TURBOPACK__imported__module__272598__30["debug"].warn("`dom.maxStringLength` cannot exceed ".concat(MAX_ALLOWED_STRING_LENGTH, ", but a value of ").concat(maxStringLength, " was configured. Sentry will use ").concat(MAX_ALLOWED_STRING_LENGTH, " instead.")); 26874 maxStringLength = MAX_ALLOWED_STRING_LENGTH; 26875 } 26876 if (typeof keyAttrs === "string") { 26877 keyAttrs = [ 26878 keyAttrs 26879 ]; 26880 } 26881 try { 26882 const event = handlerData.event; 26883 const element = _isEvent(event) ? event.target : event; 26884 target = htmlTreeAsString1(element, { 26885 keyAttrs, 26886 maxStringLength 26887 }); 26888 componentName = getComponentName(element); 26889 } catch (unused) { 26890 target = "<unknown>"; 26891 } 26892 if (target.length === 0) { 26893 return; 26894 } 26895 const breadcrumb = { 26896 category: "ui.".concat(handlerData.name), 26897 message: target 26898 }; 26899 if (componentName) { 26900 breadcrumb.data = {
26901 "ui.component_name": componentName 26902 }; 26903 } 26904 (0, __TURBOPACK__imported__module__183330__["addBreadcrumb"])(breadcrumb, { 26905 event: handlerData.event, 26906 name: handlerData.name, 26907 global: handlerData.global 26908 }); 26909 }; 26910} 26911function _getConsoleBreadcrumbHandler(client) { 26912 return function _consoleBreadcrumb(handlerData) { 26913 if ((0, __TURBOPACK__imported__module__250804__23["getClient"])() !== client) { 26914 return; 26915 } 26916 const breadcrumb = { 26917 category: "console", 26918 data: { 26919 arguments: handlerData.args, 26920 logger: "console" 26921 }, 26922 level: severityLevelFromString(handlerData.level), 26923 message: (0, __TURBOPACK__imported__module__821593__5["safeJoin"])(handlerData.args, " ") 26924 }; 26925 if (handlerData.level === "assert") { 26926 if (handlerData.args[0] === false) { 26927 breadcrumb.message = "Assertion failed: ".concat((0, __TURBOPACK__imported__module__821593__5["safeJoin"])(handlerData.args.slice(1), " ") || "console.assert"); 26928 breadcrumb.data.arguments = handlerData.args.slice(1); 26929 } else { 26930 return; 26931 } 26932 } 26933 (0, __TURBOPACK__imported__module__183330__["addBreadcrumb"])(breadcrumb, { 26934 input: handlerData.args, 26935 level: handlerData.level 26936 }); 26937 }; 26938} 26939function _getXhrBreadcrumbHandler(client) { 26940 return function _xhrBreadcrumb(handlerData) { 26941 if ((0, __TURBOPACK__imported__module__250804__23["getClient"])() !== client) { 26942 return; 26943 } 26944 const { startTimestamp, endTimestamp } = handlerData; 26945 const sentryXhrData = handlerData.xhr[SENTRY_XHR_DATA_KEY]; 26946 if (!startTimestamp || !endTimestamp || !sentryXhrData) { 26947 return; 26948 } 26949 const { method, url, status_code, body } = sentryXhrData; 26950 const data = { 26951 method, 26952 url, 26953 status_code 26954 }; 26955 const hint = { 26956 xhr: handlerData.xhr, 26957 input: body, 26958 startTimestamp, 26959 endTimestamp 26960 }; 26961 const breadcrumb = { 26962 category: "xhr", 26963 data, 26964 type: "http", 26965 level: getBreadcrumbLogLevelFromHttpStatusCode(status_code) 26966 }; 26967 client.emit("beforeOutgoingRequestBreadcrumb", breadcrumb, hint); 26968 (0, __TURBOPACK__imported__module__183330__["addBreadcrumb"])(breadcrumb, hint); 26969 }; 26970} 26971function _getFetchBreadcrumbHandler(client) { 26972 return function _fetchBreadcrumb(handlerData) { 26973 if ((0, __TURBOPACK__imported__module__250804__23["getClient"])() !== client) { 26974 return; 26975 } 26976 const { startTimestamp, endTimestamp } = handlerData; 26977 if (!endTimestamp) { 26978 return; 26979 } 26980 if (handlerData.fetchData.url.match(/sentry_key/) && handlerData.fetchData.method === "POST") { 26981 return; 26982 } 26983 if (handlerData.error) { 26984 const hint = { 26985 data: handlerData.error, 26986 input: handlerData.args, 26987 startTimestamp, 26988 endTimestamp 26989 }; 26990 const breadcrumb = { 26991 category: "fetch", 26992 data: handlerData.fetchData, 26993 level: "error", 26994 type: "http" 26995 }; 26996 client.emit("beforeOutgoingRequestBreadcrumb", breadcrumb, hint); 26997 (0, __TURBOPACK__imported__module__183330__["addBreadcrumb"])(breadcrumb, hint); 26998 } else { 26999 const response = handlerData.response; 27000 const data = { 27001 ...handlerData.fetchData, 27002 status_code: response === null || response === void 0 ? void 0 : response.status 27003 }; 27004 const hint = { 27005 input: handlerData.args, 27006 response, 27007 startTimestamp, 27008 endTimestamp 27009 }; 27010 const breadcrumb = { 27011 category: "fetch", 27012 data, 27013 type: "http", 27014 level: getBreadcrumbLogLevelFromHttpStatusCode(data.status_code) 27015 }; 27016 client.emit("beforeOutgoingRequestBreadcrumb", breadcrumb, hint); 27017 (0, __TURBOPACK__imported__module__183330__["addBreadcrumb"])(breadcrumb, hint); 27018 } 27019 }; 27020} 27021function _getHistoryBreadcrumbHandler(client) { 27022 return function _historyBreadcrumb(handlerData) { 27023 if ((0, __TURBOPACK__imported__module__250804__23["getClient"])() !== client) { 27024 return; 27025 } 27026 let from = handlerData.from; 27027 let to = handlerData.to; 27028 const parsedLoc = parseUrl(WINDOW1.location.href); 27029 let parsedFrom = from ? parseUrl(from) : void 0; 27030 const parsedTo = parseUrl(to); 27031 if (!(parsedFrom === null || parsedFrom === void 0 ? void 0 : parsedFrom.path)) { 27032 parsedFrom = parsedLoc; 27033 } 27034 if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host) { 27035 to = parsedTo.relative; 27036 } 27037 if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host) { 27038 from = parsedFrom.relative; 27039 } 27040 (0, __TURBOPACK__imported__module__183330__["addBreadcrumb"])({ 27041 category: "navigation", 27042 data: { 27043 from, 27044 to 27045 } 27046 }); 27047 }; 27048} 27049function _isEvent(event) { 27050 return !!event && !!event.target; 27051} 27052; 27053// MERGED MODULE: [project]/node_modules/@sentry/browser/build/npm/esm/prod/integrations/browserapierrors.js [app-client] (ecmascript) 27054; 27055var __TURBOPACK__imported__module__951497__10 = __TURBOPACK__imported__module__951497__; 27056var __TURBOPACK__imported__module__936032__4 = __TURBOPACK__imported__module__936032__; 27057; 27058; 27059const DEFAULT_EVENT_TARGET = "EventTarget,Window,Node,ApplicationCache,AudioTrackList,BroadcastChannel,ChannelMergerNode,CryptoOperation,EventSource,FileReader,HTMLUnknownElement,IDBDatabase,IDB
27059Request,IDBTransaction,KeyOperation,MediaController,MessagePort,ModalWindow,Notification,SVGElementInstance,Screen,SharedWorker,TextTrack,TextTrackCue,TextTrackList,WebSocket,WebSocketWorker,Worker,XMLHttpRequest,XMLHttpRequestEventTarget,XMLHttpRequestUpload".split(","); 27060const INTEGRATION_NAME5 = "BrowserApiErrors"; 27061const _browserApiErrorsIntegration = function() { 27062 let options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}; 27063 const _options = { 27064 XMLHttpRequest: true, 27065 eventTarget: true, 27066 requestAnimationFrame: true, 27067 setInterval: true, 27068 setTimeout: true, 27069 unregisterOriginalCallbacks: false, 27070 ...options 27071 }; 27072 return { 27073 name: INTEGRATION_NAME5, 27074 // TODO: This currently only works for the first client this is setup 27075 // We may want to adjust this to check for client etc. 27076 setupOnce () { 27077 if (_options.setTimeout) { 27078 (0, __TURBOPACK__imported__module__951497__10["fill"])(WINDOW1, "setTimeout", _wrapTimeFunction); 27079 } 27080 if (_options.setInterval) { 27081 (0, __TURBOPACK__imported__module__951497__10["fill"])(WINDOW1, "setInterval", _wrapTimeFunction); 27082 } 27083 if (_options.requestAnimationFrame) { 27084 (0, __TURBOPACK__imported__module__951497__10["fill"])(WINDOW1, "requestAnimationFrame", _wrapRAF); 27085 } 27086 if (_options.XMLHttpRequest && "XMLHttpRequest" in WINDOW1) { 27087 (0, __TURBOPACK__imported__module__951497__10["fill"])(XMLHttpRequest.prototype, "send", _wrapXHR); 27088 } 27089 const eventTargetOption = _options.eventTarget; 27090 if (eventTargetOption) { 27091 const eventTarget = Array.isArray(eventTargetOption) ? eventTargetOption : DEFAULT_EVENT_TARGET; 27092 eventTarget.forEach((target)=>_wrapEventTarget(target, _options)); 27093 } 27094 } 27095 }; 27096}; 27097const browserApiErrorsIntegration = defineIntegration(_browserApiErrorsIntegration); 27098function _wrapTimeFunction(original) { 27099 return function() { 27100 for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++){ 27101 args[_key] = arguments[_key]; 27102 } 27103 const originalCallback = args[0]; 27104 args[0] = wrap(originalCallback, { 27105 mechanism: { 27106 handled: false, 27107 type: "auto.browser.browserapierrors.".concat((0, __TURBOPACK__imported__module__936032__4["getFunctionName"])(original)) 27108 } 27109 }); 27110 return original.apply(this, args); 27111 }; 27112} 27113function _wrapRAF(original) { 27114 return function(callback) { 27115 return original.apply(this, [ 27116 wrap(callback, { 27117 mechanism: { 27118 data: { 27119 handler: (0, __TURBOPACK__imported__module__936032__4["getFunctionName"])(original) 27120 }, 27121 handled: false, 27122 type: "auto.browser.browserapierrors.requestAnimationFrame" 27123 } 27124 }) 27125 ]); 27126 }; 27127} 27128function _wrapXHR(originalSend) { 27129 return function() { 27130 for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++){ 27131 args[_key] = arguments[_key]; 27132 } 27133 const xhr = this; 27134 const xmlHttpRequestProps = [ 27135 "onload", 27136 "onerror", 27137 "onprogress", 27138 "onreadystatechange" 27139 ]; 27140 xmlHttpRequestProps.forEach((prop)=>{ 27141 if (prop in xhr && typeof xhr[prop] === "function") { 27142 (0, __TURBOPACK__imported__module__951497__10["fill"])(xhr, prop, function(original) { 27143 const wrapOptions = { 27144 mechanism: { 27145 data: { 27146 handler: (0, __TURBOPACK__imported__module__936032__4["getFunctionName"])(original) 27147 }, 27148 handled: false, 27149 type: "auto.browser.browserapierrors.xhr.".concat(prop) 27150 } 27151 }; 27152 const originalFunction = (0, __TURBOPACK__imported__module__951497__10["getOriginalFunction"])(original); 27153 if (originalFunction) { 27154 wrapOptions.mechanism.data.handler = (0, __TURBOPACK__imported__module__936032__4["getFunctionName"])(originalFunction); 27155 } 27156 return wrap(original, wrapOptions); 27157 }); 27158 } 27159 }); 27160 return originalSend.apply(this, args); 27161 }; 27162} 27163function _wrapEventTarget(target, integrationOptions) { 27164 var _globalObject_target, _proto_hasOwnProperty; 27165 const globalObject = WINDOW1; 27166 const proto = (_globalObject_target = globalObject[target]) === null || _globalObject_target === void 0 ? void 0 : _globalObject_target.prototype; 27167 if (!(proto === null || proto === void 0 ? void 0 : (_proto_hasOwnProperty = proto.hasOwnProperty) === null || _proto_hasOwnProperty === void 0 ? void 0 : _proto_hasOwnProperty.call(proto, "addEventListener"))) { 27168 return; 27169 } 27170 (0, __TURBOPACK__imported__module__951497__10["fill"])(proto, "addEventListener", function(original) { 27171 return function(eventName, fn, options) { 27172 try { 27173 if (isEventListenerObject(fn)) { 27174 fn.handleEvent = wrap(fn.handleEvent, { 27175 mechanism: { 27176 data: { 27177 handler: (0, __TURBOPACK__imported__module__936032__4["getFunctionName"])(fn), 27178 target 27179 }, 27180 handled: false, 27181 type: "auto.browser.browserapierrors.handleEvent" 27182 } 27183 }); 27184 } 27185 } catch (unused) {} 27186 if (integrationOptions.unregisterOriginalCallbacks) { 27187 unregisterOriginalCallback(this, eventName, fn); 27188 } 27189 return original.apply(this, [ 27190 eventName, 27191 wrap(fn, { 27192 mechanism: { 27193 data: { 27194 handler: (0, __TURBOPACK__imported__module__936032__4["getFunctionName"])(fn), 27195 target 27196 }, 27197 handled: false, 27198 type: "auto.browser.browserapierrors.addEventListener" 27199 } 27200 }), 27201 options 27202 ]); 27203 }; 27204 }); 27205 (0, __TURBOPACK__imported__module__951497__10["fill"])(proto, "removeEventListener", function(originalRemoveEventListener) { 27206 return function(eventName, fn, options) { 27207 try { 27208 if (Object.prototype.hasOwnProperty.call(fn, "__sentry_wrapped__")) { 27209 const originalEventHandler = fn.__sentry_wrapped__; 27210 if (originalEventHandler) { 27211 originalRemoveEventListener.call(this, eventName, originalEventHandler, options); 27212 } 27213 } 27214 } catch (unused) {} 27215 return originalRemoveEventListener.call(this, eventName, fn, options); 27216 }; 27217 }); 27218} 27219function isEventListenerObject(obj) { 27220 return typeof obj.handleEvent === "function"; 27221} 27222function unregisterOriginalCallback(target, eventName, fn) { 27223 if (target && typeof target === "object" && "removeEventListener" in target && typeof target.removeEventListener === "function") { 27224 target.removeEventListener(eventName, fn); 27225 } 27226} 27227; 27228// MERGED MODULE: [project]/node_modules/@sentry/browser/build/npm/esm/prod/integrations/browsersession.js [app-client] (ecmascript) 27229; 27230var __TURBOPACK__imported__module__272598__31 = __TURBOPACK__imported__module__272598__; 27231var __TURBOPACK__imported__module__662537__4 = __TURBOPACK__imported__module__662537__; 27232var __TURBOPACK__imported__module__250804__24 = __TURBOPACK__imported__module__250804__; 27233; 27234; 27235; 27236; 27237const browserSessionIntegration = defineIntegration(function() { 27238 let options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}; 27239 var _options_lifecycle; 27240 const lifecycle = (_options_lifecycle = options.lifecycle) !== null && _options_lifecycle !== void 0 ? _options_lifecycle : "route"; 27241 return { 27242 name: "BrowserSession", 27243 setupOnce () { 27244 if (typeof WINDOW1.document === "undefined") { 27245 DEBUG_BUILD1 && __TURBOPACK__imported__module__272598__31["debug"].warn("Using the `browserSessionIntegration` in non-browser environments is not supported."); 27246 return; 27247 } 27248 (0, __TURBOPACK__imported__module__662537__4["startSession"])({ 27249 ignoreDuration: true 27250 }); 27251 let initialSessionSent = false;
27252 whenIdleOrHidden(()=>{ 27253 if (!initialSessionSent) { 27254 (0, __TURBOPACK__imported__module__662537__4["captureSession"])(); 27255 initialSessionSent = true; 27256 } 27257 }); 27258 const isolationScope = (0, __TURBOPACK__imported__module__250804__24["getIsolationScope"])(); 27259 let previousUser = isolationScope.getUser(); 27260 isolationScope.addScopeListener((scope)=>{ 27261 const maybeNewUser = scope.getUser(); 27262 if ((previousUser === null || previousUser === void 0 ? void 0 : previousUser.id) !== (maybeNewUser === null || maybeNewUser === void 0 ? void 0 : maybeNewUser.id) || (previousUser === null || previousUser === void 0 ? void 0 : previousUser.ip_address) !== (maybeNewUser === null || maybeNewUser === void 0 ? void 0 : maybeNewUser.ip_address)) { 27263 previousUser = maybeNewUser; 27264 if (initialSessionSent) { 27265 (0, __TURBOPACK__imported__module__662537__4["captureSession"])(); 27266 } 27267 } 27268 }); 27269 if (lifecycle === "route") { 27270 addHistoryInstrumentationHandler((param)=>{ 27271 let { from, to } = param; 27272 if (from !== to) { 27273 (0, __TURBOPACK__imported__module__662537__4["startSession"])({ 27274 ignoreDuration: true 27275 }); 27276 (0, __TURBOPACK__imported__module__662537__4["captureSession"])(); 27277 initialSessionSent = true; 27278 } 27279 }); 27280 } 27281 } 27282 }; 27283}); 27284; 27285// MERGED MODULE: [project]/node_modules/@sentry/browser/build/npm/esm/prod/integrations/culturecontext.js [app-client] (ecmascript) 27286; 27287// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/tracing/spans/captureSpan.js [app-client] (ecmascript) 27288; 27289var __TURBOPACK__imported__module__519988__18 = __TURBOPACK__imported__module__519988__; 27290var __TURBOPACK__imported__module__571993__1 = __TURBOPACK__imported__module__571993__; 27291var __TURBOPACK__imported__module__304661__20 = __TURBOPACK__imported__module__304661__; 27292var __TURBOPACK__imported__module__242222__3 = __TURBOPACK__imported__module__242222__; 27293// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/tracing/spans/scopeContextAttributes.js [app-client] (ecmascript) 27294; 27295function scopeContextsToSpanAttributes(contexts) { 27296 const attrs = {}; 27297 const { response, profile, cloud_resource, culture, state } = contexts; 27298 if (response) { 27299 if (response.status_code != null) { 27300 attrs["http.response.status_code"] = response.status_code; 27301 } 27302 if (response.body_size != null) { 27303 attrs["http.response.body.size"] = response.body_size; 27304 } 27305 } 27306 if (profile) { 27307 if (profile.profile_id) { 27308 attrs["sentry.profile_id"] = profile.profile_id; 27309 } 27310 if (profile.profiler_id) { 27311 attrs["sentry.profiler_id"] = profile.profiler_id; 27312 } 27313 } 27314 if (cloud_resource) { 27315 for (const [key, value] of Object.entries(cloud_resource)){ 27316 if (value != null) { 27317 attrs[key] = value; 27318 } 27319 } 27320 } 27321 if (culture) { 27322 if (culture.locale) { 27323 attrs["culture.locale"] = culture.locale; 27324 } 27325 if (culture.timezone) { 27326 attrs["culture.timezone"] = culture.timezone; 27327 } 27328 } 27329 if ((state === null || state === void 0 ? void 0 : state.state) && typeof state.state.type === "string") { 27330 attrs["state.type"] = state.state.type; 27331 } 27332 const angular = contexts["angular"]; 27333 if (angular) { 27334 const version = angular["version"]; 27335 if (typeof version === "string" || typeof version === "number") { 27336 attrs["angular.version"] = version; 27337 } 27338 } 27339 const react = contexts["react"]; 27340 if (react) { 27341 const version = react["version"]; 27342 if (typeof version === "string" || typeof version === "number") { 27343 attrs["react.version"] = version; 27344 } 27345 } 27346 return attrs; 27347} 27348; 27349var __TURBOPACK__imported__module__373250__1 = __TURBOPACK__imported__module__373250__; 27350; 27351; 27352; 27353; 27354; 27355; 27356; 27357; 27358function captureSpan(span, client) { 27359 var _processedSpan_attributes; 27360 const spanJSON = (0, __TURBOPACK__imported__module__304661__20["spanToStreamedSpanJSON"])(span); 27361 const segmentSpan = (0, __TURBOPACK__imported__module__304661__20["INTERNAL_getSegmentSpan"])(span); 27362 const serializedSegmentSpan = (0, __TURBOPACK__imported__module__304661__20["spanToStreamedSpanJSON"])(segmentSpan); 27363 const { isolationScope: spanIsolationScope, scope: spanScope } = (0, __TURBOPACK__imported__module__242222__3["getCapturedScopesOnSpan"])(span); 27364 const finalScopeData = (0, __TURBOPACK__imported__module__571993__1["getCombinedScopeData"])(spanIsolationScope, spanScope); 27365 applyCommonSpanAttributes(spanJSON, serializedSegmentSpan, client, finalScopeData); 27366 const spanKind = span.kind; 27367 client.emit("preprocessSpan", spanJSON, { 27368 spanKind 27369 }); 27370 if (spanJSON.is_segment) { 27371 applyScopeToSegmentSpan(spanJSON, finalScopeData); 27372 applySdkMetadataToSegmentSpan(spanJSON, client); 27373 client.emit("processSegmentSpan", spanJSON); 27374 } 27375 client.emit("processSpan", spanJSON); 27376 const { beforeSendSpan } = client.getOptions(); 27377 const processedSpan = beforeSendSpan && isStreamedBeforeSendSpanCallback(beforeSendSpan) ? applyBeforeSendSpanCallback(spanJSON, beforeSendSpan) : spanJSON; 27378 const spanNameSource = (_processedSpan_attributes = processedSpan.attributes) === null || _processedSpan_attributes === void 0 ? void 0 : _processedSpan_attributes[__TURBOPACK__imported__module__519988__18["SEMANTIC_ATTRIBUTE_SENTRY_SOURCE"]]; 27379 if (spanJSON.is_segment && spanNameSource) { 27380 safeSetSpanJSONAttributes(processedSpan, { 27381 ["sentry.segment.name.source"]: spanNameSource 27382 }); 27383 } 27384 return { 27385 ...(0, __TURBOPACK__imported__module__304661__20["streamedSpanJsonToSerializedSpan"])(processedSpan), 27386 _segmentSpan: segmentSpan 27387 }; 27388} 27389function applyScopeToSegmentSpan(segmentSpanJSON, scopeData) { 27390 const contextAttributes = scopeContextsToSpanAttributes(scopeData.contexts); 27391 safeSetSpanJSONAttributes(segmentSpanJSON, contextAttributes); 27392} 27393function safeSetSpanJSONAttributes(spanJSON, newAttributes) { 27394 var _spanJSON_attributes; 27395 const originalAttributes = (_spanJSON_attributes = spanJSON.attributes) !== null && _spanJSON_attributes !== void 0 ? _spanJSON_attributes : spanJSON.attributes = {};
27396 Object.entries(newAttributes).forEach((param)=>{ 27397 let [key, value] = param; 27398 if (value != null && !(key in originalAttributes)) { 27399 originalAttributes[key] = value; 27400 } 27401 }); 27402} 27403function applySdkMetadataToSegmentSpan(segmentSpanJSON, client) { 27404 const integrationNames = client.getIntegrationNames(); 27405 if (!integrationNames.length) return; 27406 safeSetSpanJSONAttributes(segmentSpanJSON, { 27407 [__TURBOPACK__imported__module__519988__18["SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS"]]: integrationNames 27408 }); 27409} 27410function applyCommonSpanAttributes(spanJSON, serializedSegmentSpan, client, scopeData) { 27411 var _sdk_sdk, _sdk_sdk1, _scopeData_user, _scopeData_user1, _scopeData_user2, _scopeData_user3; 27412 const sdk = client.getSdkMetadata(); 27413 const { release, environment } = client.getOptions(); 27414 safeSetSpanJSONAttributes(spanJSON, { 27415 [Kc]: "stream", 27416 [Lc]: serializedSegmentSpan.name, 27417 [Pc]: serializedSegmentSpan.span_id, 27418 [Nc]: sdk === null || sdk === void 0 ? void 0 : (_sdk_sdk = sdk.sdk) === null || _sdk_sdk === void 0 ? void 0 : _sdk_sdk.name, 27419 [Cc]: sdk === null || sdk === void 0 ? void 0 : (_sdk_sdk1 = sdk.sdk) === null || _sdk_sdk1 === void 0 ? void 0 : _sdk_sdk1.version, 27420 [__TURBOPACK__imported__module__519988__18["SEMANTIC_ATTRIBUTE_SENTRY_RELEASE"]]: release, 27421 [__TURBOPACK__imported__module__519988__18["SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT"]]: environment || __TURBOPACK__imported__module__373250__1["DEFAULT_ENVIRONMENT"], 27422 [__TURBOPACK__imported__module__519988__18["SEMANTIC_ATTRIBUTE_USER_ID"]]: (_scopeData_user = scopeData.user) === null || _scopeData_user === void 0 ? void 0 : _scopeData_user.id, 27423 [__TURBOPACK__imported__module__519988__18["SEMANTIC_ATTRIBUTE_USER_EMAIL"]]: (_scopeData_user1 = scopeData.user) === null || _scopeData_user1 === void 0 ? void 0 : _scopeData_user1.email, 27424 [__TURBOPACK__imported__module__519988__18["SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS"]]: (_scopeData_user2 = scopeData.user) === null || _scopeData_user2 === void 0 ? void 0 : _scopeData_user2.ip_address, 27425 [__TURBOPACK__imported__module__519988__18["SEMANTIC_ATTRIBUTE_USER_USERNAME"]]: (_scopeData_user3 = scopeData.user) === null || _scopeData_user3 === void 0 ? void 0 : _scopeData_user3.username, 27426 ...scopeData.attributes 27427 }); 27428} 27429function applyBeforeSendSpanCallback(span, beforeSendSpan) { 27430 const modifedSpan = beforeSendSpan(span); 27431 if (!modifedSpan) { 27432 (0, __TURBOPACK__imported__module__304661__20["showSpanDropWarning"])(); 27433 return span; 27434 } 27435 return modifedSpan; 27436} 27437; 27438; 27439; 27440const INTEGRATION_NAME6 = "CultureContext"; 27441const _cultureContextIntegration = ()=>{ 27442 return { 27443 name: INTEGRATION_NAME6, 27444 preprocessEvent (event) { 27445 const culture = getCultureContext(); 27446 if (culture) { 27447 var _event_contexts; 27448 event.contexts = { 27449 ...event.contexts, 27450 culture: { 27451 ...culture, 27452 ...(_event_contexts = event.contexts) === null || _event_contexts === void 0 ? void 0 : _event_contexts.culture 27453 } 27454 }; 27455 } 27456 }, 27457 processSegmentSpan (span) { 27458 const culture = getCultureContext(); 27459 if (culture) { 27460 safeSetSpanJSONAttributes(span, { 27461 "culture.locale": culture.locale, 27462 "culture.timezone": culture.timezone, 27463 "culture.calendar": culture.calendar 27464 }); 27465 } 27466 } 27467 }; 27468}; 27469const cultureContextIntegration = defineIntegration(_cultureContextIntegration); 27470function getCultureContext() { 27471 try { 27472 const intl = WINDOW1.Intl; 27473 if (!intl) { 27474 return void 0; 27475 } 27476 const options = intl.DateTimeFormat().resolvedOptions(); 27477 return { 27478 locale: options.locale, 27479 timezone: options.timeZone, 27480 calendar: options.calendar 27481 }; 27482 } catch (unused) { 27483 return void 0; 27484 } 27485} 27486; 27487// MERGED MODULE: [project]/node_modules/@sentry/browser/build/npm/esm/prod/integrations/globalhandlers.js [app-client] (ecmascript) 27488; 27489var __TURBOPACK__imported__module__250804__25 = __TURBOPACK__imported__module__250804__; 27490var __TURBOPACK__imported__module__662537__5 = __TURBOPACK__imported__module__662537__; 27491var __TURBOPACK__imported__module__272598__32 = __TURBOPACK__imported__module__272598__; 27492var __TURBOPACK__imported__module__453288__10 = __TURBOPACK__imported__module__453288__; 27493var __TURBOPACK__imported__module__936032__5 = __TURBOPACK__imported__module__936032__; 27494; 27495; 27496; 27497; 27498const INTEGRATION_NAME7 = "GlobalHandlers"; 27499const _globalHandlersIntegration = function() { 27500 let options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}; 27501 const _options = { 27502 onerror: true, 27503 onunhandledrejection: true, 27504 ...options 27505 }; 27506 return { 27507 name: INTEGRATION_NAME7, 27508 setupOnce () { 27509 Error.stackTraceLimit = 50; 27510 }, 27511 setup (client) { 27512 if (_options.onerror) { 27513 _installGlobalOnErrorHandler(client); 27514 globalHandlerLog("onerror"); 27515 } 27516 if (_options.onunhandledrejection) { 27517 _installGlobalOnUnhandledRejectionHandler(client); 27518 globalHandlerLog("onunhandledrejection"); 27519 } 27520 } 27521 }; 27522}; 27523const globalHandlersIntegration = defineIntegration(_globalHandlersIntegration); 27524function _installGlobalOnErrorHandler(client) { 27525 addGlobalErrorInstrumentationHandler((data)=>{ 27526 const { stackParser, attachStacktrace } = getOptions(); 27527 if ((0, __TURBOPACK__imported__module__250804__25["getClient"])() !== client || shouldIgnoreOnError()) { 27528 return; 27529 } 27530 const { msg, url, line, column, error } = data; 27531 const event = _enhanceEventWithInitialFrame(eventFromUnknownInput1(stackParser, error || msg, void 0, attachStacktrace, false), url, line, column); 27532 event.level = "error"; 27533 (0, __TURBOPACK__imported__module__662537__5["captureEvent"])(event, { 27534 originalException: error, 27535 mechanism: { 27536 handled: false, 27537 type: "auto.browser.global_handlers.onerror" 27538 } 27539 }); 27540 }); 27541} 27542function _installGlobalOnUnhandledRejectionHandler(client) { 27543 addGlobalUnhandledRejectionInstrumentationHandler((e)=>
27543{ 27544 const { stackParser, attachStacktrace } = getOptions(); 27545 if ((0, __TURBOPACK__imported__module__250804__25["getClient"])() !== client || shouldIgnoreOnError()) { 27546 return; 27547 } 27548 const error = _getUnhandledRejectionError(e); 27549 const event = (0, __TURBOPACK__imported__module__453288__10["isPrimitive"])(error) ? _eventFromRejectionWithPrimitive(error) : eventFromUnknownInput1(stackParser, error, void 0, attachStacktrace, true); 27550 event.level = "error"; 27551 (0, __TURBOPACK__imported__module__662537__5["captureEvent"])(event, { 27552 originalException: error, 27553 mechanism: { 27554 handled: false, 27555 type: "auto.browser.global_handlers.onunhandledrejection" 27556 } 27557 }); 27558 }); 27559} 27560function _getUnhandledRejectionError(error) { 27561 if ((0, __TURBOPACK__imported__module__453288__10["isPrimitive"])(error)) { 27562 return error; 27563 } 27564 try { 27565 if ("reason" in error) { 27566 return error.reason; 27567 } 27568 if ("detail" in error && "reason" in error.detail) { 27569 return error.detail.reason; 27570 } 27571 } catch (unused) {} 27572 return error; 27573} 27574function _eventFromRejectionWithPrimitive(reason) { 27575 return { 27576 exception: { 27577 values: [ 27578 { 27579 type: "UnhandledRejection", 27580 // String() is needed because the Primitive type includes symbols (which can't be automatically stringified) 27581 value: "Non-Error promise rejection captured with value: ".concat(String(reason)) 27582 } 27583 ] 27584 } 27585 }; 27586} 27587function _enhanceEventWithInitialFrame(event, url, lineno, colno) { 27588 const e = event.exception = event.exception || {}; 27589 const ev = e.values = e.values || []; 27590 const ev0 = ev[0] = ev[0] || {}; 27591 const ev0s = ev0.stacktrace = ev0.stacktrace || {}; 27592 const ev0sf = ev0s.frames = ev0s.frames || []; 27593 if (ev0sf.length === 0) { 27594 var _getFilenameFromUrl; 27595 ev0sf.push({ 27596 colno, 27597 lineno, 27598 filename: (_getFilenameFromUrl = getFilenameFromUrl(url)) !== null && _getFilenameFromUrl !== void 0 ? _getFilenameFromUrl : getLocationHref(), 27599 function: __TURBOPACK__imported__module__936032__5["UNKNOWN_FUNCTION"], 27600 in_app: true 27601 }); 27602 } 27603 return event; 27604} 27605function globalHandlerLog(type) { 27606 DEBUG_BUILD1 && __TURBOPACK__imported__module__272598__32["debug"].log("Global Handler attached: ".concat(type)); 27607} 27608function getOptions() { 27609 const client = (0, __TURBOPACK__imported__module__250804__25["getClient"])(); 27610 const options = (client === null || client === void 0 ? void 0 : client.getOptions()) || { 27611 stackParser: ()=>[], 27612 attachStacktrace: false 27613 }; 27614 return options; 27615} 27616function getFilenameFromUrl(url) { 27617 if (!(0, __TURBOPACK__imported__module__453288__10["isString"])(url) || url.length === 0) { 27618 return void 0; 27619 } 27620 if (url.startsWith("data:")) { 27621 return "<".concat(stripDataUrlContent(url, false), ">"); 27622 } 27623 return url; 27624} 27625; 27626// MERGED MODULE: [project]/node_modules/@sentry/browser/build/npm/esm/prod/integrations/httpcontext.js [app-client] (ecmascript) 27627; 27628; 27629; 27630; 27631const httpContextIntegration = defineIntegration(()=>{ 27632 return { 27633 name: "HttpContext", 27634 preprocessEvent (event) { 27635 var _event_request; 27636 if (!WINDOW1.navigator && !WINDOW1.location && !WINDOW1.document) { 27637 return; 27638 } 27639 const reqData = getHttpRequestData(); 27640 const headers = { 27641 ...reqData.headers, 27642 ...(_event_request = event.request) === null || _event_request === void 0 ? void 0 : _event_request.headers 27643 }; 27644 event.request = { 27645 ...reqData, 27646 ...event.request, 27647 headers 27648 }; 27649 }, 27650 processSpan (span) { 27651 var _span_attributes; 27652 if (!WINDOW1.navigator && !WINDOW1.location && !WINDOW1.document) { 27653 return; 27654 } 27655 const reqData = getHttpRequestData(); 27656 safeSetSpanJSONAttributes(span, { 27657 // This attribute is used by the "Filter out events from legacy browsers and crawlers" features on the Sentry backend. 27658 // Therefore, it's set on every span. 27659 [Qu]: reqData.headers["User-Agent"],
27660 // These attributes, we only need on the segment span (analogous to the `request` context for events) 27661 ...span.is_segment && { 27662 // Coerce empty string to undefined so the helper's nullish check drops it, 27663 // rather than writing an empty `url.full` attribute onto the span. 27664 [Yu]: ((_span_attributes = span.attributes) === null || _span_attributes === void 0 ? void 0 : _span_attributes[Sc]) !== "http.client" ? reqData.url : void 0, 27665 ["".concat(ts, ".referer")]: reqData.headers["Referer"] 27666 } 27667 }); 27668 } 27669 }; 27670}); 27671; 27672// MERGED MODULE: [project]/node_modules/@sentry/browser/build/npm/esm/prod/integrations/linkederrors.js [app-client] (ecmascript) 27673; 27674// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/utils/aggregate-errors.js [app-client] (ecmascript) 27675; 27676var __TURBOPACK__imported__module__453288__11 = __TURBOPACK__imported__module__453288__; 27677; 27678function applyAggregateErrorsToEvent(exceptionFromErrorImplementation, parser, key, limit, event, hint) { 27679 var _event_exception; 27680 if (!((_event_exception = event.exception) === null || _event_exception === void 0 ? void 0 : _event_exception.values) || !hint || !(0, __TURBOPACK__imported__module__453288__11["isError"])(hint.originalException)) { 27681 return; 27682 } 27683 const originalException = event.exception.values.length > 0 ? event.exception.values[event.exception.values.length - 1] : void 0; 27684 if (originalException) { 27685 event.exception.values = aggregateExceptionsFromError(exceptionFromErrorImplementation, parser, limit, hint.originalException, key, event.exception.values, originalException, 0); 27686 } 27687} 27688function aggregateExceptionsFromError(exceptionFromErrorImplementation, parser, limit, error, key, prevExceptions, exception, exceptionId) { 27689 if (prevExceptions.length >= limit + 1) { 27690 return prevExceptions; 27691 } 27692 let newExceptions = [ 27693 ...prevExceptions 27694 ]; 27695 if ((0, __TURBOPACK__imported__module__453288__11["isError"])(error[key])) { 27696 applyExceptionGroupFieldsForParentException(exception, exceptionId, error); 27697 const newException = exceptionFromErrorImplementation(parser, error[key]); 27698 const newExceptionId = newExceptions.length; 27699 applyExceptionGroupFieldsForChildException(newException, key, newExceptionId, exceptionId); 27700 newExceptions = aggregateExceptionsFromError(exceptionFromErrorImplementation, parser, limit, error[key], key, [ 27701 newException, 27702 ...newExceptions 27703 ], newException, newExceptionId); 27704 } 27705 if (isExceptionGroup(error)) { 27706 error.errors.forEach((childError, i)=>{ 27707 if ((0, __TURBOPACK__imported__module__453288__11["isError"])(childError)) { 27708 applyExceptionGroupFieldsForParentException(exception, exceptionId, error); 27709 const newException = exceptionFromErrorImplementation(parser, childError); 27710 const newExceptionId = newExceptions.length; 27711 applyExceptionGroupFieldsForChildException(newException, "errors[".concat(i, "]"), newExceptionId, exceptionId); 27712 newExceptions = aggregateExceptionsFromError(exceptionFromErrorImplementation, parser, limit, childError, key, [ 27713 newException, 27714 ...newExceptions 27715 ], newException, newExceptionId); 27716 } 27717 }); 27718 } 27719 return newExceptions; 27720} 27721function isExceptionGroup(error) { 27722 return Array.isArray(error.errors); 27723} 27724function applyExceptionGroupFieldsForParentException(exception, exceptionId, error) { 27725 exception.mechanism = { 27726 handled: true, 27727 type: "auto.core.linked_errors", 27728 ...isExceptionGroup(error) && { 27729 is_exception_group: true 27730 }, 27731 ...exception.mechanism, 27732 exception_id: exceptionId 27733 }; 27734} 27735function applyExceptionGroupFieldsForChildException(exception, source, exceptionId, parentId) { 27736 exception.mechanism = { 27737 handled: true, 27738 ...exception.mechanism, 27739 type: "chained", 27740 source, 27741 exception_id: exceptionId, 27742 parent_id: parentId 27743 }; 27744} 27745; 27746; 27747; 27748const DEFAULT_KEY = "cause"; 27749const DEFAULT_LIMIT = 5; 27750const INTEGRATION_NAME8 = "LinkedErrors"; 27751const _linkedErrorsIntegration = function() { 27752 let options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}; 27753 const limit = options.limit || DEFAULT_LIMIT;
27754 const key = options.key || DEFAULT_KEY; 27755 return { 27756 name: INTEGRATION_NAME8, 27757 preprocessEvent (event, hint, client) { 27758 const options2 = client.getOptions(); 27759 applyAggregateErrorsToEvent(// This differs from the LinkedErrors integration in core by using a different exceptionFromError function 27760 exceptionFromError1, options2.stackParser, key, limit, event, hint); 27761 } 27762 }; 27763}; 27764const linkedErrorsIntegration = defineIntegration(_linkedErrorsIntegration); 27765; 27766// MERGED MODULE: [project]/node_modules/@sentry/browser/build/npm/esm/prod/stack-parsers.js [app-client] (ecmascript) 27767; 27768var __TURBOPACK__imported__module__936032__6 = __TURBOPACK__imported__module__936032__; 27769; 27770const OPERA10_PRIORITY = 10; 27771const OPERA11_PRIORITY = 20; 27772const CHROME_PRIORITY = 30; 27773const WINJS_PRIORITY = 40; 27774const GECKO_PRIORITY = 50; 27775function createFrame(filename, func, lineno, colno) { 27776 const frame = { 27777 filename, 27778 function: func === "<anonymous>" ? __TURBOPACK__imported__module__936032__6["UNKNOWN_FUNCTION"] : func, 27779 in_app: true 27780 }; 27781 if (lineno !== void 0) { 27782 frame.lineno = lineno; 27783 } 27784 if (colno !== void 0) { 27785 frame.colno = colno; 27786 } 27787 return frame; 27788} 27789const chromeRegexNoFnName = /^\s*at (\S+?)(?::(\d+))(?::(\d+))\s*$/i; 27790const chromeRegex = /^\s*at (?:(.+?\)(?: \[.+\])?|.*?) ?\((?:address at )?)?(?:async )?((?:<anonymous>|[-a-z]+:|.*bundle|\/)?.*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i; 27791const chromeEvalRegex = /\((\S*)(?::(\d+))(?::(\d+))\)/; 27792const chromeDataUriRegex = /at (.+?) ?\(data:(.+?),/; 27793const chromeStackParserFn = (line)=>{ 27794 const dataUriMatch = line.match(chromeDataUriRegex); 27795 if (dataUriMatch) { 27796 return { 27797 filename: "<data:".concat(dataUriMatch[2], ">"), 27798 function: dataUriMatch[1] 27799 }; 27800 } 27801 const noFnParts = chromeRegexNoFnName.exec(line); 27802 if (noFnParts) { 27803 const [, filename, line2, col] = noFnParts; 27804 return createFrame(filename, __TURBOPACK__imported__module__936032__6["UNKNOWN_FUNCTION"], +line2, +col); 27805 } 27806 const parts = chromeRegex.exec(line); 27807 if (parts) { 27808 var _parts_; 27809 const isEval = ((_parts_ = parts[2]) === null || _parts_ === void 0 ? void 0 : _parts_.indexOf("eval")) === 0; 27810 if (isEval) { 27811 const subMatch = chromeEvalRegex.exec(parts[2]); 27812 if (subMatch) { 27813 parts[2] = subMatch[1]; 27814 parts[3] = subMatch[2]; 27815 parts[4] = subMatch[3]; 27816 } 27817 } 27818 const [func, filename] = extractSafariExtensionDetails(parts[1] || __TURBOPACK__imported__module__936032__6["UNKNOWN_FUNCTION"], parts[2]); 27819 return createFrame(filename, func, parts[3] ? +parts[3] : void 0, parts[4] ? +parts[4] : void 0); 27820 } 27821 return; 27822}; 27823const chromeStackLineParser = [ 27824 CHROME_PRIORITY, 27825 chromeStackParserFn 27826]; 27827const geckoREgex = /^\s*(.*?)(?:\((.*?)\))?(?:^|@)?((?:[-a-z]+)?:\/.*?|\[native code\]|[^@]*(?:bundle|\d+\.js)|\/[\w\-. /=]+)(?::(\d+))?(?::(\d+))?\s*$/i; 27828const geckoEvalRegex = /(\S+) line (\d+)(?: > eval line \d+)* > eval/i; 27829const gecko = (line)=>{ 27830 const parts = geckoREgex.exec(line); 27831 if (parts) { 27832 const isEval = parts[3] && parts[3].indexOf(" > eval") > -1; 27833 if (isEval) { 27834 const subMatch = geckoEvalRegex.exec(parts[3]); 27835 if (subMatch) { 27836 parts[1] = parts[1] || "eval"; 27837 parts[3] = subMatch[1]; 27838 parts[4] = subMatch[2]; 27839 parts[5] = ""; 27840 } 27841 } 27842 let filename = parts[3]; 27843 let func = parts[1] || __TURBOPACK__imported__module__936032__6["UNKNOWN_FUNCTION"]; 27844 [func, filename] = extractSafariExtensionDetails(func, filename); 27845 return createFrame(filename, func, parts[4] ? +parts[4] : void 0, parts[5] ? +parts[5] : void 0); 27846 } 27847 return; 27848}; 27849const geckoStackLineParser = [ 27850 GECKO_PRIORITY, 27851 gecko 27852]; 27853const winjsRegex = /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:[-a-z]+):.*?):(\d+)(?::(\d+))?\)?\s*$/i; 27854const winjs = (line)=>{ 27855 const parts = winjsRegex.exec(line); 27856 return parts ? createFrame(parts[2], parts[1] || __TURBOPACK__imported__module__936032__6["UNKNOWN_FUNCTION"], +parts[3], parts[4] ? +parts[4] : void 0) : void 0; 27857}; 27858const winjsStackLineParser = [ 27859 WINJS_PRIORITY, 27860 winjs 27861]; 27862const opera10Regex = / line (\d+).*script (?:in )?(\S+)(?:: in function (\S+))?$/i; 27863const opera10 = (line)=>{ 27864 const parts = opera10Regex.exec(line); 27865 return parts ? createFrame(parts[2], parts[3] || __TURBOPACK__imported__module__936032__6["UNKNOWN_FUNCTION"], +parts[1]) : void 0; 27866}; 27867const opera10StackLineParser = [ 27868 OPERA10_PRIORITY, 27869 opera10 27870]; 27871const opera11Regex = / line (\d+), column (\d+)\s*(?:in (?:<anonymous function: ([^>]+)>|([^)]+))\(.*\))? in (.*):\s*$/i; 27872const opera11 = (line)=>{ 27873 const parts = opera11Regex.exec(line); 27874 return parts ? createFrame(parts[5], parts[3] || parts[4] || __TURBOPACK__imported__module__936032__6["UNKNOWN_FUNCTION"], +parts[1],
27874+parts[2]) : void 0; 27875}; 27876const opera11StackLineParser = [ 27877 OPERA11_PRIORITY, 27878 opera11 27879]; 27880const defaultStackLineParsers = [ 27881 chromeStackLineParser, 27882 geckoStackLineParser 27883]; 27884const defaultStackParser = (0, __TURBOPACK__imported__module__936032__6["createStackParser"])(...defaultStackLineParsers); 27885const extractSafariExtensionDetails = (func, filename)=>{ 27886 const isSafariExtension = func.indexOf("safari-extension") !== -1; 27887 const isSafariWebExtension = func.indexOf("safari-web-extension") !== -1; 27888 return isSafariExtension || isSafariWebExtension ? [ 27889 func.indexOf("@") !== -1 ? func.split("@")[0] : __TURBOPACK__imported__module__936032__6["UNKNOWN_FUNCTION"], 27890 isSafariExtension ? "safari-extension:".concat(filename) : "safari-web-extension:".concat(filename) 27891 ] : [ 27892 func, 27893 filename 27894 ]; 27895}; 27896; 27897// MERGED MODULE: [project]/node_modules/@sentry/browser/build/npm/esm/prod/transports/fetch.js [app-client] (ecmascript) 27898; 27899// MERGED MODULE: [project]/node_modules/@sentry/browser-utils/build/esm/getNativeImplementation.js [app-client] (ecmascript) 27900; 27901var __TURBOPACK__imported__module__272598__33 = __TURBOPACK__imported__module__272598__; 27902; 27903; 27904; 27905const cachedImplementations = {}; 27906function getNativeImplementation(name) { 27907 const cached = cachedImplementations[name]; 27908 if (cached) { 27909 return cached; 27910 } 27911 let impl = WINDOW3[name]; 27912 if (isNativeFunction(impl)) { 27913 return cachedImplementations[name] = impl.bind(WINDOW3); 27914 } 27915 const document1 = WINDOW3.document; 27916 if (document1 && typeof document1.createElement === "function") { 27917 try { 27918 const sandbox = document1.createElement("iframe"); 27919 sandbox.hidden = true; 27920 document1.head.appendChild(sandbox); 27921 const contentWindow = sandbox.contentWindow; 27922 if (contentWindow === null || contentWindow === void 0 ? void 0 : contentWindow[name]) { 27923 impl = contentWindow[name]; 27924 } 27925 document1.head.removeChild(sandbox); 27926 } catch (e) { 27927 DEBUG_BUILD && __TURBOPACK__imported__module__272598__33["debug"].warn("Could not create sandbox iframe for ".concat(name, " check, bailing to window.").concat(name, ": "), e); 27928 } 27929 } 27930 if (!impl) { 27931 return impl; 27932 } 27933 return cachedImplementations[name] = impl.bind(WINDOW3); 27934} 27935function clearCachedImplementation(name) { 27936 cachedImplementations[name] = void 0; 27937} 27938function fetch() { 27939 for(var _len = arguments.length, rest = new Array(_len), _key = 0; _key < _len; _key++){ 27940 rest[_key] = arguments[_key]; 27941 } 27942 return getNativeImplementation("fetch")(...rest); 27943} 27944function setTimeout1() { 27945 for(var _len = arguments.length, rest = new Array(_len), _key = 0; _key < _len; _key++){ 27946 rest[_key] = arguments[_key]; 27947 } 27948 return getNativeImplementation("setTimeout")(...rest); 27949} 27950; 27951; 27952; 27953const DEFAULT_BROWSER_TRANSPORT_BUFFER_SIZE = 40; 27954function makeFetchTransport(options) { 27955 let nativeFetch = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : getNativeImplementation("fetch"); 27956 let pendingBodySize = 0; 27957 let pendingCount = 0; 27958 async function makeRequest(request) { 27959 const requestSize = request.body.length; 27960 pendingBodySize += requestSize; 27961 pendingCount++; 27962 const requestOptions = { 27963 body: request.body, 27964 method: "POST", 27965 referrerPolicy: "strict-origin", 27966 headers: options.headers, 27967 // Outgoing requests are usually cancelled when navigating to a different page, causing a "TypeError: Failed to 27968 // fetch" error and sending a "network_error" client-outcome - in Chrome, the request status shows "(cancelled)". 27969 // The `keepalive` flag keeps outgoing requests alive, even when switching pages. We want this since we're 27970 // frequently sending events right before the user is switching pages (eg. when finishing navigation transactions). 27971 // Gotchas: 27972 // - `keepalive` isn't supported by Firefox 27973 // - As per spec (https://fetch.spec.whatwg.org/#http-network-or-cache-fetch): 27974 // If the sum of contentLength and inflightKeepaliveBytes is greater than 64 kibibytes, then return a network error. 27975 // We will therefore only activate the flag when we're below that limit. 27976 // There is also a limit of requests that can be open at the same time, so we also limit this to 15 27977 // See https://github.com/getsentry/sentry-javascript/pull/7553 for details 27978 keepalive: pendingBodySize <= 6e4 && pendingCount < 15, 27979 ...options.fetchOptions 27980 }; 27981 try { 27982 const response = await nativeFetch(options.url, requestOptions); 27983 return { 27984 statusCode: response.status, 27985 headers: { 27986 "x-sentry-rate-limits": response.headers.get("X-Sentry-Rate-Limits"), 27987 "retry-after": response.headers.get("Retry-After") 27988 } 27989 }; 27990 } catch (e) { 27991 clearCachedImplementation("fetch"); 27992 throw e; 27993 } finally{ 27994 pendingBodySize -= requestSize; 27995 pendingCount--; 27996 } 27997 } 27998 return createTransport(options, makeRequest, makePromiseBuffer(options.bufferSize || DEFAULT_BROWSER_TRANSPORT_BUFFER_SIZE)); 27999} 28000; 28001// MERGED MODULE: [project]/node_modules/@sentry/browser/build/npm/esm/prod/normalizeStringifyValue.js [a
28001pp-client] (ecmascript) 28002; 28003// MERGED MODULE: [project]/node_modules/@sentry/browser-utils/build/esm/is.js [app-client] (ecmascript) 28004; 28005function isElement(wat) { 28006 if (typeof Element === "undefined") { 28007 return false; 28008 } 28009 try { 28010 return wat instanceof Element; 28011 } catch (unused) { 28012 return false; 28013 } 28014} 28015; 28016; 28017const HTML_ELEMENT_CONSTRUCTOR_NAME_REGEX = /^HTML(\w*)Element$/; 28018function normalizeStringifyValue(value) { 28019 if (typeof window !== "undefined" && value === window) { 28020 return "[Window]"; 28021 } 28022 if (typeof document !== "undefined" && value === document) { 28023 return "[Document]"; 28024 } 28025 if (isElement(value)) { 28026 const objName = getConstructorName(value); 28027 if (HTML_ELEMENT_CONSTRUCTOR_NAME_REGEX.test(objName)) { 28028 return "[HTMLElement: ".concat(htmlTreeAsString1(value), "]"); 28029 } 28030 } 28031 return void 0; 28032} 28033function getConstructorName(value) { 28034 const prototype = Object.getPrototypeOf(value); 28035 return (prototype === null || prototype === void 0 ? void 0 : prototype.constructor) ? prototype.constructor.name : "null prototype"; 28036} 28037; 28038// MERGED MODULE: [project]/node_modules/@sentry/browser/build/npm/esm/prod/utils/detectBrowserExtension.js [app-client] (ecmascript) 28039; 28040var __TURBOPACK__imported__module__272598__34 = __TURBOPACK__imported__module__272598__; 28041; 28042; 28043; 28044function checkAndWarnIfIsEmbeddedBrowserExtension() { 28045 if (_isEmbeddedBrowserExtension()) { 28046 if (DEBUG_BUILD1) { 28047 (0, __TURBOPACK__imported__module__272598__34["consoleSandbox"])(()=>{ 28048 console.error("[Sentry] You cannot use Sentry.init() in a browser extension, see: https://docs.sentry.io/platforms/javascript/best-practices/browser-extensions/"); 28049 }); 28050 } 28051 return true; 28052 } 28053 return false; 28054} 28055function _isEmbeddedBrowserExtension() { 28056 var _extensionObject_runtime; 28057 if (typeof WINDOW1.window === "undefined") { 28058 return false; 28059 } 28060 const _window = WINDOW1; 28061 if (_window.nw) { 28062 return false; 28063 } 28064 const extensionObject = _window["chrome"] || _window["browser"]; 28065 if (!(extensionObject === null || extensionObject === void 0 ? void 0 : (_extensionObject_runtime = extensionObject.runtime) === null || _extensionObject_runtime === void 0 ? void 0 : _extensionObject_runtime.id)) { 28066 return false; 28067 } 28068 const href = getLocationHref(); 28069 const isDedicatedExtensionPage = WINDOW1 === WINDOW1.top && /^(?:chrome-extension|moz-extension|ms-browser-extension|safari-web-extension):\/\//.test(href); 28070 return !isDedicatedExtensionPage; 28071} 28072; 28073; 28074; 28075; 28076; 28077; 28078; 28079; 28080; 28081; 28082; 28083; 28084; 28085; 28086function getDefaultIntegrations(_options) { 28087 return [ 28088 // TODO(v11): Replace with `eventFiltersIntegration` once we remove the deprecated `inboundFiltersIntegration` 28089 // eslint-disable-next-line typescript/no-deprecated 28090 inboundFiltersIntegration(), 28091 functionToStringIntegration(), 28092 conversationIdIntegration(), 28093 browserApiErrorsIntegration(), 28094 breadcrumbsIntegration(), 28095 globalHandlersIntegration(), 28096 linkedErrorsIntegration(), 28097 dedupeIntegration(), 28098 httpContextIntegration(), 28099 cultureContextIntegration(), 28100 browserSessionIntegration() 28101 ]; 28102} 28103function init() { 28104 let options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}; 28105 const shouldDisableBecauseIsBrowserExtenstion = !options.skipBrowserExtensionCheck && checkAndWarnIfIsEmbeddedBrowserExtension(); 28106 let defaultIntegrations = options.defaultIntegrations == null ? getDefaultIntegrations() : options.defaultIntegrations; 28107 const clientOptions = { 28108 ...options, 28109 enabled: shouldDisableBecauseIsBrowserExtenstion ? false : options.enabled, 28110 stackParser: (0, __TURBOPACK__imported__module__936032__3["stackParserFromStackParserOptions"])(options.stackParser || defaultStackParser), 28111 integrations: getIntegrationsToSetup({ 28112 integrations: options.integrations, 28113 defaultIntegrations 28114 }), 28115 transport: options.transport || makeFetchTransport 28116 }; 28117 (0, __TURBOPACK__imported__module__45968__["setNormalizeStringifier"])(normalizeStringifyValue); 28118 return initAndBind(BrowserClient, clientOptions); 28119} 28120function forceLoad() {} 28121function onLoad(callback) { 28122 callback(); 28123} 28124; 28125var __TURBOPACK__imported__module__45968__3 = __TURBOPACK__imported__module__45968__; 28126var __TURBOPACK__imported__module__271645__ = __turbopack_context__.i(271645); 28127// MERGED MODULE: [project]/node_modules/@sentry/nextjs/node_modules/@sentry/react/build/esm/isSyntheticEvent.js [app-client] (ecmascript) 28128; 28129var __TURBOPACK__imported__module__453288__12 = __TURBOPACK__imported__module__453288__; 28130; 28131function isSyntheticEvent(wat) { 28132 return (0, __TURBOPACK__imported__module__453288__12["isPlainObject"])(wat) && "nativeEvent" in wat && "preventDefault" in wat && "stopPropagation" in wat; 28133} 28134; 28135; 28136; 28137; 28138; 28139function init1(options) { 28140 const opts = { 28141 ...options 28142 }; 28143 applySdkMetadata(opts, "react"); 28144 (0, __TURBOPACK__imported__module__662537__3["setContext"])("react", { 28145 version: __TURBOPACK__imported__module__271645__["version"] 28146 }); 28147 const client = init(opts); 28148 (0, __TURBOPACK__imported__module__45968__3["setNormalizeStringifier"])(normalizeStringifyValue1); 28149 return client; 28150} 28151function normalizeStringifyValue1(value) { 28152 if (isSyntheticEvent(value)) { 28153 return "[SyntheticEvent]"; 28154 } 28155 return normalizeStringifyValue(value); 28156} 28157; 28158// MERGED MODULE: [project]/node_modules/@sentry/nextjs/build/esm/common/getVercelEnv.js [app-client] (ecmascript) 28159; 28160var __TURBOPACK__imported__module__247167__3 = __TURBOPACK__imported__module__247167__; 28161function getVercelEnv(isClient) { 28162 const vercelEnvVar = isClient ? __TURBOPACK__imported__module__247167__3["default"].env.NEXT_PUBLIC_VERCEL_ENV : __TURBOPACK__imported__module__247167__3["default"].env.VERCEL_ENV; 28163 return vercelEnvVar ? "vercel-".concat(vercelEnvVar) : void 0; 28164} 28165; 28166// MERGED MODULE: [project]/node_modules/@sentry/nextjs/build/esm/common/nextNavigationErrorUtils.js [app-client] (ecmascript) 28167; 28168var __TURBOPACK__imported__module__453288__13 = __TURBOPACK__imported__module__453288__; 28169; 28170function isNotFoundNavigationError(subject) { 28171 return (0, __TURBOPACK__imported__module__453288__13["isError"])(subject) && [ 28172 "NEXT_NOT_FOUND",
28173 "NEXT_HTTP_ERROR_FALLBACK;404" 28174 ].includes(subject.digest); 28175} 28176function isRedirectNavigationError(subject) { 28177 return (0, __TURBOPACK__imported__module__453288__13["isError"])(subject) && typeof subject.digest === "string" && subject.digest.startsWith("NEXT_REDIRECT;"); 28178} 28179; 28180// MERGED MODULE: [project]/node_modules/@sentry/nextjs/build/esm/client/browserTracingIntegration.js [app-client] (ecmascript) 28181; 28182// MERGED MODULE: [project]/node_modules/@sentry/nextjs/build/esm/client/routing/nextRoutingInstrumentation.js [app-client] (ecmascript) 28183; 28184var __TURBOPACK__imported__module__247167__4 = __TURBOPACK__imported__module__247167__; 28185// MERGED MODULE: [project]/node_modules/@sentry/nextjs/build/esm/client/routing/pagesRouterRoutingInstrumentation.js [app-client] (ecmascript) 28186; 28187var __TURBOPACK__imported__module__602309__3 = __TURBOPACK__imported__module__602309__; 28188var __TURBOPACK__imported__module__605394__15 = __TURBOPACK__imported__module__605394__; 28189var __TURBOPACK__imported__module__519988__19 = __TURBOPACK__imported__module__519988__; 28190var __TURBOPACK__imported__module__272598__35 = __TURBOPACK__imported__module__272598__; 28191; 28192; 28193; 28194; 28195const globalObject = WINDOW1; 28196function extractNextDataTagInformation() { 28197 let nextData; 28198 const nextDataTag = globalObject.document.getElementById("__NEXT_DATA__"); 28199 if (nextDataTag === null || nextDataTag === void 0 ? void 0 : nextDataTag.innerHTML) { 28200 try { 28201 nextData = JSON.parse(nextDataTag.innerHTML); 28202 } catch (unused) { 28203 DEBUG_BUILD2 && __TURBOPACK__imported__module__272598__35["debug"].warn("Could not extract __NEXT_DATA__"); 28204 } 28205 } 28206 if (!nextData) { 28207 return {}; 28208 } 28209 const nextDataTagInfo = {}; 28210 const { page, query, props } = nextData; 28211 nextDataTagInfo.route = page; 28212 nextDataTagInfo.params = query; 28213 if (props === null || props === void 0 ? void 0 : props.pageProps) { 28214 nextDataTagInfo.sentryTrace = props.pageProps._sentryTraceData; 28215 nextDataTagInfo.baggage = props.pageProps._sentryBaggage; 28216 } 28217 return nextDataTagInfo; 28218} 28219function pagesRouterInstrumentPageLoad(client) { 28220 const { route, params, sentryTrace, baggage } = extractNextDataTagInformation(); 28221 const parsedBaggage = (0, __TURBOPACK__imported__module__602309__3["parseBaggageHeader"])(baggage); 28222 let name = route || globalObject.location.pathname; 28223 if ((parsedBaggage === null || parsedBaggage === void 0 ? void 0 : parsedBaggage["sentry-transaction"]) && name === "/_error") { 28224 name = parsedBaggage["sentry-transaction"]; 28225 name = name.replace(/^(GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS|TRACE|CONNECT)\s+/i, ""); 28226 } 28227 const origin = (0, __TURBOPACK__imported__module__605394__15["browserPerformanceTimeOrigin"])(); 28228 startBrowserTracingPageLoadSpan(client, { 28229 name, 28230 // pageload should always start at timeOrigin (and needs to be in s, not ms) 28231 startTime: origin ? origin / 1e3 : void 0, 28232 attributes: { 28233 [__TURBOPACK__imported__module__519988__19["SEMANTIC_ATTRIBUTE_SENTRY_OP"]]: "pageload", 28234 [__TURBOPACK__imported__module__519988__19["SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN"]]: "auto.pageload.nextjs.pages_router_instrumentation", 28235 [__TURBOPACK__imported__module__519988__19["SEMANTIC_ATTRIBUTE_SENTRY_SOURCE"]]: route ? "route" : "url", 28236 ...route && { 28237 [ju]: route 28238 }, 28239 ...params && { 28240 ...params 28241 } 28242 } 28243 }, { 28244 sentryTrace, 28245 baggage 28246 }); 28247} 28248; 28249; 28250; 28251; 28252; 28253function nextRouterInstrumentPageLoad(client) { 28254 const isAppRouter = !WINDOW1.document.getElementById("__NEXT_DATA__"); 28255 if (isAppRouter) { 28256 appRouterInstrumentPageLoad(client); 28257 } else { 28258 pagesRouterInstrumentPageLoad(client); 28259 } 28260} 28261function nextRouterInstrumentNavigation(client) { 28262 const isAppRouter = !WINDOW1.document.getElementById("__NEXT_DATA__"); 28263 if (isAppRouter) { 28264 appRouterInstrumentNavigation(client); 28265 } else if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable 28266 ; 28267} 28268; 28269; 28270; 28271function browserTracingIntegration1() { 28272 let options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}; 28273 const browserTracingIntegrationInstance = browserTracingIntegration({ 28274 ...options, 28275 instrumentNavigation: false, 28276 instrumentPageLoad: false, 28277 onRequestSpanStart () { 28278 for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++){ 28279 args[_key] = arguments[_key]; 28280 } 28281 var _options_onRequestSpanStart; 28282 const [span, { headers }] = args; 28283 if (headers === null || headers === void 0 ? void 0 : headers.get("next-router-prefetch")) { 28284 span === null || span === void 0 ? void 0 : span.setAttribute("http.request.prefetch", true); 28285 } 28286 return (_options_onRequestSpanStart = options.onRequestSpanStart) === null || _options_onRequestSpanStart === void 0 ? void 0 : _options_onRequestSpanStart.call(options, ...args); 28287 } 28288 }); 28289 const { instrumentPageLoad = true, instrumentNavigation = true } = options; 28290 return { 28291 ...browserTracingIntegrationInstance, 28292 afterAllSetup (client) { 28293 if (isBotUserAgent()) { 28294 return; 28295 } 28296 if (instrumentNavigation) { 28297 nextRouterInstrumentNavigation(client); 28298 } 28299 browserTracingIntegrationInstance.afterAllSetup(client); 28300 if (instrumentPageLoad) { 28301 nextRouterInstrumentPageLoad(client); 28302 } 28303 } 28304 }; 28305} 28306; 28307// MERGED MODULE: [project]/node_modules/@sentry/nextjs/build/esm/client/clientNormalizationIntegration.js [app-client] (ecmascript) 28308; 28309// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/integrations/rewriteframes.js [app-client] (ecmascript) 28310; 28311// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/utils/path.js [app-client] (ecmascript) 28312; 28313function normalizeArray(parts, allowAboveRoot) { 28314 let up = 0; 28315 for(let i = parts.length - 1; i >= 0; i--){ 28316 const last = parts[i]; 28317 if (last === ".") { 28318 parts.splice(i, 1); 28319 } else if (last === "..") { 28320 parts.splice(i, 1); 28321 up++; 28322 } else if (up) { 28323 parts.splice(i, 1); 28324 up--; 28325 } 28326 } 28327 if (allowAboveRoot) { 28328 for(; up--; up){ 28329 parts.unshift(".."); 28330 } 28331 } 28332 return parts; 28333} 28334const splitPathRe = /^(\S+:\\|\/?)([\s\S]*?)((?:\.{1,2}|[^/\\]+?|)(\.[^./\\]*|))(?:[/\\]*)$/; 28335function splitPath(filename) { 28336 const truncated = filename.length > 1024 ? "<truncated>".concat(filename.slice(-1024)) : filename; 28337 const parts = splitPathRe.exec(truncated); 28338 return parts ? parts.slice(1) : []; 28339} 28340function resolve() { 28341 for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++){ 28342 args[_key] = arguments[_key]; 28343 } 28344 let resolvedPath = ""; 28345 let resolvedAbsolute = false;
28346 for(let i = args.length - 1; i >= -1 && !resolvedAbsolute; i--){ 28347 const path = i >= 0 ? args[i] : "/"; 28348 if (!path) { 28349 continue; 28350 } 28351 resolvedPath = "".concat(path, "/").concat(resolvedPath); 28352 resolvedAbsolute = path.charAt(0) === "/"; 28353 } 28354 resolvedPath = normalizeArray(resolvedPath.split("/").filter((p)=>!!p), !resolvedAbsolute).join("/"); 28355 return (resolvedAbsolute ? "/" : "") + resolvedPath || "."; 28356} 28357function trim(arr) { 28358 let start = 0; 28359 for(; start < arr.length; start++){ 28360 if (arr[start] !== "") { 28361 break; 28362 } 28363 } 28364 let end = arr.length - 1; 28365 for(; end >= 0; end--){ 28366 if (arr[end] !== "") { 28367 break; 28368 } 28369 } 28370 if (start > end) { 28371 return []; 28372 } 28373 return arr.slice(start, end - start + 1); 28374} 28375function relative(from, to) { 28376 from = resolve(from).slice(1); 28377 to = resolve(to).slice(1); 28378 const fromParts = trim(from.split("/")); 28379 const toParts = trim(to.split("/")); 28380 const length = Math.min(fromParts.length, toParts.length); 28381 let samePartsLength = length; 28382 for(let i = 0; i < length; i++){ 28383 if (fromParts[i] !== toParts[i]) { 28384 samePartsLength = i; 28385 break; 28386 } 28387 } 28388 let outputParts = []; 28389 for(let i = samePartsLength; i < fromParts.length; i++){ 28390 outputParts.push(".."); 28391 } 28392 outputParts = outputParts.concat(toParts.slice(samePartsLength)); 28393 return outputParts.join("/"); 28394} 28395function normalizePath(path) { 28396 const isPathAbsolute = isAbsolute(path); 28397 const trailingSlash = path.slice(-1) === "/"; 28398 let normalizedPath = normalizeArray(path.split("/").filter((p)=>!!p), !isPathAbsolute).join("/"); 28399 if (!normalizedPath && !isPathAbsolute) { 28400 normalizedPath = "."; 28401 } 28402 if (normalizedPath && trailingSlash) { 28403 normalizedPath += "/"; 28404 } 28405 return (isPathAbsolute ? "/" : "") + normalizedPath; 28406} 28407function isAbsolute(path) { 28408 return path.charAt(0) === "/"; 28409} 28410function join() { 28411 for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++){ 28412 args[_key] = arguments[_key]; 28413 } 28414 return normalizePath(args.join("/")); 28415} 28416function dirname(path) { 28417 const result = splitPath(path); 28418 const root = result[0] || ""; 28419 let dir = result[1]; 28420 if (!root && !dir) { 28421 return "."; 28422 } 28423 if (dir) { 28424 dir = dir.slice(0, dir.length - 1); 28425 } 28426 return root + dir; 28427} 28428function basename(path, ext) { 28429 let f = splitPath(path)[2] || ""; 28430 if (ext && f.slice(ext.length * -1) === ext) { 28431 f = f.slice(0, f.length - ext.length); 28432 } 28433 return f; 28434} 28435; 28436var __TURBOPACK__imported__module__225304__12 = __TURBOPACK__imported__module__225304__; 28437; 28438; 28439; 28440const INTEGRATION_NAME9 = "RewriteFrames"; 28441const rewriteFramesIntegration = defineIntegration(function() { 28442 let options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}; 28443 const root = options.root; 28444 const prefix = options.prefix || "app:///"; 28445 const isBrowser = "window" in __TURBOPACK__imported__module__225304__12["GLOBAL_OBJ"] && !!__TURBOPACK__imported__module__225304__12["GLOBAL_OBJ"].window; 28446 const iteratee = options.iteratee || generateIteratee({ 28447 isBrowser, 28448 root, 28449 prefix 28450 }); 28451 function _processExceptionsEvent(event) { 28452 try { 28453 return { 28454 ...event, 28455 exception: { 28456 ...event.exception, 28457 // The check for this is performed inside `process` call itself, safe to skip here 28458 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion 28459 values: event.exception.values.map((value)=>({ 28460 ...value, 28461 ...value.stacktrace && { 28462 stacktrace: _processStacktrace(value.stacktrace) 28463 } 28464 })) 28465 } 28466 }; 28467 } catch (unused) { 28468 return event; 28469 } 28470 } 28471 function _processStacktrace(stacktrace) { 28472 var _stacktrace_frames; 28473 return { 28474 ...stacktrace, 28475 frames: stacktrace === null || stacktrace === void 0 ? void 0 : (_stacktrace_frames = stacktrace.frames) === null || _stacktrace_frames === void 0 ? void 0 : _stacktrace_frames.map((f)=>iteratee(f)) 28476 }; 28477 } 28478 return { 28479 name: INTEGRATION_NAME9, 28480 processEvent (originalEvent) { 28481 let processedEvent = originalEvent; 28482 if (originalEvent.exception && Array.isArray(originalEvent.exception.values)) { 28483 processedEvent = _processExceptionsEvent(processedEvent); 28484 } 28485 return processedEvent; 28486 } 28487 }; 28488}); 28489function generateIteratee(param) { 28490 let { isBrowser, root, prefix } = param; 28491 return (frame)=>{ 28492 if (!frame.filename) { 28493 return frame; 28494 } 28495 const isWindowsFrame = /^[a-zA-Z]:\\/.test(frame.filename) || // or the presence of a backslash without a forward slash (which are not allowed on Windows) 28496 frame.filename.includes("\\") && !frame.filename.includes("/"); 28497 const startsWithSlash = /^\//.test(frame.filename); 28498 if (isBrowser) { 28499 if (root) { 28500 const oldFilename = frame.filename; 28501 if (oldFilename.indexOf(root) === 0) { 28502 frame.filename = oldFilename.replace(root, prefix); 28503 } 28504 } 28505 } else { 28506 if (isWindowsFrame || startsWithSlash) { 28507 const filename = isWindowsFrame ? frame.filename.replace(/^[a-zA-Z]:/, "").replace(/\\/g, "/") : frame.filename; 28508 const base = root ? relative(root, filename) : basename(filename); 28509 frame.filename = "".concat(prefix).concat(base); 28510 } 28511 } 28512 return frame; 28513 }; 28514} 28515; 28516; 28517; 28518const NEXTJS_INTERNAL_CHUNK_REGEX = /\/_next\/static\/chunks\/(main-|main-app-|polyfills-|webpack-|framework-|framework\.)[0-9a-f]+\.js(:\d+)*$/; 28519const nextjsClientStackFrameNormalizationIntegration = defineIntegration((param)=>{ 28520 let { assetPrefix, basePath, rewriteFramesAssetPrefixPath, experimentalThirdPartyOriginStackFrames } = param; 28521 const rewriteFramesInstance = rewriteFramesIntegration({ 28522 // Turn `<origin>/<path>/_next/static/...` into `app:///_next/static/...` 28523 iteratee: (frame)=>{ 28524 var _frame_filename, _frame_filename1; 28525 if (experimentalThirdPartyOriginStackFrames) { 28526 var _frame_filename2; 28527 const windowOrigin = typeof window !== "undefined" && window.location ? window.location.origin : ""; 28528 if (((_frame_filename2 = frame.filename) === null || _frame_filename2 === void 0 ? void 0 : _frame_filename2.startsWith(windowOrigin)) && !frame.filename.endsWith(".js")) { 28529 return frame; 28530 } 28531 if (assetPrefix) { 28532 var _frame_filename3; 28533 if ((_frame_filename3 = frame.filename) === null || _frame_filename3 === void 0 ? void 0 : _frame_filename3.startsWith(assetPrefix)) { 28534 frame.filename = frame.filename.replace(assetPrefix, "app://"); 28535 } 28536 } else if (basePath) { 28537 try { 28538 const { origin: frameOrigin } = new URL(frame.filename); 28539 if (frameOrigin === windowOrigin) { 28540 var _frame_filename4; 28541 frame.filename = (_frame_filename4 = frame.filename) === null || _frame_filename4 === void 0 ? void 0 : _frame_filename4.replace(frameOrigin, "app://").replace(basePath, ""); 28542 } 28543 } catch (unused) {} 28544 } 28545 } else { 28546 try { 28547 var _frame_filename5; 28548 const { origin } = new URL(frame.filename); 28549 frame.filename = (_frame_filename5 = frame.filename) === null || _frame_filename5 === void 0 ? void 0 : _frame_filename5.replace(origin, "app://").replace(rewriteFramesAssetPrefixPath, ""); 28550 } catch (unused) {} 28551 } 28552 if (experimentalThirdPartyOriginStackFrames) { 28553 var _frame_filename6; 28554 if ((_frame_filename6 = frame.filename) === null || _frame_filename6 === void 0 ? void 0 : _frame_filename6.includes("/_next")) { 28555 frame.filename = decodeURI(frame.filename); 28556 } 28557 } else if ((_frame_filename = frame.filename) === null || _frame_filename === void 0 ? void 0 : _frame_filename.startsWith("app:///_next")) { 28558 frame.filename = decodeURI(frame.filename); 28559 } 28560 if ((_frame_filename1 = frame.filename) === null || _frame_filename1 === void 0 ? void 0 : _frame_filename1.match(NEXTJS_INTERNAL_CHUNK_REGEX)) {
28561 frame.in_app = false; 28562 } 28563 return frame; 28564 } 28565 }); 28566 return { 28567 ...rewriteFramesInstance, 28568 name: "NextjsClientStackFrameNormalization" 28569 }; 28570}); 28571; 28572// MERGED MODULE: [project]/node_modules/@sentry/nextjs/build/esm/client/routing/isrRoutingTracing.js [app-client] (ecmascript) 28573; 28574// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/utils/lru.js [app-client] (ecmascript) 28575; 28576class LRUMap { 28577 /** Get the current size of the cache */ get size() { 28578 return this._cache.size; 28579 } 28580 /** Get an entry or undefined if it was not in the cache. Re-inserts to update the recently used order */ get(key) { 28581 const value = this._cache.get(key); 28582 if (value === void 0) { 28583 return void 0; 28584 } 28585 this._cache.delete(key); 28586 this._cache.set(key, value); 28587 return value; 28588 } 28589 /** Insert an entry and evict an older entry if we've reached maxSize */ set(key, value) { 28590 if (this._cache.size >= this._maxSize) { 28591 const nextKey = this._cache.keys().next().value; 28592 this._cache.delete(nextKey); 28593 } 28594 this._cache.set(key, value); 28595 } 28596 /** Remove an entry and return the entry if it was in the cache */ remove(key) { 28597 const value = this._cache.get(key); 28598 if (value) { 28599 this._cache.delete(key); 28600 } 28601 return value; 28602 } 28603 /** Clear all entries */ clear() { 28604 this._cache.clear(); 28605 } 28606 /** Get all the keys */ keys() { 28607 return Array.from(this._cache.keys()); 28608 } 28609 /** Get all the values */ values() { 28610 const values = []; 28611 this._cache.forEach((value)=>values.push(value)); 28612 return values; 28613 } 28614 constructor(_maxSize){ 28615 this._maxSize = _maxSize; 28616 this._cache = /* @__PURE__ */ new Map(); 28617 } 28618} 28619; 28620; 28621; 28622; 28623const IS_ISR_SSG_ROUTE_CACHE = new LRUMap(100); 28624function isIsrSsgRoute(pathname) { 28625 const parameterizedPath = maybeParameterizeRoute(pathname); 28626 const pathToCheck = parameterizedPath || pathname; 28627 const cachedResult = IS_ISR_SSG_ROUTE_CACHE.get(pathToCheck); 28628 if (cachedResult !== void 0) { 28629 return cachedResult; 28630 } 28631 const manifest = getManifest(); 28632 if (!(manifest === null || manifest === void 0 ? void 0 : manifest.isrRoutes) || !Array.isArray(manifest.isrRoutes) || manifest.isrRoutes.length === 0) { 28633 IS_ISR_SSG_ROUTE_CACHE.set(pathToCheck, false); 28634 return false; 28635 } 28636 const isIsrSsgRoute2 = manifest.isrRoutes.includes(pathToCheck); 28637 IS_ISR_SSG_ROUTE_CACHE.set(pathToCheck, isIsrSsgRoute2); 28638 return isIsrSsgRoute2; 28639} 28640function removeIsrSsgTraceMetaTags() { 28641 if (!WINDOW1.document || !isIsrSsgRoute(WINDOW1.location.pathname)) { 28642 return; 28643 } 28644 function removeMetaTag(metaName) { 28645 try { 28646 const meta = WINDOW1.document.querySelector('meta[name="'.concat(metaName, '"]')); 28647 if (meta) { 28648 meta.remove(); 28649 } 28650 } catch (unused) {} 28651 } 28652 removeMetaTag("sentry-trace"); 28653 removeMetaTag("baggage"); 28654} 28655; 28656// MERGED MODULE: [project]/node_modules/@sentry/nextjs/build/esm/client/tunnelRoute.js [app-client] (ecmascript) 28657; 28658var __TURBOPACK__imported__module__247167__5 = __TURBOPACK__imported__module__247167__; 28659var __TURBOPACK__imported__module__225304__13 = __TURBOPACK__imported__module__225304__; 28660var __TURBOPACK__imported__module__339435__4 = __TURBOPACK__imported__module__339435__; 28661var __TURBOPACK__imported__module__272598__36 = __TURBOPACK__imported__module__272598__; 28662; 28663; 28664const globalWithInjectedValues = __TURBOPACK__imported__module__225304__13["GLOBAL_OBJ"]; 28665function applyTunnelRouteOption(options) { 28666 const tunnelRouteOption = __TURBOPACK__imported__module__247167__5["default"].env._sentryRewritesTunnelPath || globalWithInjectedValues._sentryRewritesTunnelPath; 28667 if (tunnelRouteOption && options.dsn) { 28668 const dsnComponents = (0, __TURBOPACK__imported__module__339435__4["dsnFromString"])(options.dsn); 28669 if (!dsnComponents) { 28670 return; 28671 } 28672 const sentrySaasDsnMatch = dsnComponents.host.match(/^o(\d+)\.ingest(?:\.([a-z]{2}))?\.sentry\.io$/); 28673 if (sentrySaasDsnMatch) { 28674 const orgId = sentrySaasDsnMatch[1]; 28675 const regionCode = sentrySaasDsnMatch[2]; 28676 let tunnelPath = "".concat(tunnelRouteOption, "?o=").concat(orgId, "&p=").concat(dsnComponents.projectId); 28677 if (regionCode) { 28678 tunnelPath += "&r=".concat(regionCode); 28679 } 28680 options.tunnel = tunnelPath; 28681 DEBUG_BUILD2 && __TURBOPACK__imported__module__272598__36["debug"].log('Tunneling events to "'.concat(tunnelPath, '"')); 28682 } else { 28683 DEBUG_BUILD2 && __TURBOPACK__imported__module__272598__36["debug"].warn("Provided DSN is not a Sentry SaaS DSN. Will not tunnel events."); 28684 } 28685 } 28686} 28687; 28688"use client"; 28689; 28690; 28691; 28692; 28693; 28694; 28695; 28696; 28697; 28698; 28699; 28700; 28701; 28702; 28703; 28704; 28705; 28706; 28707; 28708; 28709; 28710; 28711; 28712; 28713; 28714; 28715; 28716; 28717; 28718let clientIsInitialized = false;
28719const globalWithInjectedValues1 = __TURBOPACK__imported__module__225304__10["GLOBAL_OBJ"]; 28720function init2(options) { 28721 if (clientIsInitialized) { 28722 (0, __TURBOPACK__imported__module__272598__22["consoleSandbox"])(()=>{ 28723 console.warn("[@sentry/nextjs] You are calling `Sentry.init()` more than once on the client. This can happen if you have both a `sentry.client.config.ts` and a `instrumentation-client.ts` file with `Sentry.init()` calls. It is recommended to call `Sentry.init()` once in `instrumentation-client.ts`."); 28724 }); 28725 } 28726 clientIsInitialized = true; 28727 if (!DEBUG_BUILD2 && options.debug) { 28728 (0, __TURBOPACK__imported__module__272598__22["consoleSandbox"])(()=>{ 28729 console.warn("[@sentry/nextjs] You have enabled `debug: true`, but Sentry debug logging was removed from your bundle (likely via `withSentryConfig({ disableLogger: true })` / `webpack.treeshake.removeDebugLogging: true`). Set that option to `false` to see Sentry debug output."); 28730 }); 28731 } 28732 if (typeof __SENTRY_TRACING__ === "undefined" || __SENTRY_TRACING__) { 28733 removeIsrSsgTraceMetaTags(); 28734 } 28735 const opts = { 28736 environment: options.environment || __TURBOPACK__imported__module__247167__2["default"].env.SENTRY_ENVIRONMENT || getVercelEnv(true) || ("TURBOPACK compile-time value", "production"), 28737 defaultIntegrations: getDefaultIntegrations1(options), 28738 release: ("TURBOPACK compile-time value", "05b2d555bd30570bfe06dcce0df24003d307c93a") || globalWithInjectedValues1._sentryRelease, 28739 ...options 28740 }; 28741 applyTunnelRouteOption(opts); 28742 applySdkMetadata(opts, "nextjs", [ 28743 "nextjs", 28744 "react" 28745 ]); 28746 opts.ignoreSpans = [ 28747 ...opts.ignoreSpans || [], 28748 // we filter out segment spans for /404 pages 28749 /^\/404$/, 28750 // segment spans where we didn't get a reasonable transaction name 28751 // in this case, constructing a dynamic RegExp is fine because the variable is a constant 28752 // we need to ensure to exact-match, so a string match isn't safe (same for /404 above) 28753 new RegExp("^".concat(INCOMPLETE_APP_ROUTER_INSTRUMENTATION_TRANSACTION_NAME, "$")) 28754 ]; 28755 const client = init1(opts); 28756 const filterNextRedirectError = (event, hint)=>{ 28757 var _event_exception_values_, _event_exception_values, _event_exception; 28758 return isRedirectNavigationError(hint === null || hint === void 0 ? void 0 : hint.originalException) || ((_event_exception = event.exception) === null || _event_exception === void 0 ? void 0 : (_event_exception_values = _event_exception.values) === null || _event_exception_values === void 0 ? void 0 : (_event_exception_values_ = _event_exception_values[0]) === null || _event_exception_values_ === void 0 ? void 0 : _event_exception_values_.value) === "NEXT_REDIRECT" ? null : event; 28759 }; 28760 filterNextRedirectError.id = "NextRedirectErrorFilter"; 28761 (0, __TURBOPACK__imported__module__662537__2["addEventProcessor"])(filterNextRedirectError); 28762 if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable 28763 ; 28764 try { 28765 if ("TURBOPACK compile-time truthy", 1) { 28766 (0, __TURBOPACK__imported__module__250804__16["getGlobalScope"])().setTag("turbopack", true); 28767 } 28768 } catch (unused) {} 28769 return client; 28770} 28771function getDefaultIntegrations1(options) { 28772 const customDefaultIntegrations = getDefaultIntegrations(options); 28773 if (typeof __SENTRY_TRACING__ === "undefined" || __SENTRY_TRACING__) { 28774 customDefaultIntegrations.push(browserTracingIntegration1()); 28775 } 28776 const rewriteFramesAssetPrefixPath = ("TURBOPACK compile-time value", "") || globalWithInjectedValues1._sentryRewriteFramesAssetPrefixPath || ""; 28777 const assetPrefix = __TURBOPACK__imported__module__247167__2["default"].env._sentryAssetPrefix || globalWithInjectedValues1._sentryAssetPrefix; 28778 const basePath = __TURBOPACK__imported__module__247167__2["default"].env._sentryBasePath || globalWithInjectedValues1._sentryBasePath; 28779 const experimentalThirdPartyOriginStackFrames = __TURBOPACK__imported__module__247167__2["default"].env._experimentalThirdPartyOriginStackFrames === "true" || globalWithInjectedValues1._experimentalThirdPartyOriginStackFrames === "true"; 28780 customDefaultIntegrations.push(nextjsClientStackFrameNormalizationIntegration({ 28781 assetPrefix, 28782 basePath, 28783 rewriteFramesAssetPrefixPath, 28784 experimentalThirdPartyOriginStackFrames 28785 })); 28786 return customDefaultIntegrations; 28787} 28788function withSentryConfig(exportedUserNextConfig) { 28789 return exportedUserNextConfig; 28790} 28791; 28792// MERGED MODULE: [project]/node_modules/@sentry/replay/build/npm/esm/index.js [app-client] (ecmascript) 28793; 28794var __TURBOPACK__imported__module__225304__14 = __TURBOPACK__imported__module__225304__; 28795var __TURBOPACK__imported__module__45968__4 = __TURBOPACK__imported__module__45968__; 28796var __TURBOPACK__imported__module__453288__14 = __TURBOPACK__imported__module__453288__; 28797var __TURBOPACK__imported__module__951497__11 = __TURBOPACK__imported__module__951497__; 28798var __TURBOPACK__imported__module__605394__16 = __TURBOPACK__imported__module__605394__; 28799var __TURBOPACK__imported__module__272598__37 = __TURBOPACK__imported__module__272598__; 28800var __TURBOPACK__imported__module__662537__6 = __TURBOPACK__imported__module__662537__; 28801var __TURBOPACK__imported__module__183330__1 = __TURBOPACK__imported__module__183330__; 28802var __TURBOPACK__imported__module__682564__7 = __TURBOPACK__imported__module__682564__; 28803var __TURBOPACK__imported__module__250804__26 = __TURBOPACK__imported__module__250804__; 28804var __TURBOPACK__imported__module__304661__21 = __TURBOPACK__imported__module__304661__; 28805var __TURBOPACK__imported__module__473753__6 = __TURBOPACK__imported__module__473753__; 28806// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/utils/isSentryRequestUrl.js [a
28806pp-client] (ecmascript) 28807; 28808; 28809function isSentryRequestUrl(url, client) { 28810 const dsn = client === null || client === void 0 ? void 0 : client.getDsn(); 28811 const tunnel = client === null || client === void 0 ? void 0 : client.getOptions().tunnel; 28812 return checkDsn(url, dsn) || checkTunnel(url, tunnel); 28813} 28814function checkTunnel(url, tunnel) { 28815 if (!tunnel) { 28816 return false; 28817 } 28818 return removeTrailingSlash(url) === removeTrailingSlash(tunnel); 28819} 28820function checkDsn(url, dsn) { 28821 const urlParts = parseStringToURLObject(url); 28822 if (!urlParts || isURLObjectRelative(urlParts)) { 28823 return false; 28824 } 28825 if (!dsn) { 28826 return false; 28827 } 28828 return hostnameMatchesDsnHost(urlParts.hostname, dsn.host) && /(^|&|\?)sentry_key=/.test(urlParts.search); 28829} 28830function hostnameMatchesDsnHost(hostname, dsnHost) { 28831 return hostname === dsnHost || dsnHost.length > 0 && hostname.endsWith(".".concat(dsnHost)); 28832} 28833function removeTrailingSlash(str) { 28834 return str[str.length - 1] === "/" ? str.slice(0, -1) : str; 28835} 28836; 28837var __TURBOPACK__imported__module__821593__6 = __TURBOPACK__imported__module__821593__; 28838// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/utils/debounce.js [app-client] (ecmascript) 28839; 28840function debounce(func, wait, options) {
28841 let callbackReturnValue; 28842 let timerId; 28843 let maxTimerId; 28844 const maxWait = (options === null || options === void 0 ? void 0 : options.maxWait) ? Math.max(options.maxWait, wait) : 0; 28845 const setTimeoutImpl = (options === null || options === void 0 ? void 0 : options.setTimeoutImpl) || setTimeout; 28846 function invokeFunc() { 28847 cancelTimers(); 28848 callbackReturnValue = func(); 28849 return callbackReturnValue; 28850 } 28851 function cancelTimers() { 28852 timerId !== void 0 && clearTimeout(timerId); 28853 maxTimerId !== void 0 && clearTimeout(maxTimerId); 28854 timerId = maxTimerId = void 0; 28855 } 28856 function flush() { 28857 if (timerId !== void 0 || maxTimerId !== void 0) { 28858 return invokeFunc(); 28859 } 28860 return callbackReturnValue; 28861 } 28862 function debounced() { 28863 if (timerId) { 28864 clearTimeout(timerId); 28865 } 28866 timerId = setTimeoutImpl(invokeFunc, wait); 28867 if (maxWait && maxTimerId === void 0) { 28868 maxTimerId = setTimeoutImpl(invokeFunc, maxWait); 28869 } 28870 return callbackReturnValue; 28871 } 28872 debounced.cancel = cancelTimers; 28873 debounced.flush = flush; 28874 return debounced; 28875} 28876; 28877var __TURBOPACK__imported__module__67486__5 = __TURBOPACK__imported__module__67486__; 28878var __TURBOPACK__imported__module__213186__1 = __TURBOPACK__imported__module__213186__; 28879var __TURBOPACK__imported__module__519988__20 = __TURBOPACK__imported__module__519988__; 28880var __TURBOPACK__imported__module__901538__3 = __TURBOPACK__imported__module__901538__; 28881var __TURBOPACK__imported__module__170637__3 = __TURBOPACK__imported__module__170637__; 28882; 28883; 28884const WINDOW4 = __TURBOPACK__imported__module__225304__14["GLOBAL_OBJ"]; 28885const REPLAY_SESSION_KEY = "sentryReplaySession"; 28886const REPLAY_EVENT_NAME = "replay_event"; 28887const UNABLE_TO_SEND_REPLAY = "Unable to send Replay"; 28888const SESSION_IDLE_PAUSE_DURATION = 3e5; 28889const SESSION_IDLE_EXPIRE_DURATION = 9e5; 28890const DEFAULT_FLUSH_MIN_DELAY = 5e3; 28891const DEFAULT_FLUSH_MAX_DELAY = 5500; 28892const BUFFER_CHECKOUT_TIME = 6e4; 28893const RETRY_BASE_INTERVAL = 5e3; 28894const RETRY_MAX_COUNT = 3; 28895const NETWORK_BODY_MAX_SIZE = 15e4; 28896const CONSOLE_ARG_MAX_SIZE = 5e3; 28897const SLOW_CLICK_THRESHOLD = 3e3; 28898const SLOW_CLICK_SCROLL_TIMEOUT = 300; 28899const REPLAY_MAX_EVENT_BUFFER_SIZE = 2e7; 28900const MIN_REPLAY_DURATION = 4999; 28901const MIN_REPLAY_DURATION_LIMIT = 5e4; 28902const MAX_REPLAY_DURATION = 36e5; 28903var __defProp = Object.defineProperty; 28904var __defNormalProp = (obj, key, value)=>key in obj ? __defProp(obj, key, { 28905 enumerable: true, 28906 configurable: true, 28907 writable: true, 28908 value 28909 }) : obj[key] = value; 28910var __publicField = (obj, key, value)=>__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); 28911var NodeType$1 = /* @__PURE__ */ ((NodeType2)=>{ 28912 NodeType2[NodeType2["Document"] = 0] = "Document"; 28913 NodeType2[NodeType2["DocumentType"] = 1] = "DocumentType"; 28914 NodeType2[NodeType2["Element"] = 2] = "Element"; 28915 NodeType2[NodeType2["Text"] = 3] = "Text"; 28916 NodeType2[NodeType2["CDATA"] = 4] = "CDATA"; 28917 NodeType2[NodeType2["Comment"] = 5] = "Comment"; 28918 return NodeType2; 28919})(NodeType$1 || {}); 28920function isElement$1(n) { 28921 return n.nodeType === n.ELEMENT_NODE; 28922} 28923function isShadowRoot(n) { 28924 const host = n === null || n === void 0 ? void 0 : n.host; 28925 return Boolean((host === null || host === void 0 ? void 0 : host.shadowRoot) === n); 28926} 28927function isNativeShadowDom(shadowRoot) { 28928 return Object.prototype.toString.call(shadowRoot) === "[object ShadowRoot]"; 28929} 28930function fixBrowserCompatibilityIssuesInCSS(cssText) { 28931 if (cssText.includes(" background-clip: text;") && !cssText.includes(" -webkit-background-clip: text;")) { 28932 cssText = cssText.replace(/\sbackground-clip:\s*text;/g, " -webkit-background-clip: text; background-clip: text;"); 28933 } 28934 return cssText; 28935} 28936function escapeImportStatement(rule) { 28937 const { cssText } = rule; 28938 if (cssText.split('"').length < 3) return cssText; 28939 const statement = [ 28940 "@import", 28941 "url(".concat(JSON.stringify(rule.href), ")") 28942 ]; 28943 if (rule.layerName === "") { 28944 statement.push("layer"); 28945 } else if (rule.layerName) { 28946 statement.push("layer(".concat(rule.layerName, ")")); 28947 } 28948 if (rule.supportsText) { 28949 statement.push("supports(".concat(rule.supportsText, ")")); 28950 } 28951 if (rule.media.length) { 28952 statement.push(rule.media.mediaText); 28953 } 28954 return statement.join(" ") + ";"; 28955} 28956function stringifyStylesheet(s) { 28957 try { 28958 const rules = s.rules || s.cssRules; 28959 return rules ? fixBrowserCompatibilityIssuesInCSS(Array.from(rules, stringifyRule).join("")) : null; 28960 } catch (error) { 28961 return null; 28962 } 28963} 28964function fixAllCssProperty(rule) { 28965 let styles = ""; 28966 for(let i2 = 0; i2 < rule.style.length; i2++){ 28967 const styleDeclaration = rule.style; 28968 const attribute = styleDeclaration[i2]; 28969 const isImportant = styleDeclaration.getPropertyPriority(attribute); 28970 styles += "".concat(attribute, ":").concat(styleDeclaration.getPropertyValue(attribute)).concat(isImportant ? " !important" : "", ";"); 28971 } 28972 return "".concat(rule.selectorText, " { ").concat(styles, " }"); 28973} 28974function stringifyRule(rule) { 28975 let importStringified; 28976 if (isCSSImportRule(rule)) { 28977 try { 28978 importStringified = // we can access the imported stylesheet rules directly
28979 stringifyStylesheet(rule.styleSheet) || // work around browser issues with the raw string `@import url(...)` statement 28980 escapeImportStatement(rule); 28981 } catch (error) {} 28982 } else if (isCSSStyleRule(rule)) { 28983 let cssText = rule.cssText; 28984 const needsSafariColonFix = rule.selectorText.includes(":"); 28985 const needsAllFix = typeof rule.style["all"] === "string" && rule.style["all"]; 28986 if (needsAllFix) { 28987 cssText = fixAllCssProperty(rule); 28988 } 28989 if (needsSafariColonFix) { 28990 cssText = fixSafariColons(cssText); 28991 } 28992 if (needsSafariColonFix || needsAllFix) { 28993 return cssText; 28994 } 28995 } 28996 return importStringified || rule.cssText; 28997} 28998function fixSafariColons(cssStringified) { 28999 const regex = /(\[(?:[\w-]+)[^\\])(:(?:[\w-]+)\])/gm; 29000 return cssStringified.replace(regex, "$1\\$2"); 29001} 29002function isCSSImportRule(rule) { 29003 return "styleSheet" in rule; 29004} 29005function isCSSStyleRule(rule) { 29006 return "selectorText" in rule; 29007} 29008class Mirror { 29009 getId(n) { 29010 var _this_getMeta; 29011 if (!n) return -1; 29012 const id = (_this_getMeta = this.getMeta(n)) === null || _this_getMeta === void 0 ? void 0 : _this_getMeta.id; 29013 return id !== null && id !== void 0 ? id : -1; 29014 } 29015 getNode(id) { 29016 return this.idNodeMap.get(id) || null; 29017 } 29018 getIds() { 29019 return Array.from(this.idNodeMap.keys()); 29020 } 29021 getMeta(n) { 29022 return this.nodeMetaMap.get(n) || null; 29023 } 29024 // removes the node from idNodeMap 29025 // doesn't remove the node from nodeMetaMap 29026 removeNodeFromMap(n) { 29027 const id = this.getId(n); 29028 this.idNodeMap.delete(id); 29029 if (n.childNodes) { 29030 n.childNodes.forEach((childNode)=>this.removeNodeFromMap(childNode)); 29031 } 29032 } 29033 has(id) { 29034 return this.idNodeMap.has(id); 29035 } 29036 hasNode(node) { 29037 return this.nodeMetaMap.has(node); 29038 } 29039 add(n, meta) { 29040 const id = meta.id; 29041 this.idNodeMap.set(id, n); 29042 this.nodeMetaMap.set(n, meta); 29043 } 29044 replace(id, n) { 29045 const oldNode = this.getNode(id); 29046 if (oldNode) { 29047 const meta = this.nodeMetaMap.get(oldNode); 29048 if (meta) this.nodeMetaMap.set(n, meta); 29049 } 29050 this.idNodeMap.set(id, n); 29051 } 29052 reset() { 29053 this.idNodeMap = /* @__PURE__ */ new Map(); 29054 this.nodeMetaMap = /* @__PURE__ */ new WeakMap(); 29055 } 29056 constructor(){ 29057 __publicField(this, "idNodeMap", /* @__PURE__ */ new Map()); 29058 __publicField(this, "nodeMetaMap", /* @__PURE__ */ new WeakMap()); 29059 } 29060} 29061function createMirror() { 29062 return new Mirror(); 29063} 29064function shouldMaskInput(param) { 29065 let { maskInputOptions, tagName, type } = param; 29066 if (tagName === "OPTION") { 29067 tagName = "SELECT"; 29068 } 29069 return Boolean(maskInputOptions[tagName.toLowerCase()] || type && maskInputOptions[type] || type === "password" || // Default to "text" option for inputs without a "type" attribute defined 29070 tagName === "INPUT" && !type && maskInputOptions["text"]); 29071} 29072function maskInputValue(param) { 29073 let { isMasked, element, value, maskInputFn } = param; 29074 let text = value || ""; 29075 if (!isMasked) { 29076 return text; 29077 } 29078 if (maskInputFn) { 29079 text = maskInputFn(text, element); 29080 } 29081 return "*".repeat(text.length); 29082} 29083function toLowerCase(str) { 29084 return str.toLowerCase(); 29085} 29086function toUpperCase(str) { 29087 return str.toUpperCase(); 29088} 29089const ORIGINAL_ATTRIBUTE_NAME = "__rrweb_original__"; 29090function is2DCanvasBlank(canvas) { 29091 const ctx = canvas.getContext("2d"); 29092 if (!ctx) return true; 29093 const chunkSize = 50; 29094 for(let x = 0; x < canvas.width; x += chunkSize){ 29095 for(let y = 0; y < canvas.height; y += chunkSize){ 29096 const getImageData = ctx.getImageData; 29097 const originalGetImageData = ORIGINAL_ATTRIBUTE_NAME in getImageData ? getImageData[ORIGINAL_ATTRIBUTE_NAME] : getImageData; 29098 const pixelBuffer = new Uint32Array(// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access 29099 originalGetImageData.call(ctx, x, y, Math.min(chunkSize, canvas.width - x), Math.min(chunkSize, canvas.height - y)).data.buffer); 29100 if (pixelBuffer.some((pixel)=>pixel !== 0)) return false;
29101 } 29102 } 29103 return true; 29104} 29105function getInputType(element) { 29106 const type = element.type; 29107 return element.hasAttribute("data-rr-is-password") ? "password" : type ? // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion 29108 toLowerCase(type) : null; 29109} 29110function getInputValue(el, tagName, type) { 29111 if (tagName === "INPUT" && (type === "radio" || type === "checkbox")) { 29112 return el.getAttribute("value") || ""; 29113 } 29114 return el.value; 29115} 29116function extractFileExtension(path, baseURL) { 29117 var _ref; 29118 let url; 29119 try { 29120 url = new URL(path, baseURL !== null && baseURL !== void 0 ? baseURL : window.location.href); 29121 } catch (err) { 29122 return null; 29123 } 29124 const regex = /\.([0-9a-z]+)(?:$)/i; 29125 const match = url.pathname.match(regex); 29126 return (_ref = match === null || match === void 0 ? void 0 : match[1]) !== null && _ref !== void 0 ? _ref : null; 29127} 29128const cachedImplementations$1 = {}; 29129function getImplementation$1(name) { 29130 const cached = cachedImplementations$1[name]; 29131 if (cached) { 29132 return cached; 29133 } 29134 const document2 = window.document; 29135 let impl = window[name]; 29136 if (document2 && typeof document2.createElement === "function") { 29137 try { 29138 const sandbox = document2.createElement("iframe"); 29139 sandbox.hidden = true; 29140 document2.head.appendChild(sandbox); 29141 const contentWindow = sandbox.contentWindow; 29142 if (contentWindow && contentWindow[name]) { 29143 impl = contentWindow[name]; 29144 } 29145 document2.head.removeChild(sandbox); 29146 } catch (e) {} 29147 } 29148 return cachedImplementations$1[name] = impl.bind(window); 29149} 29150function setTimeout$1() { 29151 for(var _len = arguments.length, rest = new Array(_len), _key = 0; _key < _len; _key++){ 29152 rest[_key] = arguments[_key]; 29153 } 29154 return getImplementation$1("setTimeout")(...rest); 29155} 29156function clearTimeout$1() { 29157 for(var _len = arguments.length, rest = new Array(_len), _key = 0; _key < _len; _key++){ 29158 rest[_key] = arguments[_key]; 29159 } 29160 return getImplementation$1("clearTimeout")(...rest); 29161} 29162function getIFrameContentDocument$1(iframe) { 29163 try { 29164 return iframe.contentDocument; 29165 } catch (unused) {} 29166} 29167function getIFrameContentWindow$1(iframe) { 29168 try { 29169 return iframe.contentWindow; 29170 } catch (unused) {} 29171} 29172let _id = 1; 29173const tagNameRegex = new RegExp("[^a-z0-9-_:]"); 29174const IGNORED_NODE = -2; 29175function genId() { 29176 return _id++; 29177} 29178function getValidTagName(element) { 29179 if (element instanceof HTMLFormElement) { 29180 return "form"; 29181 } 29182 const processedTagName = toLowerCase(element.tagName); 29183 if (tagNameRegex.test(processedTagName)) { 29184 return "div"; 29185 } 29186 return processedTagName; 29187} 29188function extractOrigin(url) { 29189 let origin = ""; 29190 if (url.indexOf("//") > -1) { 29191 origin = url.split("/").slice(0, 3).join("/"); 29192 } else { 29193 origin = url.split("/")[0]; 29194 } 29195 origin = origin.split("?")[0]; 29196 return origin; 29197} 29198let canvasService; 29199let canvasCtx; 29200const URL_IN_CSS_REF = /url\((?:(')([^']*)'|(")(.*?)"|([^)]*))\)/gm; 29201const URL_PROTOCOL_MATCH = /^(?:[a-z+]+:)?\/\//i; 29202const URL_WWW_MATCH = /^www\..*/i; 29203const DATA_URI = /^(data:)([^,]*),(.*)/i; 29204function filterCSSPropertiesFromInlineStyle(cssText, ignoredProperties) { 29205 if (!cssText || ignoredProperties.size === 0) { 29206 return cssText; 29207 } 29208 try { 29209 const properties = cssText.split(";"); 29210 const filteredProperties = []; 29211 for (let property of properties){ 29212 property = property.trim(); 29213 if (!property) continue; 29214 const colonIndex = property.indexOf(":"); 29215 if (colonIndex === -1) { 29216 filteredProperties.push(property); 29217 continue; 29218 } 29219 const propertyName = property.slice(0, colonIndex).trim(); 29220 if (!ignoredProperties.has(propertyName)) { 29221 filteredProperties.push(property); 29222 } 29223 } 29224 return filteredProperties.join("; ") + (filteredProperties.length > 0 && cssText.endsWith(";") ? ";" : ""); 29225 } catch (error) { 29226 console.warn("Error filtering CSS properties:", error); 29227 return cssText; 29228 } 29229} 29230function absoluteToStylesheet(cssText, href) { 29231 return (cssText || "").replace(URL_IN_CSS_REF, (origin, quote1, path1, quote2, path2, path3)=>{ 29232 const filePath = path1 || path2 || path3; 29233 const maybeQuote = quote1 || quote2 || ""; 29234 if (!filePath) { 29235 return origin; 29236 } 29237 if (URL_PROTOCOL_MATCH.test(filePath) || URL_WWW_MATCH.test(filePath)) { 29238 return "url(".concat(maybeQuote).concat(filePath).concat(maybeQuote, ")"); 29239 } 29240 if (DATA_URI.test(filePath)) { 29241 return "url(".concat(maybeQuote).concat(filePath).concat(maybeQuote, ")"); 29242 } 29243 if (filePath[0] === "/") { 29244 return "url(".concat(maybeQuote).concat(extractOrigin(href) + f
vendor: 34,502 bytes, lines 29244-30092
29244ilePath).concat(maybeQuote, ")"); 29245 } 29246 const stack = href.split("/"); 29247 const parts = filePath.split("/"); 29248 stack.pop(); 29249 for (const part of parts){ 29250 if (part === ".") { 29251 continue; 29252 } else if (part === "..") { 29253 stack.pop(); 29254 } else { 29255 stack.push(part); 29256 } 29257 } 29258 return "url(".concat(maybeQuote).concat(stack.join("/")).concat(maybeQuote, ")"); 29259 }); 29260} 29261const SRCSET_NOT_SPACES = /^[^ \t\n\r\u000c]+/; 29262const SRCSET_COMMAS_OR_SPACES = /^[, \t\n\r\u000c]+/; 29263function getAbsoluteSrcsetString(doc, attributeValue) { 29264 if (attributeValue.trim() === "") { 29265 return attributeValue; 29266 } 29267 let pos = 0; 29268 function collectCharacters(regEx) { 29269 let chars2; 29270 const match = regEx.exec(attributeValue.substring(pos)); 29271 if (match) { 29272 chars2 = match[0]; 29273 pos += chars2.length; 29274 return chars2; 29275 } 29276 return ""; 29277 } 29278 const output = []; 29279 while(true){ 29280 collectCharacters(SRCSET_COMMAS_OR_SPACES); 29281 if (pos >= attributeValue.length) { 29282 break; 29283 } 29284 let url = collectCharacters(SRCSET_NOT_SPACES); 29285 if (url.slice(-1) === ",") { 29286 url = absoluteToDoc(doc, url.substring(0, url.length - 1)); 29287 output.push(url); 29288 } else { 29289 let descriptorsStr = ""; 29290 url = absoluteToDoc(doc, url); 29291 let inParens = false; 29292 while(true){ 29293 const c = attributeValue.charAt(pos); 29294 if (c === "") { 29295 output.push((url + descriptorsStr).trim()); 29296 break; 29297 } else if (!inParens) { 29298 if (c === ",") { 29299 pos += 1; 29300 output.push((url + descriptorsStr).trim()); 29301 break; 29302 } else if (c === "(") { 29303 inParens = true; 29304 } 29305 } else { 29306 if (c === ")") { 29307 inParens = false; 29308 } 29309 } 29310 descriptorsStr += c; 29311 pos += 1; 29312 } 29313 } 29314 } 29315 return output.join(", "); 29316} 29317const cachedDocument = /* @__PURE__ */ new WeakMap(); 29318function absoluteToDoc(doc, attributeValue) { 29319 if (!attributeValue || attributeValue.trim() === "") { 29320 return attributeValue; 29321 } 29322 return getHref(doc, attributeValue); 29323} 29324function isSVGElement(el) { 29325 return Boolean(el.tagName === "svg" || el.ownerSVGElement); 29326} 29327function getHref(doc, customHref) { 29328 let a = cachedDocument.get(doc); 29329 if (!a) { 29330 a = doc.createElement("a"); 29331 cachedDocument.set(doc, a); 29332 } 29333 if (!customHref) { 29334 customHref = ""; 29335 } else if (customHref.startsWith("blob:") || customHref.startsWith("data:")) { 29336 return customHref; 29337 } 29338 a.setAttribute("href", customHref); 29339 return a.href; 29340} 29341function transformAttribute(doc, tagName, name, value, element, maskAttributeFn, ignoreCSSAttributes) { 29342 if (!value) { 29343 return value; 29344 } 29345 if (name === "src" || name === "href" && !(tagName === "use" && value[0] === "#")) { 29346 return absoluteToDoc(doc, value); 29347 } else if (name === "xlink:href" && value[0] !== "#") { 29348 return absoluteToDoc(doc, value); 29349 } else if (name === "background" && (tagName === "table" || tagName === "td" || tagName === "th")) { 29350 return absoluteToDoc(doc, value); 29351 } else if (name === "srcset") { 29352 return getAbsoluteSrcsetString(doc, value); 29353 } else if (name === "style") { 29354 let processedStyle = absoluteToStylesheet(value, getHref(doc)); 29355 if (ignoreCSSAttributes && ignoreCSSAttributes.size > 0) { 29356 processedStyle = filterCSSPropertiesFromInlineStyle(processedStyle, ignoreCSSAttributes); 29357 } 29358 return processedStyle; 29359 } else if (tagName === "object" && name === "data") { 29360 return absoluteToDoc(doc, value); 29361 } 29362 if (typeof maskAttributeFn === "function") { 29363 return maskAttributeFn(name, value, element); 29364 } 29365 return value; 29366} 29367function ignoreAttribute(tagName, name, _value) { 29368 return (tagName === "video" || tagName === "audio") && name === "autoplay"; 29369} 29370function _isBlockedElement(element, blockClass, blockSelector, unblockSelector) { 29371 try { 29372 if (unblockSelector && element.matches(unblockSelector)) { 29373 return false; 29374 } 29375 if (typeof blockClass === "string") { 29376 if (element.classList.contains(blockClass)) { 29377 return true; 29378 } 29379 } else { 29380 for(let eIndex = element.classList.length; eIndex--;){ 29381 const className = element.classList[eIndex]; 29382 if (blockClass.test(className)) { 29383 return true; 29384 } 29385 } 29386 } 29387 if (blockSelector) { 29388 return element.matches(blockSelector); 29389 } 29390 } catch (e) {} 29391 return false; 29392} 29393function elementClassMatchesRegex(el, regex) { 29394 for(let eIndex = el.classList.length; eIndex--;){ 29395 const className = el.classList[eIndex]; 29396 if (regex.test(className)) { 29397 return true; 29398 } 29399 } 29400 return false; 29401} 29402function distanceToMatch(node, matchPredicate) { 29403 let limit = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : Infinity, distance = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : 0; 29404 if (!node) return -1; 29405 if (node.nodeType !== node.ELEMENT_NODE) return -1; 29406 if (distance > limit) return -1; 29407 if (matchPredicate(node)) return distance; 29408 return distanceToMatch(node.parentNode, matchPredicate, limit, distance + 1); 29409} 29410function createMatchPredicate(className, selector) { 29411 return (node)=>{ 29412 const el = node; 29413 if (el === null) return false; 29414 try { 29415 if (className) { 29416 if (typeof className === "string") { 29417 if (el.matches(".".concat(className))) return true; 29418 } else if (elementClassMatchesRegex(el, className)) { 29419 return true; 29420 } 29421 } 29422 if (selector && el.matches(selector)) return true; 29423 return false; 29424 } catch (unused) { 29425 return false; 29426 } 29427 }; 29428} 29429function needMaskingText(node, maskTextClass, maskTextSelector, unmaskTextClass, unmaskTextSelector, maskAllText) { 29430 try { 29431 const el = node.nodeType === node.ELEMENT_NODE ? node : node.parentElement; 29432 if (el === null) return false; 29433 if (el.tagName === "INPUT") { 29434 const autocomplete = el.getAttribute("autocomplete"); 29435 const disallowedAutocompleteValues = [ 29436 "current-password", 29437 "new-password", 29438 "cc-number", 29439 "cc-exp", 29440 "cc-exp-month", 29441 "cc-exp-year", 29442 "cc-csc" 29443 ]; 29444 if (disallowedAutocompleteValues.includes(autocomplete)) { 29445 return true; 29446 } 29447 } 29448 let maskDistance = -1; 29449 let unmaskDistance = -1; 29450 if (maskAllText) { 29451 unmaskDistance = distanceToMatch(el, createMatchPredicate(unmaskTextClass, unmaskTextSelector)); 29452 if (unmaskDistance < 0) { 29453 return true; 29454 } 29455 maskDistance = distanceToMatch(el, createMatchPredicate(maskTextClass, maskTextSelector), unmaskDistance >= 0 ? unmaskDistance : Infinity); 29456 } else { 29457 maskDistance = distanceToMatch(el, createMatchPredicate(maskTextClass, maskTextSelector)); 29458 if (maskDistance < 0) { 29459 return false; 29460 } 29461 unmaskDistance = distanceToMatch(el, createMatchPredicate(unmaskTextClass, unmaskTextSelector), maskDistance >= 0 ? maskDistance : Infinity); 29462 } 29463 return maskDistance >= 0 ? unmaskDistance >= 0 ? maskDistance <= unmaskDistance : true : unmaskDistance >= 0 ? false : !!maskAllText; 29464 } catch (e) {} 29465 return !!maskAllText; 29466} 29467function onceIframeLoaded(iframeEl, listener, iframeLoadTimeout) { 29468 const win = getIFrameContentWindow$1(iframeEl); 29469 if (!win) { 29470 return; 29471 } 29472 let fired = false; 29473 let readyState; 29474 try { 29475 readyState = win.document.readyState; 29476 } catch (error) { 29477 return; 29478 } 29479 if (readyState !== "complete") { 29480 const timer = setTimeout$1(()=>{ 29481 if (!fired) { 29482 listener(); 29483 fired = true; 29484 } 29485 }, iframeLoadTimeout); 29486 iframeEl.addEventListener("load", ()=>{ 29487 clearTimeout$1(timer); 29488 fired = true; 29489 listener(); 29490 }); 29491 return; 29492 } 29493 const blankUrl = "about:blank"; 29494 if (win.location.href !== blankUrl || iframeEl.src === blankUrl || iframeEl.src === "") { 29495 setTimeout$1(listener, 0); 29496 return iframeEl.addEventListener("load", listener); 29497 } 29498 iframeEl.addEventListener("load", listener); 29499} 29500function onceStylesheetLoaded(link, listener, styleSheetLoadTimeout) { 29501 let fired = false; 29502 let styleSheetLoaded; 29503 try { 29504 styleSheetLoaded = link.sheet; 29505 } catch (error) { 29506 styleSheetLoaded = null; 29507 } 29508 if (styleSheetLoaded) return; 29509 const timer = setTimeout$1(()=>{ 29510 if (!fired) { 29511 listener(); 29512 fired = true; 29513 } 29514 }, styleSheetLoadTimeout); 29515 link.addEventListener("load", ()=>{ 29516 clearTimeout$1(timer); 29517 fired = true; 29518 listener(); 29519 }); 29520} 29521function serializeNode(n, options) { 29522 const { doc, mirror, blockClass, blockSelector, unblockSelector, maskAllText, maskAttributeFn, maskTextClass, unmaskTextClass, maskTextSelector, unmaskTextSelector, inlineStylesheet, maskInputOptions = {}, maskTextFn, maskInputFn, dataURLOptions = {}, inlineImages, recordCanvas, keepIframeSrcFn, newlyAddedElement = false, ignoreCSSAttributes } = options; 29523 const rootId = getRootId(doc, mirror); 29524 switch(n.nodeType){ 29525 case n.DOCUMENT_NODE: 29526 if (n.compatMode !== "CSS1Compat") { 29527 return { 29528 type: NodeType$1.Document, 29529 childNodes: [], 29530 compatMode: n.compatMode 29531 }; 29532 } else { 29533 return { 29534 type: NodeType$1.Document, 29535 childNodes: [] 29536 }; 29537 } 29538 case n.DOCUMENT_TYPE_NODE: 29539 return { 29540 type: NodeType$1.DocumentType, 29541 name: n.name, 29542 publicId: n.publicId, 29543 systemId: n.systemId, 29544 rootId 29545 }; 29546 case n.ELEMENT_NODE: 29547 return serializeElementNode(n, { 29548 doc, 29549 blockClass, 29550 blockSelector, 29551 unblockSelector, 29552 inlineStylesheet, 29553 maskAttributeFn, 29554 maskInputOptions, 29555 maskInputFn, 29556 dataURLOptions, 29557 inlineImages, 29558 recordCanvas, 29559 keepIframeSrcFn, 29560 newlyAddedElement, 29561 rootId, 29562 maskTextClass, 29563 unmaskTextClass, 29564 maskTextSelector, 29565 unmaskTextSelector, 29566 ignoreCSSAttributes 29567 }); 29568 case n.TEXT_NODE: 29569 return serializeTextNode(n, { 29570 doc, 29571 maskAllText, 29572 maskTextClass, 29573 unmaskTextClass, 29574 maskTextSelector, 29575 unmaskTextSelector, 29576 maskTextFn, 29577 maskInputOptions, 29578 maskInputFn, 29579 rootId 29580 }); 29581 case n.CDATA_SECTION_NODE: 29582 return { 29583 type: NodeType$1.CDATA, 29584 textContent: "", 29585 rootId 29586 }; 29587 case n.COMMENT_NODE: 29588 return { 29589 type: NodeType$1.Comment, 29590 textContent: n.textContent || "", 29591 rootId 29592 }; 29593 default: 29594 return false; 29595 } 29596} 29597function getRootId(doc, mirror) { 29598 if (!mirror.hasNode(doc)) return void 0; 29599 const docId = mirror.getId(doc); 29600 return docId === 1 ? void 0 : docId; 29601} 29602function serializeTextNode(n, options) { 29603 const { maskAllText, maskTextClass, unmaskTextClass, maskTextSelector, unmaskTextSelector, maskTextFn, maskInputOptions, maskInputFn, rootId } = options; 29604 const parentTagName = n.parentNode && n.parentNode.tagName; 29605 let textContent = n.textContent; 29606 const isStyle = parentTagName === "STYLE" ? true : void 0; 29607 const isScript = parentTagName === "SCRIPT" ? true : void 0; 29608 const isTextarea = parentTagName === "TEXTAREA" ? true : void 0; 29609 if (isStyle && textContent) { 29610 try { 29611 var _n_parentNode_sheet; 29612 if (n.nextSibling || n.previousSibling) {} else if ((_n_parentNode_sheet = n.parentNode.sheet) === null || _n_parentNode_sheet === void 0 ? void 0 : _n_parentNode_sheet.cssRules) { 29613 textContent = stringifyStylesheet(n.parentNode.sheet); 29614 } 29615 } catch (err) { 29616 console.warn("Cannot get CSS styles from text's parentNode. Error: ".concat(err), n); 29617 } 29618 textContent = absoluteToStylesheet(textContent, getHref(options.doc)); 29619 } 29620 if (isScript) { 29621 textContent = "SCRIPT_PLACEHOLDER"; 29622 } 29623 const forceMask = needMaskingText(n, maskTextClass, maskTextSelector, unmaskTextClass, unmaskTextSelector, maskAllText); 29624 if (!isStyle && !isScript && !isTextarea && textContent && forceMask) { 29625 textContent = maskTextFn ? maskTextFn(textContent, n.parentElement) : textContent.replace(/[\S]/g, "*"); 29626 } 29627 if (isTextarea && textContent && (maskInputOptions.textarea || forceMask)) { 29628 textContent = maskInputFn ? maskInputFn(textContent, n.parentNode) : textContent.replace(/[\S]/g, "*"); 29629 } 29630 if (parentTagName === "OPTION" && textContent) { 29631 const isInputMasked = shouldMaskInput({ 29632 type: null, 29633 tagName: parentTagName, 29634 maskInputOptions 29635 }); 29636 textContent = maskInputValue({ 29637 isMasked: needMaskingText(n, maskTextClass, maskTextSelector, unmaskTextClass, unmaskTextSelector, isInputMasked), 29638 element: n, 29639 value: textContent, 29640 maskInputFn 29641 }); 29642 } 29643 return { 29644 type: NodeType$1.Text, 29645 textContent: textContent || "", 29646 isStyle, 29647 rootId 29648 }; 29649} 29650function serializeElementNode(n, options) { 29651 const { doc, blockClass, blockSelector, unblockSelector, inlineStylesheet, maskInputOptions = {}, maskAttributeFn, maskInputFn, dataURLOptions = {}, inlineImages, recordCanvas, keepIframeSrcFn, newlyAddedElement = false, rootId, maskTextClass, unmaskTextClass, maskTextSelector, unmaskTextSelector, ignoreCSSAttributes } = options; 29652 const needBlock = _isBlockedElement(n, blockClass, blockSelector, unblockSelector); 29653 const tagName = getValidTagName(n); 29654 let attributes2 = {}; 29655 const len = n.attributes.length; 29656 for(let i2 = 0; i2 < len; i2++){ 29657 const attr = n.attributes[i2]; 29658 if (attr.name && !ignoreAttribute(tagName, attr.name, attr.value)) { 29659 attributes2[attr.name] = transformAttribute(doc, tagName, toLowerCase(attr.name), attr.value, n, maskAttributeFn, ignoreCSSAttributes); 29660 } 29661 } 29662 if (tagName === "link" && inlineStylesheet) { 29663 const stylesheet = Array.from(doc.styleSheets).find((s)=>{ 29664 return s.href === n.href; 29665 }); 29666 let cssText = null; 29667 if (stylesheet) { 29668 cssText = stringifyStylesheet(stylesheet); 29669 } 29670 if (cssText) { 29671 attributes2.rel = null; 29672 attributes2.href = null; 29673 attributes2.crossorigin = null; 29674 attributes2._cssText = absoluteToStylesheet(cssText, stylesheet.href); 29675 } 29676 } 29677 if (tagName === "style" && n.sheet && // TODO: Currently we only try to get dynamic stylesheet when it is an empty style element 29678 !(n.innerText || n.textContent || "").trim().length) { 29679 const cssText = stringifyStylesheet(n.sheet); 29680 if (cssText) { 29681 attributes2._cssText = absoluteToStylesheet(cssText, getHref(doc)); 29682 } 29683 } 29684 if (tagName === "input" || tagName === "textarea" || tagName === "select" || tagName === "option") { 29685 const el = n; 29686 const type = getInputType(el); 29687 const value = getInputValue(el, toUpperCase(tagName), type); 29688 const checked = el.checked; 29689 if (type !== "submit" && type !== "button" && value) { 29690 const forceMask = needMaskingText(el, maskTextClass, maskTextSelector, unmaskTextClass, unmaskTextSelector, shouldMaskInput({ 29691 type, 29692 tagName: toUpperCase(tagName), 29693 maskInputOptions 29694 })); 29695 attributes2.value = maskInputValue({ 29696 isMasked: forceMask, 29697 element: el, 29698 value, 29699 maskInputFn 29700 }); 29701 } 29702 if (checked) { 29703 attributes2.checked = checked; 29704 } 29705 } 29706 if (tagName === "option") { 29707 if (n.selected && !maskInputOptions["select"]) { 29708 attributes2.selected = true; 29709 } else { 29710 delete attributes2.selected; 29711 } 29712 } 29713 if (tagName === "canvas" && recordCanvas) { 29714 if (n.__context === "2d") { 29715 if (!is2DCanvasBlank(n)) { 29716 attributes2.rr_dataURL = n.toDataURL(dataURLOptions.type, dataURLOptions.quality); 29717 } 29718 } else if (!("__context" in n)) { 29719 const canvasDataURL = n.toDataURL(dataURLOptions.type, dataURLOptions.quality); 29720 const blankCanvas = doc.createElement("canvas"); 29721 blankCanvas.width = n.width; 29722 blankCanvas.height = n.height; 29723 const blankCanvasDataURL = blankCanvas.toDataURL(dataURLOptions.type, dataURLOptions.quality); 29724 if (canvasDataURL !== blankCanvasDataURL) { 29725 attributes2.rr_dataURL = canvasDataURL; 29726 } 29727 } 29728 } 29729 if (tagName === "img" && inlineImages) { 29730 if (!canvasService) { 29731 canvasService = doc.createElement("canvas"); 29732 canvasCtx = canvasService.getContext("2d"); 29733 } 29734 const image = n; 29735 const imageSrc = image.currentSrc || image.getAttribute("src") || "<unknown-src>"; 29736 const priorCrossOrigin = image.crossOrigin; 29737 const recordInlineImage = ()=>{ 29738 image.removeEventListener("load", recordInlineImage); 29739 try { 29740 canvasService.width = image.naturalWidth; 29741 canvasService.height = image.naturalHeight; 29742 canvasCtx.drawImage(image, 0, 0); 29743 attributes2.rr_dataURL = canvasService.toDataURL(dataURLOptions.type, dataURLOptions.quality); 29744 } catch (err) { 29745 if (image.crossOrigin !== "anonymous") { 29746 image.crossOrigin = "anonymous"; 29747 if (image.complete && image.naturalWidth !== 0) recordInlineImage(); 29748 else image.addEventListener("load", recordInlineImage); 29749 return; 29750 } else { 29751 console.warn("Cannot inline img src=".concat(imageSrc, "! Error: ").concat(err)); 29752 } 29753 } 29754 if (image.crossOrigin === "anonymous") { 29755 priorCrossOrigin ? attributes2.crossOrigin = priorCrossOrigin : image.removeAttribute("crossorigin"); 29756 } 29757 }; 29758 if (image.complete && image.naturalWidth !== 0) recordInlineImage(); 29759 else image.addEventListener("load", recordInlineImage); 29760 } 29761 if (tagName === "audio" || tagName === "video") { 29762 attributes2.rr_mediaState = n.paused ? "paused" : "played"; 29763 attributes2.rr_mediaCurrentTime = n.currentTime; 29764 } 29765 if (!newlyAddedElement) { 29766 if (n.scrollLeft) { 29767 attributes2.rr_scrollLeft = n.scrollLeft; 29768 } 29769 if (n.scrollTop) { 29770 attributes2.rr_scrollTop = n.scrollTop; 29771 } 29772 } 29773 if (needBlock) { 29774 const { width, height } = n.getBoundingClientRect(); 29775 attributes2 = { 29776 class: attributes2.class, 29777 rr_width: "".concat(width, "px"), 29778 rr_height: "".concat(height, "px") 29779 }; 29780 } 29781 if (tagName === "iframe" && !keepIframeSrcFn(attributes2.src)) { 29782 if (!needBlock && !getIFrameContentDocument$1(n)) { 29783 attributes2.rr_src = attributes2.src; 29784 } 29785 delete attributes2.src; 29786 } 29787 let isCustomElement; 29788 try { 29789 if (customElements.get(tagName)) isCustomElement = true; 29790 } catch (e) {} 29791 return { 29792 type: NodeType$1.Element, 29793 tagName, 29794 attributes: attributes2, 29795 childNodes: [], 29796 isSVG: isSVGElement(n) || void 0, 29797 needBlock, 29798 rootId, 29799 isCustom: isCustomElement 29800 }; 29801} 29802function lowerIfExists(maybeAttr) { 29803 if (maybeAttr === void 0 || maybeAttr === null) { 29804 return ""; 29805 } else { 29806 return maybeAttr.toLowerCase(); 29807 } 29808} 29809function slimDOMExcluded(sn, slimDOMOptions) { 29810 if (slimDOMOptions.comment && sn.type === NodeType$1.Comment) { 29811 return true; 29812 } else if (sn.type === NodeType$1.Element) { 29813 if (slimDOMOptions.script && // script tag 29814 (sn.tagName === "script" || // (module)preload link 29815 sn.tagName === "link" && (sn.attributes.rel === "preload" || sn.attributes.rel === "modulepreload") || // prefetch link 29816 sn.tagName === "link" && sn.attributes.rel === "prefetch" && typeof sn.attributes.href === "string" && extractFileExtension(sn.attributes.href) === "js")) { 29817 return true; 29818 } else if (slimDOMOptions.headFavicon && (sn.tagName === "link" && sn.attributes.rel === "shortcut icon" || sn.tagName === "meta" && (lowerIfExists(sn.attributes.name).match(/^msapplication-tile(image|color)$/) || lowerIfExists(sn.attributes.name) === "application-name" || lowerIfExists(sn.attributes.rel) === "icon" || lowerIfExists(sn.attributes.rel) === "apple-touch-icon" || lowerIfExists(sn.attributes.rel) === "shortcut icon"))) { 29819 return true; 29820 } else if (sn.tagName === "meta") { 29821 if (slimDOMOptions.headMetaDescKeywords && lowerIfExists(sn.attributes.name).match(/^description|keywords$/)) { 29822 return true; 29823 } else if (slimDOMOptions.headMetaSocial && (lowerIfExists(sn.attributes.property).match(/^(og|twitter|fb):/) || // og = opengraph (facebook) 29824 lowerIfExists(sn.attributes.name).match(/^(og|twitter):/) || lowerIfExists(sn.attributes.name) === "pinterest")) { 29825 return true; 29826 } else if (slimDOMOptions.headMetaRobots && (lowerIfExists(sn.attributes.name) === "robots" || lowerIfExists(sn.attributes.name) === "googlebot" || lowerIfExists(sn.attributes.name) === "bingbot")) { 29827 return true; 29828 } else if (slimDOMOptions.headMetaHttpEquiv && sn.attributes["http-equiv"] !== void 0) { 29829 return true; 29830 } else if (slimDOMOptions.headMetaAuthorship && (lowerIfExists(sn.attributes.name) === "author" || lowerIfExists(sn.attributes.name) === "generator" || lowerIfExists(sn.attributes.name) === "framework" || lowerIfExists(sn.attributes.name) === "publisher" || lowerIfExists(sn.attributes.name) === "progid" || lowerIfExists(sn.attributes.property).match(/^article:/) || lowerIfExists(sn.attributes.property).match(/^product:/))) { 29831 return true; 29832 } else if (slimDOMOptions.headMetaVerification && (lowerIfExists(sn.attributes.name) === "google-site-verification" || lowerIfExists(sn.attributes.name) === "yandex-verification" || lowerIfExists(sn.attributes.name) === "csrf-token" || lowerIfExists(sn.attributes.name) === "p:domain_verify" || lowerIfExists(sn.attributes.name) === "verify-v1" || lowerIfExists(sn.attributes.name) === "verification" || lowerIfExists(sn.attributes.name) === "shopify-checkout-api-token")) { 29833 return true; 29834 } 29835 } 29836 } 29837 return false; 29838} 29839function serializeNodeWithId(n, options) { 29840 const { doc, mirror, blockClass, blockSelector, unblockSelector, maskAllText, maskTextClass, unmaskTextClass, maskTextSelector, unmaskTextSelector, skipChild = false, inlineStylesheet = true, maskInputOptions = {}, maskAttributeFn, maskTextFn, maskInputFn, slimDOMOptions, dataURLOptions = {}, inlineImages = false, recordCanvas = false, onSerialize, onIframeLoad, iframeLoadTimeout = 5e3, onBlockedImageLoad, onStylesheetLoad, stylesheetLoadTimeout = 5e3, keepIframeSrcFn = ()=>false, newlyAddedElement = false, ignoreCSSAttributes } = options; 29841 let { preserveWhiteSpace = true } = options; 29842 const _serializedNode = serializeNode(n, { 29843 doc, 29844 mirror, 29845 blockClass, 29846 blockSelector, 29847 maskAllText, 29848 unblockSelector, 29849 maskTextClass, 29850 unmaskTextClass, 29851 maskTextSelector, 29852 unmaskTextSelector, 29853 inlineStylesheet, 29854 maskInputOptions, 29855 maskAttributeFn, 29856 maskTextFn, 29857 maskInputFn, 29858 dataURLOptions, 29859 inlineImages, 29860 recordCanvas, 29861 keepIframeSrcFn, 29862 newlyAddedElement, 29863 ignoreCSSAttributes 29864 }); 29865 if (!_serializedNode) { 29866 console.warn(n, "not serialized"); 29867 return null; 29868 } 29869 let id; 29870 if (mirror.hasNode(n)) { 29871 id = mirror.getId(n); 29872 } else if (slimDOMExcluded(_serializedNode, slimDOMOptions) || !preserveWhiteSpace && _serializedNode.type === NodeType$1.Text && !_serializedNode.isStyle && !_serializedNode.textContent.trim().length) { 29873 id = IGNORED_NODE; 29874 } else { 29875 id = genId(); 29876 } 29877 const serializedNode2 = Object.assign(_serializedNode, { 29878 id 29879 }); 29880 mirror.add(n, serializedNode2); 29881 if (id === IGNORED_NODE) { 29882 return null; 29883 } 29884 if (onSerialize) { 29885 onSerialize(n); 29886 } 29887 let recordChild = !skipChild; 29888 if (serializedNode2.type === NodeType$1.Element) { 29889 recordChild = recordChild && !serializedNode2.needBlock; 29890 const shadowRoot = n.shadowRoot; 29891 if (shadowRoot && isNativeShadowDom(shadowRoot)) serializedNode2.isShadowHost = true; 29892 } 29893 if ((serializedNode2.type === NodeType$1.Document || serializedNode2.type === NodeType$1.Element) && recordChild) { 29894 if (slimDOMOptions.headWhitespace && serializedNode2.type === NodeType$1.Element && serializedNode2.tagName === "head") { 29895 preserveWhiteSpace = false; 29896 } 29897 const bypassOptions = { 29898 doc, 29899 mirror, 29900 blockClass, 29901 blockSelector, 29902 maskAllText, 29903 unblockSelector, 29904 maskTextClass, 29905 unmaskTextClass, 29906 maskTextSelector, 29907 unmaskTextSelector, 29908 skipChild, 29909 inlineStylesheet, 29910 maskInputOptions, 29911 maskAttributeFn, 29912 maskTextFn, 29913 maskInputFn, 29914 slimDOMOptions, 29915 dataURLOptions, 29916 inlineImages, 29917 recordCanvas, 29918 preserveWhiteSpace, 29919 onSerialize, 29920 onIframeLoad, 29921 iframeLoadTimeout, 29922 onBlockedImageLoad, 29923 onStylesheetLoad, 29924 stylesheetLoadTimeout, 29925 keepIframeSrcFn, 29926 ignoreCSSAttributes 29927 }; 29928 const childNodes = n.childNodes ? Array.from(n.childNodes) : []; 29929 for (const childN of childNodes){ 29930 const serializedChildNode = serializeNodeWithId(childN, bypassOptions); 29931 if (serializedChildNode) { 29932 serializedNode2.childNodes.push(serializedChildNode); 29933 } 29934 } 29935 if (isElement$1(n) && n.shadowRoot) { 29936 for (const childN of Array.from(n.shadowRoot.childNodes)){ 29937 const serializedChildNode = serializeNodeWithId(childN, bypassOptions); 29938 if (serializedChildNode) { 29939 isNativeShadowDom(n.shadowRoot) && (serializedChildNode.isShadow = true); 29940 serializedNode2.childNodes.push(serializedChildNode); 29941 } 29942 } 29943 } 29944 } 29945 if (n.parentNode && isShadowRoot(n.parentNode) && isNativeShadowDom(n.parentNode)) { 29946 serializedNode2.isShadow = true; 29947 } 29948 if (serializedNode2.type === NodeType$1.Element && serializedNode2.tagName === "iframe" && !serializedNode2.needBlock) { 29949 onceIframeLoaded(n, ()=>{ 29950 const iframeDoc = getIFrameContentDocument$1(n); 29951 if (iframeDoc && onIframeLoad) { 29952 const serializedIframeNode = serializeNodeWithId(iframeDoc, { 29953 doc: iframeDoc, 29954 mirror, 29955 blockClass, 29956 blockSelector, 29957 unblockSelector, 29958 maskAllText, 29959 maskTextClass, 29960 unmaskTextClass, 29961 maskTextSelector, 29962 unmaskTextSelector, 29963 skipChild: false, 29964 inlineStylesheet, 29965 maskInputOptions, 29966 maskAttributeFn, 29967 maskTextFn, 29968 maskInputFn, 29969 slimDOMOptions, 29970 dataURLOptions, 29971 inlineImages, 29972 recordCanvas, 29973 preserveWhiteSpace, 29974 onSerialize, 29975 onIframeLoad, 29976 iframeLoadTimeout, 29977 onStylesheetLoad, 29978 stylesheetLoadTimeout, 29979 keepIframeSrcFn, 29980 ignoreCSSAttributes 29981 }); 29982 if (serializedIframeNode) { 29983 onIframeLoad(n, serializedIframeNode); 29984 } 29985 } 29986 }, iframeLoadTimeout); 29987 } 29988 if (serializedNode2.type === NodeType$1.Element && serializedNode2.tagName === "img" && !n.complete && serializedNode2.needBlock) { 29989 const image = n; 29990 const updateImageDimensions = ()=>{ 29991 if (image.isConnected && !image.complete && onBlockedImageLoad) { 29992 try { 29993 const rect = image.getBoundingClientRect(); 29994 if (rect.width > 0 && rect.height > 0) { 29995 onBlockedImageLoad(image, serializedNode2, rect); 29996 } 29997 } catch (error) {} 29998 } 29999 image.removeEventListener("load", updateImageDimensions); 30000 }; 30001 if (image.isConnected) { 30002 image.addEventListener("load", updateImageDimensions); 30003 } 30004 } 30005 if (serializedNode2.type === NodeType$1.Element && serializedNode2.tagName === "link" && typeof serializedNode2.attributes.rel === "string" && (serializedNode2.attributes.rel === "stylesheet" || serializedNode2.attributes.rel === "preload" && typeof serializedNode2.attributes.href === "string" && extractFileExtension(serializedNode2.attributes.href) === "css")) { 30006 onceStylesheetLoaded(n, ()=>{ 30007 if (onStylesheetLoad) { 30008 const serializedLinkNode = serializeNodeWithId(n, { 30009 doc, 30010 mirror, 30011 blockClass, 30012 blockSelector, 30013 unblockSelector, 30014 maskAllText, 30015 maskTextClass, 30016 unmaskTextClass, 30017 maskTextSelector, 30018 unmaskTextSelector, 30019 skipChild: false, 30020 inlineStylesheet, 30021 maskInputOptions, 30022 maskAttributeFn, 30023 maskTextFn, 30024 maskInputFn, 30025 slimDOMOptions, 30026 dataURLOptions, 30027 inlineImages, 30028 recordCanvas, 30029 preserveWhiteSpace, 30030 onSerialize, 30031 onIframeLoad, 30032 iframeLoadTimeout, 30033 onStylesheetLoad, 30034 stylesheetLoadTimeout, 30035 keepIframeSrcFn, 30036 ignoreCSSAttributes 30037 }); 30038 if (serializedLinkNode) { 30039 onStylesheetLoad(n, serializedLinkNode); 30040 } 30041 } 30042 }, stylesheetLoadTimeout); 30043 } 30044 if (serializedNode2.type === NodeType$1.Element) { 30045 delete serializedNode2.needBlock; 30046 } 30047 return serializedNode2; 30048} 30049function snapshot(n, options) { 30050 const { mirror = new Mirror(), blockClass = "rr-block", blockSelector = null, unblockSelector = null, maskAllText = false, maskTextClass = "rr-mask", unmaskTextClass = null, maskTextSelector = null, unmaskTextSelector = null, inlineStylesheet = true, inlineImages = false, recordCanvas = false, maskAllInputs = false, maskAttributeFn, maskTextFn, maskInputFn, slimDOM = false, dataURLOptions, preserveWhiteSpace, onSerialize, onIframeLoad, iframeLoadTimeout, onBlockedImageLoad, onStylesheetLoad, stylesheetLoadTimeout, keepIframeSrcFn = ()=>false, ignoreCSSAttributes = /* @__PURE__ */ new Set([]) } = options || {}; 30051 const maskInputOptions = maskAllInputs === true ? { 30052 color: true, 30053 date: true, 30054 "datetime-local": true, 30055 email: true, 30056 month: true, 30057 number: true, 30058 range: true, 30059 search: true, 30060 tel: true, 30061 text: true, 30062 time: true, 30063 url: true, 30064 week: true, 30065 textarea: true, 30066 select: true 30067 } : maskAllInputs === false ? {} : maskAllInputs; 30068 const slimDOMOptions = slimDOM === true || slimDOM === "all" ? // if true: set of sensible options that should not throw away any information 30069 { 30070 script: true, 30071 comment: true, 30072 headFavicon: true, 30073 headWhitespace: true, 30074 headMetaDescKeywords: slimDOM === "all", 30075 // destructive 30076 headMetaSocial: true, 30077 headMetaRobots: true, 30078 headMetaHttpEquiv: true, 30079 headMetaAuthorship: true, 30080 headMetaVerification: true 30081 } : slimDOM === false ? {} : slimDOM; 30082 return serializeNodeWithId(n, { 30083 doc: n, 30084 mirror, 30085 blockClass, 30086 blockSelector, 30087 unblockSelector, 30088 maskAllText, 30089 maskTextClass, 30090 unmaskTextClass, 30091 maskTextSelector, 30092 unmaskTextSelector,
30093 skipChild: false, 30094 inlineStylesheet, 30095 maskInputOptions, 30096 maskAttributeFn, 30097 maskTextFn, 30098 maskInputFn, 30099 slimDOMOptions, 30100 dataURLOptions, 30101 inlineImages, 30102 recordCanvas, 30103 preserveWhiteSpace, 30104 onSerialize, 30105 onIframeLoad, 30106 iframeLoadTimeout, 30107 onBlockedImageLoad, 30108 onStylesheetLoad, 30109 stylesheetLoadTimeout, 30110 keepIframeSrcFn, 30111 newlyAddedElement: false, 30112 ignoreCSSAttributes 30113 }); 30114} 30115function on1(type, fn) { 30116 let target = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : document; 30117 const options = { 30118 capture: true, 30119 passive: true 30120 }; 30121 target.addEventListener(type, fn, options); 30122 return ()=>target.removeEventListener(type, fn, options); 30123} 30124const DEPARTED_MIRROR_ACCESS_WARNING = "Please stop import mirror directly. Instead of that,\r\nnow you can use replayer.getMirror() to access the mirror instance of a replayer,\r\nor you can use record.mirror to access the mirror instance during recording."; 30125let _mirror = { 30126 map: {}, 30127 getId () { 30128 console.error(DEPARTED_MIRROR_ACCESS_WARNING); 30129 return -1; 30130 }, 30131 getNode () { 30132 console.error(DEPARTED_MIRROR_ACCESS_WARNING); 30133 return null; 30134 }, 30135 removeNodeFromMap () { 30136 console.error(DEPARTED_MIRROR_ACCESS_WARNING); 30137 }, 30138 has () { 30139 console.error(DEPARTED_MIRROR_ACCESS_WARNING); 30140 return false; 30141 }, 30142 reset () { 30143 console.error(DEPARTED_MIRROR_ACCESS_WARNING); 30144 } 30145}; 30146if (typeof window !== "undefined" && window.Proxy && window.Reflect) { 30147 _mirror = new Proxy(_mirror, { 30148 get (target, prop, receiver) { 30149 if (prop === "map") { 30150 console.error(DEPARTED_MIRROR_ACCESS_WARNING); 30151 } 30152 return Reflect.get(target, prop, receiver); 30153 } 30154 }); 30155} 30156function throttle$1(func, wait) { 30157 let options = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {}; 30158 let timeout = null; 30159 let previous = 0; 30160 return function() { 30161 for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++){ 30162 args[_key] = arguments[_key]; 30163 } 30164 const now = Date.now(); 30165 if (!previous && options.leading === false) { 30166 previous = now; 30167 } 30168 const remaining = wait - (now - previous); 30169 const context = this; 30170 if (remaining <= 0 || remaining > wait) { 30171 if (timeout) { 30172 clearTimeout$2(timeout); 30173 timeout = null; 30174 } 30175 previous = now; 30176 func.apply(context, args); 30177 } else if (!timeout && options.trailing !== false) { 30178 timeout = setTimeout$2(()=>{ 30179 previous = options.leading === false ? 0 : Date.now(); 30180 timeout = null; 30181 func.apply(context, args); 30182 }, remaining); 30183 } 30184 }; 30185} 30186function hookSetter(target, key, d, isRevoked) { 30187 let win = arguments.length > 4 && arguments[4] !== void 0 ? arguments[4] : window; 30188 const original = win.Object.getOwnPropertyDescriptor(target, key); 30189 win.Object.defineProperty(target, key, isRevoked ? d : { 30190 set (value) { 30191 setTimeout$2(()=>{ 30192 d.set.call(this, value); 30193 }, 0); 30194 if (original && original.set) { 30195 original.set.call(this, value); 30196 } 30197 } 30198 }); 30199 return ()=>hookSetter(target, key, original || {}, true); 30200} 30201function patch(source, name, replacement) { 30202 try { 30203 if (!(name in source)) { 30204 return ()=>{}; 30205 } 30206 const original = source[name]; 30207 const wrapped = replacement(original); 30208 if (typeof wrapped === "function") { 30209 wrapped.prototype = wrapped.prototype || {}; 30210 Object.defineProperties(wrapped, { 30211 __rrweb_original__: { 30212 enumerable: false, 30213 value: original 30214 } 30215 }); 30216 } 30217 source[name] = wrapped; 30218 return ()=>{ 30219 source[name] = original; 30220 }; 30221 } catch (unused) { 30222 return ()=>{}; 30223 } 30224} 30225let nowTimestamp = Date.now; 30226if (!/* @__PURE__ */ /[1-9][0-9]{12}/.test(Date.now().toString())) { 30227 nowTimestamp = ()=>/* @__PURE__ */ new Date().getTime(); 30228} 30229function getWindowScroll(win) { 30230 var _doc_body_parentElement, _doc_body, _doc_body1, _doc_body_parentElement1, _doc_body2, _doc_body3; 30231 const doc = win.document; 30232 return { 30233 left: doc.scrollingElement ? doc.scrollingElement.scrollLeft : win.pageXOffset !== void 0 ? win.pageXOffset : (doc === null || doc === void 0 ? void 0 : doc.documentElement.scrollLeft) || (doc === null || doc === void 0 ? void 0 : (_doc_body = doc.body) === null || _doc_body === void 0 ? void 0 : (_doc_body_parentElement = _doc_body.parentElement) === null || _doc_body_parentElement === void 0 ? void 0 : _doc_body_parentElement.scrollLeft) || (doc === null || doc === void 0 ? void 0 : (_doc_body1 = doc.body) === null || _doc_body1 === void 0 ? void 0 : _doc_body1.scrollLeft) || 0, 30234 top: doc.scrollingElement ? doc.scrollingElement.scrollTop : win.pageYOffset !== void 0 ? win.pageYOffset : (doc === null || doc === void 0 ? void 0 : doc.documentElement.scrollTop) || (doc === null || doc === void 0 ? void 0 : (_doc_body2 = doc.body) === null || _doc_body2 === void 0 ? void 0 : (_doc_body_parentElement1 = _doc_body2.parentElement) === null || _doc_body_parentElement1 === void 0 ? void 0 : _doc_body_parentElement1.scrollTop) || (doc === null || doc === void 0 ? void 0 : (_doc_body3 = doc.body) === null || _doc_body3 === void 0 ? void 0 : _doc_body3.scrollTop) || 0 30235 }; 30236} 30237function getWindowHeight() { 30238 return window.innerHeight || document.documentElement && document.documentElement.clientHeight || document.body && document.body.clientHeight; 30239} 30240function getWindowWidth() { 30241 return window.innerWidth || document.documentElement && document.documentElement.clientWidth || document.body && document.body.clientWidth; 30242} 30243function closestElementOfNode$1(node) { 30244 if (!node) { 30245 return null; 30246 } 30247 try { 30248 const el = node.nodeType === node.ELEMENT_NODE ? node : node.parentElement; 30249 return el; 30250 } catch (error) { 30251 return null; 30252 } 30253} 30254function isBlocked(node, blockClass, blockSelector, unblockSelector, checkAncestors) { 30255 if (!node) { 30256 return false;
30257 } 30258 const el = closestElementOfNode$1(node); 30259 if (!el) { 30260 return false; 30261 } 30262 const blockedPredicate = createMatchPredicate(blockClass, blockSelector); 30263 if (!checkAncestors) { 30264 const isUnblocked = unblockSelector && el.matches(unblockSelector); 30265 return blockedPredicate(el) && !isUnblocked; 30266 } 30267 const blockDistance = distanceToMatch(el, blockedPredicate); 30268 let unblockDistance = -1; 30269 if (blockDistance < 0) { 30270 return false; 30271 } 30272 if (unblockSelector) { 30273 unblockDistance = distanceToMatch(el, createMatchPredicate(null, unblockSelector)); 30274 } 30275 if (blockDistance > -1 && unblockDistance < 0) { 30276 return true; 30277 } 30278 return blockDistance < unblockDistance; 30279} 30280function isSerialized(n, mirror) { 30281 return mirror.getId(n) !== -1; 30282} 30283function isIgnored(n, mirror) { 30284 return mirror.getId(n) === IGNORED_NODE; 30285} 30286function isAncestorRemoved(target, mirror) { 30287 if (isShadowRoot(target)) { 30288 return false; 30289 } 30290 const id = mirror.getId(target); 30291 if (!mirror.has(id)) { 30292 return true; 30293 } 30294 if (target.parentNode && target.parentNode.nodeType === target.DOCUMENT_NODE) { 30295 return false; 30296 } 30297 if (!target.parentNode) { 30298 return true; 30299 } 30300 return isAncestorRemoved(target.parentNode, mirror); 30301} 30302function legacy_isTouchEvent(event) { 30303 return Boolean(event.changedTouches); 30304} 30305function polyfill() { 30306 let win = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : window; 30307 if ("NodeList" in win && !win.NodeList.prototype.forEach) { 30308 win.NodeList.prototype.forEach = Array.prototype.forEach; 30309 } 30310 if ("DOMTokenList" in win && !win.DOMTokenList.prototype.forEach) { 30311 win.DOMTokenList.prototype.forEach = Array.prototype.forEach; 30312 } 30313 if (!Node.prototype.contains) { 30314 var _this = this; 30315 Node.prototype.contains = function() { 30316 for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++){ 30317 args[_key] = arguments[_key]; 30318 } 30319 let node = args[0]; 30320 if (!(0 in args)) { 30321 throw new TypeError("1 argument is required"); 30322 } 30323 do { 30324 if (_this === node) { 30325 return true; 30326 } 30327 }while (node = node && node.parentNode) 30328 return false; 30329 }; 30330 } 30331} 30332function isSerializedIframe(n, mirror) { 30333 return Boolean(n.nodeName === "IFRAME" && mirror.getMeta(n)); 30334} 30335function isSerializedStylesheet(n, mirror) { 30336 return Boolean(n.nodeName === "LINK" && n.nodeType === n.ELEMENT_NODE && n.getAttribute && n.getAttribute("rel") === "stylesheet" && mirror.getMeta(n)); 30337} 30338function hasShadowRoot(n) { 30339 return Boolean(n === null || n === void 0 ? void 0 : n.shadowRoot); 30340} 30341class StyleSheetMirror { 30342 getId(stylesheet) { 30343 var _this_styleIDMap_get; 30344 return (_this_styleIDMap_get = this.styleIDMap.get(stylesheet)) !== null && _this_styleIDMap_get !== void 0 ? _this_styleIDMap_get : -1; 30345 } 30346 has(stylesheet) { 30347 return this.styleIDMap.has(stylesheet); 30348 } 30349 /** 30350 * @returns If the stylesheet is in the mirror, returns the id of the stylesheet. If not, return the new assigned id. 30351 */ add(stylesheet, id) { 30352 if (this.has(stylesheet)) return this.getId(stylesheet); 30353 let newId; 30354 if (id === void 0) { 30355 newId = this.id++; 30356 } else newId = id; 30357 this.styleIDMap.set(stylesheet, newId); 30358 this.idStyleMap.set(newId, stylesheet); 30359 return newId; 30360 } 30361 getStyle(id) { 30362 return this.idStyleMap.get(id) || null; 30363 } 30364 reset() { 30365 this.styleIDMap = /* @__PURE__ */ new WeakMap(); 30366 this.idStyleMap = /* @__PURE__ */ new Map(); 30367 this.id = 1; 30368 } 30369 generateId() { 30370 return this.id++; 30371 } 30372 constructor(){ 30373 this.id = 1; 30374 this.styleIDMap = /* @__PURE__ */ new WeakMap(); 30375 this.idStyleMap = /* @__PURE__ */ new Map(); 30376 } 30377} 30378function getShadowHost(n) { 30379 var _n_getRootNode, _n_getRootNode1; 30380 let shadowHost = null; 30381 if (((_n_getRootNode1 = n.getRootNode) === null || _n_getRootNode1 === void 0 ? void 0 : (_n_getRootNode = _n_getRootNode1.call(n)) === null || _n_getRootNode === void 0 ? void 0 : _n_getRootNode.nodeType) === N
vendor: 6,487 bytes, lines 30381-30525
30381ode.DOCUMENT_FRAGMENT_NODE && n.getRootNode().host) shadowHost = n.getRootNode().host; 30382 return shadowHost; 30383} 30384function getRootShadowHost(n) { 30385 let rootShadowHost = n; 30386 let shadowHost; 30387 while(shadowHost = getShadowHost(rootShadowHost))rootShadowHost = shadowHost; 30388 return rootShadowHost; 30389} 30390function shadowHostInDom(n) { 30391 const doc = n.ownerDocument; 30392 if (!doc) return false; 30393 const shadowHost = getRootShadowHost(n); 30394 return doc.contains(shadowHost); 30395} 30396function inDom(n) { 30397 const doc = n.ownerDocument; 30398 if (!doc) return false; 30399 return doc.contains(n) || shadowHostInDom(n); 30400} 30401const cachedImplementations1 = {}; 30402function getImplementation(name) { 30403 const cached = cachedImplementations1[name]; 30404 if (cached) { 30405 return cached; 30406 } 30407 const document2 = window.document; 30408 let impl = window[name]; 30409 if (document2 && typeof document2.createElement === "function") { 30410 try { 30411 const sandbox = document2.createElement("iframe"); 30412 sandbox.hidden = true; 30413 document2.head.appendChild(sandbox); 30414 const contentWindow = sandbox.contentWindow; 30415 if (contentWindow && contentWindow[name]) { 30416 impl = contentWindow[name]; 30417 } 30418 document2.head.removeChild(sandbox); 30419 } catch (e) {} 30420 } 30421 return cachedImplementations1[name] = impl.bind(window); 30422} 30423function onRequestAnimationFrame() { 30424 for(var _len = arguments.length, rest = new Array(_len), _key = 0; _key < _len; _key++){ 30425 rest[_key] = arguments[_key]; 30426 } 30427 return getImplementation("requestAnimationFrame")(...rest); 30428} 30429function setTimeout$2() { 30430 for(var _len = arguments.length, rest = new Array(_len), _key = 0; _key < _len; _key++){ 30431 rest[_key] = arguments[_key]; 30432 } 30433 return getImplementation("setTimeout")(...rest); 30434} 30435function clearTimeout$2() { 30436 for(var _len = arguments.length, rest = new Array(_len), _key = 0; _key < _len; _key++){ 30437 rest[_key] = arguments[_key]; 30438 } 30439 return getImplementation("clearTimeout")(...rest); 30440} 30441var EventType = /* @__PURE__ */ ((EventType2)=>{ 30442 EventType2[EventType2["DomContentLoaded"] = 0] = "DomContentLoaded"; 30443 EventType2[EventType2["Load"] = 1] = "Load"; 30444 EventType2[EventType2["FullSnapshot"] = 2] = "FullSnapshot"; 30445 EventType2[EventType2["IncrementalSnapshot"] = 3] = "IncrementalSnapshot"; 30446 EventType2[EventType2["Meta"] = 4] = "Meta"; 30447 EventType2[EventType2["Custom"] = 5] = "Custom"; 30448 EventType2[EventType2["Plugin"] = 6] = "Plugin"; 30449 return EventType2; 30450})(EventType || {}); 30451var IncrementalSource = /* @__PURE__ */ ((IncrementalSource2)=>{ 30452 IncrementalSource2[IncrementalSource2["Mutation"] = 0] = "Mutation"; 30453 IncrementalSource2[IncrementalSource2["MouseMove"] = 1] = "MouseMove"; 30454 IncrementalSource2[IncrementalSource2["MouseInteraction"] = 2] = "MouseInteraction"; 30455 IncrementalSource2[IncrementalSource2["Scroll"] = 3] = "Scroll"; 30456 IncrementalSource2[IncrementalSource2["ViewportResize"] = 4] = "ViewportResize"; 30457 IncrementalSource2[IncrementalSource2["Input"] = 5] = "Input"; 30458 IncrementalSource2[IncrementalSource2["TouchMove"] = 6] = "TouchMove"; 30459 IncrementalSource2[IncrementalSource2["MediaInteraction"] = 7] = "MediaInteraction"; 30460 IncrementalSource2[IncrementalSource2["StyleSheetRule"] = 8] = "StyleSheetRule"; 30461 IncrementalSource2[IncrementalSource2["CanvasMutation"] = 9] = "CanvasMutation"; 30462 IncrementalSource2[IncrementalSource2["Font"] = 10] = "Font"; 30463 IncrementalSource2[IncrementalSource2["Log"] = 11] = "Log"; 30464 IncrementalSource2[IncrementalSource2["Drag"] = 12] = "Drag"; 30465 IncrementalSource2[IncrementalSource2["StyleDeclaration"] = 13] = "StyleDeclaration"; 30466 IncrementalSource2[IncrementalSource2["Selection"] = 14] = "Selection"; 30467 IncrementalSource2[IncrementalSource2["AdoptedStyleSheet"] = 15] = "AdoptedStyleSheet"; 30468 IncrementalSource2[IncrementalSource2["CustomElement"] = 16] = "CustomElement"; 30469 return IncrementalSource2; 30470})(IncrementalSource || {}); 30471var MouseInteractions = /* @__PURE__ */ ((MouseInteractions2)=>{ 30472 MouseInteractions2[MouseInteractions2["MouseUp"] = 0] = "MouseUp"; 30473 MouseInteractions2[MouseInteractions2["MouseDown"] = 1] = "MouseDown"; 30474 MouseInteractions2[MouseInteractions2["Click"] = 2] = "Click"; 30475 MouseInteractions2[MouseInteractions2["ContextMenu"] = 3] = "ContextMenu"; 30476 MouseInteractions2[MouseInteractions2["DblClick"] = 4] = "DblClick"; 30477 MouseInteractions2[MouseInteractions2["Focus"] = 5] = "Focus"; 30478 MouseInteractions2[MouseInteractions2["Blur"] = 6] = "Blur"; 30479 MouseInteractions2[MouseInteractions2["TouchStart"] = 7] = "TouchStart"; 30480 MouseInteractions2[MouseInteractions2["TouchMove_Departed"] = 8] = "TouchMove_Departed"; 30481 MouseInteractions2[MouseInteractions2["TouchEnd"] = 9] = "TouchEnd"; 30482 MouseInteractions2[MouseInteractions2["TouchCancel"] = 10] = "TouchCancel"; 30483 return MouseInteractions2; 30484})(MouseInteractions || {}); 30485var PointerTypes = /* @__PURE__ */ ((PointerTypes2)=>{ 30486 PointerTypes2[PointerTypes2["Mouse"] = 0] = "Mouse"; 30487 PointerTypes2[PointerTypes2["Pen"] = 1] = "Pen"; 30488 PointerTypes2[PointerTypes2["Touch"] = 2] = "Touch"; 30489 return PointerTypes2; 30490})(PointerTypes || {}); 30491var MediaInteractions = /* @__PURE__ */ ((MediaInteractions2)=>{ 30492 MediaInteractions2[MediaInteractions2["Play"] = 0] = "Play"; 30493 MediaInteractions2[MediaInteractions2["Pause"] = 1] = "Pause"; 30494 MediaInteractions2[MediaInteractions2["Seeked"] = 2] = "Seeked"; 30495 MediaInteractions2[MediaInteractions2["VolumeChange"] = 3] = "VolumeChange"; 30496 MediaInteractions2[MediaInteractions2["RateChange"] = 4] = "RateChange"; 30497 return MediaInteractions2; 30498})(MediaInteractions || {}); 30499let errorHandler; 30500function registerErrorHandler(handler) { 30501 errorHandler = handler; 30502} 30503function unregisterErrorHandler() { 30504 errorHandler = void 0; 30505} 30506const callbackWrapper = (cb)=>{ 30507 if (!errorHandler) { 30508 return cb; 30509 } 30510 const rrwebWrapped = function() { 30511 for(var _len = arguments.length, rest = new Array(_len), _key = 0; _key < _len; _key++){ 30512 rest[_key] = arguments[_key]; 30513 } 30514 try { 30515 return cb(...rest); 30516 } catch (error) { 30517 if (errorHandler && errorHandler(error) === true) { 30518 return ()=>{}; 30519 } 30520 throw error; 30521 } 30522 }; 30523 return rrwebWrapped; 30524}; 30525var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
30525+/"; 30526var lookup = typeof Uint8Array === "undefined" ? [] : new Uint8Array(256); 30527for(var i1 = 0; i1 < chars.length; i1++){ 30528 lookup[chars.charCodeAt(i1)] = i1; 30529} 30530class CanvasManagerNoop { 30531 reset() {} 30532 freeze() {} 30533 unfreeze() {} 30534 lock() {} 30535 unlock() {} 30536 snapshot() {} 30537 addWindow() {} 30538 addShadowRoot() {} 30539 resetShadowRoots() {} 30540} 30541function getIFrameContentDocument(iframe) { 30542 try { 30543 return iframe.contentDocument; 30544 } catch (e2) {} 30545} 30546function getIFrameContentWindow(iframe) { 30547 try { 30548 return iframe.contentWindow; 30549 } catch (e2) {} 30550} 30551class StyleDeclarationParser { 30552 parse(styleText) { 30553 return this.parseWithConstructableStylesheet(styleText) || this.parseWithDetachedElement(styleText); 30554 } 30555 parseWithConstructableStylesheet(styleText) { 30556 if (typeof CSSStyleSheet === "undefined" || typeof CSSStyleSheet.prototype.replaceSync !== "function") { 30557 return null; 30558 } 30559 try { 30560 const sheet = new CSSStyleSheet(); 30561 sheet.replaceSync("x { ".concat(styleText, " }")); 30562 const rule = sheet.cssRules[0]; 30563 if (!rule || rule.type !== CSSRule.STYLE_RULE) { 30564 return null; 30565 } 30566 return rule.style; 30567 } catch (unused) { 30568 return null; 30569 } 30570 } 30571 parseWithDetachedElement(styleText) { 30572 const old = this.getUnattachedDoc().createElement("span"); 30573 old.setAttribute("style", styleText); 30574 return old.style; 30575 } 30576 getUnattachedDoc() { 30577 if (!this.unattachedDoc) { 30578 try { 30579 this.unattachedDoc = document.implementation.createHTMLDocument(); 30580 } catch (unused) { 30581 this.unattachedDoc = this.doc; 30582 } 30583 } 30584 return this.unattachedDoc; 30585 } 30586 constructor(doc){ 30587 this.doc = doc; 30588 this.unattachedDoc = null; 30589 } 30590} 30591function isNodeInLinkedList(n2) { 30592 return "__ln" in n2; 30593} 30594class DoubleLinkedList { 30595 get(position) { 30596 if (position >= this.length) { 30597 throw new Error("Position outside of list range"); 30598 } 30599 let current = this.head; 30600 for(let index = 0; index < position; index++){ 30601 current = (current === null || current === void 0 ? void 0 : current.next) || null; 30602 } 30603 return current; 30604 } 30605 addNode(n2) { 30606 const node = { 30607 value: n2, 30608 previous: null, 30609 next: null 30610 }; 30611 n2.__ln = node; 30612 if (n2.previousSibling && isNodeInLinkedList(n2.previousSibling)) { 30613 const current = n2.previousSibling.__ln.next; 30614 node.next = current; 30615 node.previous = n2.previousSibling.__ln; 30616 n2.previousSibling.__ln.next = node; 30617 if (current) { 30618 current.previous = node; 30619 } 30620 } else if (n2.nextSibling && isNodeInLinkedList(n2.nextSibling) && n2.nextSibling.__ln.previous) { 30621 const current = n2.nextSibling.__ln.previous; 30622 node.previous = current; 30623 node.next = n2.nextSibling.__ln; 30624 n2.nextSibling.__ln.previous = node; 30625 if (current) { 30626 current.next = node; 30627 } 30628 } else { 30629 if (this.head) { 30630 this.head.previous = node; 30631 } 30632 node.next = this.head; 30633 this.head = node; 30634 } 30635 if (node.next === null) { 30636 this.tail = node; 30637 } 30638 this.length++; 30639 } 30640 removeNode(n2) { 30641 const current = n2.__ln; 30642 if (!this.head) { 30643 return; 30644 } 30645 if (!current.previous) { 30646 this.head = current.next; 30647 if (this.head) { 30648 this.head.previous = null; 30649 } else { 30650 this.tail = null; 30651 } 30652 } else { 30653 current.previous.next = current.next; 30654 if (current.next) { 30655 current.next.previous = current.previous; 30656 } else { 30657 this.tail = current.previous; 30658 } 30659 } 30660 if (n2.__ln) { 30661 delete n2.__ln; 30662 } 30663 this.length--; 30664 } 30665 constructor(){ 30666 this.length = 0; 30667 this.head = null; 30668 this.tail = null; 30669 } 30670} 30671const moveKey = (id, parentId)=>"".concat(id, "@").concat(parentId); 30672class MutationBuffer { 30673 init(options) { 30674 [ 30675 "mutationCb", 30676 "blockClass", 30677 "blockSelector", 30678 "unblockSelector", 30679 "maskAllText", 30680 "maskTextClass", 30681 "unmaskTextClass", 30682 "maskTextSelector", 30683 "unmaskTextSelector", 30684 "inlineStylesheet", 30685 "maskInputOptions", 30686 "maskAttributeFn", 30687 "maskTextFn", 30688 "maskInputFn", 30689 "keepIframeSrcFn", 30690 "recordCanvas", 30691 "inlineImages", 30692 "slimDOMOptions", 30693 "dataURLOptions", 30694 "doc", 30695 "mirror", 30696 "iframeManager", 30697 "stylesheetManager", 30698 "shadowDomManager", 30699 "canvasManager", 30700 "processedNodeManager", 30701 "ignoreCSSAttributes"
vendor: 39,888 bytes, lines 30702-31619
30702 ].forEach((key)=>{ 30703 this[key] = options[key]; 30704 }); 30705 this.styleDeclarationParser = new StyleDeclarationParser(this.doc); 30706 } 30707 freeze() { 30708 this.frozen = true; 30709 this.canvasManager.freeze(); 30710 } 30711 unfreeze() { 30712 this.frozen = false; 30713 this.canvasManager.unfreeze(); 30714 this.emit(); 30715 } 30716 isFrozen() { 30717 return this.frozen; 30718 } 30719 lock() { 30720 this.locked = true; 30721 this.canvasManager.lock(); 30722 } 30723 unlock() { 30724 this.locked = false; 30725 this.canvasManager.unlock(); 30726 this.emit(); 30727 } 30728 reset() { 30729 this.shadowDomManager.reset(); 30730 this.canvasManager.reset(); 30731 } 30732 constructor(){ 30733 this.frozen = false; 30734 this.locked = false; 30735 this.texts = []; 30736 this.attributes = []; 30737 this.attributeMap = /* @__PURE__ */ new WeakMap(); 30738 this.removes = []; 30739 this.mapRemoves = []; 30740 this.movedMap = {}; 30741 this.addedSet = /* @__PURE__ */ new Set(); 30742 this.movedSet = /* @__PURE__ */ new Set(); 30743 this.droppedSet = /* @__PURE__ */ new Set(); 30744 this.processMutations = (mutations)=>{ 30745 mutations.forEach(this.processMutation); 30746 this.emit(); 30747 }; 30748 this.emit = ()=>{ 30749 if (this.frozen || this.locked) { 30750 return; 30751 } 30752 const adds = []; 30753 const addedIds = /* @__PURE__ */ new Set(); 30754 const addList = new DoubleLinkedList(); 30755 const getNextId = (n2)=>{ 30756 let ns = n2; 30757 let nextId = IGNORED_NODE; 30758 while(nextId === IGNORED_NODE){ 30759 ns = ns && ns.nextSibling; 30760 nextId = ns && this.mirror.getId(ns); 30761 } 30762 return nextId; 30763 }; 30764 const pushAdd = (n2)=>{ 30765 if (!n2.parentNode || !inDom(n2)) { 30766 return; 30767 } 30768 const parentId = isShadowRoot(n2.parentNode) ? this.mirror.getId(getShadowHost(n2)) : this.mirror.getId(n2.parentNode); 30769 const nextId = getNextId(n2); 30770 if (parentId === -1 || nextId === -1) { 30771 return addList.addNode(n2); 30772 } 30773 const sn = serializeNodeWithId(n2, { 30774 doc: this.doc, 30775 mirror: this.mirror, 30776 blockClass: this.blockClass, 30777 blockSelector: this.blockSelector, 30778 maskAllText: this.maskAllText, 30779 unblockSelector: this.unblockSelector, 30780 maskTextClass: this.maskTextClass, 30781 unmaskTextClass: this.unmaskTextClass, 30782 maskTextSelector: this.maskTextSelector, 30783 unmaskTextSelector: this.unmaskTextSelector, 30784 skipChild: true, 30785 newlyAddedElement: true, 30786 inlineStylesheet: this.inlineStylesheet, 30787 maskInputOptions: this.maskInputOptions, 30788 maskAttributeFn: this.maskAttributeFn, 30789 maskTextFn: this.maskTextFn, 30790 maskInputFn: this.maskInputFn, 30791 slimDOMOptions: this.slimDOMOptions, 30792 dataURLOptions: this.dataURLOptions, 30793 recordCanvas: this.recordCanvas, 30794 inlineImages: this.inlineImages, 30795 onSerialize: (currentN)=>{ 30796 if (isSerializedIframe(currentN, this.mirror) && !isBlocked(currentN, this.blockClass, this.blockSelector, this.unblockSelector, false)) { 30797 this.iframeManager.addIframe(currentN); 30798 } 30799 if (isSerializedStylesheet(currentN, this.mirror)) { 30800 this.stylesheetManager.trackLinkElement(currentN); 30801 } 30802 if (hasShadowRoot(n2)) { 30803 this.shadowDomManager.addShadowRoot(n2.shadowRoot, this.doc); 30804 } 30805 }, 30806 onIframeLoad: (iframe, childSn)=>{ 30807 if (isBlocked(iframe, this.blockClass, this.blockSelector, this.unblockSelector, false)) { 30808 return; 30809 } 30810 this.iframeManager.attachIframe(iframe, childSn); 30811 const contentWindow = getIFrameContentWindow(iframe); 30812 if (contentWindow) { 30813 this.canvasManager.addWindow(contentWindow); 30814 } 30815 this.shadowDomManager.observeAttachShadow(iframe); 30816 }, 30817 onStylesheetLoad: (link, childSn)=>{ 30818 this.stylesheetManager.attachLinkElement(link, childSn); 30819 }, 30820 onBlockedImageLoad: (_imageEl, serializedNode, param)=>{ 30821 let { width, height } = param; 30822 this.mutationCb({ 30823 adds: [], 30824 removes: [], 30825 texts: [], 30826 attributes: [ 30827 { 30828 id: serializedNode.id, 30829 attributes: { 30830 style: { 30831 width: "".concat(width, "px"), 30832 height: "".concat(height, "px") 30833 } 30834 } 30835 } 30836 ] 30837 }); 30838 }, 30839 ignoreCSSAttributes: this.ignoreCSSAttributes 30840 }); 30841 if (sn) { 30842 adds.push({ 30843 parentId, 30844 nextId, 30845 node: sn 30846 }); 30847 addedIds.add(sn.id); 30848 } 30849 }; 30850 while(this.mapRemoves.length){ 30851 this.mirror.removeNodeFromMap(this.mapRemoves.shift()); 30852 } 30853 for (const n2 of this.movedSet){ 30854 if (isParentRemoved(this.removes, n2, this.mirror) && !this.movedSet.has(n2.parentNode)) { 30855 continue; 30856 } 30857 pushAdd(n2); 30858 } 30859 for (const n2 of this.addedSet){ 30860 if (!isAncestorInSet(this.droppedSet, n2) && !isParentRemoved(this.removes, n2, this.mirror)) { 30861 pushAdd(n2); 30862 } else if (isAncestorInSet(this.movedSet, n2)) { 30863 pushAdd(n2); 30864 } else { 30865 this.droppedSet.add(n2); 30866 } 30867 } 30868 let candidate = null; 30869 while(addList.length){ 30870 let node = null; 30871 if (candidate) { 30872 const parentId = this.mirror.getId(candidate.value.parentNode); 30873 const nextId = getNextId(candidate.value); 30874 if (parentId !== -1 && nextId !== -1) { 30875 node = candidate; 30876 } 30877 } 30878 if (!node) { 30879 let tailNode = addList.tail; 30880 while(tailNode){ 30881 const _node = tailNode; 30882 tailNode = tailNode.previous; 30883 if (_node) { 30884 const parentId = this.mirror.getId(_node.value.parentNode); 30885 const nextId = getNextId(_node.value); 30886 if (nextId === -1) continue; 30887 else if (parentId !== -1) { 30888 node = _node; 30889 break; 30890 } else { 30891 const unhandledNode = _node.value; 30892 if (unhandledNode.parentNode && unhandledNode.parentNode.nodeType === Node.DOCUMENT_FRAGMENT_NODE) { 30893 const shadowHost = unhandledNode.parentNode.host; 30894 const parentId2 = this.mirror.getId(shadowHost); 30895 if (parentId2 !== -1) { 30896 node = _node; 30897 break; 30898 } 30899 } 30900 } 30901 } 30902 } 30903 } 30904 if (!node) { 30905 while(addList.head){ 30906 addList.removeNode(addList.head.value); 30907 } 30908 break; 30909 } 30910 candidate = node.previous; 30911 addList.removeNode(node.value); 30912 pushAdd(node.value); 30913 } 30914 const payload = { 30915 texts: this.texts.map((text)=>({ 30916 id: this.mirror.getId(text.node), 30917 value: text.value 30918 })).filter((text)=>!addedIds.has(text.id)).filter((text)=>this.mirror.has(text.id)), 30919 attributes: this.attributes.map((attribute)=>{ 30920 const { attributes } = attribute; 30921 if (typeof attributes.style === "string") { 30922 const diffAsStr = JSON.stringify(attribute.styleDiff); 30923 const unchangedAsStr = JSON.stringify(attribute._unchangedStyles); 30924 if (diffAsStr.length < attributes.style.length) { 30925 if ((diffAsStr + unchangedAsStr).split("var(").length === attributes.style.split("var(").length) { 30926 attributes.style = attribute.styleDiff; 30927 } 30928 } 30929 } 30930 return { 30931 id: this.mirror.getId(attribute.node), 30932 attributes 30933 }; 30934 }).filter((attribute)=>!addedIds.has(attribute.id)).filter((attribute)=>this.mirror.has(attribute.id)), 30935 removes: this.removes, 30936 adds 30937 }; 30938 if (!payload.texts.length && !payload.attributes.length && !payload.removes.length && !payload.adds.length) { 30939 return; 30940 } 30941 this.texts = []; 30942 this.attributes = []; 30943 this.attributeMap = /* @__PURE__ */ new WeakMap(); 30944 this.removes = []; 30945 this.addedSet = /* @__PURE__ */ new Set(); 30946 this.movedSet = /* @__PURE__ */ new Set(); 30947 this.droppedSet = /* @__PURE__ */ new Set(); 30948 this.movedMap = {}; 30949 this.mutationCb(payload); 30950 }; 30951 this.processMutation = (m)=>{ 30952 if (isIgnored(m.target, this.mirror)) { 30953 return; 30954 } 30955 switch(m.type){ 30956 case "characterData": 30957 { 30958 const value = m.target.textContent; 30959 if (!isBlocked(m.target, this.blockClass, this.blockSelector, this.unblockSelector, false) && value !== m.oldValue) { 30960 this.texts.push({ 30961 value: needMaskingText(m.target, this.maskTextClass, this.maskTextSelector, this.unmaskTextClass, this.unmaskTextSelector, this.maskAllText) && value ? this.maskTextFn ? this.maskTextFn(value, closestElementOfNode$1(m.target)) : value.replace(/[\S]/g, "*") : value, 30962 node: m.target 30963 }); 30964 } 30965 break; 30966 } 30967 case "attributes": 30968 { 30969 const target = m.target; 30970 let attributeName = m.attributeName; 30971 let value = m.target.getAttribute(attributeName); 30972 if (attributeName === "value") { 30973 const type = getInputType(target); 30974 const tagName = target.tagName; 30975 value = getInputValue(target, tagName, type); 30976 const isInputMasked = shouldMaskInput({ 30977 maskInputOptions: this.maskInputOptions, 30978 tagName, 30979 type 30980 }); 30981 const forceMask = needMaskingText(m.target, this.maskTextClass, this.maskTextSelector, this.unmaskTextClass, this.unmaskTextSelector, isInputMasked); 30982 value = maskInputValue({ 30983 isMasked: forceMask, 30984 element: target, 30985 value, 30986 maskInputFn: this.maskInputFn 30987 }); 30988 } 30989 if (isBlocked(m.target, this.blockClass, this.blockSelector, this.unblockSelector, false) || value === m.oldValue) { 30990 return; 30991 } 30992 let item = this.attributeMap.get(m.target); 30993 if (target.tagName === "IFRAME" && attributeName === "src" && !this.keepIframeSrcFn(value)) { 30994 const iframeDoc = getIFrameContentDocument(target); 30995 if (!iframeDoc) { 30996 attributeName = "rr_src"; 30997 } else { 30998 return; 30999 } 31000 } 31001 if (!item) { 31002 item = { 31003 node: m.target, 31004 attributes: {}, 31005 styleDiff: {}, 31006 _unchangedStyles: {} 31007 }; 31008 this.attributes.push(item); 31009 this.attributeMap.set(m.target, item); 31010 } 31011 if (attributeName === "type" && target.tagName === "INPUT" && (m.oldValue || "").toLowerCase() === "password") { 31012 target.setAttribute("data-rr-is-password", "true"); 31013 } 31014 if (!ignoreAttribute(target.tagName, attributeName)) { 31015 item.attributes[attributeName] = transformAttribute(this.doc, toLowerCase(target.tagName), toLowerCase(attributeName), value, target, this.maskAttributeFn); 31016 if (attributeName === "style") { 31017 const oldStyle = m.oldValue ? this.styleDeclarationParser.parse(m.oldValue) : null; 31018 for (const pname of Array.from(target.style)){ 31019 const newValue = target.style.getPropertyValue(pname); 31020 const newPriority = target.style.getPropertyPriority(pname); 31021 if (newValue !== ((oldStyle === null || oldStyle === void 0 ? void 0 : oldStyle.getPropertyValue(pname)) || "") || newPriority !== ((oldStyle === null || oldStyle === void 0 ? void 0 : oldStyle.getPropertyPriority(pname)) || "")) { 31022 if (newPriority === "") { 31023 item.styleDiff[pname] = newValue; 31024 } else { 31025 item.styleDiff[pname] = [ 31026 newValue, 31027 newPriority 31028 ]; 31029 } 31030 } else { 31031 item._unchangedStyles[pname] = [ 31032 newValue, 31033 newPriority 31034 ]; 31035 } 31036 } 31037 if (oldStyle) { 31038 for (const pname of Array.from(oldStyle)){ 31039 if (target.style.getPropertyValue(pname) === "") { 31040 item.styleDiff[pname] = false; 31041 } 31042 } 31043 } 31044 } 31045 } 31046 break; 31047 } 31048 case "childList": 31049 { 31050 if (isBlocked(m.target, this.blockClass, this.blockSelector, this.unblockSelector, true)) { 31051 return; 31052 } 31053 m.addedNodes.forEach((n2)=>this.genAdds(n2, m.target)); 31054 m.removedNodes.forEach((n2)=>{ 31055 const nodeId = this.mirror.getId(n2); 31056 const parentId = isShadowRoot(m.target) ? this.mirror.getId(m.target.host) : this.mirror.getId(m.target); 31057 if (isBlocked(m.target, this.blockClass, this.blockSelector, this.unblockSelector, false) || isIgnored(n2, this.mirror) || !isSerialized(n2, this.mirror)) { 31058 return; 31059 } 31060 if (this.addedSet.has(n2)) { 31061 deepDelete(this.addedSet, n2); 31062 this.droppedSet.add(n2); 31063 } else if (this.addedSet.has(m.target) && nodeId === -1) ; 31064 else if (isAncestorRemoved(m.target, this.mirror)) ; 31065 else if (this.movedSet.has(n2) && this.movedMap[moveKey(nodeId, parentId)]) { 31066 deepDelete(this.movedSet, n2); 31067 } else { 31068 this.removes.push({ 31069 parentId, 31070 id: nodeId, 31071 isShadow: isShadowRoot(m.target) && isNativeShadowDom(m.target) ? true : void 0 31072 }); 31073 } 31074 this.mapRemoves.push(n2); 31075 }); 31076 break; 31077 } 31078 } 31079 }; 31080 this.genAdds = (n2, target)=>{ 31081 if (this.processedNodeManager.inOtherBuffer(n2, this)) return; 31082 if (this.addedSet.has(n2) || this.movedSet.has(n2)) return; 31083 if (this.mirror.hasNode(n2)) { 31084 if (isIgnored(n2, this.mirror)) { 31085 return; 31086 } 31087 this.movedSet.add(n2); 31088 let targetId = null; 31089 if (target && this.mirror.hasNode(target)) { 31090 targetId = this.mirror.getId(target); 31091 } 31092 if (targetId && targetId !== -1) { 31093 this.movedMap[moveKey(this.mirror.getId(n2), targetId)] = true; 31094 } 31095 } else { 31096 this.addedSet.add(n2); 31097 this.droppedSet.delete(n2); 31098 } 31099 if (!isBlocked(n2, this.blockClass, this.blockSelector, this.unblockSelector, false)) { 31100 if (n2.childNodes) { 31101 n2.childNodes.forEach((childN)=>this.genAdds(childN)); 31102 } 31103 if (hasShadowRoot(n2)) { 31104 n2.shadowRoot.childNodes.forEach((childN)=>{ 31105 this.processedNodeManager.add(childN, this); 31106 this.genAdds(childN, n2); 31107 }); 31108 } 31109 } 31110 }; 31111 } 31112} 31113function deepDelete(addsSet, n2) { 31114 var _n2_childNodes; 31115 addsSet.delete(n2); 31116 (_n2_childNodes = n2.childNodes) === null || _n2_childNodes === void 0 ? void 0 : _n2_childNodes.forEach((childN)=>deepDelete(addsSet, childN)); 31117} 31118function isParentRemoved(removes, n2, mirror2) { 31119 if (removes.length === 0) return false; 31120 return _isParentRemoved(removes, n2, mirror2); 31121} 31122function _isParentRemoved(removes, n2, mirror2) { 31123 let node = n2.parentNode; 31124 while(node){ 31125 const parentId = mirror2.getId(node); 31126 if (removes.some((r2)=>r2.id === parentId)) { 31127 return true; 31128 } 31129 node = node.parentNode; 31130 } 31131 return false; 31132} 31133function isAncestorInSet(set, n2) { 31134 if (set.size === 0) return false; 31135 return _isAncestorInSet(set, n2); 31136} 31137function _isAncestorInSet(set, n2) { 31138 const { parentNode } = n2; 31139 if (!parentNode) { 31140 return false; 31141 } 31142 if (set.has(parentNode)) { 31143 return true; 31144 } 31145 return _isAncestorInSet(set, parentNode); 31146} 31147const mutationBuffers = []; 31148function getEventTarget1(event) { 31149 try { 31150 if ("composedPath" in event) { 31151 const path = event.composedPath(); 31152 if (path.length) { 31153 return path[0]; 31154 } 31155 } else if ("path" in event && event.path.length) { 31156 return event.path[0]; 31157 } 31158 } catch (unused) {} 31159 return event && event.target; 31160} 31161function initMutationObserver(options, rootEl) { 31162 var _window_Zone___symbol__, _window_Zone, _window; 31163 const mutationBuffer = new MutationBuffer(); 31164 mutationBuffers.push(mutationBuffer); 31165 mutationBuffer.init(options); 31166 let mutationObserverCtor = window.MutationObserver || /** 31167 * Some websites may disable MutationObserver by removing it from the window object. 31168 * If someone is using rrweb to build a browser extention or things like it, they 31169 * could not change the website's code but can have an opportunity to inject some 31170 * code before the website executing its JS logic. 31171 * Then they can do this to store the native MutationObserver: 31172 * window.__rrMutationObserver = MutationObserver 31173 */ window.__rrMutationObserver; 31174 const angularZoneSymbol = (_window = window) === null || _window === void 0 ? void 0 : (_window_Zone = _window.Zone) === null || _window_Zone === void 0 ? void 0 : (_window_Zone___symbol__ = _window_Zone.__symbol__) === null || _window_Zone___symbol__ === void 0 ? void 0 : _window_Zone___symbol__.call(_window_Zone, "MutationObserver"); 31175 if (angularZoneSymbol && window[angularZoneSymbol]) { 31176 mutationObserverCtor = window[angularZoneSymbol]; 31177 } 31178 const observer = new mutationObserverCtor(callbackWrapper((mutations)=>{ 31179 if (options.onMutation && options.onMutation(mutations) === false) { 31180 return; 31181 } 31182 mutationBuffer.processMutations.bind(mutationBuffer)(mutations); 31183 })); 31184 observer.observe(rootEl, { 31185 attributes: true, 31186 attributeOldValue: true, 31187 characterData: true, 31188 characterDataOldValue: true, 31189 childList: true, 31190 subtree: true 31191 }); 31192 return observer; 31193} 31194function initMoveObserver(param) { 31195 let { mousemoveCb, sampling, doc, mirror: mirror2 } = param; 31196 if (sampling.mousemove === false) { 31197 return ()=>{}; 31198 } 31199 const threshold = typeof sampling.mousemove === "number" ? sampling.mousemove : 50; 31200 const callbackThreshold = typeof sampling.mousemoveCallback === "number" ? sampling.mousemoveCallback : 500; 31201 let positions = []; 31202 let timeBaseline; 31203 const wrappedCb = throttle$1(callbackWrapper((source)=>{ 31204 const totalOffset = Date.now() - timeBaseline; 31205 mousemoveCb(positions.map((p)=>{ 31206 p.timeOffset -= totalOffset; 31207 return p; 31208 }), source); 31209 positions = []; 31210 timeBaseline = null; 31211 }), callbackThreshold); 31212 const updatePosition = callbackWrapper(throttle$1(callbackWrapper((evt)=>{ 31213 const target = getEventTarget1(evt); 31214 const { clientX, clientY } = legacy_isTouchEvent(evt) ? evt.changedTouches[0] : evt; 31215 if (!timeBaseline) { 31216 timeBaseline = nowTimestamp(); 31217 } 31218 positions.push({ 31219 x: clientX, 31220 y: clientY, 31221 id: mirror2.getId(target), 31222 timeOffset: nowTimestamp() - timeBaseline 31223 }); 31224 wrappedCb(typeof DragEvent !== "undefined" && evt instanceof DragEvent ? IncrementalSource.Drag : evt instanceof MouseEvent ? IncrementalSource.MouseMove : IncrementalSource.TouchMove); 31225 }), threshold, { 31226 trailing: false 31227 })); 31228 const handlers = [ 31229 on1("mousemove", updatePosition, doc), 31230 on1("touchmove", updatePosition, doc), 31231 on1("drag", updatePosition, doc) 31232 ]; 31233 return callbackWrapper(()=>{ 31234 handlers.forEach((h)=>h()); 31235 }); 31236} 31237function initMouseInteractionObserver(param) { 31238 let { mouseInteractionCb, doc, mirror: mirror2, blockClass, blockSelector, unblockSelector, sampling } = param; 31239 if (sampling.mouseInteraction === false) { 31240 return ()=>{}; 31241 } 31242 const disableMap = sampling.mouseInteraction === true || sampling.mouseInteraction === void 0 ? {} : sampling.mouseInteraction; 31243 const handlers = []; 31244 let currentPointerType = null; 31245 const getHandler = (eventKey)=>{ 31246 return (event)=>{ 31247 const target = getEventTarget1(event); 31248 if (isBlocked(target, blockClass, blockSelector, unblockSelector, true)) { 31249 return; 31250 } 31251 let pointerType = null; 31252 let thisEventKey = eventKey; 31253 if ("pointerType" in event) { 31254 switch(event.pointerType){ 31255 case "mouse": 31256 pointerType = PointerTypes.Mouse; 31257 break; 31258 case "touch": 31259 pointerType = PointerTypes.Touch; 31260 break; 31261 case "pen": 31262 pointerType = PointerTypes.Pen; 31263 break; 31264 } 31265 if (pointerType === PointerTypes.Touch) { 31266 if (MouseInteractions[eventKey] === MouseInteractions.MouseDown) { 31267 thisEventKey = "TouchStart"; 31268 } else if (MouseInteractions[eventKey] === MouseInteractions.MouseUp) { 31269 thisEventKey = "TouchEnd"; 31270 } 31271 } else if (pointerType === PointerTypes.Pen) ; 31272 } else if (legacy_isTouchEvent(event)) { 31273 pointerType = PointerTypes.Touch; 31274 } 31275 if (pointerType !== null) { 31276 currentPointerType = pointerType; 31277 if (thisEventKey.startsWith("Touch") && pointerType === PointerTypes.Touch || thisEventKey.startsWith("Mouse") && pointerType === PointerTypes.Mouse) { 31278 pointerType = null; 31279 } 31280 } else if (MouseInteractions[eventKey] === MouseInteractions.Click) { 31281 pointerType = currentPointerType; 31282 currentPointerType = null; 31283 } 31284 const e2 = legacy_isTouchEvent(event) ? event.changedTouches[0] : event; 31285 if (!e2) { 31286 return; 31287 } 31288 const id = mirror2.getId(target); 31289 const { clientX, clientY } = e2; 31290 callbackWrapper(mouseInteractionCb)({ 31291 type: MouseInteractions[thisEventKey], 31292 id, 31293 x: clientX, 31294 y: clientY, 31295 ...pointerType !== null && { 31296 pointerType 31297 } 31298 }); 31299 }; 31300 }; 31301 Object.keys(MouseInteractions).filter((key)=>Number.isNaN(Number(key)) && !key.endsWith("_Departed") && disableMap[key] !== false).forEach((eventKey)=>{ 31302 let eventName = toLowerCase(eventKey); 31303 const handler = getHandler(eventKey); 31304 if (window.PointerEvent) { 31305 switch(MouseInteractions[eventKey]){ 31306 case MouseInteractions.MouseDown: 31307 case MouseInteractions.MouseUp: 31308 eventName = eventName.replace("mouse", "pointer"); 31309 break; 31310 case MouseInteractions.TouchStart: 31311 case MouseInteractions.TouchEnd: 31312 return; 31313 } 31314 } 31315 handlers.push(on1(eventName, handler, doc)); 31316 }); 31317 return callbackWrapper(()=>{ 31318 handlers.forEach((h)=>h()); 31319 }); 31320} 31321function initScrollObserver(param) { 31322 let { scrollCb, doc, mirror: mirror2, blockClass, blockSelector, unblockSelector, sampling } = param; 31323 const updatePosition = callbackWrapper(throttle$1(callbackWrapper((evt)=>{ 31324 const target = getEventTarget1(evt); 31325 if (!target || isBlocked(target, blockClass, blockSelector, unblockSelector, true)) { 31326 return; 31327 } 31328 const id = mirror2.getId(target); 31329 if (target === doc && doc.defaultView) { 31330 const scrollLeftTop = getWindowScroll(doc.defaultView); 31331 scrollCb({ 31332 id, 31333 x: scrollLeftTop.left, 31334 y: scrollLeftTop.top 31335 }); 31336 } else { 31337 scrollCb({ 31338 id, 31339 x: target.scrollLeft, 31340 y: target.scrollTop 31341 }); 31342 } 31343 }), sampling.scroll || 100)); 31344 return on1("scroll", updatePosition, doc); 31345} 31346function initViewportResizeObserver(param, param1) { 31347 let { viewportResizeCb } = param, { win } = param1; 31348 let lastH = -1; 31349 let lastW = -1; 31350 const updateDimension = callbackWrapper(throttle$1(callbackWrapper(()=>{ 31351 const height = getWindowHeight(); 31352 const width = getWindowWidth(); 31353 if (lastH !== height || lastW !== width) { 31354 viewportResizeCb({ 31355 width: Number(width), 31356 height: Number(height) 31357 }); 31358 lastH = height; 31359 lastW = width; 31360 } 31361 }), 200)); 31362 return on1("resize", updateDimension, win); 31363} 31364const INPUT_TAGS = [ 31365 "INPUT", 31366 "TEXTAREA", 31367 "SELECT" 31368]; 31369const lastInputValueMap = /* @__PURE__ */ new WeakMap(); 31370function initInputObserver(param) { 31371 let { inputCb, doc, mirror: mirror2, blockClass, blockSelector, unblockSelector, ignoreClass, ignoreSelector, maskInputOptions, maskInputFn, sampling, userTriggeredOnInput, maskTextClass, unmaskTextClass, maskTextSelector, unmaskTextSelector } = param; 31372 function eventHandler(event) { 31373 let target = getEventTarget1(event); 31374 const userTriggered = event.isTrusted; 31375 const tagName = target && toUpperCase(target.tagName); 31376 if (tagName === "OPTION") target = target.parentElement; 31377 if (!target || !tagName || INPUT_TAGS.indexOf(tagName) < 0 || isBlocked(target, blockClass, blockSelector, unblockSelector, true)) { 31378 return; 31379 } 31380 const el = target; 31381 if (el.classList.contains(ignoreClass) || ignoreSelector && el.matches(ignoreSelector)) { 31382 return; 31383 } 31384 const type = getInputType(target); 31385 let text = getInputValue(el, tagName, type); 31386 let isChecked = false; 31387 const isInputMasked = shouldMaskInput({ 31388 maskInputOptions, 31389 tagName, 31390 type 31391 }); 31392 const forceMask = needMaskingText(target, maskTextClass, maskTextSelector, unmaskTextClass, unmaskTextSelector, isInputMasked); 31393 if (type === "radio" || type === "checkbox") { 31394 isChecked = target.checked; 31395 } 31396 text = maskInputValue({ 31397 isMasked: forceMask, 31398 element: target, 31399 value: text, 31400 maskInputFn 31401 }); 31402 cbWithDedup(target, userTriggeredOnInput ? { 31403 text, 31404 isChecked, 31405 userTriggered 31406 } : { 31407 text, 31408 isChecked 31409 }); 31410 const name = target.name; 31411 if (type === "radio" && name && isChecked) { 31412 doc.querySelectorAll('input[type="radio"][name="'.concat(name, '"]')).forEach((el2)=>{ 31413 if (el2 !== target) { 31414 const text2 = maskInputValue({ 31415 // share mask behavior of `target` 31416 isMasked: forceMask, 31417 element: el2, 31418 value: getInputValue(el2, tagName, type), 31419 maskInputFn 31420 }); 31421 cbWithDedup(el2, userTriggeredOnInput ? { 31422 text: text2, 31423 isChecked: !isChecked, 31424 userTriggered: false 31425 } : { 31426 text: text2, 31427 isChecked: !isChecked 31428 }); 31429 } 31430 }); 31431 } 31432 } 31433 function cbWithDedup(target, v2) { 31434 const lastInputValue = lastInputValueMap.get(target); 31435 if (!lastInputValue || lastInputValue.text !== v2.text || lastInputValue.isChecked !== v2.isChecked) { 31436 lastInputValueMap.set(target, v2); 31437 const id = mirror2.getId(target); 31438 callbackWrapper(inputCb)({ 31439 ...v2, 31440 id 31441 }); 31442 } 31443 } 31444 const events = sampling.input === "last" ? [ 31445 "change" 31446 ] : [ 31447 "input", 31448 "change" 31449 ]; 31450 const handlers = events.map((eventName)=>on1(eventName, callbackWrapper(eventHandler), doc)); 31451 const currentWindow = doc.defaultView; 31452 if (!currentWindow) { 31453 return ()=>{ 31454 handlers.forEach((h)=>h()); 31455 }; 31456 } 31457 const propertyDescriptor = currentWindow.Object.getOwnPropertyDescriptor(currentWindow.HTMLInputElement.prototype, "value"); 31458 const hookProperties = [ 31459 [ 31460 currentWindow.HTMLInputElement.prototype, 31461 "value" 31462 ], 31463 [ 31464 currentWindow.HTMLInputElement.prototype, 31465 "checked" 31466 ], 31467 [ 31468 currentWindow.HTMLSelectElement.prototype, 31469 "value" 31470 ], 31471 [ 31472 currentWindow.HTMLTextAreaElement.prototype, 31473 "value" 31474 ], 31475 // Some UI library use selectedIndex to set select value 31476 [ 31477 currentWindow.HTMLSelectElement.prototype, 31478 "selectedIndex" 31479 ], 31480 [ 31481 currentWindow.HTMLOptionElement.prototype, 31482 "selected" 31483 ] 31484 ]; 31485 if (propertyDescriptor && propertyDescriptor.set) { 31486 handlers.push(...hookProperties.map((p)=>hookSetter(p[0], p[1], { 31487 set () { 31488 callbackWrapper(eventHandler)({ 31489 target: this, 31490 isTrusted: false 31491 }); 31492 } 31493 }, false, currentWindow))); 31494 } 31495 return callbackWrapper(()=>{ 31496 handlers.forEach((h)=>h()); 31497 }); 31498} 31499function getNestedCSSRulePositions(rule) { 31500 const positions = []; 31501 function recurse(childRule, pos) { 31502 if (hasNestedCSSRule("CSSGroupingRule") && childRule.parentRule instanceof CSSGroupingRule || hasNestedCSSRule("CSSMediaRule") && childRule.parentRule instanceof CSSMediaRule || hasNestedCSSRule("CSSSupportsRule") && childRule.parentRule instanceof CSSSupportsRule || hasNestedCSSRule("CSSConditionRule") && childRule.parentRule instanceof CSSConditionRule) { 31503 const rules2 = Array.from(childRule.parentRule.cssRules); 31504 const index = rules2.indexOf(childRule); 31505 pos.unshift(index); 31506 } else if (childRule.parentStyleSheet) { 31507 const rules2 = Array.from(childRule.parentStyleSheet.cssRules); 31508 const index = rules2.indexOf(childRule); 31509 pos.unshift(index); 31510 } 31511 return pos; 31512 } 31513 return recurse(rule, positions); 31514} 31515function getIdAndStyleId(sheet, mirror2, styleMirror) { 31516 let id, styleId; 31517 if (!sheet) return {}; 31518 if (sheet.ownerNode) id = mirror2.getId(sheet.ownerNode); 31519 else styleId = styleMirror.getId(sheet); 31520 return { 31521 styleId, 31522 id 31523 }; 31524} 31525function initStyleSheetObserver(param, param1) { 31526 let { styleSheetRuleCb, mirror: mirror2, stylesheetManager } = param, { win } = param1; 31527 if (!win.CSSStyleSheet || !win.CSSStyleSheet.prototype) { 31528 return ()=>{}; 31529 } 31530 const insertRule = win.CSSStyleSheet.prototype.insertRule; 31531 win.CSSStyleSheet.prototype.insertRule = new Proxy(insertRule, { 31532 apply: callbackWrapper((target, thisArg, argumentsList)=>{ 31533 const [rule, index] = argumentsList; 31534 const { id, styleId } = getIdAndStyleId(thisArg, mirror2, stylesheetManager.styleMirror); 31535 if (id && id !== -1 || styleId && styleId !== -1) { 31536 styleSheetRuleCb({ 31537 id, 31538 styleId, 31539 adds: [ 31540 { 31541 rule, 31542 index 31543 } 31544 ] 31545 }); 31546 } 31547 return target.apply(thisArg, argumentsList); 31548 }) 31549 }); 31550 const deleteRule = win.CSSStyleSheet.prototype.deleteRule; 31551 win.CSSStyleSheet.prototype.deleteRule = new Proxy(deleteRule, { 31552 apply: callbackWrapper((target, thisArg, argumentsList)=>{ 31553 const [index] = argumentsList; 31554 const { id, styleId } = getIdAndStyleId(thisArg, mirror2, stylesheetManager.styleMirror); 31555 if (id && id !== -1 || styleId && styleId !== -1) { 31556 styleSheetRuleCb({ 31557 id, 31558 styleId, 31559 removes: [ 31560 { 31561 index 31562 } 31563 ] 31564 }); 31565 } 31566 return target.apply(thisArg, argumentsList); 31567 }) 31568 }); 31569 let replace; 31570 if (win.CSSStyleSheet.prototype.replace) { 31571 replace = win.CSSStyleSheet.prototype.replace; 31572 win.CSSStyleSheet.prototype.replace = new Proxy(replace, { 31573 apply: callbackWrapper((target, thisArg, argumentsList)=>{ 31574 const [text] = argumentsList; 31575 const { id, styleId } = getIdAndStyleId(thisArg, mirror2, stylesheetManager.styleMirror); 31576 if (id && id !== -1 || styleId && styleId !== -1) { 31577 styleSheetRuleCb({ 31578 id, 31579 styleId, 31580 replace: text 31581 }); 31582 } 31583 return target.apply(thisArg, argumentsList); 31584 }) 31585 }); 31586 } 31587 let replaceSync; 31588 if (win.CSSStyleSheet.prototype.replaceSync) { 31589 replaceSync = win.CSSStyleSheet.prototype.replaceSync; 31590 win.CSSStyleSheet.prototype.replaceSync = new Proxy(replaceSync, { 31591 apply: callbackWrapper((target, thisArg, argumentsList)=>{ 31592 const [text] = argumentsList; 31593 const { id, styleId } = getIdAndStyleId(thisArg, mirror2, stylesheetManager.styleMirror); 31594 if (id && id !== -1 || styleId && styleId !== -1) { 31595 styleSheetRuleCb({ 31596 id, 31597 styleId, 31598 replaceSync: text 31599 }); 31600 } 31601 return target.apply(thisArg, argumentsList); 31602 }) 31603 }); 31604 } 31605 const supportedNestedCSSRuleTypes = {}; 31606 if (canMonkeyPatchNestedCSSRule("CSSGroupingRule")) { 31607 supportedNestedCSSRuleTypes.CSSGroupingRule = win.CSSGroupingRule; 31608 } else { 31609 if (canMonkeyPatchNestedCSSRule("CSSMediaRule")) { 31610 supportedNestedCSSRuleTypes.CSSMediaRule = win.CSSMediaRule; 31611 } 31612 if (canMonkeyPatchNestedCSSRule("CSSConditionRule")) { 31613 supportedNestedCSSRuleTypes.CSSConditionRule = win.CSSConditionRule; 31614 } 31615 if (canMonkeyPatchNestedCSSRule("CSSSupportsRule")) { 31616 supportedNestedCSSRuleTypes.CSSSupportsRule = win.CSSSupportsRule; 31617 } 31618 } 31619 const unmodifiedFunctions = {};
31620 Object.entries(supportedNestedCSSRuleTypes).forEach((param)=>{ 31621 let [typeKey, type] = param; 31622 unmodifiedFunctions[typeKey] = { 31623 // eslint-disable-next-line @typescript-eslint/unbound-method 31624 insertRule: type.prototype.insertRule, 31625 // eslint-disable-next-line @typescript-eslint/unbound-method 31626 deleteRule: type.prototype.deleteRule 31627 }; 31628 type.prototype.insertRule = new Proxy(unmodifiedFunctions[typeKey].insertRule, { 31629 apply: callbackWrapper((target, thisArg, argumentsList)=>{ 31630 const [rule, index] = argumentsList; 31631 const { id, styleId } = getIdAndStyleId(thisArg.parentStyleSheet, mirror2, stylesheetManager.styleMirror); 31632 if (id && id !== -1 || styleId && styleId !== -1) { 31633 styleSheetRuleCb({ 31634 id, 31635 styleId, 31636 adds: [ 31637 { 31638 rule, 31639 index: [ 31640 ...getNestedCSSRulePositions(thisArg), 31641 index || 0 31642 ] 31643 } 31644 ] 31645 }); 31646 } 31647 return target.apply(thisArg, argumentsList); 31648 }) 31649 }); 31650 type.prototype.deleteRule = new Proxy(unmodifiedFunctions[typeKey].deleteRule, { 31651 apply: callbackWrapper((target, thisArg, argumentsList)=>{ 31652 const [index] = argumentsList; 31653 const { id, styleId } = getIdAndStyleId(thisArg.parentStyleSheet, mirror2, stylesheetManager.styleMirror); 31654 if (id && id !== -1 || styleId && styleId !== -1) { 31655 styleSheetRuleCb({ 31656 id, 31657 styleId, 31658 removes: [ 31659 { 31660 index: [ 31661 ...getNestedCSSRulePositions(thisArg), 31662 index 31663 ] 31664 } 31665 ] 31666 }); 31667 } 31668 return target.apply(thisArg, argumentsList); 31669 }) 31670 }); 31671 }); 31672 return callbackWrapper(()=>{ 31673 win.CSSStyleSheet.prototype.insertRule = insertRule; 31674 win.CSSStyleSheet.prototype.deleteRule = deleteRule; 31675 replace && (win.CSSStyleSheet.prototype.replace = replace); 31676 replaceSync && (win.CSSStyleSheet.prototype.replaceSync = replaceSync); 31677 Object.entries(supportedNestedCSSRuleTypes).forEach((param)=>{ 31678 let [typeKey, type] = param; 31679 type.prototype.insertRule = unmodifiedFunctions[typeKey].insertRule; 31680 type.prototype.deleteRule = unmodifiedFunctions[typeKey].deleteRule; 31681 }); 31682 }); 31683} 31684function initAdoptedStyleSheetObserver(param, host) { 31685 let { mirror: mirror2, stylesheetManager } = param; 31686 var _host_defaultView, _host_ownerDocument_defaultView, _host_ownerDocument; 31687 let hostId = null; 31688 if (host.nodeName === "#document") hostId = mirror2.getId(host); 31689 else hostId = mirror2.getId(host.host); 31690 const patchTarget = host.nodeName === "#document" ? (_host_defaultView = host.defaultView) === null || _host_defaultView === void 0 ? void 0 : _host_defaultView.Document : (_host_ownerDocument = host.ownerDocument) === null || _host_ownerDocument === void 0 ? void 0 : (_host_ownerDocument_defaultView = _host_ownerDocument.defaultView) === null || _host_ownerDocument_defaultView === void 0 ? void 0 : _host_ownerDocument_defaultView.ShadowRoot; 31691 const originalPropertyDescriptor = (patchTarget === null || patchTarget === void 0 ? void 0 : patchTarget.prototype) ? Object.getOwnPropertyDescriptor(patchTarget === null || patchTarget === void 0 ? void 0 : patchTarget.prototype, "adoptedStyleSheets") : void 0; 31692 if (hostId === null || hostId === -1 || !patchTarget || !originalPropertyDescriptor) return ()=>{};
vendor: 5,166 bytes, lines 31693-31800
31693 Object.defineProperty(host, "adoptedStyleSheets", { 31694 configurable: originalPropertyDescriptor.configurable, 31695 enumerable: originalPropertyDescriptor.enumerable, 31696 get () { 31697 var _originalPropertyDescriptor_get; 31698 return (_originalPropertyDescriptor_get = originalPropertyDescriptor.get) === null || _originalPropertyDescriptor_get === void 0 ? void 0 : _originalPropertyDescriptor_get.call(this); 31699 }, 31700 set (sheets) { 31701 var _originalPropertyDescriptor_set; 31702 const result = (_originalPropertyDescriptor_set = originalPropertyDescriptor.set) === null || _originalPropertyDescriptor_set === void 0 ? void 0 : _originalPropertyDescriptor_set.call(this, sheets); 31703 if (hostId !== null && hostId !== -1) { 31704 try { 31705 stylesheetManager.adoptStyleSheets(sheets, hostId); 31706 } catch (e2) {} 31707 } 31708 return result; 31709 } 31710 }); 31711 return callbackWrapper(()=>{ 31712 Object.defineProperty(host, "adoptedStyleSheets", { 31713 configurable: originalPropertyDescriptor.configurable, 31714 enumerable: originalPropertyDescriptor.enumerable, 31715 // eslint-disable-next-line @typescript-eslint/unbound-method 31716 get: originalPropertyDescriptor.get, 31717 // eslint-disable-next-line @typescript-eslint/unbound-method 31718 set: originalPropertyDescriptor.set 31719 }); 31720 }); 31721} 31722function initStyleDeclarationObserver(param, param1) { 31723 let { styleDeclarationCb, mirror: mirror2, ignoreCSSAttributes, stylesheetManager } = param, { win } = param1; 31724 const setProperty = win.CSSStyleDeclaration.prototype.setProperty; 31725 win.CSSStyleDeclaration.prototype.setProperty = new Proxy(setProperty, { 31726 apply: callbackWrapper((target, thisArg, argumentsList)=>{ 31727 var _thisArg_parentRule; 31728 const [property, value, priority] = argumentsList; 31729 if (ignoreCSSAttributes.has(property)) { 31730 return setProperty.apply(thisArg, [ 31731 property, 31732 value, 31733 priority 31734 ]); 31735 } 31736 const { id, styleId } = getIdAndStyleId((_thisArg_parentRule = thisArg.parentRule) === null || _thisArg_parentRule === void 0 ? void 0 : _thisArg_parentRule.parentStyleSheet, mirror2, stylesheetManager.styleMirror); 31737 if (id && id !== -1 || styleId && styleId !== -1) { 31738 styleDeclarationCb({ 31739 id, 31740 styleId, 31741 set: { 31742 property, 31743 value, 31744 priority 31745 }, 31746 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion 31747 index: getNestedCSSRulePositions(thisArg.parentRule) 31748 }); 31749 } 31750 return target.apply(thisArg, argumentsList); 31751 }) 31752 }); 31753 const removeProperty = win.CSSStyleDeclaration.prototype.removeProperty; 31754 win.CSSStyleDeclaration.prototype.removeProperty = new Proxy(removeProperty, { 31755 apply: callbackWrapper((target, thisArg, argumentsList)=>{ 31756 var _thisArg_parentRule; 31757 const [property] = argumentsList; 31758 if (ignoreCSSAttributes.has(property)) { 31759 return removeProperty.apply(thisArg, [ 31760 property 31761 ]); 31762 } 31763 const { id, styleId } = getIdAndStyleId((_thisArg_parentRule = thisArg.parentRule) === null || _thisArg_parentRule === void 0 ? void 0 : _thisArg_parentRule.parentStyleSheet, mirror2, stylesheetManager.styleMirror); 31764 if (id && id !== -1 || styleId && styleId !== -1) { 31765 styleDeclarationCb({ 31766 id, 31767 styleId, 31768 remove: { 31769 property 31770 }, 31771 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion 31772 index: getNestedCSSRulePositions(thisArg.parentRule) 31773 }); 31774 } 31775 return target.apply(thisArg, argumentsList); 31776 }) 31777 }); 31778 return callbackWrapper(()=>{ 31779 win.CSSStyleDeclaration.prototype.setProperty = setProperty; 31780 win.CSSStyleDeclaration.prototype.removeProperty = removeProperty; 31781 }); 31782} 31783function initMediaInteractionObserver(param) { 31784 let { mediaInteractionCb, blockClass, blockSelector, unblockSelector, mirror: mirror2, sampling, doc } = param; 31785 const handler = callbackWrapper((type)=>throttle$1(callbackWrapper((event)=>{ 31786 const target = getEventTarget1(event); 31787 if (!target || isBlocked(target, blockClass, blockSelector, unblockSelector, true)) { 31788 return; 31789 } 31790 const { currentTime, volume, muted, playbackRate } = target; 31791 mediaInteractionCb({ 31792 type, 31793 id: mirror2.getId(target), 31794 currentTime, 31795 volume, 31796 muted, 31797 playbackRate 31798 }); 31799 }), sampling.media || 500)); 31800 const handlers = [
vendor: 14,174 bytes, lines 31801-32148
31801 on1("play", handler(MediaInteractions.Play), doc), 31802 on1("pause", handler(MediaInteractions.Pause), doc), 31803 on1("seeked", handler(MediaInteractions.Seeked), doc), 31804 on1("volumechange", handler(MediaInteractions.VolumeChange), doc), 31805 on1("ratechange", handler(MediaInteractions.RateChange), doc) 31806 ]; 31807 return callbackWrapper(()=>{ 31808 handlers.forEach((h)=>h()); 31809 }); 31810} 31811function initFontObserver(param) { 31812 let { fontCb, doc } = param; 31813 const win = doc.defaultView; 31814 if (!win) { 31815 return ()=>{}; 31816 } 31817 const handlers = []; 31818 const fontMap = /* @__PURE__ */ new WeakMap(); 31819 const originalFontFace = win.FontFace; 31820 win.FontFace = function FontFace2(family, source, descriptors) { 31821 const fontFace = new originalFontFace(family, source, descriptors); 31822 fontMap.set(fontFace, { 31823 family, 31824 buffer: typeof source !== "string", 31825 descriptors, 31826 fontSource: typeof source === "string" ? source : JSON.stringify(Array.from(new Uint8Array(source))) 31827 }); 31828 return fontFace; 31829 }; 31830 const restoreHandler = patch(doc.fonts, "add", function(original) { 31831 return function(fontFace) { 31832 setTimeout$2(callbackWrapper(()=>{ 31833 const p = fontMap.get(fontFace); 31834 if (p) { 31835 fontCb(p); 31836 fontMap.delete(fontFace); 31837 } 31838 }), 0); 31839 return original.apply(this, [ 31840 fontFace 31841 ]); 31842 }; 31843 }); 31844 handlers.push(()=>{ 31845 win.FontFace = originalFontFace; 31846 }); 31847 handlers.push(restoreHandler); 31848 return callbackWrapper(()=>{ 31849 handlers.forEach((h)=>h()); 31850 }); 31851} 31852function initSelectionObserver(param) { 31853 const { doc, mirror: mirror2, blockClass, blockSelector, unblockSelector, selectionCb } = param; 31854 let collapsed = true; 31855 const updateSelection = callbackWrapper(()=>{ 31856 const selection = doc.getSelection(); 31857 if (!selection || collapsed && (selection === null || selection === void 0 ? void 0 : selection.isCollapsed)) return; 31858 collapsed = selection.isCollapsed || false; 31859 const ranges = []; 31860 const count = selection.rangeCount || 0; 31861 for(let i2 = 0; i2 < count; i2++){ 31862 const range = selection.getRangeAt(i2); 31863 const { startContainer, startOffset, endContainer, endOffset } = range; 31864 const blocked = isBlocked(startContainer, blockClass, blockSelector, unblockSelector, true) || isBlocked(endContainer, blockClass, blockSelector, unblockSelector, true); 31865 if (blocked) continue; 31866 ranges.push({ 31867 start: mirror2.getId(startContainer), 31868 startOffset, 31869 end: mirror2.getId(endContainer), 31870 endOffset 31871 }); 31872 } 31873 selectionCb({ 31874 ranges 31875 }); 31876 }); 31877 updateSelection(); 31878 return on1("selectionchange", updateSelection); 31879} 31880function initCustomElementObserver(param) { 31881 let { doc, customElementCb } = param; 31882 const win = doc.defaultView; 31883 if (!win || !win.customElements) return ()=>{}; 31884 const restoreHandler = patch(win.customElements, "define", function(original) { 31885 return function(name, constructor, options) { 31886 try { 31887 customElementCb({ 31888 define: { 31889 name 31890 } 31891 }); 31892 } catch (e2) {} 31893 return original.apply(this, [ 31894 name, 31895 constructor, 31896 options 31897 ]); 31898 }; 31899 }); 31900 return restoreHandler; 31901} 31902function initObservers(o2) { 31903 let _hooks = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}; 31904 const currentWindow = o2.doc.defaultView; 31905 if (!currentWindow) { 31906 return ()=>{}; 31907 } 31908 let mutationObserver; 31909 if (o2.recordDOM) { 31910 mutationObserver = initMutationObserver(o2, o2.doc); 31911 } 31912 const mousemoveHandler = initMoveObserver(o2); 31913 const mouseInteractionHandler = initMouseInteractionObserver(o2); 31914 const scrollHandler = initScrollObserver(o2); 31915 const viewportResizeHandler = initViewportResizeObserver(o2, { 31916 win: currentWindow 31917 }); 31918 const inputHandler = initInputObserver(o2); 31919 const mediaInteractionHandler = initMediaInteractionObserver(o2); 31920 let styleSheetObserver = ()=>{}; 31921 let adoptedStyleSheetObserver = ()=>{}; 31922 let styleDeclarationObserver = ()=>{}; 31923 let fontObserver = ()=>{}; 31924 if (o2.recordDOM) { 31925 styleSheetObserver = initStyleSheetObserver(o2, { 31926 win: currentWindow 31927 }); 31928 adoptedStyleSheetObserver = initAdoptedStyleSheetObserver(o2, o2.doc); 31929 styleDeclarationObserver = initStyleDeclarationObserver(o2, { 31930 win: currentWindow 31931 }); 31932 if (o2.collectFonts) { 31933 fontObserver = initFontObserver(o2); 31934 } 31935 } 31936 const selectionObserver = initSelectionObserver(o2); 31937 const customElementObserver = initCustomElementObserver(o2); 31938 const pluginHandlers = []; 31939 for (const plugin of o2.plugins){ 31940 pluginHandlers.push(plugin.observer(plugin.callback, currentWindow, plugin.options)); 31941 } 31942 return callbackWrapper(()=>{ 31943 mutationBuffers.forEach((b)=>b.reset()); 31944 mutationObserver === null || mutationObserver === void 0 ? void 0 : mutationObserver.disconnect(); 31945 mousemoveHandler(); 31946 mouseInteractionHandler(); 31947 scrollHandler(); 31948 viewportResizeHandler(); 31949 inputHandler(); 31950 mediaInteractionHandler(); 31951 styleSheetObserver(); 31952 adoptedStyleSheetObserver(); 31953 styleDeclarationObserver(); 31954 fontObserver(); 31955 selectionObserver(); 31956 customElementObserver(); 31957 pluginHandlers.forEach((h)=>h()); 31958 }); 31959} 31960function hasNestedCSSRule(prop) { 31961 return typeof window[prop] !== "undefined"; 31962} 31963function canMonkeyPatchNestedCSSRule(prop) { 31964 return Boolean(typeof window[prop] !== "undefined" && // Note: Generally, this check _shouldn't_ be necessary 31965 // However, in some scenarios (e.g. jsdom) this can sometimes fail, so we check for it here 31966 window[prop].prototype && "insertRule" in window[prop].prototype && "deleteRule" in window[prop].prototype); 31967} 31968class CrossOriginIframeMirror { 31969 getId(iframe, remoteId, idToRemoteMap, remoteToIdMap) { 31970 const idToRemoteIdMap = idToRemoteMap || this.getIdToRemoteIdMap(iframe); 31971 const remoteIdToIdMap = remoteToIdMap || this.getRemoteIdToIdMap(iframe); 31972 let id = idToRemoteIdMap.get(remoteId); 31973 if (!id) { 31974 id = this.generateIdFn(); 31975 idToRemoteIdMap.set(remoteId, id); 31976 remoteIdToIdMap.set(id, remoteId); 31977 } 31978 return id; 31979 } 31980 getIds(iframe, remoteId) { 31981 const idToRemoteIdMap = this.getIdToRemoteIdMap(iframe); 31982 const remoteIdToIdMap = this.getRemoteIdToIdMap(iframe); 31983 return remoteId.map((id)=>this.getId(iframe, id, idToRemoteIdMap, remoteIdToIdMap)); 31984 } 31985 getRemoteId(iframe, id, map) { 31986 const remoteIdToIdMap = map || this.getRemoteIdToIdMap(iframe); 31987 if (typeof id !== "number") return id; 31988 const remoteId = remoteIdToIdMap.get(id); 31989 if (!remoteId) return -1; 31990 return remoteId; 31991 } 31992 getRemoteIds(iframe, ids) { 31993 const remoteIdToIdMap = this.getRemoteIdToIdMap(iframe); 31994 return ids.map((id)=>this.getRemoteId(iframe, id, remoteIdToIdMap)); 31995 } 31996 reset(iframe) { 31997 if (!iframe) { 31998 this.iframeIdToRemoteIdMap = /* @__PURE__ */ new WeakMap(); 31999 this.iframeRemoteIdToIdMap = /* @__PURE__ */ new WeakMap(); 32000 return; 32001 } 32002 this.iframeIdToRemoteIdMap.delete(iframe); 32003 this.iframeRemoteIdToIdMap.delete(iframe); 32004 } 32005 getIdToRemoteIdMap(iframe) { 32006 let idToRemoteIdMap = this.iframeIdToRemoteIdMap.get(iframe); 32007 if (!idToRemoteIdMap) { 32008 idToRemoteIdMap = /* @__PURE__ */ new Map(); 32009 this.iframeIdToRemoteIdMap.set(iframe, idToRemoteIdMap); 32010 } 32011 return idToRemoteIdMap; 32012 } 32013 getRemoteIdToIdMap(iframe) { 32014 let remoteIdToIdMap = this.iframeRemoteIdToIdMap.get(iframe); 32015 if (!remoteIdToIdMap) { 32016 remoteIdToIdMap = /* @__PURE__ */ new Map(); 32017 this.iframeRemoteIdToIdMap.set(iframe, remoteIdToIdMap); 32018 } 32019 return remoteIdToIdMap; 32020 } 32021 constructor(generateIdFn){ 32022 this.generateIdFn = generateIdFn; 32023 this.iframeIdToRemoteIdMap = /* @__PURE__ */ new WeakMap(); 32024 this.iframeRemoteIdToIdMap = /* @__PURE__ */ new WeakMap(); 32025 } 32026} 32027class IframeManagerNoop { 32028 addIframe() {} 32029 addLoadListener() {} 32030 attachIframe() {} 32031 constructor(){ 32032 this.crossOriginIframeMirror = new CrossOriginIframeMirror(genId); 32033 this.crossOriginIframeRootIdMap = /* @__PURE__ */ new WeakMap(); 32034 } 32035} 32036class IframeManager { 32037 addIframe(iframeEl) { 32038 this.iframes.set(iframeEl, true); 32039 const contentWindow = getIFrameContentWindow(iframeEl); 32040 if (contentWindow) this.crossOriginIframeMap.set(contentWindow, iframeEl); 32041 } 32042 addLoadListener(cb) { 32043 this.loadListener = cb; 32044 } 32045 attachIframe(iframeEl, childSn) { 32046 var _this_loadListener, _this; 32047 this.mutationCb({ 32048 adds: [ 32049 { 32050 parentId: this.mirror.getId(iframeEl), 32051 nextId: null, 32052 node: childSn 32053 } 32054 ], 32055 removes: [], 32056 texts: [], 32057 attributes: [], 32058 isAttachIframe: true 32059 }); 32060 if (this.recordCrossOriginIframes) { 32061 var _getIFrameContentWindow; 32062 (_getIFrameContentWindow = getIFrameContentWindow(iframeEl)) === null || _getIFrameContentWindow === void 0 ? void 0 : _getIFrameContentWindow.addEventListener("message", this.handleMessage.bind(this)); 32063 } 32064 (_this_loadListener = (_this = this).loadListener) === null || _this_loadListener === void 0 ? void 0 : _this_loadListener.call(_this, iframeEl); 32065 const iframeDoc = getIFrameContentDocument(iframeEl); 32066 if (iframeDoc && iframeDoc.adoptedStyleSheets && iframeDoc.adoptedStyleSheets.length > 0) this.stylesheetManager.adoptStyleSheets(iframeDoc.adoptedStyleSheets, this.mirror.getId(iframeDoc)); 32067 } 32068 handleMessage(message) { 32069 const crossOriginMessageEvent = message; 32070 if (crossOriginMessageEvent.data.type !== "rrweb" || // To filter out the rrweb messages which are forwarded by some sites. 32071 crossOriginMessageEvent.origin !== crossOriginMessageEvent.data.origin) return; 32072 const iframeSourceWindow = message.source; 32073 if (!iframeSourceWindow) return; 32074 const iframeEl = this.crossOriginIframeMap.get(message.source); 32075 if (!iframeEl) return; 32076 const transformedEvent = this.transformCrossOriginEvent(iframeEl, crossOriginMessageEvent.data.event); 32077 if (transformedEvent) this.wrappedEmit(transformedEvent, crossOriginMessageEvent.data.isCheckout); 32078 } 32079 transformCrossOriginEvent(iframeEl, e2) { 32080 switch(e2.type){ 32081 case EventType.FullSnapshot: 32082 { 32083 this.crossOriginIframeMirror.reset(iframeEl); 32084 this.crossOriginIframeStyleMirror.reset(iframeEl); 32085 this.replaceIdOnNode(e2.data.node, iframeEl); 32086 const rootId = e2.data.node.id; 32087 this.crossOriginIframeRootIdMap.set(iframeEl, rootId); 32088 this.patchRootIdOnNode(e2.data.node, rootId); 32089 return { 32090 timestamp: e2.timestamp, 32091 type: EventType.IncrementalSnapshot, 32092 data: { 32093 source: IncrementalSource.Mutation, 32094 adds: [ 32095 { 32096 parentId: this.mirror.getId(iframeEl), 32097 nextId: null, 32098 node: e2.data.node 32099 } 32100 ], 32101 removes: [], 32102 texts: [], 32103 attributes: [], 32104 isAttachIframe: true 32105 } 32106 }; 32107 } 32108 case EventType.Meta: 32109 case EventType.Load: 32110 case EventType.DomContentLoaded: 32111 { 32112 return false; 32113 } 32114 case EventType.Plugin: 32115 { 32116 return e2; 32117 } 32118 case EventType.Custom: 32119 { 32120 this.replaceIds(e2.data.payload, iframeEl, [ 32121 "id", 32122 "parentId", 32123 "previousId", 32124 "nextId" 32125 ]); 32126 return e2; 32127 } 32128 case EventType.IncrementalSnapshot: 32129 { 32130 switch(e2.data.source){ 32131 case IncrementalSource.Mutation: 32132 { 32133 e2.data.adds.forEach((n2)=>{ 32134 this.replaceIds(n2, iframeEl, [ 32135 "parentId", 32136 "nextId", 32137 "previousId" 32138 ]); 32139 this.replaceIdOnNode(n2.node, iframeEl); 32140 const rootId = this.crossOriginIframeRootIdMap.get(iframeEl); 32141 rootId && this.patchRootIdOnNode(n2.node, rootId); 32142 }); 32143 e2.data.removes.forEach((n2)=>{ 32144 this.replaceIds(n2, iframeEl, [ 32145 "parentId", 32146 "id" 32147 ]); 32148 });
vendor: 4,780 bytes, lines 32149-32255
32149 e2.data.attributes.forEach((n2)=>{ 32150 this.replaceIds(n2, iframeEl, [ 32151 "id" 32152 ]); 32153 }); 32154 e2.data.texts.forEach((n2)=>{ 32155 this.replaceIds(n2, iframeEl, [ 32156 "id" 32157 ]); 32158 }); 32159 return e2; 32160 } 32161 case IncrementalSource.Drag: 32162 case IncrementalSource.TouchMove: 32163 case IncrementalSource.MouseMove: 32164 { 32165 e2.data.positions.forEach((p)=>{ 32166 this.replaceIds(p, iframeEl, [ 32167 "id" 32168 ]); 32169 }); 32170 return e2; 32171 } 32172 case IncrementalSource.ViewportResize: 32173 { 32174 return false; 32175 } 32176 case IncrementalSource.MediaInteraction: 32177 case IncrementalSource.MouseInteraction: 32178 case IncrementalSource.Scroll: 32179 case IncrementalSource.CanvasMutation: 32180 case IncrementalSource.Input: 32181 { 32182 this.replaceIds(e2.data, iframeEl, [ 32183 "id" 32184 ]); 32185 return e2; 32186 } 32187 case IncrementalSource.StyleSheetRule: 32188 case IncrementalSource.StyleDeclaration: 32189 { 32190 this.replaceIds(e2.data, iframeEl, [ 32191 "id" 32192 ]); 32193 this.replaceStyleIds(e2.data, iframeEl, [ 32194 "styleId" 32195 ]); 32196 return e2; 32197 } 32198 case IncrementalSource.Font: 32199 { 32200 return e2; 32201 } 32202 case IncrementalSource.Selection: 32203 { 32204 e2.data.ranges.forEach((range)=>{ 32205 this.replaceIds(range, iframeEl, [ 32206 "start", 32207 "end" 32208 ]); 32209 }); 32210 return e2; 32211 } 32212 case IncrementalSource.AdoptedStyleSheet: 32213 { 32214 var _e2_data_styles; 32215 this.replaceIds(e2.data, iframeEl, [ 32216 "id" 32217 ]); 32218 this.replaceStyleIds(e2.data, iframeEl, [ 32219 "styleIds" 32220 ]); 32221 (_e2_data_styles = e2.data.styles) === null || _e2_data_styles === void 0 ? void 0 : _e2_data_styles.forEach((style)=>{ 32222 this.replaceStyleIds(style, iframeEl, [ 32223 "styleId" 32224 ]); 32225 }); 32226 return e2; 32227 } 32228 } 32229 } 32230 } 32231 return false; 32232 } 32233 replace(iframeMirror, obj, iframeEl, keys) { 32234 for (const key of keys){ 32235 if (!Array.isArray(obj[key]) && typeof obj[key] !== "number") continue; 32236 if (Array.isArray(obj[key])) { 32237 obj[key] = iframeMirror.getIds(iframeEl, obj[key]); 32238 } else { 32239 obj[key] = iframeMirror.getId(iframeEl, obj[key]); 32240 } 32241 } 32242 return obj; 32243 } 32244 replaceIds(obj, iframeEl, keys) { 32245 return this.replace(this.crossOriginIframeMirror, obj, iframeEl, keys); 32246 } 32247 replaceStyleIds(obj, iframeEl, keys) { 32248 return this.replace(this.crossOriginIframeStyleMirror, obj, iframeEl, keys); 32249 } 32250 replaceIdOnNode(node, iframeEl) { 32251 this.replaceIds(node, iframeEl, [ 32252 "id", 32253 "rootId" 32254 ]); 32255 if ("childNodes" in node) {
vendor: 6,904 bytes, lines 32256-32432
32256 node.childNodes.forEach((child)=>{ 32257 this.replaceIdOnNode(child, iframeEl); 32258 }); 32259 } 32260 } 32261 patchRootIdOnNode(node, rootId) { 32262 if (node.type !== NodeType$1.Document && !node.rootId) node.rootId = rootId; 32263 if ("childNodes" in node) { 32264 node.childNodes.forEach((child)=>{ 32265 this.patchRootIdOnNode(child, rootId); 32266 }); 32267 } 32268 } 32269 constructor(options){ 32270 this.iframes = /* @__PURE__ */ new WeakMap(); 32271 this.crossOriginIframeMap = /* @__PURE__ */ new WeakMap(); 32272 this.crossOriginIframeMirror = new CrossOriginIframeMirror(genId); 32273 this.crossOriginIframeRootIdMap = /* @__PURE__ */ new WeakMap(); 32274 this.mutationCb = options.mutationCb; 32275 this.wrappedEmit = options.wrappedEmit; 32276 this.stylesheetManager = options.stylesheetManager; 32277 this.recordCrossOriginIframes = options.recordCrossOriginIframes; 32278 this.crossOriginIframeStyleMirror = new CrossOriginIframeMirror(this.stylesheetManager.styleMirror.generateId.bind(this.stylesheetManager.styleMirror)); 32279 this.mirror = options.mirror; 32280 if (this.recordCrossOriginIframes) { 32281 window.addEventListener("message", this.handleMessage.bind(this)); 32282 } 32283 } 32284} 32285class ShadowDomManagerNoop { 32286 init() {} 32287 addShadowRoot() {} 32288 observeAttachShadow() {} 32289 reset() {} 32290} 32291class ShadowDomManager { 32292 init() { 32293 this.reset(); 32294 this.patchAttachShadow(Element, document); 32295 } 32296 addShadowRoot(shadowRoot, doc) { 32297 if (!isNativeShadowDom(shadowRoot)) return; 32298 if (this.shadowDoms.has(shadowRoot)) return; 32299 this.shadowDoms.add(shadowRoot); 32300 this.bypassOptions.canvasManager.addShadowRoot(shadowRoot); 32301 const observer = initMutationObserver({ 32302 ...this.bypassOptions, 32303 doc, 32304 mutationCb: this.mutationCb, 32305 mirror: this.mirror, 32306 shadowDomManager: this 32307 }, shadowRoot); 32308 this.restoreHandlers.push(()=>observer.disconnect()); 32309 this.restoreHandlers.push(initScrollObserver({ 32310 ...this.bypassOptions, 32311 scrollCb: this.scrollCb, 32312 // https://gist.github.com/praveenpuglia/0832da687ed5a5d7a0907046c9ef1813 32313 // scroll is not allowed to pass the boundary, so we need to listen the shadow document 32314 doc: shadowRoot, 32315 mirror: this.mirror 32316 })); 32317 setTimeout$2(()=>{ 32318 if (shadowRoot.adoptedStyleSheets && shadowRoot.adoptedStyleSheets.length > 0) this.bypassOptions.stylesheetManager.adoptStyleSheets(shadowRoot.adoptedStyleSheets, this.mirror.getId(shadowRoot.host)); 32319 this.restoreHandlers.push(initAdoptedStyleSheetObserver({ 32320 mirror: this.mirror, 32321 stylesheetManager: this.bypassOptions.stylesheetManager 32322 }, shadowRoot)); 32323 }, 0); 32324 } 32325 /** 32326 * Monkey patch 'attachShadow' of an IFrameElement to observe newly added shadow doms. 32327 */ observeAttachShadow(iframeElement) { 32328 const iframeDoc = getIFrameContentDocument(iframeElement); 32329 const iframeWindow = getIFrameContentWindow(iframeElement); 32330 if (!iframeDoc || !iframeWindow) return; 32331 this.patchAttachShadow(iframeWindow.Element, iframeDoc); 32332 } 32333 /** 32334 * Patch 'attachShadow' to observe newly added shadow doms. 32335 */ patchAttachShadow(element, doc) { 32336 const manager = this; 32337 this.restoreHandlers.push(patch(element.prototype, "attachShadow", function(original) { 32338 return function(option) { 32339 const shadowRoot = original.call(this, option); 32340 if (this.shadowRoot && inDom(this)) manager.addShadowRoot(this.shadowRoot, doc); 32341 return shadowRoot; 32342 }; 32343 })); 32344 } 32345 reset() { 32346 this.restoreHandlers.forEach((handler)=>{ 32347 try { 32348 handler(); 32349 } catch (e2) {} 32350 }); 32351 this.restoreHandlers = []; 32352 this.shadowDoms = /* @__PURE__ */ new WeakSet(); 32353 this.bypassOptions.canvasManager.resetShadowRoots(); 32354 } 32355 constructor(options){ 32356 this.shadowDoms = /* @__PURE__ */ new WeakSet(); 32357 this.restoreHandlers = []; 32358 this.mutationCb = options.mutationCb; 32359 this.scrollCb = options.scrollCb; 32360 this.bypassOptions = options.bypassOptions; 32361 this.mirror = options.mirror; 32362 this.init(); 32363 } 32364} 32365class StylesheetManager { 32366 attachLinkElement(linkEl, childSn) { 32367 if ("_cssText" in childSn.attributes) this.mutationCb({ 32368 adds: [], 32369 removes: [], 32370 texts: [], 32371 attributes: [ 32372 { 32373 id: childSn.id, 32374 attributes: childSn.attributes 32375 } 32376 ] 32377 }); 32378 this.trackLinkElement(linkEl); 32379 } 32380 trackLinkElement(linkEl) { 32381 if (this.trackedLinkElements.has(linkEl)) return; 32382 this.trackedLinkElements.add(linkEl); 32383 this.trackStylesheetInLinkElement(linkEl); 32384 } 32385 adoptStyleSheets(sheets, hostId) { 32386 if (sheets.length === 0) return; 32387 const adoptedStyleSheetData = { 32388 id: hostId, 32389 styleIds: [] 32390 }; 32391 const styles = []; 32392 for (const sheet of sheets){ 32393 let styleId; 32394 if (!this.styleMirror.has(sheet)) { 32395 styleId = this.styleMirror.add(sheet); 32396 styles.push({ 32397 styleId, 32398 rules: Array.from(sheet.rules || CSSRule, (r2, index)=>({ 32399 rule: stringifyRule(r2), 32400 index 32401 })) 32402 }); 32403 } else styleId = this.styleMirror.getId(sheet); 32404 adoptedStyleSheetData.styleIds.push(styleId); 32405 } 32406 if (styles.length > 0) adoptedStyleSheetData.styles = styles; 32407 this.adoptedStyleSheetCb(adoptedStyleSheetData); 32408 } 32409 reset() { 32410 this.styleMirror.reset(); 32411 this.trackedLinkElements = /* @__PURE__ */ new WeakSet(); 32412 } 32413 // TODO: take snapshot on stylesheet reload by applying event listener 32414 trackStylesheetInLinkElement(_linkEl) {} 32415 constructor(options){ 32416 this.trackedLinkElements = /* @__PURE__ */ new WeakSet(); 32417 this.styleMirror = new StyleSheetMirror(); 32418 this.mutationCb = options.mutationCb; 32419 this.adoptedStyleSheetCb = options.adoptedStyleSheetCb; 32420 } 32421} 32422class ProcessedNodeManager { 32423 inOtherBuffer(node, thisBuffer) { 32424 const buffers = this.nodeMap.get(node); 32425 return buffers && Array.from(buffers).some((buffer)=>buffer !== thisBuffer); 32426 } 32427 add(node, buffer) { 32428 if (!this.active) { 32429 this.active = true; 32430 onRequestAnimationFrame(()=>{ 32431 this.nodeMap = /* @__PURE__ */ new WeakMap(); 32432 this.active = false;
32433 }); 32434 } 32435 this.nodeMap.set(node, (this.nodeMap.get(node) || /* @__PURE__ */ new Set()).add(buffer)); 32436 } 32437 destroy() {} 32438 constructor(){ 32439 this.nodeMap = /* @__PURE__ */ new WeakMap(); 32440 this.active = false; 32441 } 32442} 32443let wrappedEmit; 32444let _takeFullSnapshot; 32445try { 32446 if (Array.from([ 32447 1 32448 ], (x)=>x * 2)[0] !== 2) { 32449 var _cleanFrame_contentWindow; 32450 const cleanFrame = document.createElement("iframe"); 32451 document.body.appendChild(cleanFrame); 32452 Array.from = ((_cleanFrame_contentWindow = cleanFrame.contentWindow) === null || _cleanFrame_contentWindow === void 0 ? void 0 : _cleanFrame_contentWindow.Array.from) || Array.from; 32453 document.body.removeChild(cleanFrame); 32454 } 32455} catch (err) { 32456 console.debug("Unable to override Array.from", err); 32457} 32458const mirror = createMirror(); 32459function record() { 32460 let options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}; 32461 const { emit, checkoutEveryNms, checkoutEveryNth, blockClass = "rr-block", blockSelector = null, unblockSelector = null, ignoreClass = "rr-ignore", ignoreSelector = null, maskAllText = false, maskTextClass = "rr-mask", unmaskTextClass = null, maskTextSelector = null, unmaskTextSelector = null, inlineStylesheet = true, maskAllInputs, maskInputOptions: _maskInputOptions, slimDOMOptions: _slimDOMOptions, maskAttributeFn, maskInputFn, maskTextFn, maxCanvasSize = null, packFn, sampling = {}, dataURLOptions = {}, mousemoveWait, recordDOM = true, recordCanvas = false, recordCrossOriginIframes = false, recordAfter = options.recordAfter === "DOMContentLoaded" ? options.recordAfter : "load", userTriggeredOnInput = false, collectFonts = false, inlineImages = false, plugins, keepIframeSrcFn = ()=>false, ignoreCSSAttributes = /* @__PURE__ */ new Set([]), errorHandler, onMutation, getCanvasManager } = options; 32462 registerErrorHandler(errorHandler); 32463 const inEmittingFrame = recordCrossOriginIframes ? window.parent === window : true; 32464 let passEmitsToParent = false; 32465 if (!inEmittingFrame) { 32466 try { 32467 if (window.parent.document) { 32468 passEmitsToParent = false; 32469 } 32470 } catch (e2) { 32471 passEmitsToParent = true; 32472 } 32473 } 32474 if (inEmittingFrame && !emit) { 32475 throw new Error("emit function is required"); 32476 } 32477 if (!inEmittingFrame && !passEmitsToParent) { 32478 return ()=>{}; 32479 } 32480 if (mousemoveWait !== void 0 && sampling.mousemove === void 0) { 32481 sampling.mousemove = mousemoveWait; 32482 } 32483 mirror.reset(); 32484 const maskInputOptions = maskAllInputs === true ? { 32485 color: true, 32486 date: true, 32487 "datetime-local": true, 32488 email: true, 32489 month: true, 32490 number: true, 32491 range: true, 32492 search: true, 32493 tel: true, 32494 text: true, 32495 time: true, 32496 url: true, 32497 week: true, 32498 textarea: true, 32499 select: true, 32500 radio: true, 32501 checkbox: true 32502 } : _maskInputOptions !== void 0 ? _maskInputOptions : {}; 32503 const slimDOMOptions = _slimDOMOptions === true || _slimDOMOptions === "all" ? { 32504 script: true, 32505 comment: true, 32506 headFavicon: true, 32507 headWhitespace: true, 32508 headMetaSocial: true, 32509 headMetaRobots: true, 32510 headMetaHttpEquiv: true, 32511 headMetaVerification: true, 32512 // the following are off for slimDOMOptions === true, 32513 // as they destroy some (hidden) info: 32514 headMetaAuthorship: _slimDOMOptions === "all", 32515 headMetaDescKeywords: _slimDOMOptions === "all" 32516 } : _slimDOMOptions ? _slimDOMOptions : {}; 32517 polyfill(); 32518 let lastFullSnapshotEvent; 32519 let incrementalSnapshotCount = 0; 32520 const eventProcessor = (e2)=>{ 32521 for (const plugin of plugins || []){ 32522 if (plugin.eventProcessor) { 32523 e2 = plugin.eventProcessor(e2); 32524 } 32525 } 32526 if (packFn && // Disable packing events which will be emitted to parent frames. 32527 !passEmitsToParent) { 32528 e2 = packFn(e2); 32529 } 32530 return e2; 32531 }; 32532 wrappedEmit = (r2, isCheckout)=>{ 32533 var _mutationBuffers_; 32534 const e2 = r2; 32535 e2.timestamp = nowTimestamp(); 32536 if (((_mutationBuffers_ = mutationBuffers[0]) === null || _mutationBuffers_ === void 0 ? void 0 : _mutationBuffers_.isFrozen()) && e2.type !== EventType.FullSnapshot && !(e2.type === EventType.IncrementalSnapshot && e2.data.source === IncrementalSource.Mutation)) {
vendor: 4,392 bytes, lines 32537-32659
32537 mutationBuffers.forEach((buf)=>buf.unfreeze()); 32538 } 32539 if (inEmittingFrame) { 32540 emit === null || emit === void 0 ? void 0 : emit(eventProcessor(e2), isCheckout); 32541 } else if (passEmitsToParent) { 32542 const message = { 32543 type: "rrweb", 32544 event: eventProcessor(e2), 32545 origin: window.location.origin, 32546 isCheckout 32547 }; 32548 window.parent.postMessage(message, "*"); 32549 } 32550 if (e2.type === EventType.FullSnapshot) { 32551 lastFullSnapshotEvent = e2; 32552 incrementalSnapshotCount = 0; 32553 } else if (e2.type === EventType.IncrementalSnapshot) { 32554 if (e2.data.source === IncrementalSource.Mutation && e2.data.isAttachIframe) { 32555 return; 32556 } 32557 incrementalSnapshotCount++; 32558 const exceedCount = checkoutEveryNth && incrementalSnapshotCount >= checkoutEveryNth; 32559 const exceedTime = checkoutEveryNms && lastFullSnapshotEvent && e2.timestamp - lastFullSnapshotEvent.timestamp > checkoutEveryNms; 32560 if (exceedCount || exceedTime) { 32561 takeFullSnapshot2(true); 32562 } 32563 } 32564 }; 32565 const wrappedMutationEmit = (m)=>{ 32566 wrappedEmit({ 32567 type: EventType.IncrementalSnapshot, 32568 data: { 32569 source: IncrementalSource.Mutation, 32570 ...m 32571 } 32572 }); 32573 }; 32574 const wrappedScrollEmit = (p)=>wrappedEmit({ 32575 type: EventType.IncrementalSnapshot, 32576 data: { 32577 source: IncrementalSource.Scroll, 32578 ...p 32579 } 32580 }); 32581 const wrappedCanvasMutationEmit = (p)=>wrappedEmit({ 32582 type: EventType.IncrementalSnapshot, 32583 data: { 32584 source: IncrementalSource.CanvasMutation, 32585 ...p 32586 } 32587 }); 32588 const wrappedAdoptedStyleSheetEmit = (a2)=>wrappedEmit({ 32589 type: EventType.IncrementalSnapshot, 32590 data: { 32591 source: IncrementalSource.AdoptedStyleSheet, 32592 ...a2 32593 } 32594 }); 32595 const stylesheetManager = new StylesheetManager({ 32596 mutationCb: wrappedMutationEmit, 32597 adoptedStyleSheetCb: wrappedAdoptedStyleSheetEmit 32598 }); 32599 const iframeManager = typeof __RRWEB_EXCLUDE_IFRAME__ === "boolean" && __RRWEB_EXCLUDE_IFRAME__ ? new IframeManagerNoop() : new IframeManager({ 32600 mirror, 32601 mutationCb: wrappedMutationEmit, 32602 stylesheetManager, 32603 recordCrossOriginIframes, 32604 wrappedEmit 32605 }); 32606 for (const plugin of plugins || []){ 32607 if (plugin.getMirror) plugin.getMirror({ 32608 nodeMirror: mirror, 32609 crossOriginIframeMirror: iframeManager.crossOriginIframeMirror, 32610 crossOriginIframeStyleMirror: iframeManager.crossOriginIframeStyleMirror 32611 }); 32612 } 32613 const processedNodeManager = new ProcessedNodeManager(); 32614 const canvasManager = _getCanvasManager(getCanvasManager, { 32615 mirror, 32616 win: window, 32617 mutationCb: (p)=>wrappedEmit({ 32618 type: EventType.IncrementalSnapshot, 32619 data: { 32620 source: IncrementalSource.CanvasMutation, 32621 ...p 32622 } 32623 }), 32624 recordCanvas, 32625 blockClass, 32626 blockSelector, 32627 unblockSelector, 32628 maxCanvasSize, 32629 sampling: sampling["canvas"], 32630 dataURLOptions, 32631 errorHandler 32632 }); 32633 const shadowDomManager = typeof __RRWEB_EXCLUDE_SHADOW_DOM__ === "boolean" && __RRWEB_EXCLUDE_SHADOW_DOM__ ? new ShadowDomManagerNoop() : new ShadowDomManager({ 32634 mutationCb: wrappedMutationEmit, 32635 scrollCb: wrappedScrollEmit, 32636 bypassOptions: { 32637 onMutation, 32638 blockClass, 32639 blockSelector, 32640 unblockSelector, 32641 maskAllText, 32642 maskTextClass, 32643 unmaskTextClass, 32644 maskTextSelector, 32645 unmaskTextSelector, 32646 inlineStylesheet, 32647 maskInputOptions, 32648 dataURLOptions, 32649 maskAttributeFn, 32650 maskTextFn, 32651 maskInputFn, 32652 recordCanvas, 32653 inlineImages, 32654 sampling, 32655 slimDOMOptions, 32656 iframeManager, 32657 stylesheetManager, 32658 canvasManager, 32659 keepIframeSrcFn,
32660 processedNodeManager, 32661 ignoreCSSAttributes 32662 }, 32663 mirror 32664 }); 32665 const takeFullSnapshot2 = function() { 32666 let isCheckout = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : false; 32667 if (!recordDOM) { 32668 return; 32669 } 32670 wrappedEmit({ 32671 type: EventType.Meta, 32672 data: { 32673 href: window.location.href, 32674 width: getWindowWidth(), 32675 height: getWindowHeight() 32676 } 32677 }, isCheckout); 32678 stylesheetManager.reset(); 32679 shadowDomManager.init(); 32680 mutationBuffers.forEach((buf)=>buf.lock()); 32681 const node = snapshot(document, { 32682 mirror, 32683 blockClass, 32684 blockSelector, 32685 unblockSelector, 32686 maskAllText, 32687 maskTextClass, 32688 unmaskTextClass, 32689 maskTextSelector, 32690 unmaskTextSelector, 32691 inlineStylesheet, 32692 maskAllInputs: maskInputOptions, 32693 maskAttributeFn, 32694 maskInputFn, 32695 maskTextFn, 32696 slimDOM: slimDOMOptions, 32697 dataURLOptions, 32698 recordCanvas, 32699 inlineImages, 32700 onSerialize: (n2)=>{ 32701 if (isSerializedIframe(n2, mirror)) { 32702 iframeManager.addIframe(n2); 32703 } 32704 if (isSerializedStylesheet(n2, mirror)) { 32705 stylesheetManager.trackLinkElement(n2); 32706 } 32707 if (hasShadowRoot(n2)) { 32708 shadowDomManager.addShadowRoot(n2.shadowRoot, document); 32709 } 32710 }, 32711 onIframeLoad: (iframe, childSn)=>{ 32712 iframeManager.attachIframe(iframe, childSn); 32713 const contentWindow = getIFrameContentWindow(iframe); 32714 if (contentWindow) { 32715 canvasManager.addWindow(contentWindow); 32716 } 32717 shadowDomManager.observeAttachShadow(iframe); 32718 }, 32719 onStylesheetLoad: (linkEl, childSn)=>{ 32720 stylesheetManager.attachLinkElement(linkEl, childSn); 32721 }, 32722 onBlockedImageLoad: (_imageEl, serializedNode, param)=>{ 32723 let { width, height } = param; 32724 wrappedMutationEmit({ 32725 adds: [], 32726 removes: [], 32727 texts: [], 32728 attributes: [ 32729 { 32730 id: serializedNode.id, 32731 attributes: { 32732 style: { 32733 width: "".concat(width, "px"), 32734 height: "".concat(height, "px") 32735 } 32736 } 32737 } 32738 ] 32739 }); 32740 }, 32741 keepIframeSrcFn, 32742 ignoreCSSAttributes 32743 }); 32744 if (!node) { 32745 return console.warn("Failed to snapshot the document"); 32746 } 32747 wrappedEmit({ 32748 type: EventType.FullSnapshot, 32749 data: { 32750 node, 32751 initialOffset: getWindowScroll(window) 32752 } 32753 }); 32754 mutationBuffers.forEach((buf)=>buf.unlock()); 32755 if (document.adoptedStyleSheets && document.adoptedStyleSheets.length > 0) stylesheetManager.adoptStyleSheets(document.adoptedStyleSheets, mirror.getId(document)); 32756 }; 32757 _takeFullSnapshot = takeFullSnapshot2; 32758 try { 32759 const handlers = []; 32760 const observe = (doc)=>{ 32761 var _plugins_filter; 32762 return callbackWrapper(initObservers)({ 32763 onMutation, 32764 mutationCb: wrappedMutationEmit, 32765 mousemoveCb: (positions, source)=>wrappedEmit({ 32766 type: EventType.IncrementalSnapshot, 32767 data: { 32768 source, 32769 positions 32770 } 32771 }), 32772 mouseInteractionCb: (d)=>wrappedEmit({ 32773 type: EventType.IncrementalSnapshot, 32774 data: { 32775 source: IncrementalSource.MouseInteraction, 32776 ...d 32777 } 32778 }), 32779 scrollCb: wrappedScrollEmit, 32780 viewportResizeCb: (d)=>wrappedEmit({ 32781 type: EventType.IncrementalSnapshot, 32782 data: { 32783 source: IncrementalSource.ViewportResize, 32784 ...d 32785 } 32786 }), 32787 inputCb: (v2)=>wrappedEmit({ 32788 type: EventType.IncrementalSnapshot, 32789 data: { 32790 source: IncrementalSource.Input, 32791 ...v2 32792 } 32793 }), 32794 mediaInteractionCb: (p)=>wrappedEmit({ 32795 type: EventType.IncrementalSnapshot, 32796 data: { 32797 source: IncrementalSource.MediaInteraction, 32798 ...p 32799 } 32800 }), 32801 styleSheetRuleCb: (r2)=>wrappedEmit({ 32802 type: EventType.IncrementalSnapshot, 32803 data: { 32804 source: IncrementalSource.StyleSheetRule, 32805 ...r2 32806 } 32807 }), 32808 styleDeclarationCb: (r2)=>wrappedEmit({ 32809 type: EventType.IncrementalSnapshot, 32810 data: { 32811 source: IncrementalSource.StyleDeclaration, 32812 ...r2 32813 } 32814 }), 32815 canvasMutationCb: wrappedCanvasMutationEmit, 32816 fontCb: (p)=>wrappedEmit({ 32817 type: EventType.IncrementalSnapshot, 32818 data: { 32819 source: IncrementalSource.Font, 32820 ...p 32821 } 32822 }), 32823 selectionCb: (p)=>{ 32824 wrappedEmit({ 32825 type: EventType.IncrementalSnapshot, 32826 data: { 32827 source: IncrementalSource.Selection, 32828 ...p 32829 } 32830 }); 32831 }, 32832 customElementCb: (c2)=>{ 32833 wrappedEmit({ 32834 type: EventType.IncrementalSnapshot, 32835 data: { 32836 source: IncrementalSource.CustomElement, 32837 ...c2 32838 } 32839 }); 32840 }, 32841 blockClass, 32842 ignoreClass, 32843 ignoreSelector, 32844 maskAllText, 32845 maskTextClass, 32846 unmaskTextClass, 32847 maskTextSelector, 32848 unmaskTextSelector, 32849 maskInputOptions, 32850 inlineStylesheet, 32851 sampling, 32852 recordDOM, 32853 recordCanvas, 32854 inlineImages,
vendor: 10,116 bytes, lines 32855-33133
32855 userTriggeredOnInput, 32856 collectFonts, 32857 doc, 32858 maskAttributeFn, 32859 maskInputFn, 32860 maskTextFn, 32861 keepIframeSrcFn, 32862 blockSelector, 32863 unblockSelector, 32864 slimDOMOptions, 32865 dataURLOptions, 32866 mirror, 32867 iframeManager, 32868 stylesheetManager, 32869 shadowDomManager, 32870 processedNodeManager, 32871 canvasManager, 32872 ignoreCSSAttributes, 32873 plugins: (plugins === null || plugins === void 0 ? void 0 : (_plugins_filter = plugins.filter((p)=>p.observer)) === null || _plugins_filter === void 0 ? void 0 : _plugins_filter.map((p)=>({ 32874 observer: p.observer, 32875 options: p.options, 32876 callback: (payload)=>wrappedEmit({ 32877 type: EventType.Plugin, 32878 data: { 32879 plugin: p.name, 32880 payload 32881 } 32882 }) 32883 }))) || [] 32884 }, {}); 32885 }; 32886 iframeManager.addLoadListener((iframeEl)=>{ 32887 try { 32888 handlers.push(observe(iframeEl.contentDocument)); 32889 } catch (error) { 32890 console.warn(error); 32891 } 32892 }); 32893 const init = ()=>{ 32894 takeFullSnapshot2(); 32895 handlers.push(observe(document)); 32896 }; 32897 if (document.readyState === "interactive" || document.readyState === "complete") { 32898 init(); 32899 } else { 32900 handlers.push(on1("DOMContentLoaded", ()=>{ 32901 wrappedEmit({ 32902 type: EventType.DomContentLoaded, 32903 data: {} 32904 }); 32905 if (recordAfter === "DOMContentLoaded") init(); 32906 })); 32907 handlers.push(on1("load", ()=>{ 32908 wrappedEmit({ 32909 type: EventType.Load, 32910 data: {} 32911 }); 32912 if (recordAfter === "load") init(); 32913 }, window)); 32914 } 32915 return ()=>{ 32916 handlers.forEach((h)=>h()); 32917 processedNodeManager.destroy(); 32918 _takeFullSnapshot = void 0; 32919 unregisterErrorHandler(); 32920 }; 32921 } catch (error) { 32922 console.warn(error); 32923 } 32924} 32925function takeFullSnapshot(isCheckout) { 32926 if (!_takeFullSnapshot) { 32927 throw new Error("please take full snapshot after start recording"); 32928 } 32929 _takeFullSnapshot(isCheckout); 32930} 32931record.mirror = mirror; 32932record.takeFullSnapshot = takeFullSnapshot; 32933function _getCanvasManager(getCanvasManagerFn, options) { 32934 try { 32935 return getCanvasManagerFn ? getCanvasManagerFn(options) : new CanvasManagerNoop(); 32936 } catch (unused) { 32937 console.warn("Unable to initialize CanvasManager"); 32938 return new CanvasManagerNoop(); 32939 } 32940} 32941var n1; 32942!function(t2) { 32943 t2[t2.NotStarted = 0] = "NotStarted", t2[t2.Running = 1] = "Running", t2[t2.Stopped = 2] = "Stopped"; 32944}(n1 || (n1 = {})); 32945const ReplayEventTypeIncrementalSnapshot = 3; 32946const ReplayEventTypeCustom = 5; 32947function timestampToMs(timestamp) { 32948 const isMs = timestamp > 9999999999; 32949 return isMs ? timestamp : timestamp * 1e3; 32950} 32951function timestampToS(timestamp) { 32952 const isMs = timestamp > 9999999999; 32953 return isMs ? timestamp / 1e3 : timestamp; 32954} 32955function addBreadcrumbEvent(replay, breadcrumb) { 32956 if (breadcrumb.category === "sentry.transaction") { 32957 return; 32958 } 32959 if ([ 32960 "ui.click", 32961 "ui.input" 32962 ].includes(breadcrumb.category)) { 32963 replay.triggerUserActivity(); 32964 } else { 32965 replay.checkAndHandleExpiredSession(); 32966 } 32967 replay.addUpdate(()=>{ 32968 replay.throttledAddEvent({ 32969 type: EventType.Custom, 32970 // TODO: We were converting from ms to seconds for breadcrumbs, spans, 32971 // but maybe we should just keep them as milliseconds 32972 timestamp: (breadcrumb.timestamp || 0) * 1e3, 32973 data: { 32974 tag: "breadcrumb", 32975 // normalize to max. 10 depth and 1_000 properties per object 32976 payload: (0, __TURBOPACK__imported__module__45968__4["normalize"])(breadcrumb, 10, 1e3) 32977 } 32978 }); 32979 return breadcrumb.category === "console"; 32980 }); 32981} 32982const INTERACTIVE_SELECTOR = "button,a"; 32983function getClosestInteractive(element) { 32984 const closestInteractive = element.closest(INTERACTIVE_SELECTOR); 32985 return closestInteractive || element; 32986} 32987function getClickTargetNode(event) { 32988 const target = getTargetNode(event); 32989 if (!target || !(target instanceof Element)) { 32990 return target; 32991 } 32992 return getClosestInteractive(target); 32993} 32994function getTargetNode(event) { 32995 if (isEventWithTarget(event)) { 32996 return event.target; 32997 } 32998 return event; 32999} 33000function isEventWithTarget(event) { 33001 return (0, __TURBOPACK__imported__module__453288__14["isObjectLike"])(event) && "target" in event; 33002} 33003let handlers2; 33004function onWindowOpen(cb) { 33005 if (!handlers2) { 33006 handlers2 = []; 33007 monkeyPatchWindowOpen(); 33008 } 33009 handlers2.push(cb); 33010 return ()=>{ 33011 const pos = handlers2 ? handlers2.indexOf(cb) : -1; 33012 if (pos > -1) { 33013 handlers2.splice(pos, 1); 33014 } 33015 }; 33016} 33017function monkeyPatchWindowOpen() { 33018 (0, __TURBOPACK__imported__module__951497__11["fill"])(WINDOW4, "open", function(originalWindowOpen) { 33019 return function() { 33020 for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++){ 33021 args[_key] = arguments[_key]; 33022 } 33023 if (handlers2) { 33024 try { 33025 handlers2.forEach((handler)=>handler()); 33026 } catch (unused) {} 33027 } 33028 return originalWindowOpen.apply(WINDOW4, args); 33029 }; 33030 }); 33031} 33032const IncrementalMutationSources = /* @__PURE__ */ new Set([ 33033 IncrementalSource.Mutation, 33034 IncrementalSource.StyleSheetRule, 33035 IncrementalSource.StyleDeclaration, 33036 IncrementalSource.AdoptedStyleSheet, 33037 IncrementalSource.CanvasMutation, 33038 IncrementalSource.Selection, 33039 IncrementalSource.MediaInteraction 33040]); 33041function handleClick(clickDetector, clickBreadcrumb, node) { 33042 clickDetector.handleClick(clickBreadcrumb, node); 33043} 33044class ClickDetector { 33045 /** Register click detection handlers on mutation or scroll. */ addListeners() { 33046 const cleanupWindowOpen = onWindowOpen(()=>{ 33047 this._lastMutation = nowInSeconds(); 33048 }); 33049 this._teardown = ()=>{ 33050 cleanupWindowOpen(); 33051 this._clicks = []; 33052 this._lastMutation = 0; 33053 this._lastScroll = 0; 33054 }; 33055 } 33056 /** Clean up listeners. */ removeListeners() { 33057 if (this._teardown) { 33058 this._teardown(); 33059 } 33060 if (this._checkClickTimeout) { 33061 clearTimeout(this._checkClickTimeout); 33062 } 33063 } 33064 /** @inheritDoc */ handleClick(breadcrumb, node) { 33065 if (ignoreElement(node, this._ignoreSelector) || !isClickBreadcrumb(breadcrumb)) { 33066 return; 33067 } 33068 const newClick = { 33069 timestamp: timestampToS(breadcrumb.timestamp), 33070 clickBreadcrumb: breadcrumb, 33071 // Set this to 0 so we know it originates from the click breadcrumb 33072 clickCount: 0, 33073 node 33074 }; 33075 if (this._clicks.some((click)=>click.node === newClick.node && Math.abs(click.timestamp - newClick.timestamp) < 1)) { 33076 return; 33077 } 33078 this._clicks.push(newClick); 33079 if (this._clicks.length === 1) { 33080 this._scheduleCheckClicks(); 33081 } 33082 } 33083 /** @inheritDoc */ registerMutation() { 33084 let timestamp = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : Date.now(); 33085 this._lastMutation = timestampToS(timestamp); 33086 } 33087 /** @inheritDoc */ registerScroll() { 33088 let timestamp = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : Date.now(); 33089 this._lastScroll = timestampToS(timestamp); 33090 } 33091 /** @inheritDoc */ registerClick(element) { 33092 const node = getClosestInteractive(element); 33093 this._handleMultiClick(node); 33094 } 33095 /** Count multiple clicks on elements. */ _handleMultiClick(node) { 33096 this._getClicks(node).forEach((click)=>{ 33097 click.clickCount++; 33098 }); 33099 } 33100 /** Get all pending clicks for a given node. */ _getClicks(node) { 33101 return this._clicks.filter((click)=>click.node === node); 33102 } 33103 /** Check the clicks that happened. */ _checkClicks() { 33104 const timedOutClicks = []; 33105 const now = nowInSeconds(); 33106 this._clicks.forEach((click)=>{ 33107 if (!click.mutationAfter && this._lastMutation) { 33108 click.mutationAfter = click.timestamp <= this._lastMutation ? this._lastMutation - click.timestamp : void 0; 33109 } 33110 if (!click.scrollAfter && this._lastScroll) { 33111 click.scrollAfter = click.timestamp <= this._lastScroll ? this._lastScroll - click.timestamp : void 0; 33112 } 33113 if (click.timestamp + this._timeout <= now) { 33114 timedOutClicks.push(click); 33115 } 33116 }); 33117 for (const click of timedOutClicks){ 33118 const pos = this._clicks.indexOf(click); 33119 if (pos > -1) { 33120 this._generateBreadcrumbs(click); 33121 this._clicks.splice(pos, 1); 33122 } 33123 } 33124 if (this._clicks.length) { 33125 this._scheduleCheckClicks(); 33126 } 33127 } 33128 /** Generate matching breadcrumb(s) for the click. */ _generateBreadcrumbs(click) { 33129 const replay = this._replay; 33130 const hadScroll = click.scrollAfter && click.scrollAfter <= this._scrollTimeout; 33131 const hadMutation = click.mutationAfter && click.mutationAfter <= this._threshold; 33132 const isSlowClick = !hadScroll && !hadMutation; 33133 const { clickCount, clickBreadcrumb }
vendor: 14,550 bytes, lines 33133-33561
33133 = click; 33134 if (isSlowClick) { 33135 const timeAfterClickMs = Math.min(click.mutationAfter || this._timeout, this._timeout) * 1e3; 33136 const endReason = timeAfterClickMs < this._timeout * 1e3 ? "mutation" : "timeout"; 33137 const breadcrumb = { 33138 type: "default", 33139 message: clickBreadcrumb.message, 33140 timestamp: clickBreadcrumb.timestamp, 33141 category: "ui.slowClickDetected", 33142 data: { 33143 ...clickBreadcrumb.data, 33144 url: WINDOW4.location.href, 33145 route: replay.getCurrentRoute(), 33146 timeAfterClickMs, 33147 endReason, 33148 // If clickCount === 0, it means multiClick was not correctly captured here 33149 // - we still want to send 1 in this case 33150 clickCount: clickCount || 1 33151 } 33152 }; 33153 this._addBreadcrumbEvent(replay, breadcrumb); 33154 return; 33155 } 33156 if (clickCount > 1) { 33157 const breadcrumb = { 33158 type: "default", 33159 message: clickBreadcrumb.message, 33160 timestamp: clickBreadcrumb.timestamp, 33161 category: "ui.multiClick", 33162 data: { 33163 ...clickBreadcrumb.data, 33164 url: WINDOW4.location.href, 33165 route: replay.getCurrentRoute(), 33166 clickCount, 33167 metric: true 33168 } 33169 }; 33170 this._addBreadcrumbEvent(replay, breadcrumb); 33171 } 33172 } 33173 /** Schedule to check current clicks. */ _scheduleCheckClicks() { 33174 if (this._checkClickTimeout) { 33175 clearTimeout(this._checkClickTimeout); 33176 } 33177 this._checkClickTimeout = setTimeout1(()=>this._checkClicks(), 1e3); 33178 } 33179 constructor(replay, slowClickConfig, _addBreadcrumbEvent = addBreadcrumbEvent){ 33180 this._lastMutation = 0; 33181 this._lastScroll = 0; 33182 this._clicks = []; 33183 this._timeout = slowClickConfig.timeout / 1e3; 33184 this._threshold = slowClickConfig.threshold / 1e3; 33185 this._scrollTimeout = slowClickConfig.scrollTimeout / 1e3; 33186 this._replay = replay; 33187 this._ignoreSelector = slowClickConfig.ignoreSelector; 33188 this._addBreadcrumbEvent = _addBreadcrumbEvent; 33189 } 33190} 33191const SLOW_CLICK_TAGS = [ 33192 "A", 33193 "BUTTON", 33194 "INPUT" 33195]; 33196function ignoreElement(node, ignoreSelector) { 33197 if (!SLOW_CLICK_TAGS.includes(node.tagName)) { 33198 return true; 33199 } 33200 if (node.tagName === "INPUT" && ![ 33201 "submit", 33202 "button" 33203 ].includes(node.getAttribute("type") || "")) { 33204 return true; 33205 } 33206 if (node.tagName === "A" && (node.hasAttribute("download") || node.hasAttribute("target") && node.getAttribute("target") !== "_self")) { 33207 return true; 33208 } 33209 if (ignoreSelector && node.matches(ignoreSelector)) { 33210 return true; 33211 } 33212 return false; 33213} 33214function isClickBreadcrumb(breadcrumb) { 33215 return !!(breadcrumb.data && typeof breadcrumb.data.nodeId === "number" && breadcrumb.timestamp); 33216} 33217function nowInSeconds() { 33218 return Date.now() / 1e3; 33219} 33220function updateClickDetectorForRecordingEvent(clickDetector, event) { 33221 try { 33222 if (!isIncrementalEvent(event)) { 33223 return; 33224 } 33225 const { source } = event.data; 33226 if (IncrementalMutationSources.has(source)) { 33227 clickDetector.registerMutation(event.timestamp); 33228 } 33229 if (source === IncrementalSource.Scroll) { 33230 clickDetector.registerScroll(event.timestamp); 33231 } 33232 if (isIncrementalMouseInteraction(event)) { 33233 const { type, id } = event.data; 33234 const node = record.mirror.getNode(id); 33235 if (node instanceof HTMLElement && type === MouseInteractions.Click) { 33236 clickDetector.registerClick(node); 33237 } 33238 } 33239 } catch (unused) {} 33240} 33241function isIncrementalEvent(event) { 33242 return event.type === ReplayEventTypeIncrementalSnapshot; 33243} 33244function isIncrementalMouseInteraction(event) { 33245 return event.data.source === IncrementalSource.MouseInteraction; 33246} 33247function createBreadcrumb(breadcrumb) { 33248 return { 33249 timestamp: Date.now() / 1e3, 33250 type: "default", 33251 ...breadcrumb 33252 }; 33253} 33254var NodeType = /* @__PURE__ */ ((NodeType2)=>{ 33255 NodeType2[NodeType2["Document"] = 0] = "Document"; 33256 NodeType2[NodeType2["DocumentType"] = 1] = "DocumentType"; 33257 NodeType2[NodeType2["Element"] = 2] = "Element"; 33258 NodeType2[NodeType2["Text"] = 3] = "Text"; 33259 NodeType2[NodeType2["CDATA"] = 4] = "CDATA"; 33260 NodeType2[NodeType2["Comment"] = 5] = "Comment"; 33261 return NodeType2; 33262})(NodeType || {}); 33263const ATTRIBUTES_TO_RECORD = /* @__PURE__ */ new Set([ 33264 "id", 33265 "class", 33266 "aria-label", 33267 "role", 33268 "name", 33269 "alt", 33270 "title", 33271 "data-test-id", 33272 "data-testid", 33273 "disabled", 33274 "aria-disabled", 33275 "data-sentry-component" 33276]); 33277function getAttributesToRecord(attributes) { 33278 const obj = {}; 33279 if (!attributes["data-sentry-component"] && attributes["data-sentry-element"]) { 33280 attributes["data-sentry-component"] = attributes["data-sentry-element"]; 33281 } 33282 for(const key in attributes){ 33283 if (ATTRIBUTES_TO_RECORD.has(key)) { 33284 let normalizedKey = key; 33285 if (key === "data-testid" || key === "data-test-id") { 33286 normalizedKey = "testId"; 33287 } 33288 obj[normalizedKey] = attributes[key]; 33289 } 33290 } 33291 return obj; 33292} 33293const handleDomListener = (replay)=>{ 33294 return (handlerData)=>{ 33295 if (!replay.isEnabled()) { 33296 return; 33297 } 33298 const result = handleDom(handlerData); 33299 if (!result) { 33300 return; 33301 } 33302 const isClick = handlerData.name === "click"; 33303 const event = isClick ? handlerData.event : void 0; 33304 if (isClick && replay.clickDetector && (event === null || event === void 0 ? void 0 : event.target) && !event.altKey && !event.metaKey && !event.ctrlKey && !event.shiftKey) { 33305 handleClick(replay.clickDetector, result, getClickTargetNode(handlerData.event)); 33306 } 33307 addBreadcrumbEvent(replay, result); 33308 }; 33309}; 33310function getBaseDomBreadcrumb(target, message) { 33311 const nodeId = record.mirror.getId(target); 33312 const node = nodeId && record.mirror.getNode(nodeId); 33313 const meta = node && record.mirror.getMeta(node); 33314 const element = meta && isElement1(meta) ? meta : null; 33315 return { 33316 message, 33317 data: element ? { 33318 nodeId, 33319 node: { 33320 id: nodeId, 33321 tagName: element.tagName, 33322 textContent: Array.from(element.childNodes).map((node2)=>node2.type === NodeType.Text && node2.textContent).filter(Boolean).map((text)=>text.trim()).join(""), 33323 attributes: getAttributesToRecord(element.attributes) 33324 } 33325 } : {} 33326 }; 33327} 33328function handleDom(handlerData) { 33329 const { target, message } = getDomTarget(handlerData); 33330 return createBreadcrumb({ 33331 category: "ui.".concat(handlerData.name), 33332 ...getBaseDomBreadcrumb(target, message) 33333 }); 33334} 33335function getDomTarget(handlerData) { 33336 const isClick = handlerData.name === "click"; 33337 let message; 33338 let target = null; 33339 try { 33340 target = isClick ? getClickTargetNode(handlerData.event) : getTargetNode(handlerData.event); 33341 message = htmlTreeAsString1(target, { 33342 maxStringLength: 200 33343 }) || "<unknown>"; 33344 } catch (unused) { 33345 message = "<unknown>"; 33346 } 33347 return { 33348 target, 33349 message 33350 }; 33351} 33352function isElement1(node) { 33353 return node.type === NodeType.Element; 33354} 33355function handleKeyboardEvent(replay, event) { 33356 if (!replay.isEnabled()) { 33357 return; 33358 } 33359 replay.updateUserActivity(); 33360 const breadcrumb = getKeyboardBreadcrumb(event); 33361 if (!breadcrumb) { 33362 return; 33363 } 33364 addBreadcrumbEvent(replay, breadcrumb); 33365} 33366function getKeyboardBreadcrumb(event) { 33367 const { metaKey, shiftKey, ctrlKey, altKey, key, target } = event; 33368 if (!target || isInputElement(target) || !key) { 33369 return null; 33370 } 33371 const hasModifierKey = metaKey || ctrlKey || altKey; 33372 const isCharacterKey = key.length === 1; 33373 if (!hasModifierKey && isCharacterKey) { 33374 return null; 33375 } 33376 const message = htmlTreeAsString1(target, { 33377 maxStringLength: 200 33378 }) || "<unknown>"; 33379 const baseBreadcrumb = getBaseDomBreadcrumb(target, message); 33380 return createBreadcrumb({ 33381 category: "ui.keyDown", 33382 message, 33383 data: { 33384 ...baseBreadcrumb.data, 33385 metaKey, 33386 shiftKey, 33387 ctrlKey, 33388 altKey, 33389 key 33390 } 33391 }); 33392} 33393function isInputElement(target) { 33394 return target.tagName === "INPUT" || target.tagName === "TEXTAREA" || target.isContentEditable; 33395} 33396const ENTRY_TYPES = { 33397 // @ts-expect-error TODO: entry type does not fit the create* functions entry type 33398 resource: createResourceEntry, 33399 paint: createPaintEntry, 33400 // @ts-expect-error TODO: entry type does not fit the create* functions entry type 33401 navigation: createNavigationEntry 33402}; 33403function webVitalHandler(getter, replay) { 33404 return (param)=>{ 33405 let { metric } = param; 33406 return void replay.replayPerformanceEntries.push(getter(metric)); 33407 }; 33408} 33409function createPerformanceEntries(entries) { 33410 return entries.map(createPerformanceEntry).filter(Boolean); 33411} 33412function createPerformanceEntry(entry) { 33413 const entryType = ENTRY_TYPES[entry.entryType]; 33414 if (!entryType) { 33415 return null; 33416 } 33417 return entryType(entry); 33418} 33419function getAbsoluteTime1(time) { 33420 return (((0, __TURBOPACK__imported__module__605394__16["browserPerformanceTimeOrigin"])() || WINDOW4.performance.timeOrigin) + time) / 1e3; 33421} 33422function createPaintEntry(entry) { 33423 const { duration, entryType, name, startTime } = entry; 33424 const start = getAbsoluteTime1(startTime); 33425 return { 33426 type: entryType, 33427 name, 33428 start, 33429 end: start + duration, 33430 data: void 0 33431 }; 33432} 33433function createNavigationEntry(entry) { 33434 const { entryType, name, decodedBodySize, duration, domComplete, encodedBodySize, domContentLoadedEventStart, domContentLoadedEventEnd, domInteractive, loadEventStart, loadEventEnd, redirectCount, startTime, transferSize, type } = entry; 33435 if (duration === 0) { 33436 return null; 33437 } 33438 return { 33439 type: "".concat(entryType, ".").concat(type), 33440 start: getAbsoluteTime1(startTime), 33441 end: getAbsoluteTime1(domComplete), 33442 name, 33443 data: { 33444 size: transferSize, 33445 decodedBodySize, 33446 encodedBodySize, 33447 duration, 33448 domInteractive, 33449 domContentLoadedEventStart, 33450 domContentLoadedEventEnd, 33451 loadEventStart, 33452 loadEventEnd, 33453 domComplete, 33454 redirectCount 33455 } 33456 }; 33457} 33458function createResourceEntry(entry) { 33459 const { entryType, initiatorType, name, responseEnd, startTime, decodedBodySize, encodedBodySize, responseStatus, transferSize } = entry; 33460 if ([ 33461 "fetch", 33462 "xmlhttprequest" 33463 ].includes(initiatorType)) { 33464 return null; 33465 } 33466 return { 33467 type: "".concat(entryType, ".").concat(initiatorType), 33468 start: getAbsoluteTime1(startTime), 33469 end: getAbsoluteTime1(responseEnd), 33470 name, 33471 data: { 33472 size: transferSize, 33473 statusCode: responseStatus, 33474 decodedBodySize, 33475 encodedBodySize 33476 } 33477 }; 33478} 33479function getLargestContentfulPaint(metric) { 33480 const lastEntry = metric.entries[metric.entries.length - 1]; 33481 const node = (lastEntry === null || lastEntry === void 0 ? void 0 : lastEntry.element) ? [ 33482 lastEntry.element 33483 ] : void 0; 33484 return getWebVital(metric, "largest-contentful-paint", node); 33485} 33486function isLayoutShift(entry) { 33487 return entry.sources !== void 0; 33488} 33489function getCumulativeLayoutShift(metric) { 33490 const layoutShifts = []; 33491 const nodes = []; 33492 for (const entry of metric.entries){ 33493 if (isLayoutShift(entry)) { 33494 const nodeIds = []; 33495 for (const source of entry.sources){ 33496 if (source.node) { 33497 nodes.push(source.node); 33498 const nodeId = record.mirror.getId(source.node); 33499 if (nodeId) { 33500 nodeIds.push(nodeId); 33501 } 33502 } 33503 } 33504 layoutShifts.push({ 33505 value: entry.value, 33506 nodeIds: nodeIds.length ? nodeIds : void 0 33507 }); 33508 } 33509 } 33510 return getWebVital(metric, "cumulative-layout-shift", nodes, layoutShifts); 33511} 33512function getInteractionToNextPaint(metric) { 33513 const lastEntry = metric.entries[metric.entries.length - 1]; 33514 const node = (lastEntry === null || lastEntry === void 0 ? void 0 : lastEntry.target) ? [ 33515 lastEntry.target 33516 ] : void 0; 33517 return getWebVital(metric, "interaction-to-next-paint", node); 33518} 33519function getWebVital(metric, name, nodes, attributions) { 33520 const value = metric.value; 33521 const rating = metric.rating; 33522 const end = getAbsoluteTime1(value); 33523 return { 33524 type: "web-vital", 33525 name, 33526 start: end, 33527 end, 33528 data: { 33529 value, 33530 size: value, 33531 rating, 33532 nodeIds: nodes ? nodes.map((node)=>record.mirror.getId(node)) : void 0, 33533 attributions 33534 } 33535 }; 33536} 33537function setupPerformanceObserver(replay) { 33538 function addPerformanceEntry(entry) { 33539 if (!replay.performanceEntries.includes(entry)) { 33540 replay.performanceEntries.push(entry); 33541 } 33542 } 33543 function onEntries(param) { 33544 let { entries } = param; 33545 entries.forEach(addPerformanceEntry); 33546 } 33547 const clearCallbacks = []; 33548 [ 33549 "navigation", 33550 "paint", 33551 "resource" 33552 ].forEach((type)=>{ 33553 clearCallbacks.push(addPerformanceInstrumentationHandler(type, onEntries)); 33554 }); 33555 clearCallbacks.push(addLcpInstrumentationHandler(webVitalHandler(getLargestContentfulPaint, replay)), addClsInstrumentationHandler(webVitalHandler(getCumulativeLayoutShift, replay)), addInpInstrumentationHandler(webVitalHandler(getInteractionToNextPaint, replay))); 33556 return ()=>{ 33557 clearCallbacks.forEach((clearCallback)=>clearCallback()); 33558 }; 33559} 33560const DEBUG_BUILD3 = typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__; 33561const t1 = '
vendor: 10,329 bytes, line 33561
33561var t=Uint8Array,n=Uint16Array,r=Int32Array,e=new t([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),i=new t([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),s=new t([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),a=function(t,e){for(var i=new n(31),s=0;s<31;++s)i[s]=e+=1<<t[s-1];var a=new r(i[30]);for(s=1;s<30;++s)for(var o=i[s];o<i[s+1];++o)a[o]=o-i[s]<<5|s;return{b:i,r:a}},o=a(e,2),h=o.b,f=o.r;h[28]=258,f[258]=28;for(var l=a(i,0).r,u=new n(32768),c=0;c<32768;++c){var v=(43690&c)>>1|(21845&c)<<1;v=(61680&(v=(52428&v)>>2|(13107&v)<<2))>>4|(3855&v)<<4,u[c]=((65280&v)>>8|(255&v)<<8)>>1}var d=function(t,r,e){for(var i=t.length,s=0,a=new n(r);s<i;++s)t[s]&&++a[t[s]-1];var o,h=new n(r);for(s=1;s<r;++s)h[s]=h[s-1]+a[s-1]<<1;if(e){o=new n(1<<r);var f=15-r;for(s=0;s<i;++s)if(t[s])for(var l=s<<4|t[s],c=r-t[s],v=h[t[s]-1]++<<c,d=v|(1<<c)-1;v<=d;++v)o[u[v]>>f]=l}else for(o=new n(i),s=0;s<i;++s)t[s]&&(o[s]=u[h[t[s]-1]++]>>15-t[s]);return o},p=new t(288);for(c=0;c<144;++c)p[c]=8;for(c=144;c<256;++c)p[c]=9;for(c=256;c<280;++c)p[c]=7;for(c=280;c<288;++c)p[c]=8;var g=new t(32);for(c=0;c<32;++c)g[c]=5;var w=d(p,9,0),y=d(g,5,0),m=function(t){return(t+7)/8|0},b=function(n,r,e){return(null==e||e>n.length)&&(e=n.length),new t(n.subarray(r,e))},M=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],E=function(t,n,r){var e=new Error(n||M[t]);if(e.code=t,Error.captureStackTrace&&Error.captureStackTrace(e,E),!r)throw e;return e},z=function(t,n,r){r<<=7&n;var e=n/8|0;t[e]|=r,t[e+1]|=r>>8},_=function(t,n,r){r<<=7&n;var e=n/8|0;t[e]|=r,t[e+1]|=r>>8,t[e+2]|=r>>16},x=function(r,e){for(var i=[],s=0;s<r.length;++s)r[s]&&i.push({s:s,f:r[s]});var a=i.length,o=i.slice();if(!a)return{t:F,l:0};if(1==a){var h=new t(i[0].s+1);return h[i[0].s]=1,{t:h,l:1}}i.sort(function(t,n){return t.f-n.f}),i.push({s:-1,f:25001});var f=i[0],l=i[1],u=0,c=1,v=2;for(i[0]={s:-1,f:f.f+l.f,l:f,r:l};c!=a-1;)f=i[i[u].f<i[v].f?u++:v++],l=i[u!=c&&i[u].f<i[v].f?u++:v++],i[c++]={s:-1,f:f.f+l.f,l:f,r:l};var d=o[0].s;for(s=1;s<a;++s)o[s].s>d&&(d=o[s].s);var p=new n(d+1),g=A(i[c-1],p,0);if(g>e){s=0;var w=0,y=g-e,m=1<<y;for(o.sort(function(t,n){return p[n.s]-p[t.s]||t.f-n.f});s<a;++s){var b=o[s].s;if(!(p[b]>e))break;w+=m-(1<<g-p[b]),p[b]=e}for(w>>=y;w>0;){var M=o[s].s;p[M]<e?w-=1<<e-p[M]++-1:++s}for(;s>=0&&w;--s){var E=o[s].s;p[E]==e&&(--p[E],++w)}g=e}return{t:new t(p),l:g}},A=function(t,n,r){return-1==t.s?Math.max(A(t.l,n,r+1),A(t.r,n,r+1)):n[t.s]=r},D=function(t){for(var r=t.length;r&&!t[--r];);for(var e=new n(++r),i=0,s=t[0],a=1,o=function(t){e[i++]=t},h=1;h<=r;++h)if(t[h]==s&&h!=r)++a;else{if(!s&&a>2){for(;a>138;a-=138)o(32754);a>2&&(o(a>10?a-11<<5|28690:a-3<<5|12305),a=0)}else if(a>3){for(o(s),--a;a>6;a-=6)o(8304);a>2&&(o(a-3<<5|8208),a=0)}for(;a--;)o(s);a=1,s=t[h]}return{c:e.subarray(0,i),n:r}},T=function(t,n){for(var r=0,e=0;e<n.length;++e)r+=t[e]*n[e];return r},k=function(t,n,r){var e=r.length,i=m(n+2);t[i]=255&e,t[i+1]=e>>8,t[i+2]=255^t[i],t[i+3]=255^t[i+1];for(var s=0;s<e;++s)t[i+s+4]=r[s];return 8*(i+4+e)},U=function(t,r,a,o,h,f,l,u,c,v,m){z(r,m++,a),++h[256];for(var b=x(h,15),M=b.t,E=b.l,A=x(f,15),U=A.t,C=A.l,F=D(M),I=F.c,S=F.n,L=D(U),O=L.c,j=L.n,q=new n(19),B=0;B<I.length;++B)++q[31&I[B]];for(B=0;B<O.length;++B)++q[31&O[B]];for(var G=x(q,7),H=G.t,J=G.l,K=19;K>4&&!H[s[K-1]];--K);var N,P,Q,R,V=v+5<<3,W=T(h,p)+T(f,g)+l,X=T(h,M)+T(f,U)+l+14+3*K+T(q,H)+2*q[16]+3*q[17]+7*q[18];if(c>=0&&V<=W&&V<=X)return k(r,m,t.subarray(c,c+v));if(z(r,m,1+(X<W)),m+=2,X<W){N=d(M,E,0),P=M,Q=d(U,C,0),R=U;var Y=d(H,J,0);z(r,m,S-257),z(r,m+5,j-1),z(r,m+10,K-4),m+=14;for(B=0;B<K;++B)z(r,m+3*B,H[s[B]]);m+=3*K;for(var Z=[I,O],$=0;$<2;++$){var tt=Z[$];for(B=0;B<tt.length;++B){var nt=31&tt[B];z(r,m,Y[nt]),m+=H[nt],nt>15&&(z(r,m,tt[B]>>5&127),m+=tt[B]>>12)}}}else N=w,P=p,Q=y,R=g;for(B=0;B<u;++B){var rt=o[B];if(rt>255){_(r,m,N[(nt=rt>>18&31)+257]),m+=P[nt+257],nt>7&&(z(r,m,rt>>23&31),m+=e[nt]);var et=31&rt;_(r,m,Q[et]),m+=R[et],et>3&&(_(r,m,rt>>5&8191),m+=i[et])}else _(r,m,N[rt]),m+=P[rt]}return _(r,m,N[256]),m+P[256]},C=new r([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),F=new t(0),I=function(){for(var t=new Int32Array(256),n=0;n<256;++n){for(var r=n,e=9;--e;)r=(1&r&&-306674912)^r>>>1;t[n]=r}return t}(),S=function(){var t=1,n=0;return{p:function(r){for(var e=t,i=n,s=0|r.length,a=0;a!=s;){for(var o=Math.min(a+2655,s);a<o;++a)i+=e+=r[a];e=(65535&e)+15*(e>>16),i=(65535&i)+15*(i>>16)}t=e,n=i},d:function(){return(255&(t%=65521))<<24|(65280&t)<<8|(255&(n%=65521))<<8|n>>8}}},L=function(s,a,o,h,u){if(!u&&(u={l:1},a.dictionary)){var c=a.dictionary.subarray(-32768),v=new t(c.length+s.length);v.set(c),v.set(s,c.length),s=v,u.w=c.length}return function(s,a,o,h,u,c){var v=c.z||s.length,d=new t(h+v+5*(1+Math.ceil(v/7e3))+u),p=d.subarray(h,d.length-u),g=c.l,w=7&(c.r||0);if(a){w&&(p[0]=c.r>>3);for(var y=C[a-1],M=y>>13,E=8191&y,z=(1<<o)-1,_=c.p||new n(32768),x=c.h||new n(z+1),A=Math.ceil(o/3),D=2*A,T=function(t){return(s[t]^s[t+1]<<A^s[t+2]<<D)&z},F=new r(25e3),I=new n(288),S=new n(32),L=0,O=0,j=c.i||0,q=0,B=c.w||0,G=0;j+2<v;++j){var H=T(j),J=32767&j,K=x[H];if(_[J]=K,x[H]=J,B<=j){var N=v-j;if((L>7e3||q>24576)&&(N>423||!g)){w=U(s,p,0,F,I,S,O,q,G,j-G,w),q=L=O=0,G=j;for(var P=0;P<286;++P)I[P]=0;for(P=0;P<30;++P)S[P]=0}var Q=2,R=0,V=E,W=J-K&32767;if(N>2&&H==T(j-W))for(var X=Math.min(M,N)-1,Y=Math.min(32767,j),Z=Math.min(258,N);W<=Y&&--V&&J!=K;){if(s[j+Q]==s[j+Q-W]){for(var $=0;$<Z&&s[j+$]==s[j+$-W];++$);if($>Q){if(Q=$,R=W,$>X)break;var tt=Math.min(W,$-2),nt=0;for(P=0;P<tt;++P){var rt=j-W+P&32767,et=rt-_[rt]&32767;et>nt&&(nt=et,K=rt)}}}W+=(J=K)-(K=_[J])&32767}if(R){F[q++]=268435456|f[Q]<<18|l[R];var it=31&f[Q],st=31&l[R];O+=e[it]+i[st],++I[257+it],++S[st],B=j+Q,++L}else F[q++]=s[j],++I[s[j]]}}for(j=Math.max(j,B);j<v;++j)F[q++]=s[j],++I[s[j]];w=U(s,p,g,F,I,S,O,q,G,j-G,w),g||(c.r=7&w|p[w/8|0]<<3,w-=7,c.h=x,c.p=_,c.i=j,c.w=B)}else{for(j=c.w||0;j<v+g;j+=65535){var at=j+65535;at>=v&&(p[w/8|0]=g,at=v),w=k(p,w+1,s.subarray(j,at))}c.i=v}return b(d,0,h+m(w)+u)}(s,null==a.level?6:a.level,null==a.mem?u.l?Math.ceil(1.5*Math.max(8,Math.min(13,Math.log(s.length)))):20:12+a.mem,o,h,u)},O=function(t,n,r){for(;r;++n)t[n]=r,r>>>=8},j=function(){function n(n,r){if("function"==typeof n&&(r=n,n={}),this.ondata=r,this.o=n||{},this.s={l:0,i:32768,w:32768,z:32768},this.b=new t(98304),this.o.dictionary){var e=this.o.dictionary.subarray(-32768);this.b.set(e,32768-e.length),this.s.i=32768-e.length}}return n.prototype.p=function(t,n){this.ondata(L(t,this.o,0,0,this.s),n)},n.prototype.push=function(n,r){this.ondata||E(5),this.s.l&&E(4);var e=n.length+this.s.z;if(e>this.b.length){if(e>2*this.b.length-32768){var i=new t(-32768&e);i.set(this.b.subarray(0,this.s.z)),this.b=i}var s=this.b.length-this.s.z;this.b.set(n.subarray(0,s),this.s.z),this.s.z=this.b.length,this.p(this.b,!1),this.b.set(this.b.subarray(-32768)),this.b.set(n.subarray(s),32768),this.s.z=n.length-s+32768,this.s.i=32766,this.s.w=32768}else this.b.set(n,this.s.z),this.s.z+=n.length;this.s.l=1&r,(this.s.z>this.s.w+8191||r)&&(this.p(this.b,r||!1),this.s.w=this.s.i,this.s.i-=2)},n.prototype.flush=function(){this.ondata||E(5),this.s.l&&E(4),this.p(this.b,!1),this.s.w=this.s.i,this.s.i-=2},n}();function q(t,n){n||(n={});var r=function(){var t=-1;return{p:function(n){for(var r=t,e=0;e<n.length;++e)r=I[255&r^n[e]]^r>>>8;t=r},d:function(){return~t}}}(),e=t.length;r.p(t);var i,s=L(t,n,10+((i=n).filename?i.filename.length+1:0),8),a=s.length;return function(t,n){var r=n.filename;if(t[0]=31,t[1]=139,t[2]=8,t[8]=n.level<2?4:9==n.level?2:0,t[9]=3,0!=n.mtime&&O(t,4,Math.floor(new Date(n.mtime||Date.now())/1e3)),r){t[3]=8;for(var e=0;e<=r.length;++e)t[e+10]=r.charCodeAt(e)}}(s,n),O(s,a-8,r.d()),O(s,a-4,e),s}var B=function(){function t(t,n){this.c=S(),this.v=1,j.call(this,t,n)}return t.prototype.push=function(t,n){this.c.p(t),j.prototype.push.call(this,t,n)},t.prototype.p=function(t,n){var r=L(t,this.o,this.v&&(this.o.dictionary?6:2),n&&4,this.s);this.v&&(function(t,n){var r=n.level,e=0==r?0:r<6?1:9==r?3:2;if(t[0]=120,t[1]=e<<6|(n.dictionary&&32),t[1]|=31-(t[0]<<8|t[1])%31,n.dictionary){var i=S();i.p(n.dictionary),O(t,2,i.d())}}(r,this.o),this.v=0),n&&O(r,r.length-4,this.c.d()),this.ondata(r,n)},t.prototype.flush=function(){j.prototype.flush.call(this)},t}(),G="undefined"!=typeof TextEncoder&&new TextEncoder,H="undefined"!=typeof TextDecoder&&new TextDecoder;try{H.decode(F,{stream:!0})}catch(t){}var J=function(){function t(t){this.ondata=t}return t.prototype.push=function(t,n){this.ondata||E(5),this.d&&E(4),this.ondata(K(t),this.d=n||!1)},t}();function K(n,r){if(G)return G.encode(n);for(var e=n.length,i=new t(n.length+(n.length>>1)),s=0,a=function(t){i[s++]=t},o=0;o<e;++o){if(s+5>i.length){var h=new t(s+8+(e-o<<1));h.set(i),i=h}var f=n.charCodeAt(o);f<128||r?a(f):f<2048?(a(192|f>>6),a(128|63&f)):f>55295&&f<57344?(a(240|(f=65536+(1047552&f)|1023&n.charCodeAt(++o))>>18),a(128|f>>12&63),a(128|f>>6&63),a(128|63&f)):(a(224|f>>12),a(128|f>>6&63),a(128|63&f))}return b(i,0,s)}const N=new class{constructor(){this._init()}clear(){this._init()}addEvent(t){if(!t)throw new Error("Adding invalid event");const n=this._hasEvents?",":"";this.stream.push(n+t),this._hasEvents=!0}finish(){this.stream.push("]",!0);const t=function(t){let n=0;for(const r of t)n+=r.length;const r=new Uint8Array(n);for(let n=0,e=0,i=t.length;n<i;n++){const i=t[n];r.set(i,e),e+=i.length}return r}(this._deflatedData);return this._init(),t}_init(){this._hasEvents=!1,this._deflatedData=[],this.deflate=new B,this.deflate.ondata=(t,n)=>{this._deflatedData.push(t)},this.stream=new J((t,n)=>{this.deflate.push(t,n)}),this.stream.push("[")}},P={clear:()=>{N.clear()},addEvent:t=>N.addEvent(t),finish:()=>N.finish(),compress:t=>function(t){return q(K(t))}(t)};addEventListener("message",function(t){const n=t.data.method,r=t.data.id,e=t.data.arg;if(n in P&&"function"==typeof P[n])try{const t=P[n](e);postMessage({id:r,method:n,success:!0,response:t})}catch(t){postMessage({id:r,method:n,success:!1,response:t.message}),console.error(t)}}),postMessage({id:void 0,method:"init",success:!0,response:void 0});
33561'; 33562function e1() { 33563 const e2 = new Blob([ 33564 t1 33565 ], { 33566 type: "text/javascript" 33567 }); 33568 return URL.createObjectURL(e2); 33569} 33570const CONSOLE_LEVELS = [ 33571 "log", 33572 "warn", 33573 "error" 33574]; 33575const PREFIX = "[Replay] "; 33576function _addBreadcrumb(message) { 33577 let level = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "info"; 33578 (0, __TURBOPACK__imported__module__183330__1["addBreadcrumb"])({ 33579 category: "console", 33580 data: { 33581 logger: "replay" 33582 }, 33583 level, 33584 message: "".concat(PREFIX).concat(message) 33585 }, {
33586 level 33587 }); 33588} 33589function makeReplayDebugLogger() { 33590 let _capture = false; 33591 let _trace = false; 33592 const _debug = { 33593 exception: ()=>void 0, 33594 infoTick: ()=>void 0, 33595 setConfig: (opts)=>{ 33596 _capture = !!opts.captureExceptions; 33597 _trace = !!opts.traceInternals; 33598 } 33599 }; 33600 if (DEBUG_BUILD3) { 33601 CONSOLE_LEVELS.forEach((name)=>{ 33602 _debug[name] = function() { 33603 for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++){ 33604 args[_key] = arguments[_key]; 33605 } 33606 __TURBOPACK__imported__module__272598__37["debug"][name](PREFIX, ...args); 33607 if (_trace) { 33608 _addBreadcrumb(args.join(""), severityLevelFromString(name)); 33609 } 33610 }; 33611 }); 33612 _debug.exception = function(error) { 33613 for(var _len = arguments.length, message = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++){ 33614 message[_key - 1] = arguments[_key]; 33615 } 33616 if (message.length && _debug.error) { 33617 _debug.error(...message); 33618 } 33619 __TURBOPACK__imported__module__272598__37["debug"].error(PREFIX, error); 33620 if (_capture) { 33621 (0, __TURBOPACK__imported__module__662537__6["captureException"])(error, { 33622 mechanism: { 33623 handled: true, 33624 type: "auto.function.replay.debug" 33625 } 33626 }); 33627 } else if (_trace) { 33628 _addBreadcrumb(error, "error"); 33629 } 33630 }; 33631 _debug.infoTick = function() { 33632 for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++){ 33633 args[_key] = arguments[_key]; 33634 } 33635 __TURBOPACK__imported__module__272598__37["debug"].log(PREFIX, ...args); 33636 if (_trace) { 33637 setTimeout(()=>_addBreadcrumb(args[0]), 0); 33638 } 33639 }; 33640 } else { 33641 CONSOLE_LEVELS.forEach((name)=>{ 33642 _debug[name] = ()=>void 0; 33643 }); 33644 } 33645 return _debug; 33646} 33647const debug = makeReplayDebugLogger(); 33648class EventBufferSizeExceededError extends Error { 33649 constructor(){ 33650 super("Event buffer exceeded maximum size of ".concat(REPLAY_MAX_EVENT_BUFFER_SIZE, ".")); 33651 } 33652} 33653class WorkerDestroyedError extends Error { 33654 constructor(){ 33655 super("Worker destroyed"); 33656 } 33657} 33658class EventBufferArray { 33659 /** @inheritdoc */ get hasEvents() { 33660 return this.events.length > 0; 33661 } 33662 /** @inheritdoc */ get type() { 33663 return "sync"; 33664 } 33665 /** @inheritdoc */ destroy() { 33666 this.events = []; 33667 } 33668 /** @inheritdoc */ async addEvent(event) { 33669 const eventSize = JSON.stringify(event).length; 33670 this._totalSize += eventSize; 33671 if (this._totalSize > REPLAY_MAX_EVENT_BUFFER_SIZE) { 33672 throw new EventBufferSizeExceededError(); 33673 } 33674 this.events.push(event); 33675 } 33676 /** @inheritdoc */ finish() { 33677 return new Promise((resolve)=>{ 33678 const eventsRet = this.events; 33679 this.clear(); 33680 resolve(JSON.stringify(eventsRet)); 33681 }); 33682 } 33683 /** @inheritdoc */ clear() { 33684 this.events = []; 33685 this._totalSize = 0; 33686 this.hasCheckout = false; 33687 } 33688 /** @inheritdoc */ getEarliestTimestamp() { 33689 let ts = null; 33690 for (const { timestamp } of this.events){ 33691 if (ts === null || timestamp < ts) ts = timestamp; 33692 } 33693 return ts === null ? ts : timestampToMs(ts); 33694 } 33695 constructor(){ 33696 this.events = []; 33697 this._totalSize = 0; 33698 this.hasCheckout = false; 33699 this.waitForCheckout = false; 33700 } 33701} 33702class WorkerHandler { 33703 /** 33704 * Ensure the worker is ready (or not). 33705 * This will either resolve when the worker is ready, or reject if an error occurred. 33706 */ ensureReady() { 33707 if (this._ensureReadyPromise) { 33708 return this._ensureReadyPromise; 33709 } 33710 this._ensureReadyPromise = new Promise((resolve, reject)=>{ 33711 this._worker.addEventListener("message", (param)=>{ 33712 let { data } = param; 33713 if (data.success) { 33714 resolve(); 33715 } else { 33716 DEBUG_BUILD3 && debug.warn("Received worker message with unsuccessful status", data); 33717 reject(new Error("Received worker message with unsuccessful status")); 33718 } 33719 }, { 33720 once: true 33721 }); 33722 this._worker.addEventListener("error", (error)=>{ 33723 DEBUG_BUILD3 && debug.warn("Failed to load Replay compression worker", error); 33724 reject(new Error("Failed to load Replay compression worker: ".concat(error instanceof ErrorEvent && error.message ? error.message : "Unknown error. This can happen due to CSP policy restrictions, network issues, or the worker script failing to load."))); 33725 }, { 33726 once: true 33727 }); 33728 }); 33729 return this._ensureReadyPromise; 33730 } 33731 /** 33732 * Destroy the worker. 33733 */ destroy() { 33734 DEBUG_BUILD3 && debug.log("Destroying compression worker"); 33735 this._worker.removeEventListener("message", this._onMessage); 33736 this._pending.forEach((pending)=>pending.reject(new WorkerDestroyedError())); 33737 this._pending.clear(); 33738 this._worker.terminate(); 33739 } 33740 /** 33741 * Post message to worker and wait for response before resolving promise. 33742 */ postMessage(method, arg) { 33743 const id = this._getAndIncrementId(); 33744 return new Promise((resolve, reject)=>{ 33745 this._pending.set(id, { 33746 method, 33747 resolve, 33748 reject 33749 }); 33750 try { 33751 this._worker.postMessage({ 33752 id, 33753 method, 33754 arg 33755 }); 33756 } catch (error) { 33757 this._pending.delete(id); 33758 reject(error); 33759 } 33760 }); 33761 } 33762 /** Get the current ID and increment it for the next call. */ _getAndIncrementId() { 33763 return this._id++; 33764 } 33765 constructor(worker){ 33766 this._onMessage = (param)=>{ 33767 let { data } = param; 33768 const response = data; 33769 if (typeof response.id !== "number") { 33770 return; 33771 } 33772 const pending = this._pending.get(response.id); 33773 if (!pending || pending.method !== response.method) { 33774 return; 33775 } 33776 this._pending.delete(response.id); 33777 if (!response.success) { 33778 DEBUG_BUILD3 && debug.error("Error in compression worker: ", response.response); 33779 pending.reject(new Error("Error in compression worker")); 33780 return; 33781 } 33782 pending.resolve(response.response); 33783 }; 33784 this._worker = worker; 33785 this._id = 0; 33786 this._pending = /* @__PURE__ */ new Map(); 33787 this._worker.addEventListener("message", this._onMessage); 33788 } 33789} 33790class EventBufferCompressionWorker { 33791 /** @inheritdoc */ get hasEvents() { 33792 return !!this._earliestTimestamp; 33793 } 33794 /** @inheritdoc */ get type() { 33795 return "worker"; 33796 } 33797 /** 33798 * Ensure the worker is ready (or not). 33799 * This will either resolve when the worker is ready, or reject if an error occurred. 33800 */ ensureReady() { 33801 return this._worker.ensureReady(); 33802 } 33803 /** 33804 * Destroy the event buffer. 33805 */ destroy() { 33806 this._worker.destroy(); 33807 } 33808 /** 33809 * Add an event to the event buffer. 33810 * 33811 * Returns true if event was successfully received and processed by worker. 33812 */ addEvent(event) { 33813 const timestamp = timestampToMs(event.timestamp); 33814 if (!this._earliestTimestamp || timestamp < this._earliestTimestamp) { 33815 this._earliestTimestamp = timestamp; 33816 } 33817 const data = JSON.stringify(event); 33818 this._totalSize += data.length; 33819 if (this._totalSize > REPLAY_MAX_EVENT_BUFFER_SIZE) { 33820 return Promise.reject(new EventBufferSizeExceededError()); 33821 } 33822 return this._sendEventToWorker(data); 33823 } 33824 /** 33825 * Finish the event buffer and return the compressed data. 33826 */ finish() { 33827 return this._finishRequest(); 33828 } 33829 /** @inheritdoc */ clear() { 33830 this._earliestTimestamp = null; 33831 this._totalSize = 0; 33832 this.hasCheckout = false;
33833 this._worker.postMessage("clear").then(null, (e)=>{ 33834 DEBUG_BUILD3 && debug.exception(e, 'Sending "clear" message to worker failed', e); 33835 }); 33836 } 33837 /** @inheritdoc */ getEarliestTimestamp() { 33838 return this._earliestTimestamp; 33839 } 33840 /** 33841 * Send the event to the worker. 33842 */ _sendEventToWorker(data) { 33843 return this._worker.postMessage("addEvent", data); 33844 } 33845 /** 33846 * Finish the request and return the compressed data from the worker. 33847 */ async _finishRequest() { 33848 const response = await this._worker.postMessage("finish"); 33849 this._earliestTimestamp = null; 33850 this._totalSize = 0; 33851 return response; 33852 } 33853 constructor(worker){ 33854 this._worker = new WorkerHandler(worker); 33855 this._earliestTimestamp = null; 33856 this._totalSize = 0; 33857 this.hasCheckout = false; 33858 this.waitForCheckout = false; 33859 } 33860} 33861class EventBufferProxy { 33862 /** @inheritdoc */ get waitForCheckout() { 33863 return this._used.waitForCheckout; 33864 } 33865 /** @inheritdoc */ get type() { 33866 return this._used.type; 33867 } 33868 /** @inheritDoc */ get hasEvents() { 33869 return this._used.hasEvents; 33870 } 33871 /** @inheritdoc */ get hasCheckout() { 33872 return this._used.hasCheckout; 33873 } 33874 /** @inheritdoc */ set hasCheckout(value) { 33875 this._used.hasCheckout = value; 33876 } 33877 /** @inheritdoc */ // eslint-disable-next-line @typescript-eslint/adjacent-overload-signatures 33878 set waitForCheckout(value) { 33879 this._used.waitForCheckout = value; 33880 } 33881 /** @inheritDoc */ destroy() { 33882 this._fallback.destroy(); 33883 this._compression.destroy(); 33884 } 33885 /** @inheritdoc */ clear() { 33886 return this._used.clear(); 33887 } 33888 /** @inheritdoc */ getEarliestTimestamp() { 33889 return this._used.getEarliestTimestamp(); 33890 } 33891 /** 33892 * Add an event to the event buffer. 33893 * 33894 * Returns true if event was successfully added.
vendor: 4,376 bytes, lines 33895-34024
33895 */ addEvent(event) { 33896 return this._used.addEvent(event); 33897 } 33898 /** @inheritDoc */ async finish() { 33899 await this.ensureWorkerIsLoaded(); 33900 return this._used.finish(); 33901 } 33902 /** Ensure the worker has loaded. */ ensureWorkerIsLoaded() { 33903 return this._ensureWorkerIsLoadedPromise; 33904 } 33905 /** Actually check if the worker has been loaded. */ async _ensureWorkerIsLoaded() { 33906 try { 33907 await this._compression.ensureReady(); 33908 } catch (error) { 33909 DEBUG_BUILD3 && debug.exception(error, "Failed to load the compression worker, falling back to simple buffer"); 33910 return; 33911 } 33912 await this._switchToCompressionWorker(); 33913 } 33914 /** Switch the used buffer to the compression worker. */ async _switchToCompressionWorker() { 33915 const { events, hasCheckout, waitForCheckout } = this._fallback; 33916 const addEventPromises = []; 33917 for (const event of events){ 33918 addEventPromises.push(this._compression.addEvent(event)); 33919 } 33920 this._compression.hasCheckout = hasCheckout; 33921 this._compression.waitForCheckout = waitForCheckout; 33922 this._used = this._compression; 33923 try { 33924 await Promise.all(addEventPromises); 33925 this._fallback.clear(); 33926 } catch (error) { 33927 if (error instanceof WorkerDestroyedError) { 33928 return; 33929 } 33930 DEBUG_BUILD3 && debug.exception(error, "Failed to add events when switching buffers."); 33931 } 33932 } 33933 constructor(worker){ 33934 this._fallback = new EventBufferArray(); 33935 this._compression = new EventBufferCompressionWorker(worker); 33936 this._used = this._fallback; 33937 this._ensureWorkerIsLoadedPromise = this._ensureWorkerIsLoaded(); 33938 } 33939} 33940function createEventBuffer(param) { 33941 let { useCompression, workerUrl: customWorkerUrl } = param; 33942 if (useCompression && // eslint-disable-next-line no-restricted-globals 33943 window.Worker) { 33944 const worker = _loadWorker(customWorkerUrl); 33945 if (worker) { 33946 return worker; 33947 } 33948 } 33949 DEBUG_BUILD3 && debug.log("Using simple buffer"); 33950 return new EventBufferArray(); 33951} 33952function _loadWorker(customWorkerUrl) { 33953 try { 33954 const workerUrl = customWorkerUrl || _getWorkerUrl(); 33955 if (!workerUrl) { 33956 return; 33957 } 33958 DEBUG_BUILD3 && debug.log("Using compression worker".concat(customWorkerUrl ? " from ".concat(customWorkerUrl) : "")); 33959 const worker = new Worker(workerUrl); 33960 return new EventBufferProxy(worker); 33961 } catch (error) { 33962 DEBUG_BUILD3 && debug.exception(error, "Failed to create compression worker"); 33963 } 33964} 33965function _getWorkerUrl() { 33966 if (typeof __SENTRY_EXCLUDE_REPLAY_WORKER__ === "undefined" || !__SENTRY_EXCLUDE_REPLAY_WORKER__) { 33967 return e1(); 33968 } 33969 return ""; 33970} 33971function hasSessionStorage() { 33972 try { 33973 return "sessionStorage" in WINDOW4 && !!WINDOW4.sessionStorage; 33974 } catch (unused) { 33975 return false; 33976 } 33977} 33978function clearSession(replay) { 33979 deleteSession(); 33980 replay.session = void 0; 33981} 33982function deleteSession() { 33983 if (!hasSessionStorage()) { 33984 return; 33985 } 33986 try { 33987 WINDOW4.sessionStorage.removeItem(REPLAY_SESSION_KEY); 33988 } catch (unused) {} 33989} 33990function isSampled(sampleRate) { 33991 if (sampleRate === void 0) { 33992 return false; 33993 } 33994 return Math.random() < sampleRate; 33995} 33996function saveSession(session) { 33997 if (!hasSessionStorage()) { 33998 return; 33999 } 34000 try { 34001 WINDOW4.sessionStorage.setItem(REPLAY_SESSION_KEY, JSON.stringify(session)); 34002 } catch (unused) {} 34003} 34004function makeSession(session) { 34005 const now = Date.now(); 34006 const id = session.id || (0, __TURBOPACK__imported__module__682564__7["uuid4"])(); 34007 const started = session.started || now; 34008 const lastActivity = session.lastActivity || now; 34009 const segmentId = session.segmentId || 0; 34010 const sampled = session.sampled; 34011 const previousSessionId = session.previousSessionId; 34012 const dirty = session.dirty || false; 34013 return { 34014 id, 34015 started, 34016 lastActivity, 34017 segmentId, 34018 sampled, 34019 previousSessionId, 34020 dirty 34021 }; 34022} 34023function getSessionSampleType(sessionSampleRate, allowBuffering) { 34024 return isSampled(sessionSampleRate) ? "session" : allowBuffering ? "buffer" : false;
34025} 34026function createSession(param) { 34027 let { sessionSampleRate, allowBuffering, stickySession = false } = param, { previousSessionId } = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}; 34028 const sampled = getSessionSampleType(sessionSampleRate, allowBuffering); 34029 const session = makeSession({ 34030 sampled, 34031 previousSessionId 34032 }); 34033 if (stickySession) { 34034 saveSession(session); 34035 } 34036 return session; 34037} 34038function fetchSession() { 34039 if (!hasSessionStorage()) { 34040 return null; 34041 } 34042 try { 34043 const sessionStringFromStorage = WINDOW4.sessionStorage.getItem(REPLAY_SESSION_KEY); 34044 if (!sessionStringFromStorage) { 34045 return null; 34046 } 34047 const sessionObj = JSON.parse(sessionStringFromStorage); 34048 DEBUG_BUILD3 && debug.infoTick("Loading existing session"); 34049 return makeSession(sessionObj); 34050 } catch (unused) { 34051 return null; 34052 } 34053} 34054function isExpired(initialTime, expiry) { 34055 let targetTime = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : +/* @__PURE__ */ new Date(); 34056 if (initialTime === null || expiry === void 0 || expiry < 0) { 34057 return true; 34058 } 34059 if (expiry === 0) { 34060 return false; 34061 } 34062 return initialTime + expiry <= targetTime; 34063} 34064function isSessionExpired(session, param) { 34065 let { maxReplayDuration, sessionIdleExpire, targetTime = Date.now() } = param; 34066 return(// First, check that maximum session length has not been exceeded 34067 isExpired(session.started, maxReplayDuration, targetTime) || // check that the idle timeout has not been exceeded (i.e. user has 34068 // performed an action within the last `sessionIdleExpire` ms) 34069 isExpired(session.lastActivity, sessionIdleExpire, targetTime)); 34070} 34071function shouldRefreshSession(session, param) { 34072 let { sessionIdleExpire, maxReplayDuration } = param; 34073 if (!isSessionExpired(session, { 34074 sessionIdleExpire, 34075 maxReplayDuration 34076 })) { 34077 return false; 34078 } 34079 if (session.sampled === "buffer" && session.segmentId === 0) { 34080 return false; 34081 } 34082 return true; 34083} 34084function loadOrCreateSession(param, sessionOptions) { 34085 let { sessionIdleExpire, maxReplayDuration, previousSessionId } = param; 34086 const existingSession = sessionOptions.stickySession && fetchSession(); 34087 if (!existingSession) { 34088 DEBUG_BUILD3 && debug.infoTick("Creating new session"); 34089 return createSession(sessionOptions, { 34090 previousSessionId 34091 }); 34092 } 34093 if (!shouldRefreshSession(existingSession, { 34094 sessionIdleExpire, 34095 maxReplayDuration 34096 })) { 34097 return existingSession; 34098 } 34099 DEBUG_BUILD3 && debug.infoTick("Session in sessionStorage is expired, creating new one..."); 34100 return createSession(sessionOptions, { 34101 previousSessionId: existingSession.id 34102 }); 34103} 34104function isCustomEvent(event) { 34105 return event.type === EventType.Custom; 34106} 34107function addEventSync(replay, event, isCheckout) { 34108 if (!shouldAddEvent(replay, event)) { 34109 return false; 34110 } 34111 _addEvent(replay, event, isCheckout); 34112 return true; 34113} 34114function addEvent(replay, event, isCheckout) { 34115 if (!shouldAddEvent(replay, event)) { 34116 return Promise.resolve(null); 34117 } 34118 return _addEvent(replay, event, isCheckout); 34119} 34120async function _addEvent(replay, event, isCheckout) { 34121 const { eventBuffer } = replay; 34122 if (!eventBuffer || eventBuffer.waitForCheckout && !isCheckout) { 34123 return null; 34124 } 34125 const isBufferMode = replay.recordingMode === "buffer"; 34126 try { 34127 if (isCheckout && isBufferMode) { 34128 eventBuffer.clear(); 34129 } 34130 if (isCheckout) { 34131 eventBuffer.hasCheckout = true; 34132 eventBuffer.waitForCheckout = false; 34133 } 34134 const replayOptions = replay.getOptions(); 34135 const eventAfterPossibleCallback = maybeApplyCallback(event, replayOptions.beforeAddRecordingEvent); 34136 if (!eventAfterPossibleCallback) { 34137 return; 34138 } 34139 return await eventBuffer.addEvent(eventAfterPossibleCallback); 34140 } catch (error) { 34141 if (!replay.isEnabled()) { 34142 replay.handleException(error); 34143 return null; 34144 } 34145 const isExceeded = error && error instanceof EventBufferSizeExceededError; 34146 const reason = isExceeded ? "eventBufferOverflow" : "eventBufferError"; 34147 const client = (0, __TURBOPACK__imported__module__250804__26["getClient"])(); 34148 if (client) { 34149 const dropReason = isExceeded ? "buffer_overflow" : "internal_sdk_error";
34150 client.recordDroppedEvent(dropReason, "replay"); 34151 } 34152 if (isExceeded && isBufferMode) { 34153 eventBuffer.clear(); 34154 eventBuffer.waitForCheckout = true; 34155 return null; 34156 } 34157 replay.handleException(error); 34158 await replay.stop({ 34159 reason 34160 }); 34161 } 34162} 34163function shouldAddEvent(replay, event) { 34164 if (!replay.eventBuffer || replay.isPaused() || !replay.isEnabled()) { 34165 return false; 34166 } 34167 const timestampInMs = timestampToMs(event.timestamp); 34168 if (timestampInMs + replay.timeouts.sessionIdlePause < Date.now()) { 34169 return false; 34170 } 34171 if (timestampInMs > replay.getContext().initialTimestamp + replay.getOptions().maxReplayDuration) { 34172 DEBUG_BUILD3 && debug.infoTick("Skipping event with timestamp ".concat(timestampInMs, " because it is after maxReplayDuration")); 34173 return false; 34174 } 34175 return true; 34176} 34177function maybeApplyCallback(event, callback) { 34178 try { 34179 if (typeof callback === "function" && isCustomEvent(event)) { 34180 return callback(event); 34181 } 34182 } catch (error) { 34183 DEBUG_BUILD3 && debug.exception(error, "An error occurred in the `beforeAddRecordingEvent` callback, skipping the event..."); 34184 return null; 34185 } 34186 return event; 34187} 34188const MAX_CONTEXT_VALUES = 100; 34189function addSegmentDetailsToContext(replay, traceId, segmentName) { 34190 const replayContext = replay.getContext(); 34191 if (traceId && replayContext.traceIds.size < MAX_CONTEXT_VALUES) { 34192 replayContext.traceIds.add(traceId); 34193 } 34194 if (segmentName && replayContext.segmentNames.size < MAX_CONTEXT_VALUES) { 34195 replayContext.segmentNames.add(segmentName); 34196 } 34197} 34198function handleProcessSegmentSpan(replay) { 34199 return (spanJSON)=>{ 34200 if (!replay.isEnabled()) { 34201 return; 34202 } 34203 addSegmentDetailsToContext(replay, spanJSON.trace_id, spanJSON.name || void 0); 34204 }; 34205} 34206function isErrorEvent1(event) { 34207 return !event.type; 34208} 34209function isTransactionEvent1(event) { 34210 return event.type === "transaction"; 34211} 34212function isReplayEvent(event) { 34213 return event.type === "replay_event"; 34214} 34215function isFeedbackEvent(event) { 34216 return event.type === "feedback"; 34217} 34218function handleAfterSendEvent(replay) { 34219 return (event, sendResponse)=>{ 34220 if (!replay.isEnabled() || !isErrorEvent1(event) && !isTransactionEvent1(event)) { 34221 return; 34222 } 34223 const statusCode = sendResponse.statusCode; 34224 if (!statusCode || statusCode < 200 || statusCode >= 300) { 34225 return; 34226 } 34227 if (isTransactionEvent1(event)) { 34228 handleTransactionEvent(replay, event); 34229 return; 34230 } 34231 handleErrorEvent(replay, event); 34232 }; 34233} 34234function handleTransactionEvent(replay, event) { 34235 var _event_contexts_trace, _event_contexts; 34236 addSegmentDetailsToContext(replay, (_event_contexts = event.contexts) === null || _event_contexts === void 0 ? void 0 : (_event_contexts_trace = _event_contexts.trace) === null || _event_contexts_trace === void 0 ? void 0 : _event_contexts_trace.trace_id, event.transaction); 34237} 34238function handleErrorEvent(replay, event) { 34239 var _event_tags; 34240 const replayContext = replay.getContext(); 34241 if (event.event_id && replayContext.errorIds.size < 100) { 34242 replayContext.errorIds.add(event.event_id); 34243 } 34244 if (replay.recordingMode !== "buffer" || !((_event_tags = event.tags) === null || _event_tags === void 0 ? void 0 : _event_tags.replayId)) { 34245 return; 34246 } 34247 const { beforeErrorSampling } = replay.getOptions(); 34248 if (typeof beforeErrorSampling === "function" && !beforeErrorSampling(event)) { 34249 return; 34250 } 34251 setTimeout1(async ()=>{ 34252 try { 34253 await replay.sendBufferedReplayOrFlush(); 34254 } catch (err) { 34255 replay.handleException(err); 34256 } 34257 }); 34258} 34259function handleBeforeSendEvent(replay) { 34260 return (event)=>{ 34261 if (!replay.isEnabled() || !isErrorEvent1(event)) { 34262 return; 34263 } 34264 handleHydrationError(replay, event); 34265 }; 34266} 34267function handleHydrationError(replay, event) { 34268 var _event_exception_values_, _event_exception_values, _event_exception; 34269 const exceptionValue = (_event_exception = event.exception) === null || _event_exception === void 0 ? void 0 : (_event_exception_values = _event_exception.values) === null || _event_exception_values === void 0 ? void 0 : (_event_exception_values_ = _event_exception_values[0]) === null || _event_exception_values_ === void 0 ? void 0 : _event_exception_values_.value; 34270 if (typeof exceptionValue !== "string") { 34271 return; 34272 } 34273 if (// Only matches errors in production builds of react-dom 34274 // Example https://reactjs.org/docs/error-decoder.html?invariant=423 34275 // With newer React versions, the messages changed to a different website https://react.dev/errors/418 34276 exceptionValue.match(/(reactjs\.org\/docs\/error-decoder\.html\?invariant=|react\.dev\/errors\/)(418|419|422|423|425)/) || // Development builds of react-dom 34277 // Error 1: Hydration failed because the initial UI does not match what was rendered on the server. 34278 // Error 2: Text content does not match server-rendered HTML. Warning: Text content did not match. 34279 exceptionValue.match(/(does not match server-rendered HTML|Hydration failed because)/i)) { 34280 const breadcrumb = createBreadcrumb({ 34281 category: "replay.hydrate-error", 34282 data: { 34283 url: getLocationHref() 34284 } 34285 }); 34286 addBreadcrumbEvent(replay, breadcrumb); 34287 } 34288} 34289function handleBreadcrumbs(replay) { 34290 const client = (0, __TURBOPACK__imported__module__250804__26["getClient"])(); 34291 if (!client) { 34292 return; 34293 } 34294 client.on("beforeAddBreadcrumb", (breadcrumb)=>beforeAddBreadcrumb(replay, breadcrumb)); 34295} 34296function beforeAddBreadcrumb(replay, breadcrumb) { 34297 if (!replay.isEnabled() || !isBreadcrumbWithCategory(breadcrumb)) { 34298 return; 34299 } 34300 const result = normalizeBreadcrumb(breadcrumb); 34301 if (result) { 34302 addBreadcrumbEvent(replay, result); 34303 } 34304} 34305function normalizeBreadcrumb(breadcrumb) { 34306 if (!isBreadcrumbWithCategory(breadcrumb) || [ 34307 // fetch & xhr are handled separately,in handleNetworkBreadcrumbs 34308 "fetch", 34309 "xhr", 34310 // These two are breadcrumbs for emitted sentry events, we don't care about them 34311 "sentry.event", 34312 "sentry.transaction" 34313 ].includes(breadcrumb.category) || // We capture UI breadcrumbs separately 34314 breadcrumb.category.startsWith("ui.")) { 34315 return null; 34316 } 34317 if (breadcrumb.category === "console") { 34318 return normalizeConsoleBreadcrumb(breadcrumb); 34319 } 34320 return createBreadcrumb(breadcrumb); 34321} 34322function normalizeConsoleBreadcrumb(breadcrumb) { 34323 var _breadcrumb_data; 34324 const args = (_breadcrumb_data = breadcrumb.data) === null || _breadcrumb_data === void 0 ? void 0 : _breadcrumb_data.arguments; 34325 if (!Array.isArray(args) || args.length === 0) { 34326 return createBreadcrumb(breadcrumb); 34327 } 34328 let isTruncated = false;
34329 const normalizedArgs = args.map((arg)=>{ 34330 if (!arg) { 34331 return arg; 34332 } 34333 if (typeof arg === "string") { 34334 if (arg.length > CONSOLE_ARG_MAX_SIZE) { 34335 isTruncated = true; 34336 return "".concat(arg.slice(0, CONSOLE_ARG_MAX_SIZE), "â¦"); 34337 } 34338 return arg; 34339 } 34340 if (typeof arg === "object") { 34341 try { 34342 const normalizedArg = (0, __TURBOPACK__imported__module__45968__4["normalize"])(arg, 7); 34343 const stringified = JSON.stringify(normalizedArg); 34344 if (stringified.length > CONSOLE_ARG_MAX_SIZE) { 34345 isTruncated = true; 34346 return "".concat(JSON.stringify(normalizedArg, null, 2).slice(0, CONSOLE_ARG_MAX_SIZE), "â¦"); 34347 } 34348 return normalizedArg; 34349 } catch (unused) {} 34350 } 34351 return arg; 34352 }); 34353 return createBreadcrumb({ 34354 ...breadcrumb, 34355 data: { 34356 ...breadcrumb.data, 34357 arguments: normalizedArgs, 34358 ...isTruncated ? { 34359 _meta: { 34360 warnings: [ 34361 "CONSOLE_ARG_TRUNCATED" 34362 ] 34363 } 34364 } : {} 34365 } 34366 }); 34367} 34368function isBreadcrumbWithCategory(breadcrumb) { 34369 return !!breadcrumb.category; 34370} 34371function isRrwebError(event, hint) { 34372 var _event_exception_values, _event_exception, _hint_originalException; 34373 if (event.type || !((_event_exception = event.exception) === null || _event_exception === void 0 ? void 0 : (_event_exception_values = _event_exception.values) === null || _event_exception_values === void 0 ? void 0 : _event_exception_values.length)) { 34374 return false; 34375 } 34376 if ((_hint_originalException = hint.originalException) === null || _hint_originalException === void 0 ? void 0 : _hint_originalException.__rrweb__) { 34377 return true; 34378 } 34379 return false; 34380} 34381function resetReplayIdOnDynamicSamplingContext() { 34382 const dsc = (0, __TURBOPACK__imported__module__250804__26["getCurrentScope"])().getPropagationContext().dsc; 34383 if (dsc) { 34384 delete dsc.replay_id; 34385 } 34386 const activeSpan = (0, __TURBOPACK__imported__module__304661__21["getActiveSpan"])(); 34387 if (activeSpan) { 34388 const dsc2 = (0, __TURBOPACK__imported__module__473753__6["getDynamicSamplingContextFromSpan"])(activeSpan); 34389 delete dsc2.replay_id; 34390 } 34391} 34392function setReplayIdOnDynamicSamplingContext(replayId) { 34393 const dsc = (0, __TURBOPACK__imported__module__250804__26["getCurrentScope"])().getPropagationContext().dsc; 34394 if (dsc) { 34395 dsc.replay_id = replayId; 34396 } 34397 const activeSpan = (0, __TURBOPACK__imported__module__304661__21["getActiveSpan"])(); 34398 if (activeSpan) { 34399 const dsc2 = (0, __TURBOPACK__imported__module__473753__6["getDynamicSamplingContextFromSpan"])(activeSpan); 34400 dsc2.replay_id = replayId; 34401 } 34402} 34403function addFeedbackBreadcrumb(replay, event) { 34404 replay.triggerUserActivity(); 34405 replay.addUpdate(()=>{ 34406 if (!event.timestamp) { 34407 return true; 34408 } 34409 replay.throttledAddEvent({ 34410 type: EventType.Custom, 34411 timestamp: event.timestamp * 1e3, 34412 data: { 34413 tag: "breadcrumb", 34414 payload: { 34415 timestamp: event.timestamp, 34416 type: "default", 34417 category: "sentry.feedback", 34418 data: { 34419 feedbackId: event.event_id 34420 } 34421 } 34422 } 34423 }); 34424 return false; 34425 }); 34426} 34427function shouldSampleForBufferEvent(replay, event) { 34428 if (replay.recordingMode !== "buffer") { 34429 return false; 34430 } 34431 if (event.message === UNABLE_TO_SEND_REPLAY) { 34432 return false; 34433 } 34434 if (!event.exception || event.type) { 34435 return false; 34436 } 34437 return isSampled(replay.getOptions().errorSampleRate); 34438} 34439function handleGlobalEventListener(replay) { 34440 return Object.assign((event, hint)=>{ 34441 var _replay_session; 34442 if (replay.session && shouldRefreshSession(replay.session, { 34443 maxReplayDuration: replay.getOptions().maxReplayDuration, 34444 sessionIdleExpire: replay.timeouts.sessionIdleExpire 34445 })) { 34446 resetReplayIdOnDynamicSamplingContext(); 34447 } 34448 if (!replay.isEnabled() || replay.isPaused()) { 34449 return event; 34450 } 34451 if (isReplayEvent(event)) { 34452 delete event.breadcrumbs; 34453 return event; 34454 } 34455 if (!isErrorEvent1(event) && !isTransactionEvent1(event) && !isFeedbackEvent(event)) { 34456 return event; 34457 }
vendor: 5,282 bytes, lines 34458-34641
34458 const isSessionActive = replay.checkAndHandleExpiredSession(); 34459 if (!isSessionActive) { 34460 resetReplayIdOnDynamicSamplingContext(); 34461 return event; 34462 } 34463 if (isFeedbackEvent(event)) { 34464 replay.flush(); 34465 event.contexts.feedback.replay_id = replay.getSessionId(); 34466 addFeedbackBreadcrumb(replay, event); 34467 return event; 34468 } 34469 if (isRrwebError(event, hint) && !replay.getOptions()._experiments.captureExceptions) { 34470 DEBUG_BUILD3 && debug.log("Ignoring error from rrweb internals", event); 34471 return null; 34472 } 34473 const isErrorEventSampled = shouldSampleForBufferEvent(replay, event); 34474 const shouldTagReplayId = isErrorEventSampled || replay.recordingMode === "session"; 34475 if (shouldTagReplayId) { 34476 event.tags = { 34477 ...event.tags, 34478 replayId: replay.getSessionId() 34479 }; 34480 } 34481 if (isErrorEventSampled && replay.recordingMode === "buffer" && ((_replay_session = replay.session) === null || _replay_session === void 0 ? void 0 : _replay_session.sampled) === "buffer") { 34482 const session = replay.session; 34483 session.dirty = true; 34484 if (replay.getOptions().stickySession) { 34485 saveSession(session); 34486 } 34487 } 34488 return event; 34489 }, { 34490 id: "Replay" 34491 }); 34492} 34493function createPerformanceSpans(replay, entries) { 34494 return entries.map((param)=>{ 34495 let { type, start, end, name, data } = param; 34496 const response = replay.throttledAddEvent({ 34497 type: EventType.Custom, 34498 timestamp: start, 34499 data: { 34500 tag: "performanceSpan", 34501 payload: { 34502 op: type, 34503 description: name, 34504 startTimestamp: start, 34505 endTimestamp: end, 34506 data 34507 } 34508 } 34509 }); 34510 return typeof response === "string" ? Promise.resolve(null) : response; 34511 }); 34512} 34513function handleHistory(handlerData) { 34514 const { from, to } = handlerData; 34515 const now = Date.now() / 1e3; 34516 return { 34517 type: "navigation.push", 34518 start: now, 34519 end: now, 34520 name: to, 34521 data: { 34522 previous: from 34523 } 34524 }; 34525} 34526function handleHistorySpanListener(replay) { 34527 return (handlerData)=>{ 34528 if (!replay.isEnabled()) { 34529 return; 34530 } 34531 const result = handleHistory(handlerData); 34532 if (result === null) { 34533 return; 34534 } 34535 replay.getContext().urls.push(result.name); 34536 replay.triggerUserActivity(); 34537 replay.addUpdate(()=>{ 34538 createPerformanceSpans(replay, [ 34539 result 34540 ]); 34541 return false; 34542 }); 34543 }; 34544} 34545function shouldFilterRequest(replay, url) { 34546 if (DEBUG_BUILD3 && replay.getOptions()._experiments.traceInternals) { 34547 return false; 34548 } 34549 return isSentryRequestUrl(url, (0, __TURBOPACK__imported__module__250804__26["getClient"])()); 34550} 34551function addNetworkBreadcrumb(replay, result) { 34552 if (!replay.isEnabled()) { 34553 return; 34554 } 34555 if (result === null) { 34556 return; 34557 } 34558 if (shouldFilterRequest(replay, result.name)) { 34559 return; 34560 } 34561 replay.addUpdate(()=>{ 34562 createPerformanceSpans(replay, [ 34563 result 34564 ]); 34565 return true; 34566 }); 34567} 34568function getBodySize(body) { 34569 if (!body) { 34570 return void 0; 34571 } 34572 const textEncoder = new TextEncoder(); 34573 try { 34574 if (typeof body === "string") { 34575 return textEncoder.encode(body).length; 34576 } 34577 if (body instanceof URLSearchParams) { 34578 return textEncoder.encode(body.toString()).length; 34579 } 34580 if (body instanceof FormData) { 34581 const formDataStr = serializeFormData(body); 34582 return textEncoder.encode(formDataStr).length; 34583 } 34584 if (body instanceof Blob) { 34585 return body.size; 34586 } 34587 if (body instanceof ArrayBuffer) { 34588 return body.byteLength; 34589 } 34590 } catch (unused) {} 34591 return void 0; 34592} 34593function parseContentLengthHeader(header) { 34594 if (!header) { 34595 return void 0; 34596 } 34597 const size = parseInt(header, 10); 34598 return isNaN(size) ? void 0 : size; 34599} 34600function mergeWarning(info, warning) { 34601 if (!info) { 34602 return { 34603 headers: {}, 34604 size: void 0, 34605 _meta: { 34606 warnings: [ 34607 warning 34608 ] 34609 } 34610 }; 34611 } 34612 const newMeta = { 34613 ...info._meta 34614 }; 34615 const existingWarnings = newMeta.warnings || []; 34616 newMeta.warnings = [ 34617 ...existingWarnings, 34618 warning 34619 ]; 34620 info._meta = newMeta; 34621 return info; 34622} 34623function makeNetworkReplayBreadcrumb(type, data) { 34624 if (!data) { 34625 return null; 34626 } 34627 const { startTimestamp, endTimestamp, url, method, statusCode, request, response } = data; 34628 const result = { 34629 type, 34630 start: startTimestamp / 1e3, 34631 end: endTimestamp / 1e3, 34632 name: url, 34633 data: { 34634 method, 34635 statusCode, 34636 request, 34637 response 34638 } 34639 }; 34640 return result; 34641}
vendor: 4,519 bytes, lines 34642-34778
34642function buildSkippedNetworkRequestOrResponse(bodySize) { 34643 return { 34644 headers: {}, 34645 size: bodySize, 34646 _meta: { 34647 warnings: [ 34648 "URL_SKIPPED" 34649 ] 34650 } 34651 }; 34652} 34653function buildNetworkRequestOrResponse(headers, bodySize, body) { 34654 if (!bodySize && Object.keys(headers).length === 0) { 34655 return void 0; 34656 } 34657 if (!bodySize) { 34658 return { 34659 headers 34660 }; 34661 } 34662 if (!body) { 34663 return { 34664 headers, 34665 size: bodySize 34666 }; 34667 } 34668 const info = { 34669 headers, 34670 size: bodySize 34671 }; 34672 const { body: normalizedBody, warnings } = normalizeNetworkBody(body); 34673 info.body = normalizedBody; 34674 if (warnings === null || warnings === void 0 ? void 0 : warnings.length) { 34675 info._meta = { 34676 warnings 34677 }; 34678 } 34679 return info; 34680} 34681function getAllowedHeaders(headers, allowedHeaders) { 34682 return Object.entries(headers).reduce((filteredHeaders, param)=>{ 34683 let [key, value] = param; 34684 const normalizedKey = key.toLowerCase(); 34685 if (allowedHeaders.includes(normalizedKey) && headers[key]) { 34686 filteredHeaders[normalizedKey] = value; 34687 } 34688 return filteredHeaders; 34689 }, {}); 34690} 34691function normalizeNetworkBody(body) { 34692 if (!body || typeof body !== "string") { 34693 return { 34694 body 34695 }; 34696 } 34697 const exceedsSizeLimit = body.length > NETWORK_BODY_MAX_SIZE; 34698 const isProbablyJson = _strIsProbablyJson(body); 34699 if (exceedsSizeLimit) { 34700 const truncatedBody = body.slice(0, NETWORK_BODY_MAX_SIZE); 34701 if (isProbablyJson) { 34702 return { 34703 body: truncatedBody, 34704 warnings: [ 34705 "MAYBE_JSON_TRUNCATED" 34706 ] 34707 }; 34708 } 34709 return { 34710 body: "".concat(truncatedBody, "â¦"), 34711 warnings: [ 34712 "TEXT_TRUNCATED" 34713 ] 34714 }; 34715 } 34716 if (isProbablyJson) { 34717 try { 34718 const jsonBody = JSON.parse(body); 34719 return { 34720 body: jsonBody 34721 }; 34722 } catch (unused) {} 34723 } 34724 return { 34725 body 34726 }; 34727} 34728function _strIsProbablyJson(str) { 34729 const first = str[0]; 34730 const last = str[str.length - 1]; 34731 return first === "[" && last === "]" || first === "{" && last === "}"; 34732} 34733function urlMatches(url, urls) { 34734 const fullUrl = getFullUrl(url); 34735 return (0, __TURBOPACK__imported__module__821593__6["stringMatchesSomePattern"])(fullUrl, urls); 34736} 34737function getFullUrl(url) { 34738 let baseURI = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : WINDOW4.document.baseURI; 34739 if (url.startsWith("http://") || url.startsWith("https://") || url.startsWith(WINDOW4.location.origin)) { 34740 return url; 34741 } 34742 const fixedUrl = new URL(url, baseURI); 34743 if (fixedUrl.origin !== new URL(baseURI).origin) { 34744 return url; 34745 } 34746 const fullUrl = fixedUrl.href; 34747 if (!url.endsWith("/") && fullUrl.endsWith("/")) { 34748 return fullUrl.slice(0, -1); 34749 } 34750 return fullUrl; 34751} 34752async function captureFetchBreadcrumbToReplay(breadcrumb, hint, options) { 34753 try { 34754 const data = await _prepareFetchData(breadcrumb, hint, options); 34755 const result = makeNetworkReplayBreadcrumb("resource.fetch", data); 34756 addNetworkBreadcrumb(options.replay, result); 34757 } catch (error) { 34758 DEBUG_BUILD3 && debug.exception(error, "Failed to capture fetch breadcrumb"); 34759 } 34760} 34761function enrichFetchBreadcrumb(breadcrumb, hint) { 34762 const { input, response } = hint; 34763 const body = input ? getFetchRequestArgBody(input) : void 0; 34764 const reqSize = getBodySize(body); 34765 const resSize = response ? parseContentLengthHeader(response.headers.get("content-length")) : void 0; 34766 if (reqSize !== void 0) { 34767 breadcrumb.data.request_body_size = reqSize; 34768 } 34769 if (resSize !== void 0) { 34770 breadcrumb.data.response_body_size = resSize; 34771 } 34772} 34773async function _prepareFetchData(breadcrumb, hint, options) { 34774 const now = Date.now(); 34775 const { startTimestamp = now, endTimestamp = now } = hint; 34776 const { url, method, status_code: statusCode = 0, request_body_size: requestBodySize, response_body_size: responseBodySize } = breadcrumb.data; 34777 const captureDetails = urlMatches(url, options.networkDetailAllowUrls) && !urlMatches(url, options.networkDetailDenyUrls); 34778 const request = captureDetails ? _getRequestInfo(options, hint.input, requestBodySize) : buildSkippedNetwork
vendor: 6,276 bytes, lines 34778-34949
34778RequestOrResponse(requestBodySize); 34779 const response = await _getResponseInfo(captureDetails, options, hint.response, responseBodySize); 34780 return { 34781 startTimestamp, 34782 endTimestamp, 34783 url, 34784 method, 34785 statusCode, 34786 request, 34787 response 34788 }; 34789} 34790function _getRequestInfo(param, input, requestBodySize) { 34791 let { networkCaptureBodies, networkRequestHeaders } = param; 34792 const headers = input ? getRequestHeaders(input, networkRequestHeaders) : {}; 34793 if (!networkCaptureBodies) { 34794 return buildNetworkRequestOrResponse(headers, requestBodySize, void 0); 34795 } 34796 const requestBody = getFetchRequestArgBody(input); 34797 const [bodyStr, warning] = getBodyString(requestBody, debug); 34798 const data = buildNetworkRequestOrResponse(headers, requestBodySize, bodyStr); 34799 if (warning) { 34800 return mergeWarning(data, warning); 34801 } 34802 return data; 34803} 34804async function _getResponseInfo(captureDetails, param, response, responseBodySize) { 34805 let { networkCaptureBodies, networkResponseHeaders } = param; 34806 if (!captureDetails && responseBodySize !== void 0) { 34807 return buildSkippedNetworkRequestOrResponse(responseBodySize); 34808 } 34809 const headers = response ? getAllHeaders(response.headers, networkResponseHeaders) : {}; 34810 if (!response || !networkCaptureBodies && responseBodySize !== void 0) { 34811 return buildNetworkRequestOrResponse(headers, responseBodySize, void 0); 34812 } 34813 const [bodyText, warning] = await _parseFetchResponseBody(response); 34814 const result = getResponseData(bodyText, { 34815 networkCaptureBodies, 34816 responseBodySize, 34817 captureDetails, 34818 headers 34819 }); 34820 if (warning) { 34821 return mergeWarning(result, warning); 34822 } 34823 return result; 34824} 34825function getResponseData(bodyText, param) { 34826 let { networkCaptureBodies, responseBodySize, captureDetails, headers } = param; 34827 try { 34828 const size = (bodyText === null || bodyText === void 0 ? void 0 : bodyText.length) && responseBodySize === void 0 ? getBodySize(bodyText) : responseBodySize; 34829 if (!captureDetails) { 34830 return buildSkippedNetworkRequestOrResponse(size); 34831 } 34832 if (networkCaptureBodies) { 34833 return buildNetworkRequestOrResponse(headers, size, bodyText); 34834 } 34835 return buildNetworkRequestOrResponse(headers, size, void 0); 34836 } catch (error) { 34837 DEBUG_BUILD3 && debug.exception(error, "Failed to serialize response body"); 34838 return buildNetworkRequestOrResponse(headers, responseBodySize, void 0); 34839 } 34840} 34841async function _parseFetchResponseBody(response) { 34842 const res = _tryCloneResponse(response); 34843 if (!res) { 34844 return [ 34845 void 0, 34846 "BODY_PARSE_ERROR" 34847 ]; 34848 } 34849 try { 34850 const text = await _tryGetResponseText(res); 34851 return [ 34852 text 34853 ]; 34854 } catch (error) { 34855 if (error instanceof Error && error.message.indexOf("Timeout") > -1) { 34856 DEBUG_BUILD3 && debug.warn("Parsing text body from response timed out"); 34857 return [ 34858 void 0, 34859 "BODY_PARSE_TIMEOUT" 34860 ]; 34861 } 34862 DEBUG_BUILD3 && debug.exception(error, "Failed to get text body from response"); 34863 return [ 34864 void 0, 34865 "BODY_PARSE_ERROR" 34866 ]; 34867 } 34868} 34869function getAllHeaders(headers, allowedHeaders) { 34870 const allHeaders = {}; 34871 allowedHeaders.forEach((header)=>{ 34872 if (headers.get(header)) { 34873 allHeaders[header] = headers.get(header); 34874 } 34875 }); 34876 return allHeaders; 34877} 34878function getRequestHeaders(fetchArgs, allowedHeaders) { 34879 if (fetchArgs.length === 1 && typeof fetchArgs[0] !== "string") { 34880 return getHeadersFromOptions(fetchArgs[0], allowedHeaders); 34881 } 34882 if (fetchArgs.length === 2) { 34883 return getHeadersFromOptions(fetchArgs[1], allowedHeaders); 34884 } 34885 return {}; 34886} 34887function getHeadersFromOptions(input, allowedHeaders) { 34888 if (!input) { 34889 return {}; 34890 } 34891 const headers = input.headers; 34892 if (!headers) { 34893 return {}; 34894 } 34895 if (headers instanceof Headers) { 34896 return getAllHeaders(headers, allowedHeaders); 34897 } 34898 if (Array.isArray(headers)) { 34899 return {}; 34900 } 34901 return getAllowedHeaders(headers, allowedHeaders); 34902} 34903function _tryCloneResponse(response) { 34904 try { 34905 return response.clone(); 34906 } catch (error) { 34907 DEBUG_BUILD3 && debug.exception(error, "Failed to clone response body"); 34908 } 34909} 34910function _tryGetResponseText(response) { 34911 return new Promise((resolve, reject)=>{ 34912 const timeout = setTimeout1(()=>reject(new Error("Timeout while trying to read response body")), 500); 34913 _getResponseText(response).then((txt)=>resolve(txt), (reason)=>reject(reason)).finally(()=>clearTimeout(timeout)); 34914 }); 34915} 34916async function _getResponseText(response) { 34917 return await response.text(); 34918} 34919async function captureXhrBreadcrumbToReplay(breadcrumb, hint, options) { 34920 try { 34921 const data = _prepareXhrData(breadcrumb, hint, options); 34922 const result = makeNetworkReplayBreadcrumb("resource.xhr", data); 34923 addNetworkBreadcrumb(options.replay, result); 34924 } catch (error) { 34925 DEBUG_BUILD3 && debug.exception(error, "Failed to capture xhr breadcrumb"); 34926 } 34927} 34928function enrichXhrBreadcrumb(breadcrumb, hint) { 34929 const { xhr, input } = hint; 34930 if (!xhr) { 34931 return; 34932 } 34933 const reqSize = getBodySize(input); 34934 const resSize = xhr.getResponseHeader("content-length") ? parseContentLengthHeader(xhr.getResponseHeader("content-length")) : _getBodySize(xhr.response, xhr.responseType); 34935 if (reqSize !== void 0) { 34936 breadcrumb.data.request_body_size = reqSize; 34937 } 34938 if (resSize !== void 0) { 34939 breadcrumb.data.response_body_size = resSize; 34940 } 34941} 34942function _prepareXhrData(breadcrumb, hint, options) { 34943 const now = Date.now(); 34944 const { startTimestamp = now, endTimestamp = now, input, xhr } = hint; 34945 const { url, method, status_code: statusCode = 0, request_body_size: requestBodySize, response_body_size: responseBodySize } = breadcrumb.data; 34946 if (!url) { 34947 return null; 34948 } 34949 if (!xhr || !urlMatches(url, options.networkDetailAllowUrls) || urlMatches(url, options.networkDetailDenyUrls)) {
34950 const request2 = buildSkippedNetworkRequestOrResponse(requestBodySize); 34951 const response2 = buildSkippedNetworkRequestOrResponse(responseBodySize); 34952 return { 34953 startTimestamp, 34954 endTimestamp, 34955 url, 34956 method, 34957 statusCode, 34958 request: request2, 34959 response: response2 34960 }; 34961 } 34962 const xhrInfo = xhr[SENTRY_XHR_DATA_KEY]; 34963 const networkRequestHeaders = xhrInfo ? getAllowedHeaders(xhrInfo.request_headers, options.networkRequestHeaders) : {}; 34964 const networkResponseHeaders = getAllowedHeaders(parseXhrResponseHeaders(xhr), options.networkResponseHeaders); 34965 const [requestBody, requestWarning] = options.networkCaptureBodies ? getBodyString(input, debug) : [ 34966 void 0 34967 ]; 34968 const [responseBody, responseWarning] = options.networkCaptureBodies ? _getXhrResponseBody(xhr) : [ 34969 void 0 34970 ]; 34971 const request = buildNetworkRequestOrResponse(networkRequestHeaders, requestBodySize, requestBody); 34972 const response = buildNetworkRequestOrResponse(networkResponseHeaders, responseBodySize, responseBody); 34973 return { 34974 startTimestamp, 34975 endTimestamp, 34976 url, 34977 method, 34978 statusCode, 34979 request: requestWarning ? mergeWarning(request, requestWarning) : request, 34980 response: responseWarning ? mergeWarning(response, responseWarning) : response 34981 }; 34982} 34983function _getXhrResponseBody(xhr) { 34984 const errors = []; 34985 try { 34986 return [ 34987 xhr.responseText 34988 ]; 34989 } catch (e) { 34990 errors.push(e); 34991 } 34992 try { 34993 return _parseXhrResponse(xhr.response, xhr.responseType); 34994 } catch (e) { 34995 errors.push(e); 34996 } 34997 DEBUG_BUILD3 && debug.warn("Failed to get xhr response body", ...errors); 34998 return [ 34999 void 0 35000 ]; 35001} 35002function _parseXhrResponse(body, responseType) { 35003 try { 35004 if (typeof body === "string") { 35005 return [ 35006 body 35007 ]; 35008 } 35009 if (body instanceof Document) { 35010 return [ 35011 body.body.outerHTML 35012 ]; 35013 } 35014 if (responseType === "json" && (0, __TURBOPACK__imported__module__453288__14["isObjectLike"])(body)) { 35015 return [ 35016 JSON.stringify(body) 35017 ]; 35018 } 35019 if (!body) { 35020 return [ 35021 void 0 35022 ]; 35023 } 35024 } catch (error) { 35025 DEBUG_BUILD3 && debug.exception(error, "Failed to serialize body", body); 35026 return [ 35027 void 0, 35028 "BODY_PARSE_ERROR" 35029 ]; 35030 } 35031 DEBUG_BUILD3 && debug.log("Skipping network body because of body type", body); 35032 return [ 35033 void 0, 35034 "UNPARSEABLE_BODY_TYPE" 35035 ]; 35036} 35037function _getBodySize(body, responseType) { 35038 try { 35039 const bodyStr = responseType === "json" && (0, __TURBOPACK__imported__module__453288__14["isObjectLike"])(body) ? JSON.stringify(body) : body; 35040 return getBodySize(bodyStr); 35041 } catch (unused) { 35042 return void 0; 35043 } 35044} 35045function handleNetworkBreadcrumbs(replay) { 35046 const client = (0, __TURBOPACK__imported__module__250804__26["getClient"])(); 35047 try { 35048 const { networkDetailAllowUrls, networkDetailDenyUrls, networkCaptureBodies, networkRequestHeaders, networkResponseHeaders } = replay.getOptions(); 35049 const options = { 35050 replay, 35051 networkDetailAllowUrls, 35052 networkDetailDenyUrls, 35053 networkCaptureBodies, 35054 networkRequestHeaders, 35055 networkResponseHeaders 35056 }; 35057 if (client) { 35058 client.on("beforeAddBreadcrumb", (breadcrumb, hint)=>beforeAddNetworkBreadcrumb(options, breadcrumb, hint)); 35059 } 35060 } catch (unused) {} 35061} 35062function beforeAddNetworkBreadcrumb(options, breadcrumb, hint) { 35063 if (!breadcrumb.data) { 35064 return; 35065 } 35066 try { 35067 if (_isXhrBreadcrumb(breadcrumb) && _isXhrHint(hint)) { 35068 enrichXhrBreadcrumb(breadcrumb, hint); 35069 captureXhrBreadcrumbToReplay(breadcrumb, hint, options); 35070 } 35071 if (_isFetchBreadcrumb(breadcrumb) && _isFetchHint(hint)) { 35072 enrichFetchBreadcrumb(breadcrumb, hint); 35073 captureFetchBreadcrumbToReplay(breadcrumb, hint, options); 35074 } 35075 } catch (e) { 35076 DEBUG_BUILD3 && debug.exception(e, "Error when enriching network breadcrumb"); 35077 } 35078} 35079function _isXhrBreadcrumb(breadcrumb) { 35080 return breadcrumb.category === "xhr"; 35081} 35082function _isFetchBreadcrumb(breadcrumb) { 35083 return breadcrumb.category === "fetch"; 35084} 35085function _isXhrHint(hint) { 35086 return hint === null || hint === void 0 ? void 0 : hint.xhr; 35087} 35088function _isFetchHint(hint) { 35089 return (hint === null || hint === void 0 ? void 0 : hint.input) !== void 0; 35090} 35091function addGlobalListeners(replay) { 35092 const client = (0, __TURBOPACK__imported__module__250804__26["getClient"])(); 35093 addClickKeypressInstrumentationHandler(handleDomListener(replay)); 35094 addHistoryInstrumentationHandler(handleHistorySpanListener(replay)); 35095 handleBreadcrumbs(replay); 35096 handleNetworkBreadcrumbs(replay); 35097 const eventProcessor = handleGlobalEventListener(replay); 35098 (0, __TURBOPACK__imported__module__662537__6["addEventProcessor"])(eventProcessor); 35099 if (client) { 35100 client.on("beforeSendEvent", handleBeforeSendEvent(replay)); 35101 client.on("afterSendEvent", handleAfterSendEvent(replay)); 35102 client.on("createDsc", (dsc)=>{ 35103 const replayId = replay.getSessionId(); 35104 if (replayId && replay.isEnabled() && replay.recordingMode === "session") {
35105 const isSessionActive = replay.checkAndHandleExpiredSession(); 35106 if (isSessionActive) { 35107 dsc.replay_id = replayId; 35108 } 35109 } 35110 }); 35111 client.on("processSegmentSpan", handleProcessSegmentSpan(replay)); 35112 client.on("spanStart", (span)=>{ 35113 replay.lastActiveSpan = span; 35114 }); 35115 client.on("spanEnd", (span)=>{ 35116 replay.lastActiveSpan = span; 35117 }); 35118 client.on("beforeSendFeedback", async (feedbackEvent, options)=>{ 35119 var _feedbackEvent_contexts; 35120 const replayId = replay.getSessionId(); 35121 if ((options === null || options === void 0 ? void 0 : options.includeReplay) && replay.isEnabled() && replayId && ((_feedbackEvent_contexts = feedbackEvent.contexts) === null || _feedbackEvent_contexts === void 0 ? void 0 : _feedbackEvent_contexts.feedback)) { 35122 if (feedbackEvent.contexts.feedback.source === "api") { 35123 await replay.sendBufferedReplayOrFlush(); 35124 } 35125 feedbackEvent.contexts.feedback.replay_id = replayId; 35126 } 35127 }); 35128 client.on("openFeedbackWidget", async ()=>{ 35129 await replay.sendBufferedReplayOrFlush(); 35130 }); 35131 } 35132} 35133async function addMemoryEntry(replay) { 35134 try { 35135 return Promise.all(createPerformanceSpans(replay, [ 35136 // @ts-expect-error memory doesn't exist on type Performance as the API is non-standard (we check that it exists above) 35137 createMemoryEntry(WINDOW4.performance.memory) 35138 ])); 35139 } catch (unused) { 35140 return []; 35141 } 35142} 35143function createMemoryEntry(memoryEntry) { 35144 const { jsHeapSizeLimit, totalJSHeapSize, usedJSHeapSize } = memoryEntry; 35145 const time = Date.now() / 1e3; 35146 return { 35147 type: "memory", 35148 name: "memory", 35149 start: time, 35150 end: time, 35151 data: { 35152 memory: { 35153 jsHeapSizeLimit, 35154 totalJSHeapSize, 35155 usedJSHeapSize 35156 } 35157 } 35158 }; 35159} 35160function debounce1(func, wait, options) { 35161 return debounce(func, wait, { 35162 ...options, 35163 // @ts-expect-error - Not quite sure why these types do not match, but this is fine 35164 setTimeoutImpl: setTimeout1 35165 }); 35166} 35167const NAVIGATOR = __TURBOPACK__imported__module__225304__14["GLOBAL_OBJ"].navigator; 35168function getRecordingSamplingOptions() { 35169 var _ref, _ref1; 35170 if (/iPhone|iPad|iPod/i.test((_ref = NAVIGATOR === null || NAVIGATOR === void 0 ? void 0 : NAVIGATOR.userAgent) !== null && _ref !== void 0 ? _ref : "") || /Macintosh/i.test((_ref1 = NAVIGATOR === null || NAVIGATOR === void 0 ? void 0 : NAVIGATOR.userAgent) !== null && _ref1 !== void 0 ? _ref1 : "") && (NAVIGATOR === null || NAVIGATOR === void 0 ? void 0 : NAVIGATOR.maxTouchPoints) && (NAVIGATOR === null || NAVIGATOR === void 0 ? void 0 : NAVIGATOR.maxTouchPoints) > 1) { 35171 return { 35172 sampling: { 35173 mousemove: false 35174 } 35175 }; 35176 } 35177 return {}; 35178} 35179function getHandleRecordingEmit(replay) { 35180 let hadFirstEvent = false; 35181 return (event, _isCheckout)=>{ 35182 try { 35183 if (!replay.checkAndHandleExpiredSession()) { 35184 DEBUG_BUILD3 && debug.warn("Received replay event after session expired."); 35185 return; 35186 } 35187 const isCheckout = _isCheckout || !hadFirstEvent; 35188 hadFirstEvent = true; 35189 syncMirrorAttributesFromMutationEvent(event); 35190 if (replay.clickDetector) { 35191 updateClickDetectorForRecordingEvent(replay.clickDetector, event); 35192 } 35193 replay.addUpdate(()=>{ 35194 if (replay.recordingMode === "buffer" && isCheckout) { 35195 replay.setInitialState(); 35196 } 35197 if (!addEventSync(replay, event, isCheckout)) { 35198 return true; 35199 } 35200 if (!isCheckout) { 35201 return false; 35202 } 35203 const session = replay.session; 35204 addSettingsEvent(replay, isCheckout); 35205 if (replay.recordingMode === "buffer" && session && replay.eventBuffer && !session.dirty) { 35206 const earliestEvent = replay.eventBuffer.getEarliestTimestamp(); 35207 if (earliestEvent) { 35208 DEBUG_BUILD3 && debug.log("Updating session start time to earliest event in buffer to ".concat(new Date(earliestEvent))); 35209 session.started = earliestEvent; 35210 if (replay.getOptions().stickySession) { 35211 saveSession(session); 35212 } 35213 } 35214 } 35215 if (session === null || session === void 0 ? void 0 : session.previousSessionId) { 35216 return true; 35217 } 35218 if (replay.recordingMode === "session") { 35219 void replay.flush(); 35220 } 35221 return true; 35222 }); 35223 } catch (error) { 35224 replay.handleException(error); 35225 } 35226 }; 35227} 35228function syncMirrorAttributesFromMutationEvent(event) { 35229 const data = event.data; 35230 if (event.type !== EventType.IncrementalSnapshot || !data || typeof data !== "object" || !("source" in data) || data.source !== IncrementalSource.Mutation || !("attributes" in data) || !Array.isArray(data.attributes)) { 35231 return; 35232 } 35233 for (const mutation of data.attributes){ 35234 const node = record.mirror.getNode(mutation.id); 35235 const meta = node && record.mirror.getMeta(node); 35236 if ((meta === null || meta === void 0 ? void 0 : meta.type) !== NodeType.Element) { 35237 continue; 35238 } 35239 for (const [attributeName, value] of Object.entries(mutation.attributes)){ 35240 if (value === null) { 35241 delete meta.attributes[attributeName]; 35242 } else { 35243 meta.attributes[attributeName] = value; 35244 } 35245 } 35246 } 35247} 35248function createOptionsEvent(replay) { 35249 const options = replay.getOptions(); 35250 return { 35251 type: EventType.Custom, 35252 timestamp: Date.now(), 35253 data: { 35254 tag: "options", 35255 payload: { 35256 shouldRecordCanvas: replay.isRecordingCanvas(), 35257 sessionSampleRate: options.sessionSampleRate, 35258 errorSampleRate: options.errorSampleRate, 35259 useCompressionOption: options.useCompression, 35260 blockAllMedia: options.blockAllMedia, 35261 maskAllText: options.maskAllText, 35262 maskAllInputs: options.maskAllInputs, 35263 useCompression: replay.eventBuffer ? replay.eventBuffer.type === "worker" : false, 35264 networkDetailHasUrls: options.networkDetailAllowUrls.length > 0, 35265 networkCaptureBodies: options.networkCaptureBodies, 35266 networkRequestHasHeaders: options.networkRequestHeaders.length > 0, 35267 networkResponseHasHeaders: options.networkResponseHeaders.length > 0 35268 } 35269 } 35270 }; 35271} 35272function addSettingsEvent(replay, isCheckout) { 35273 var _replay_session; 35274 if (!isCheckout || ((_replay_session = replay.session) === null || _replay_session === void 0 ? void 0 : _replay_session.segmentId) !== 0) { 35275 return; 35276 } 35277 addEventSync(replay, createOptionsEvent(replay), false); 35278} 35279function closestElementOfNode(node) { 35280 if (!node) { 35281 return null; 35282 } 35283 try { 35284 const el = node.nodeType === node.ELEMENT_NODE ? node : node.parentElement; 35285 return el; 35286 } catch (unused) { 35287 return null; 35288 } 35289} 35290function createReplayEnvelope(replayEvent, recordingData, dsn, tunnel) { 35291 return (0, __TURBOPACK__imported__module__67486__5["createEnvelope"])((0, __TURBOPACK__imported__module__67486__5["createEventEnvelopeHeaders"])(replayEvent, (0, __TURBOPACK__imported__module__67486__5["getSdkMetadataForEnvelopeHeader"])(replayEvent), tunnel, dsn), [ 35292 [ 35293 { 35294 type: "replay_event" 35295 }, 35296 replayEvent 35297 ], 35298 [ 35299 { 35300 type: "replay_recording",
35301 // If string then we need to encode to UTF8, otherwise will have 35302 // wrong size. TextEncoder has similar browser support to 35303 // MutationObserver, although it does not accept IE11. 35304 length: typeof recordingData === "string" ? new TextEncoder().encode(recordingData).length : recordingData.length 35305 }, 35306 recordingData 35307 ] 35308 ]); 35309} 35310function prepareRecordingData(param) { 35311 let { recordingData, headers } = param; 35312 let payloadWithSequence; 35313 const replayHeaders = "".concat(JSON.stringify(headers), "\n"); 35314 if (typeof recordingData === "string") { 35315 payloadWithSequence = "".concat(replayHeaders).concat(recordingData); 35316 } else { 35317 const enc = new TextEncoder(); 35318 const sequence = enc.encode(replayHeaders); 35319 payloadWithSequence = new Uint8Array(sequence.length + recordingData.length); 35320 payloadWithSequence.set(sequence); 35321 payloadWithSequence.set(recordingData, sequence.length); 35322 } 35323 return payloadWithSequence; 35324} 35325async function prepareReplayEvent(param) { 35326 let { client, scope, replayId: event_id, event } = param; 35327 const integrations = typeof client["_integrations"] === "object" && client["_integrations"] !== null && !Array.isArray(client["_integrations"]) ? Object.keys(client["_integrations"]) : void 0; 35328 const eventHint = { 35329 event_id, 35330 integrations 35331 }; 35332 client.emit("preprocessEvent", event, eventHint); 35333 const preparedEvent = await (0, __TURBOPACK__imported__module__213186__1["prepareEvent"])(client.getOptions(), event, eventHint, scope, client, (0, __TURBOPACK__imported__module__250804__26["getIsolationScope"])()); 35334 if (!preparedEvent) { 35335 return null; 35336 } 35337 client.emit("postprocessEvent", preparedEvent, eventHint); 35338 preparedEvent.platform = preparedEvent.platform || "javascript"; 35339 const metadata = client.getSdkMetadata(); 35340 const { name, version, settings } = (metadata === null || metadata === void 0 ? void 0 : metadata.sdk) || {}; 35341 preparedEvent.sdk = { 35342 ...preparedEvent.sdk, 35343 name: name || "sentry.javascript.unknown", 35344 version: version || "0.0.0", 35345 settings 35346 }; 35347 return preparedEvent; 35348} 35349async function sendReplayRequest(param) { 35350 let { recordingData, replayId, segmentId: segment_id, eventContext, timestamp, session } = param; 35351 const preparedRecordingData = prepareRecordingData({ 35352 recordingData, 35353 headers: { 35354 segment_id 35355 } 35356 }); 35357 const { urls, errorIds, traceIds, segmentNames, initialTimestamp } = eventContext; 35358 const client = (0, __TURBOPACK__imported__module__250804__26["getClient"])(); 35359 const scope = (0, __TURBOPACK__imported__module__250804__26["getCurrentScope"])(); 35360 const transport = client === null || client === void 0 ? void 0 : client.getTransport(); 35361 const dsn = client === null || client === void 0 ? void 0 : client.getDsn(); 35362 if (!client || !transport || !dsn || !session.sampled) { 35363 return Promise.resolve({}); 35364 } 35365 const baseEvent = { 35366 type: REPLAY_EVENT_NAME, 35367 replay_start_timestamp: initialTimestamp / 1e3, 35368 timestamp: timestamp / 1e3, 35369 error_ids: errorIds, 35370 trace_ids: traceIds, 35371 segment_names: segmentNames, 35372 urls, 35373 replay_id: replayId, 35374 segment_id, 35375 replay_type: session.sampled 35376 }; 35377 const replayEvent = await prepareReplayEvent({ 35378 scope, 35379 client, 35380 replayId, 35381 event: baseEvent 35382 }); 35383 if (!replayEvent) { 35384 client.recordDroppedEvent("event_processor", "replay"); 35385 DEBUG_BUILD3 && debug.log("An event processor returned `null`, will not send event."); 35386 return Promise.resolve({}); 35387 } 35388 delete replayEvent.sdkProcessingMetadata; 35389 const envelope = createReplayEnvelope(replayEvent, preparedRecordingData, dsn, client.getOptions().tunnel); 35390 let response; 35391 try { 35392 response = await transport.send(envelope); 35393 } catch (err) { 35394 const error = new Error(UNABLE_TO_SEND_REPLAY); 35395 try { 35396 error.cause = err;
35397 } catch (unused) {} 35398 throw error; 35399 } 35400 const rateLimits = updateRateLimits({}, response); 35401 if (isRateLimited(rateLimits, "replay")) { 35402 throw new RateLimitError(rateLimits); 35403 } 35404 if (typeof response.statusCode === "number" && (response.statusCode < 200 || response.statusCode >= 300)) { 35405 throw new TransportStatusCodeError(response.statusCode); 35406 } 35407 return response; 35408} 35409class TransportStatusCodeError extends Error { 35410 constructor(statusCode){ 35411 super("Transport returned status code ".concat(statusCode)); 35412 } 35413} 35414class RateLimitError extends Error { 35415 constructor(rateLimits){ 35416 super("Rate limit hit"); 35417 this.rateLimits = rateLimits; 35418 } 35419} 35420class ReplayDurationLimitError extends Error { 35421 constructor(){ 35422 super("Session is too long, not sending replay"); 35423 } 35424} 35425async function sendReplay(replayData) { 35426 let retryConfig = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : { 35427 count: 0, 35428 interval: RETRY_BASE_INTERVAL 35429 }; 35430 const { recordingData, onError } = replayData; 35431 if (!recordingData.length) { 35432 return; 35433 } 35434 try { 35435 await sendReplayRequest(replayData); 35436 return true; 35437 } catch (err) { 35438 if (err instanceof TransportStatusCodeError || err instanceof RateLimitError) { 35439 throw err; 35440 } 35441 (0, __TURBOPACK__imported__module__662537__6["setContext"])("Replays", { 35442 _retryCount: retryConfig.count 35443 }); 35444 if (onError) { 35445 onError(err); 35446 } 35447 if (retryConfig.count >= RETRY_MAX_COUNT) { 35448 const error = new Error("".concat(UNABLE_TO_SEND_REPLAY, " - max retries exceeded")); 35449 try { 35450 error.cause = err; 35451 } catch (unused) {} 35452 throw error; 35453 } 35454 retryConfig.interval *= ++retryConfig.count; 35455 return new Promise((resolve, reject)=>{ 35456 setTimeout1(async ()=>{ 35457 try { 35458 await sendReplay(replayData, retryConfig); 35459 resolve(true); 35460 } catch (err2) { 35461 reject(err2); 35462 } 35463 }, retryConfig.interval); 35464 }); 35465 } 35466} 35467const THROTTLED = "__THROTTLED"; 35468const SKIPPED = "__SKIPPED"; 35469function throttle(fn, maxCount, durationSeconds) { 35470 const counter = /* @__PURE__ */ new Map(); 35471 const _cleanup = (now)=>{ 35472 const threshold = now - durationSeconds; 35473 counter.forEach((_value, key)=>{ 35474 if (key < threshold) { 35475 counter.delete(key); 35476 } 35477 }); 35478 }; 35479 const _getTotalCount = ()=>{ 35480 return [ 35481 ...counter.values() 35482 ].reduce((a, b)=>a + b, 0); 35483 }; 35484 let isThrottled = false; 35485 return function() { 35486 for(var _len = arguments.length, rest = new Array(_len), _key = 0; _key < _len; _key++){ 35487 rest[_key] = arguments[_key]; 35488 } 35489 const now = Math.floor(Date.now() / 1e3); 35490 _cleanup(now); 35491 if (_getTotalCount() >= maxCount) { 35492 const wasThrottled = isThrottled; 35493 isThrottled = true; 35494 return wasThrottled ? SKIPPED : THROTTLED; 35495 } 35496 isThrottled = false; 35497 const count = counter.get(now) || 0; 35498 counter.set(now, count + 1); 35499 return fn(...rest); 35500 }; 35501} 35502class ReplayContainer { 35503 /** Get the event context. */ getContext() { 35504 return this._context; 35505 } 35506 /** If recording is currently enabled. */ isEnabled() { 35507 return this._isEnabled; 35508 } 35509 /** If recording is currently paused. */ isPaused() { 35510 return this._isPaused; 35511 } 35512 /** 35513 * Determine if canvas recording is enabled 35514 */ isRecordingCanvas() { 35515 return Boolean(this._canvas); 35516 } 35517 /** Get the replay integration options. */ getOptions() { 35518 return this._options; 35519 } 35520 /** A wrapper to conditionally capture exceptions. */ handleException(error) { 35521 DEBUG_BUILD3 && debug.exception(error); 35522 if (this._options.onError) { 35523 this._options.onError(error); 35524 } 35525 } 35526 /** 35527 * Initializes the plugin based on sampling configuration. Should not be 35528 * called outside of constructor. 35529 */ initializeSampling(previousSessionId) { 35530 const { errorSampleRate, sessionSampleRate } = this._options; 35531 const requiresManualStart = errorSampleRate <= 0 && sessionSampleRate <= 0; 35532 this._requiresManualStart = requiresManualStart; 35533 if (requiresManualStart) { 35534 return; 35535 } 35536 this._initializeSessionForSampling(previousSessionId); 35537 if (!this.session) { 35538 DEBUG_BUILD3 && debug.exception(new Error("Unable to initialize and create session")); 35539 return; 35540 } 35541 if (this.session.sampled === false) { 35542 return; 35543 } 35544 this.recordingMode = this.session.sampled === "buffer" && this.session.segmentId === 0 ? "buffer" : "session"; 35545 DEBUG_BUILD3 && debug.infoTick("Starting replay in ".concat(this.recordingMode, " mode")); 35546 this._initializeRecording(); 35547 } 35548 /** 35549 * Start a replay regardless of sampling rate. Calling this will always 35550 * create a new session. Will log a message if replay is already in progress. 35551 * 35552 * Creates or loads a session, attaches listeners to varying events (DOM, 35553 * _performanceObserver, Recording, Sentry SDK, etc) 35554 */ start() { 35555 if (this._isEnabled && this.recordingMode === "session") { 35556 DEBUG_BUILD3 && debug.log("Recording is already in progress"); 35557 return; 35558 } 35559 if (this._isEnabled && this.recordingMode === "buffer") { 35560 DEBUG_BUILD3 && debug.log("Buffering is in progress, call `flush()` to save the replay"); 35561 return; 35562 } 35563 DEBUG_BUILD3 && debug.infoTick("Starting replay in session mode"); 35564 this._updateUserActivity(); 35565 const session = loadOrCreateSession({ 35566 maxReplayDuration: this._options.maxReplayDuration, 35567 sessionIdleExpire: this.timeouts.sessionIdleExpire 35568 }, { 35569 stickySession: this._options.stickySession, 35570 // This is intentional: create a new session-based replay when calling `start()` 35571 sessionSampleRate: 1, 35572 allowBuffering: false 35573 }); 35574 this.session = session; 35575 this.recordingMode = "session"; 35576 this._initializeRecording(); 35577 } 35578 /** 35579 * Start replay buffering. Buffers until `flush()` is called or, if 35580 * `replaysOnErrorSampleRate` > 0, an error occurs.
vendor: 1,051 bytes, lines 35581-35608
35581 */ startBuffering() { 35582 if (this._isEnabled) { 35583 DEBUG_BUILD3 && debug.log("Buffering is in progress, call `flush()` to save the replay"); 35584 return; 35585 } 35586 DEBUG_BUILD3 && debug.infoTick("Starting replay in buffer mode"); 35587 const session = loadOrCreateSession({ 35588 sessionIdleExpire: this.timeouts.sessionIdleExpire, 35589 maxReplayDuration: this._options.maxReplayDuration 35590 }, { 35591 stickySession: this._options.stickySession, 35592 sessionSampleRate: 0, 35593 allowBuffering: true 35594 }); 35595 this.session = session; 35596 this.recordingMode = "buffer"; 35597 this._initializeRecording(); 35598 } 35599 /** 35600 * Start recording. 35601 * 35602 * Note that this will cause a new DOM checkout 35603 */ startRecording() { 35604 try { 35605 const canvasOptions = this._canvas; 35606 this._stopRecording = record({ 35607 ...this._recordingOptions, 35608 // When running in error sampling mode, we need to overwrite `checkoutEveryNms`
35609 // Without this, it would record forever, until an error happens, which we don't want 35610 // instead, we'll always keep the last 60 seconds of replay before an error happened 35611 ...this.recordingMode === "buffer" ? { 35612 checkoutEveryNms: BUFFER_CHECKOUT_TIME 35613 } : // Otherwise, use experimental option w/ min checkout time of 6 minutes 35614 // This is to improve playback seeking as there could potentially be 35615 // less mutations to process in the worse cases. 35616 // 35617 // checkout by "N" events is probably ideal, but means we have less 35618 // control about the number of checkouts we make (which generally 35619 // increases replay size) 35620 this._options._experiments.continuousCheckout && { 35621 // Minimum checkout time is 6 minutes 35622 checkoutEveryNms: Math.max(36e4, this._options._experiments.continuousCheckout) 35623 }, 35624 emit: getHandleRecordingEmit(this), 35625 ...getRecordingSamplingOptions(), 35626 onMutation: this._onMutationHandler.bind(this), 35627 ...canvasOptions ? { 35628 recordCanvas: canvasOptions.recordCanvas, 35629 getCanvasManager: canvasOptions.getCanvasManager, 35630 sampling: canvasOptions.sampling, 35631 dataURLOptions: canvasOptions.dataURLOptions 35632 } : {} 35633 }); 35634 } catch (err) { 35635 this.handleException(err); 35636 } 35637 } 35638 /** 35639 * Stops the recording, if it was running. 35640 * 35641 * Returns true if it was previously stopped, or is now stopped, 35642 * otherwise false. 35643 */ stopRecording() { 35644 try { 35645 if (this._stopRecording) { 35646 this._stopRecording(); 35647 this._stopRecording = void 0; 35648 } 35649 return true; 35650 } catch (err) { 35651 this.handleException(err); 35652 return false; 35653 } 35654 } 35655 /** 35656 * Currently, this needs to be manually called (e.g. for tests). Sentry SDK 35657 * does not support a teardown 35658 */ async stop() { 35659 let { forceFlush = false, reason } = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}; 35660 var _this_session, _getClient; 35661 if (!this._isEnabled) { 35662 return; 35663 } 35664 this._isEnabled = false; 35665 this.recordingMode = "buffer"; 35666 const stopReason = reason !== null && reason !== void 0 ? reason : "manual"; 35667 (_getClient = (0, __TURBOPACK__imported__module__250804__26["getClient"])()) === null || _getClient === void 0 ? void 0 : _getClient.emit("replayEnd", { 35668 sessionId: (_this_session = this.session) === null || _this_session === void 0 ? void 0 : _this_session.id, 35669 reason: stopReason 35670 }); 35671 try { 35672 var _this_eventBuffer; 35673 DEBUG_BUILD3 && debug.log("Stopping Replay triggered by ".concat(stopReason)); 35674 resetReplayIdOnDynamicSamplingContext(); 35675 this._removeListeners(); 35676 this.stopRecording(); 35677 this._debouncedFlush.cancel(); 35678 if (forceFlush) { 35679 await this._flush({ 35680 force: true 35681 }); 35682 } 35683 (_this_eventBuffer = this.eventBuffer) === null || _this_eventBuffer === void 0 ? void 0 : _this_eventBuffer.destroy(); 35684 this.eventBuffer = null; 35685 clearSession(this); 35686 } catch (err) { 35687 this.handleException(err); 35688 } 35689 } 35690 /** 35691 * Pause some replay functionality. See comments for `_isPaused`. 35692 * This differs from stop as this only stops DOM recording, it is 35693 * not as thorough of a shutdown as `stop()`. 35694 */ pause() { 35695 if (this._isPaused) { 35696 return; 35697 } 35698 this._isPaused = true; 35699 this.stopRecording(); 35700 DEBUG_BUILD3 && debug.log("Pausing replay"); 35701 } 35702 /** 35703 * Resumes recording, see notes for `pause(). 35704 * 35705 * Note that calling `startRecording()` here will cause a 35706 * new DOM checkout.` 35707 */ resume() { 35708 if (!this._isPaused || !this._checkSession()) { 35709 return; 35710 } 35711 this._isPaused = false;
35712 this.startRecording(); 35713 DEBUG_BUILD3 && debug.log("Resuming replay"); 35714 } 35715 /** 35716 * If not in "session" recording mode, flush event buffer which will create a new replay. 35717 * Unless `continueRecording` is false, the replay will continue to record and 35718 * behave as a "session"-based replay. 35719 * 35720 * Otherwise, queue up a flush. 35721 */ async sendBufferedReplayOrFlush() { 35722 let { continueRecording = true } = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}; 35723 if (this.recordingMode === "session") { 35724 return this.flushImmediate(); 35725 } 35726 const activityTime = Date.now(); 35727 DEBUG_BUILD3 && debug.log("Converting buffer to session"); 35728 await this.flushImmediate(); 35729 const hasStoppedRecording = this.stopRecording(); 35730 if (!continueRecording || !hasStoppedRecording) { 35731 return; 35732 } 35733 if (this.recordingMode === "session") { 35734 return; 35735 } 35736 this.recordingMode = "session"; 35737 if (this.session) { 35738 this.session.dirty = false; 35739 this._updateUserActivity(activityTime); 35740 this._updateSessionActivity(activityTime); 35741 this._maybeSaveSession(); 35742 setReplayIdOnDynamicSamplingContext(this.session.id); 35743 } 35744 this.startRecording(); 35745 } 35746 /** 35747 * We want to batch uploads of replay events. Save events only if 35748 * `<flushMinDelay>` milliseconds have elapsed since the last event 35749 * *OR* if `<flushMaxDelay>` milliseconds have elapsed. 35750 * 35751 * Accepts a callback to perform side-effects and returns true to stop batch 35752 * processing and hand back control to caller. 35753 */ addUpdate(cb) { 35754 const cbResult = cb(); 35755 if (this.recordingMode === "buffer" || !this._isEnabled) { 35756 return; 35757 } 35758 if (cbResult === true) { 35759 return; 35760 } 35761 this._debouncedFlush(); 35762 } 35763 /** 35764 * Updates the user activity timestamp and resumes recording. This should be 35765 * called in an event handler for a user action that we consider as the user 35766 * being "active" (e.g. a mouse click). 35767 */ triggerUserActivity() { 35768 this._updateUserActivity(); 35769 if (!this._stopRecording) { 35770 if (!this._checkSession()) { 35771 return; 35772 } 35773 this.resume(); 35774 return; 35775 } 35776 this.checkAndHandleExpiredSession(); 35777 this._updateSessionActivity(); 35778 } 35779 /** 35780 * Updates the user activity timestamp *without* resuming 35781 * recording. Some user events (e.g. keydown) can be create 35782 * low-value replays that only contain the keypress as a 35783 * breadcrumb. Instead this would require other events to 35784 * create a new replay after a session has expired. 35785 */ updateUserActivity() { 35786 this._updateUserActivity(); 35787 this._updateSessionActivity(); 35788 } 35789 /** 35790 * Only flush if `this.recordingMode === 'session'` 35791 */ conditionalFlush() { 35792 if (this.recordingMode === "buffer") { 35793 return Promise.resolve(); 35794 } 35795 return this.flushImmediate(); 35796 } 35797 /** 35798 * Flush using debounce flush 35799 */ flush() { 35800 return this._debouncedFlush(); 35801 } 35802 /** 35803 * Always flush via `_debouncedFlush` so that we do not have flushes triggered 35804 * from calling both `flush` and `_debouncedFlush`. Otherwise, there could be 35805 * cases of multiple flushes happening closely together. 35806 */ flushImmediate() { 35807 this._debouncedFlush(); 35808 return this._debouncedFlush.flush(); 35809 } 35810 /** 35811 * Cancels queued up flushes. 35812 */ cancelFlush() { 35813 this._debouncedFlush.cancel(); 35814 } 35815 /** Get the current session (=replay) ID 35816 * 35817 * @param onlyIfSampled - If true, will only return the session ID if the session is sampled. 35818 */ getSessionId(onlyIfSampled) { 35819 var _this_session, _this_session1; 35820 if (onlyIfSampled && ((_this_session = this.session) === null || _this_session === void 0 ? void 0 : _this_session.sampled) === false) { 35821 return void 0; 35822 } 35823 return (_this_session1 = this.session) === null || _this_session1 === void 0 ? void 0 : _this_session1.id; 35824 } 35825 /** 35826 * Checks if recording should be stopped due to user inactivity. Otherwise 35827 * check if session is expired and create a new session if so. Triggers a new 35828 * full snapshot on new session. 35829 * 35830 * Returns true if session is not expired, false otherwise. 35831 * @hidden 35832 */ checkAndHandleExpiredSession() { 35833 var _this_session; 35834 if (this._lastActivity && isExpired(this._lastActivity, this.timeouts.sessionIdlePause) && ((_this_session = this.session) === null || _this_session === void 0 ? void 0 : _this_session.sampled) === "session") { 35835 this.pause(); 35836 return; 35837 } 35838 if (!this._checkSession()) { 35839 return false;
35840 } 35841 return true; 35842 } 35843 /** 35844 * Capture some initial state that can change throughout the lifespan of the 35845 * replay. This is required because otherwise they would be captured at the 35846 * first flush. 35847 */ setInitialState() { 35848 const urlPath = "".concat(WINDOW4.location.pathname).concat(WINDOW4.location.hash).concat(WINDOW4.location.search); 35849 const url = "".concat(WINDOW4.location.origin).concat(urlPath); 35850 this.performanceEntries = []; 35851 this.replayPerformanceEntries = []; 35852 this._clearContext(); 35853 this._context.initialUrl = url; 35854 this._context.initialTimestamp = Date.now(); 35855 this._context.urls.push(url); 35856 } 35857 /** 35858 * Add a breadcrumb event, that may be throttled. 35859 * If it was throttled, we add a custom breadcrumb to indicate that. 35860 */ throttledAddEvent(event, isCheckout) { 35861 const res = this._throttledAddEvent(event, isCheckout); 35862 if (res === THROTTLED) { 35863 const breadcrumb = createBreadcrumb({ 35864 category: "replay.throttled" 35865 }); 35866 this.addUpdate(()=>{ 35867 return !addEventSync(this, { 35868 type: ReplayEventTypeCustom, 35869 timestamp: breadcrumb.timestamp || 0, 35870 data: { 35871 tag: "breadcrumb", 35872 payload: breadcrumb, 35873 metric: true 35874 } 35875 }); 35876 }); 35877 } 35878 return res; 35879 } 35880 /** 35881 * This will get the parametrized route name of the current page. 35882 * This is only available if performance is enabled, and if an instrumented router is used. 35883 */ getCurrentRoute() { 35884 const lastActiveSpan = this.lastActiveSpan || (0, __TURBOPACK__imported__module__304661__21["getActiveSpan"])(); 35885 const lastRootSpan = lastActiveSpan && (0, __TURBOPACK__imported__module__304661__21["getRootSpan"])(lastActiveSpan); 35886 const attributes = lastRootSpan && (0, __TURBOPACK__imported__module__304661__21["spanToJSON"])(lastRootSpan).data || {}; 35887 const source = attributes[__TURBOPACK__imported__module__519988__20["SEMANTIC_ATTRIBUTE_SENTRY_SOURCE"]]; 35888 if (!lastRootSpan || !source || ![ 35889 "route", 35890 "custom" 35891 ].includes(source)) { 35892 return void 0; 35893 } 35894 return (0, __TURBOPACK__imported__module__304661__21["spanToJSON"])(lastRootSpan).description; 35895 } 35896 /** 35897 * Initialize and start all listeners to varying events (DOM, 35898 * Performance Observer, Recording, Sentry SDK, etc) 35899 */ _initializeRecording() { 35900 this.setInitialState(); 35901 this._updateSessionActivity(); 35902 this.eventBuffer = createEventBuffer({ 35903 useCompression: this._options.useCompression, 35904 workerUrl: this._options.workerUrl 35905 }); 35906 this._removeListeners(); 35907 this._addListeners(); 35908 this._isEnabled = true; 35909 this._isPaused = false; 35910 if (this.session) { 35911 var _getClient; 35912 (_getClient = (0, __TURBOPACK__imported__module__250804__26["getClient"])()) === null || _getClient === void 0 ? void 0 : _getClient.emit("replayStart", { 35913 sessionId: this.session.id, 35914 recordingMode: this.recordingMode 35915 }); 35916 } 35917 this.startRecording(); 35918 if (this.recordingMode === "session" && this.session) { 35919 setReplayIdOnDynamicSamplingContext(this.session.id); 35920 } 35921 } 35922 /** 35923 * Loads (or refreshes) the current session. 35924 */ _initializeSessionForSampling(previousSessionId) { 35925 const allowBuffering = this._options.errorSampleRate > 0; 35926 const session = loadOrCreateSession({ 35927 sessionIdleExpire: this.timeouts.sessionIdleExpire, 35928 maxReplayDuration: this._options.maxReplayDuration, 35929 previousSessionId 35930 }, { 35931 stickySession: this._options.stickySession, 35932 sessionSampleRate: this._options.sessionSampleRate, 35933 allowBuffering 35934 }); 35935 this.session = session; 35936 } 35937 /** 35938 * Checks and potentially refreshes the current session. 35939 * Returns false if session is not recorded. 35940 */ _checkSession() { 35941 if (!this.session) { 35942 return false;
vendor: 5,026 bytes, lines 35943-36075
35943 } 35944 const currentSession = this.session; 35945 if (shouldRefreshSession(currentSession, { 35946 sessionIdleExpire: this.timeouts.sessionIdleExpire, 35947 maxReplayDuration: this._options.maxReplayDuration 35948 })) { 35949 this._refreshSession(currentSession); 35950 return false; 35951 } 35952 return true; 35953 } 35954 /** 35955 * Refresh a session with a new one. 35956 * This stops the current session (without forcing a flush, as that would never work since we are expired), 35957 * and then does a new sampling based on the refreshed session. 35958 */ async _refreshSession(session) { 35959 if (!this._isEnabled) { 35960 return; 35961 } 35962 await this.stop({ 35963 reason: "sessionExpired" 35964 }); 35965 this.initializeSampling(session.id); 35966 } 35967 /** 35968 * Adds listeners to record events for the replay 35969 */ _addListeners() { 35970 try { 35971 WINDOW4.document.addEventListener("visibilitychange", this._handleVisibilityChange); 35972 WINDOW4.addEventListener("blur", this._handleWindowBlur); 35973 WINDOW4.addEventListener("focus", this._handleWindowFocus); 35974 WINDOW4.addEventListener("keydown", this._handleKeyboardEvent); 35975 if (this.clickDetector) { 35976 this.clickDetector.addListeners(); 35977 } 35978 if (!this._hasInitializedCoreListeners) { 35979 addGlobalListeners(this); 35980 this._hasInitializedCoreListeners = true; 35981 } 35982 } catch (err) { 35983 this.handleException(err); 35984 } 35985 this._performanceCleanupCallback = setupPerformanceObserver(this); 35986 } 35987 /** 35988 * Cleans up listeners that were created in `_addListeners` 35989 */ _removeListeners() { 35990 try { 35991 WINDOW4.document.removeEventListener("visibilitychange", this._handleVisibilityChange); 35992 WINDOW4.removeEventListener("blur", this._handleWindowBlur); 35993 WINDOW4.removeEventListener("focus", this._handleWindowFocus); 35994 WINDOW4.removeEventListener("keydown", this._handleKeyboardEvent); 35995 if (this.clickDetector) { 35996 this.clickDetector.removeListeners(); 35997 } 35998 if (this._performanceCleanupCallback) { 35999 this._performanceCleanupCallback(); 36000 } 36001 } catch (err) { 36002 this.handleException(err); 36003 } 36004 } 36005 /** 36006 * Tasks to run when we consider a page to be hidden (via blurring and/or visibility) 36007 */ _doChangeToBackgroundTasks(breadcrumb) { 36008 if (!this.session) { 36009 return; 36010 } 36011 const expired = shouldRefreshSession(this.session, { 36012 maxReplayDuration: this._options.maxReplayDuration, 36013 sessionIdleExpire: this.timeouts.sessionIdleExpire 36014 }); 36015 if (expired) { 36016 resetReplayIdOnDynamicSamplingContext(); 36017 return; 36018 } 36019 if (breadcrumb) { 36020 this._createCustomBreadcrumb(breadcrumb); 36021 } 36022 void this.conditionalFlush(); 36023 } 36024 /** 36025 * Tasks to run when we consider a page to be visible (via focus and/or visibility) 36026 */ _doChangeToForegroundTasks(breadcrumb) { 36027 if (!this.session) { 36028 return; 36029 } 36030 const isSessionActive = this.checkAndHandleExpiredSession(); 36031 if (!isSessionActive) { 36032 DEBUG_BUILD3 && debug.log("Document has become active, but session has expired"); 36033 return; 36034 } 36035 if (breadcrumb) { 36036 this._createCustomBreadcrumb(breadcrumb); 36037 } 36038 } 36039 /** 36040 * Update user activity (across session lifespans) 36041 */ _updateUserActivity() { 36042 let _lastActivity = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : Date.now(); 36043 this._lastActivity = _lastActivity; 36044 } 36045 /** 36046 * Updates the session's last activity timestamp 36047 */ _updateSessionActivity() { 36048 let _lastActivity = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : Date.now(); 36049 if (this.session) { 36050 this.session.lastActivity = _lastActivity; 36051 this._maybeSaveSession(); 36052 } 36053 } 36054 /** 36055 * Helper to create (and buffer) a replay breadcrumb from a core SDK breadcrumb 36056 */ _createCustomBreadcrumb(breadcrumb) { 36057 this.addUpdate(()=>{ 36058 this.throttledAddEvent({ 36059 type: EventType.Custom, 36060 timestamp: breadcrumb.timestamp || 0, 36061 data: { 36062 tag: "breadcrumb", 36063 payload: breadcrumb 36064 } 36065 }); 36066 }); 36067 } 36068 /** 36069 * Observed performance events are added to `this.performanceEntries`. These 36070 * are included in the replay event before it is finished and sent to Sentry. 36071 */ _addPerformanceEntries() { 36072 let performanceEntries = createPerformanceEntries(this.performanceEntries).concat(this.replayPerformanceEntries); 36073 this.performanceEntries = []; 36074 this.replayPerformanceEntries = []; 36075 if (this._requiresManualStart) {
36076 const initialTimestampInSeconds = this._context.initialTimestamp / 1e3; 36077 performanceEntries = performanceEntries.filter((entry)=>entry.start >= initialTimestampInSeconds); 36078 } 36079 return Promise.all(createPerformanceSpans(this, performanceEntries)); 36080 } 36081 /** 36082 * Clear _context 36083 */ _clearContext() { 36084 this._context.errorIds.clear(); 36085 this._context.traceIds.clear(); 36086 this._context.segmentNames.clear(); 36087 this._context.urls = []; 36088 } 36089 /** Update the initial timestamp based on the buffer content. */ _updateInitialTimestampFromEventBuffer() { 36090 const { session, eventBuffer } = this; 36091 if (!session || !eventBuffer || this._requiresManualStart) { 36092 return; 36093 } 36094 if (session.segmentId) { 36095 return; 36096 } 36097 const earliestEvent = eventBuffer.getEarliestTimestamp(); 36098 if (earliestEvent && earliestEvent < this._context.initialTimestamp) { 36099 this._context.initialTimestamp = earliestEvent; 36100 } 36101 } 36102 /** 36103 * Return and clear _context 36104 */ _popEventContext() { 36105 const _context = { 36106 initialTimestamp: this._context.initialTimestamp, 36107 initialUrl: this._context.initialUrl, 36108 errorIds: Array.from(this._context.errorIds), 36109 traceIds: Array.from(this._context.traceIds), 36110 segmentNames: Array.from(this._context.segmentNames), 36111 urls: this._context.urls 36112 }; 36113 this._clearContext(); 36114 return _context; 36115 } 36116 /** 36117 * Flushes replay event buffer to Sentry. 36118 * 36119 * Performance events are only added right before flushing - this is 36120 * due to the buffered performance observer events. 36121 * 36122 * Should never be called directly, only by `flush` 36123 */ async _runFlush() { 36124 var _this_eventBuffer; 36125 const replayId = this.getSessionId(); 36126 if (!this.session || !this.eventBuffer || !replayId) { 36127 DEBUG_BUILD3 && debug.error("No session or eventBuffer found to flush."); 36128 return; 36129 } 36130 await this._addPerformanceEntries(); 36131 if (!((_this_eventBuffer = this.eventBuffer) === null || _this_eventBuffer === void 0 ? void 0 : _this_eventBuffer.hasEvents)) { 36132 return; 36133 } 36134 await addMemoryEntry(this); 36135 if (!this.eventBuffer) { 36136 return; 36137 } 36138 if (replayId !== this.getSessionId()) { 36139 return; 36140 } 36141 try { 36142 this._updateInitialTimestampFromEventBuffer(); 36143 const timestamp = Date.now(); 36144 if (timestamp - this._context.initialTimestamp > this._options.maxReplayDuration + 3e4) { 36145 throw new ReplayDurationLimitError(); 36146 } 36147 const eventContext = this._popEventContext(); 36148 const segmentId = this.session.segmentId++; 36149 this._maybeSaveSession(); 36150 const recordingData = await this.eventBuffer.finish(); 36151 await sendReplay({ 36152 replayId, 36153 recordingData, 36154 segmentId, 36155 eventContext, 36156 session: this.session, 36157 timestamp, 36158 onError: (err)=>this.handleException(err) 36159 }); 36160 } catch (err) { 36161 this.handleException(err); 36162 this.stop({ 36163 reason: "sendError" 36164 }); 36165 const client = (0, __TURBOPACK__imported__module__250804__26["getClient"])(); 36166 if (client) { 36167 let dropReason; 36168 if (err instanceof RateLimitError) { 36169 dropReason = "ratelimit_backoff"; 36170 } else if (err instanceof ReplayDurationLimitError) { 36171 dropReason = "invalid"; 36172 } else { 36173 dropReason = "send_error"; 36174 } 36175 client.recordDroppedEvent(dropReason, "replay"); 36176 } 36177 } 36178 } 36179 /** 36180 * Flush recording data to Sentry. Creates a lock so that only a single flush 36181 * can be active at a time. Do not call this directly. 36182 */ async _flush() { 36183 let { force = false } = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}; 36184 if (!this._isEnabled && !force) { 36185 return; 36186 } 36187 if (!this.checkAndHandleExpiredSession()) { 36188 DEBUG_BUILD3 && debug.error("Attempting to finish replay event after session expired."); 36189 return; 36190 } 36191 if (!this.session) { 36192 return; 36193 } 36194 const start = this.session.started; 36195 const now = Date.now(); 36196 const duration = now - start; 36197 this._debouncedFlush.cancel(); 36198 const tooShort = duration < this._options.minReplayDuration; 36199 const tooLong = duration > this._options.maxReplayDuration + 5e3; 36200 if (tooShort || tooLong) { 36201 DEBUG_BUILD3 && debug.log("Session duration (".concat(Math.floor(duration / 1e3), "s) is too ").concat(tooShort ? "short" : "long", ", not sending replay.")); 36202 if (tooShort) { 36203 this._debouncedFlush(); 36204 } 36205 return; 36206 } 36207 const eventBuffer = this.eventBuffer; 36208 if (eventBuffer && this.session.segmentId === 0 && !eventBuffer.hasCheckout) { 36209 DEBUG_BUILD3 && debug.log("Flushing initial segment without checkout."); 36210 } 36211 const _flushInProgress = !!this._flushLock; 36212 if (!this._flushLock) { 36213 this._flushLock = this._runFlush(); 36214 } 36215 try { 36216 await this._flushLock; 36217 } catch (err) { 36218 this.handleException(err); 36219 } finally{ 36220 this._flushLock = void 0; 36221 if (_flushInProgress) { 36222 this._debouncedFlush(); 36223 } 36224 } 36225 } 36226 /** Save the session, if it is sticky */ _maybeSaveSession() { 36227 if (this.session && this._options.stickySession) { 36228 saveSession(this.session); 36229 } 36230 } 36231 /** Handler for rrweb.record.onMutation */ _onMutationHandler(mutations) { 36232 const { ignoreMutations } = this._options._experiments; 36233 if (ignoreMutations === null || ignoreMutations === void 0 ? void 0 : ignoreMutations.length) { 36234 if (mutations.some((mutation)=>{ 36235 const el = closestElementOfNode(mutation.target); 36236 const selector = ignoreMutations.join(","); 36237 return el === null || el === void 0 ? void 0 : el.matches(selector); 36238 })) { 36239 return false;
vendor: 5,698 bytes, lines 36240-36394
36240 } 36241 } 36242 const count = mutations.length; 36243 const mutationLimit = this._options.mutationLimit; 36244 const mutationBreadcrumbLimit = this._options.mutationBreadcrumbLimit; 36245 const overMutationLimit = mutationLimit && count > mutationLimit; 36246 if (count > mutationBreadcrumbLimit || overMutationLimit) { 36247 const breadcrumb = createBreadcrumb({ 36248 category: "replay.mutations", 36249 data: { 36250 count, 36251 limit: overMutationLimit 36252 } 36253 }); 36254 this._createCustomBreadcrumb(breadcrumb); 36255 } 36256 if (overMutationLimit) { 36257 this.stop({ 36258 reason: "mutationLimit", 36259 forceFlush: this.recordingMode === "session" 36260 }); 36261 return false; 36262 } 36263 return true; 36264 } 36265 constructor({ options, recordingOptions }){ 36266 this.eventBuffer = null; 36267 this.performanceEntries = []; 36268 this.replayPerformanceEntries = []; 36269 this.recordingMode = "session"; 36270 this.timeouts = { 36271 sessionIdlePause: SESSION_IDLE_PAUSE_DURATION, 36272 sessionIdleExpire: SESSION_IDLE_EXPIRE_DURATION 36273 }; 36274 this._lastActivity = Date.now(); 36275 this._isEnabled = false; 36276 this._isPaused = false; 36277 this._requiresManualStart = false; 36278 this._hasInitializedCoreListeners = false; 36279 this._context = { 36280 errorIds: /* @__PURE__ */ new Set(), 36281 traceIds: /* @__PURE__ */ new Set(), 36282 segmentNames: /* @__PURE__ */ new Set(), 36283 urls: [], 36284 initialTimestamp: Date.now(), 36285 initialUrl: "" 36286 }; 36287 this._recordingOptions = recordingOptions; 36288 this._options = options; 36289 this._debouncedFlush = debounce1(()=>this._flush(), this._options.flushMinDelay, { 36290 maxWait: this._options.flushMaxDelay 36291 }); 36292 this._throttledAddEvent = throttle((event, isCheckout)=>addEvent(this, event, isCheckout), // Max 300 events... 36293 300, // ... per 5s 36294 5); 36295 const { slowClickTimeout, slowClickIgnoreSelectors } = this.getOptions(); 36296 const slowClickConfig = slowClickTimeout ? { 36297 threshold: Math.min(SLOW_CLICK_THRESHOLD, slowClickTimeout), 36298 timeout: slowClickTimeout, 36299 scrollTimeout: SLOW_CLICK_SCROLL_TIMEOUT, 36300 ignoreSelector: slowClickIgnoreSelectors ? slowClickIgnoreSelectors.join(",") : "" 36301 } : void 0; 36302 if (slowClickConfig) { 36303 this.clickDetector = new ClickDetector(this, slowClickConfig); 36304 } 36305 if (DEBUG_BUILD3) { 36306 const experiments = options._experiments; 36307 debug.setConfig({ 36308 captureExceptions: !!experiments.captureExceptions, 36309 traceInternals: !!experiments.traceInternals 36310 }); 36311 } 36312 this._handleVisibilityChange = ()=>{ 36313 if (WINDOW4.document.visibilityState === "visible") { 36314 this._doChangeToForegroundTasks(); 36315 } else { 36316 this._doChangeToBackgroundTasks(); 36317 } 36318 }; 36319 this._handleWindowBlur = ()=>{ 36320 const breadcrumb = createBreadcrumb({ 36321 category: "ui.blur" 36322 }); 36323 this._doChangeToBackgroundTasks(breadcrumb); 36324 }; 36325 this._handleWindowFocus = ()=>{ 36326 const breadcrumb = createBreadcrumb({ 36327 category: "ui.focus" 36328 }); 36329 this._doChangeToForegroundTasks(breadcrumb); 36330 }; 36331 this._handleKeyboardEvent = (event)=>{ 36332 handleKeyboardEvent(this, event); 36333 }; 36334 } 36335} 36336function getOption(selectors, defaultSelectors) { 36337 return [ 36338 ...selectors, 36339 // sentry defaults 36340 ...defaultSelectors 36341 ].join(","); 36342} 36343function getPrivacyOptions(param) { 36344 let { mask, unmask, block, unblock, ignore } = param; 36345 const defaultBlockedElements = [ 36346 "base", 36347 "iframe[srcdoc]:not([src])" 36348 ]; 36349 const maskSelector = getOption(mask, [ 36350 ".sentry-mask", 36351 "[data-sentry-mask]" 36352 ]); 36353 const unmaskSelector = getOption(unmask, []); 36354 const options = { 36355 // We are making the decision to make text and input selectors the same 36356 maskTextSelector: maskSelector, 36357 unmaskTextSelector: unmaskSelector, 36358 blockSelector: getOption(block, [ 36359 ".sentry-block", 36360 "[data-sentry-block]", 36361 ...defaultBlockedElements 36362 ]), 36363 unblockSelector: getOption(unblock, []), 36364 ignoreSelector: getOption(ignore, [ 36365 ".sentry-ignore", 36366 "[data-sentry-ignore]", 36367 'input[type="file"]' 36368 ]) 36369 }; 36370 return options; 36371} 36372function maskAttribute(param) { 36373 let { el, key, maskAttributes, maskAllText, privacyOptions, value } = param; 36374 if (privacyOptions.unmaskTextSelector && el.matches(privacyOptions.unmaskTextSelector)) { 36375 return value; 36376 } 36377 const masksNamedAttribute = maskAttributes.includes(key); 36378 const masksSubmitButtonValue = maskAllText && key === "value" && el.tagName === "INPUT" && [ 36379 "submit", 36380 "button" 36381 ].includes(el.getAttribute("type") || ""); 36382 if (masksNamedAttribute || masksSubmitButtonValue) { 36383 return value.replace(/[\S]/g, "*"); 36384 } 36385 return value; 36386} 36387const MEDIA_SELECTORS = 'img,image,svg,video,object,picture,embed,map,audio,link[rel="icon"],link[rel="apple-touch-icon"]'; 36388const DEFAULT_NETWORK_HEADERS = [ 36389 "content-length", 36390 "content-type", 36391 "accept" 36392]; 36393const ORIGINAL_BODY = /* @__PURE__ */ Symbol.for("sentry__originalRequestBody"); 36394let _initialized = false;
36395let _isRequestInstrumented = false; 36396function _INTERNAL_instrumentRequestInterface() { 36397 if (typeof Request === "undefined" || _isRequestInstrumented) { 36398 return; 36399 } 36400 const OriginalRequest = Request; 36401 try { 36402 const SentryRequest = function(input, init) { 36403 const request = new OriginalRequest(input, init); 36404 if ((init === null || init === void 0 ? void 0 : init.body) != null) { 36405 request[ORIGINAL_BODY] = init.body; 36406 } 36407 return request; 36408 }; 36409 SentryRequest.prototype = OriginalRequest.prototype; 36410 __TURBOPACK__imported__module__225304__14["GLOBAL_OBJ"].Request = SentryRequest; 36411 _isRequestInstrumented = true; 36412 } catch (unused) {} 36413} 36414const replayIntegration = (options)=>{ 36415 return new Replay(options); 36416}; 36417class Replay { 36418 /** If replay has already been initialized */ get _isInitialized() { 36419 return _initialized; 36420 } 36421 /** Update _isInitialized */ set _isInitialized(value) { 36422 _initialized = value; 36423 } 36424 /** 36425 * Setup and initialize replay container 36426 */ afterAllSetup(client) { 36427 if (!(0, __TURBOPACK__imported__module__901538__3["isBrowser"])() || this._replay) { 36428 return; 36429 } 36430 if (this._initialOptions.attachRawBodyFromRequest) { 36431 _INTERNAL_instrumentRequestInterface(); 36432 } 36433 this._setup(client); 36434 this._initialize(client); 36435 } 36436 /** 36437 * Start a replay regardless of sampling rate. Calling this will always 36438 * create a new session. Will log a message if replay is already in progress. 36439 * 36440 * Creates or loads a session, attaches listeners to varying events (DOM, 36441 * PerformanceObserver, Recording, Sentry SDK, etc) 36442 */ start() { 36443 if (!this._replay) { 36444 return; 36445 } 36446 this._replay.start(); 36447 } 36448 /** 36449 * Start replay buffering. Buffers until `flush()` is called or, if 36450 * `replaysOnErrorSampleRate` > 0, until an error occurs.
vendor: 7,182 bytes, lines 36451-36624
36451 */ startBuffering() { 36452 if (!this._replay) { 36453 return; 36454 } 36455 this._replay.startBuffering(); 36456 } 36457 /** 36458 * Currently, this needs to be manually called (e.g. for tests). Sentry SDK 36459 * does not support a teardown 36460 * 36461 * @param options.flush - Whether to flush the pending replay segment when stopping. 36462 * When recording in `session` mode, `stop()` flushes the buffered-but-unsent segment by 36463 * default (`flush: true`), matching the previous behavior. Pass `flush: false` to stop 36464 * recording without sending that pending segment â useful when a user withdraws consent 36465 * and no further data should leave the browser. 36466 * 36467 * Note: `flush: false` only prevents the *pending* (final) segment from being sent. It does 36468 * **not** retract segments that were already sent earlier during `session` recording. 36469 */ stop(options) { 36470 var _ref; 36471 if (!this._replay) { 36472 return Promise.resolve(); 36473 } 36474 return this._replay.stop({ 36475 forceFlush: (_ref = options === null || options === void 0 ? void 0 : options.flush) !== null && _ref !== void 0 ? _ref : this._replay.recordingMode === "session", 36476 reason: "manual" 36477 }); 36478 } 36479 /** 36480 * If not in "session" recording mode, flush event buffer which will create a new replay. 36481 * If replay is not enabled, a new session replay is started. 36482 * Unless `continueRecording` is false, the replay will continue to record and 36483 * behave as a "session"-based replay. 36484 * 36485 * Otherwise, queue up a flush. 36486 */ flush(options) { 36487 if (!this._replay) { 36488 return Promise.resolve(); 36489 } 36490 if (!this._replay.isEnabled()) { 36491 this._replay.start(); 36492 return Promise.resolve(); 36493 } 36494 return this._replay.sendBufferedReplayOrFlush(options); 36495 } 36496 /** 36497 * Get the current session ID. 36498 * 36499 * @param onlyIfSampled - If true, will only return the session ID if the session is sampled. 36500 * 36501 */ getReplayId(onlyIfSampled) { 36502 var _this__replay; 36503 if (!((_this__replay = this._replay) === null || _this__replay === void 0 ? void 0 : _this__replay.isEnabled())) { 36504 return; 36505 } 36506 return this._replay.getSessionId(onlyIfSampled); 36507 } 36508 /** 36509 * Get the current recording mode. This can be either `session` or `buffer`. 36510 * 36511 * `session`: Recording the whole session, sending it continuously 36512 * `buffer`: Always keeping the last 60s of recording, requires: 36513 * - having replaysOnErrorSampleRate > 0 to capture replay when an error occurs 36514 * - or calling `flush()` to send the replay 36515 */ getRecordingMode() { 36516 var _this__replay; 36517 if (!((_this__replay = this._replay) === null || _this__replay === void 0 ? void 0 : _this__replay.isEnabled())) { 36518 return; 36519 } 36520 return this._replay.recordingMode; 36521 } 36522 processSpan(span) { 36523 const replayId = this.getReplayId(true); 36524 if (replayId) { 36525 safeSetSpanJSONAttributes(span, { 36526 "sentry.replay_id": replayId 36527 }); 36528 if (this.getRecordingMode() === "buffer") { 36529 safeSetSpanJSONAttributes(span, { 36530 "sentry._internal.replay_is_buffering": true 36531 }); 36532 } 36533 } 36534 } 36535 /** 36536 * Initializes replay. 36537 */ _initialize(client) { 36538 if (!this._replay) { 36539 return; 36540 } 36541 this._maybeLoadFromReplayCanvasIntegration(client); 36542 this._replay.initializeSampling(); 36543 } 36544 /** Setup the integration. */ _setup(client) { 36545 const finalOptions = loadReplayOptionsFromClient(this._initialOptions, client); 36546 this._replay = new ReplayContainer({ 36547 options: finalOptions, 36548 recordingOptions: this._recordingOptions 36549 }); 36550 } 36551 /** Get canvas options from ReplayCanvas integration, if it is also added. */ _maybeLoadFromReplayCanvasIntegration(client) { 36552 try { 36553 const canvasIntegration = client.getIntegrationByName("ReplayCanvas"); 36554 if (!canvasIntegration) { 36555 return; 36556 } 36557 this._replay["_canvas"] = canvasIntegration.getOptions(); 36558 } catch (unused) {} 36559 } 36560 constructor({ flushMinDelay = DEFAULT_FLUSH_MIN_DELAY, flushMaxDelay = DEFAULT_FLUSH_MAX_DELAY, minReplayDuration = MIN_REPLAY_DURATION, maxReplayDuration = MAX_REPLAY_DURATION, stickySession = true, useCompression = true, workerUrl, _experiments = {}, maskAllText = true, maskAllInputs = true, blockAllMedia = true, mutationBreadcrumbLimit = 750, mutationLimit = 1e4, slowClickTimeout = 7e3, slowClickIgnoreSelectors = [], networkDetailAllowUrls = [], networkDetailDenyUrls = [], networkCaptureBodies = true, networkRequestHeaders = [], networkResponseHeaders = [], mask = [], maskAttributes = [ 36561 "title", 36562 "placeholder", 36563 "aria-label" 36564 ], unmask = [], block = [], unblock = [], ignore = [], maskFn, beforeAddRecordingEvent, beforeErrorSampling, onError, attachRawBodyFromRequest = false } = {}){ 36565 this.name = "Replay"; 36566 const privacyOptions = getPrivacyOptions({ 36567 mask, 36568 unmask, 36569 block, 36570 unblock, 36571 ignore 36572 }); 36573 this._recordingOptions = { 36574 maskAllInputs, 36575 maskAllText, 36576 maskInputOptions: { 36577 password: true 36578 }, 36579 maskTextFn: maskFn, 36580 maskInputFn: maskFn, 36581 maskAttributeFn: (key, value, el)=>maskAttribute({ 36582 maskAttributes, 36583 maskAllText, 36584 privacyOptions, 36585 key, 36586 value, 36587 el 36588 }), 36589 ...privacyOptions, 36590 // Our defaults 36591 slimDOMOptions: "all", 36592 inlineStylesheet: true, 36593 // Disable inline images as it will increase segment/replay size 36594 inlineImages: false, 36595 // collect fonts, but be aware that `sentry.io` needs to be an allowed 36596 // origin for playback 36597 collectFonts: true, 36598 errorHandler: (err)=>{ 36599 try { 36600 err.__rrweb__ = true; 36601 } catch (unused) {} 36602 }, 36603 // experimental support for recording iframes from different origins 36604 recordCrossOriginIframes: Boolean(_experiments.recordCrossOriginIframes) 36605 }; 36606 this._initialOptions = { 36607 flushMinDelay, 36608 flushMaxDelay, 36609 minReplayDuration: Math.min(minReplayDuration, MIN_REPLAY_DURATION_LIMIT), 36610 maxReplayDuration: Math.min(maxReplayDuration, MAX_REPLAY_DURATION), 36611 stickySession, 36612 useCompression, 36613 workerUrl, 36614 blockAllMedia, 36615 maskAllInputs, 36616 maskAllText, 36617 mutationBreadcrumbLimit, 36618 mutationLimit, 36619 slowClickTimeout, 36620 slowClickIgnoreSelectors, 36621 networkDetailAllowUrls, 36622 networkDetailDenyUrls, 36623 networkCaptureBodies, 36624 networkRequestHeaders: _getMergedNetworkHeaders(network
36624RequestHeaders), 36625 networkResponseHeaders: _getMergedNetworkHeaders(networkResponseHeaders), 36626 beforeAddRecordingEvent, 36627 beforeErrorSampling, 36628 onError, 36629 attachRawBodyFromRequest, 36630 _experiments 36631 }; 36632 if (this._initialOptions.blockAllMedia) { 36633 this._recordingOptions.blockSelector = !this._recordingOptions.blockSelector ? MEDIA_SELECTORS : "".concat(this._recordingOptions.blockSelector, ",").concat(MEDIA_SELECTORS); 36634 this._recordingOptions.ignoreCSSAttributes = /* @__PURE__ */ new Set([ 36635 "background-image" 36636 ]); 36637 } 36638 if (this._isInitialized && (0, __TURBOPACK__imported__module__901538__3["isBrowser"])()) { 36639 throw new Error("Multiple Sentry Session Replay instances are not supported"); 36640 } 36641 this._isInitialized = true; 36642 } 36643} 36644function loadReplayOptionsFromClient(initialOptions, client) { 36645 const opt = client.getOptions(); 36646 const finalOptions = { 36647 sessionSampleRate: 0, 36648 errorSampleRate: 0, 36649 ...initialOptions 36650 }; 36651 const replaysSessionSampleRate = (0, __TURBOPACK__imported__module__170637__3["parseSampleRate"])(opt.replaysSessionSampleRate); 36652 const replaysOnErrorSampleRate = (0, __TURBOPACK__imported__module__170637__3["parseSampleRate"])(opt.replaysOnErrorSampleRate); 36653 if (replaysSessionSampleRate == null && replaysOnErrorSampleRate == null) { 36654 (0, __TURBOPACK__imported__module__272598__37["consoleSandbox"])(()=>{ 36655 console.warn("Replay is disabled because neither `replaysSessionSampleRate` nor `replaysOnErrorSampleRate` are set."); 36656 }); 36657 } 36658 if (replaysSessionSampleRate != null) { 36659 finalOptions.sessionSampleRate = replaysSessionSampleRate; 36660 } 36661 if (replaysOnErrorSampleRate != null) { 36662 finalOptions.errorSampleRate = replaysOnErrorSampleRate; 36663 } 36664 return finalOptions; 36665} 36666function _getMergedNetworkHeaders(headers) { 36667 return [ 36668 ...DEFAULT_NETWORK_HEADERS, 36669 ...headers.map((header)=>header.toLowerCase()) 36670 ]; 36671} 36672function getReplay() { 36673 const client = (0, __TURBOPACK__imported__module__250804__26["getClient"])(); 36674 return client === null || client === void 0 ? void 0 : client.getIntegrationByName("Replay"); 36675} 36676; 36677// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/integrations/third-party-errors-filter.js [app-client] (ecmascript) 36678; 36679// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/metadata.js [app-client] (ecmascript) 36680; 36681var __TURBOPACK__imported__module__225304__15 = __TURBOPACK__imported__module__225304__; 36682; 36683const filenameMetadataMap = /* @__PURE__ */ new Map(); 36684const parsedStacks = /* @__PURE__ */ new Set(); 36685function getFilenameToMetadataMap(parser) { 36686 if (!__TURBOPACK__imported__module__225304__15["GLOBAL_OBJ"]._sentryModuleMetadata) { 36687 return {}; 36688 } 36689 const filenameMap = {}; 36690 for (const stack of Object.keys(__TURBOPACK__imported__module__225304__15["GLOBAL_OBJ"]._sentryModuleMetadata)){ 36691 const metadata = __TURBOPACK__imported__module__225304__15["GLOBAL_OBJ"]._sentryModuleMetadata[stack]; 36692 const frames = parser(stack); 36693 for (const frame of frames.reverse()){ 36694 if (frame.filename) { 36695 filenameMap[frame.filename] = metadata; 36696 break; 36697 } 36698 } 36699 } 36700 return filenameMap; 36701} 36702function ensureMetadataStacksAreParsed(parser) { 36703 if (!__TURBOPACK__imported__module__225304__15["GLOBAL_OBJ"]._sentryModuleMetadata) { 36704 return; 36705 } 36706 for (const stack of Object.keys(__TURBOPACK__imported__module__225304__15["GLOBAL_OBJ"]._sentryModuleMetadata)){ 36707 const metadata = __TURBOPACK__imported__module__225304__15["GLOBAL_OBJ"]._sentryModuleMetadata[stack]; 36708 if (parsedStacks.has(stack)) { 36709 continue; 36710 } 36711 parsedStacks.add(stack); 36712 const frames = parser(stack); 36713 for (const frame of frames.reverse()){ 36714 if (frame.filename) { 36715 filenameMetadataMap.set(frame.filename, metadata); 36716 break; 36717 } 36718 } 36719 } 36720} 36721function getMetadataForUrl(parser, filename) { 36722 ensureMetadataStacksAreParsed(parser); 36723 return filenameMetadataMap.get(filename); 36724} 36725function addMetadataToStackFrames(parser, event) { 36726 var _event_exception_values, _event_exception; 36727 (_event_exception = event.exception) === null || _event_exception === void 0 ? void 0 : (_event_exception_values = _event_exception.values) === null || _event_exception_values === void 0 ? void 0 : _event_exception_values.forEac
36727h((exception)=>{ 36728 var _exception_stacktrace_frames, _exception_stacktrace; 36729 (_exception_stacktrace = exception.stacktrace) === null || _exception_stacktrace === void 0 ? void 0 : (_exception_stacktrace_frames = _exception_stacktrace.frames) === null || _exception_stacktrace_frames === void 0 ? void 0 : _exception_stacktrace_frames.forEach((frame)=>{ 36730 if (!frame.filename || frame.module_metadata) { 36731 return; 36732 } 36733 const metadata = getMetadataForUrl(parser, frame.filename); 36734 if (metadata) { 36735 frame.module_metadata = metadata; 36736 } 36737 }); 36738 }); 36739} 36740function stripMetadataFromStackFrames(event) { 36741 var _event_exception_values, _event_exception; 36742 (_event_exception = event.exception) === null || _event_exception === void 0 ? void 0 : (_event_exception_values = _event_exception.values) === null || _event_exception_values === void 0 ? void 0 : _event_exception_values.forEach((exception)=>{ 36743 var _exception_stacktrace_frames, _exception_stacktrace; 36744 (_exception_stacktrace = exception.stacktrace) === null || _exception_stacktrace === void 0 ? void 0 : (_exception_stacktrace_frames = _exception_stacktrace.frames) === null || _exception_stacktrace_frames === void 0 ? void 0 : _exception_stacktrace_frames.forEach((frame)=>{ 36745 delete frame.module_metadata; 36746 }); 36747 }); 36748} 36749; 36750var __TURBOPACK__imported__module__67486__6 = __TURBOPACK__imported__module__67486__; 36751var __TURBOPACK__imported__module__936032__7 = __TURBOPACK__imported__module__936032__; 36752var __TURBOPACK__imported__module__225304__16 = __TURBOPACK__imported__module__225304__; 36753; 36754; 36755; 36756; 36757; 36758const thirdPartyErrorFilterIntegration = defineIntegration((options)=>{ 36759 return { 36760 name: "ThirdPartyErrorsFilter", 36761 setup (client) { 36762 client.on("beforeEnvelope", (envelope)=>{ 36763 (0, __TURBOPACK__imported__module__67486__6["forEachEnvelopeItem"])(envelope, (item, type)=>{ 36764 if (type === "event") { 36765 const event = Array.isArray(item) ? item[1] : void 0; 36766 if (event) { 36767 stripMetadataFromStackFrames(event); 36768 item[1] = event; 36769 } 36770 } 36771 }); 36772 }); 36773 client.on("applyFrameMetadata", (event)=>{ 36774 if (event.type) { 36775 return; 36776 } 36777 const stackParser = client.getOptions().stackParser; 36778 addMetadataToStackFrames(stackParser, event); 36779 }); 36780 }, 36781 preprocessEvent (event) { 36782 var _GLOBAL_OBJ__sentryWrappedDepth; 36783 if (options.ignoreSentryInternalFrames && ((_GLOBAL_OBJ__sentryWrappedDepth = __TURBOPACK__imported__module__225304__16["GLOBAL_OBJ"]._sentryWrappedDepth) !== null && _GLOBAL_OBJ__sentryWrappedDepth !== void 0 ? _GLOBAL_OBJ__sentryWrappedDepth : 0) > 0) { 36784 event.sdkProcessingMetadata = { 36785 ...event.sdkProcessingMetadata, 36786 insideSentryWrapped: true 36787 }; 36788 } 36789 }, 36790 processEvent (event) { 36791 var _event_sdkProcessingMetadata, _event_exception_values, _event_exception; 36792 const insideSentryWrapped = options.ignoreSentryInternalFrames ? ((_event_sdkProcessingMetadata = event.sdkProcessingMetadata) === null || _event_sdkProcessingMetadata === void 0 ? void 0 : _event_sdkProcessingMetadata.insideSentryWrapped) === true && ((_event_exception = event.exception) === null || _event_exception === void 0 ? void 0 : (_event_exception_values = _event_exception.values) === null || _event_exception_values === void 0 ? void 0 : _event_exception_values.length) === 1 : false; 36793 const frameKeys = getBundleKeysForAllFramesWithFilenames(event, options.ignoreSentryInternalFrames, insideSentryWrapped); 36794 if (frameKeys) { 36795 const arrayMethod = options.behaviour === "drop-error-if-contains-third-party-frames" || options.behaviour === "apply-tag-if-contains-third-party-frames" ? "some" : "every"; 36796 const behaviourApplies = frameKeys[arrayMethod]((keys)=>!keys.some((key)=>options.filterKeys.includes(key))); 36797 if (behaviourApplies) { 36798 const shouldDrop = options.behaviour === "drop-error-if-contains-third-party-frames" || options.behaviour === "drop-error-if-exclusively-contains-third-party-frames"; 36799 if (shouldDrop) { 36800 return null; 36801 } else { 36802 event.tags = { 36803 ...event.tags, 36804 third_party_code: true 36805 }; 36806 } 36807 } 36808 } 36809 return event; 36810 } 36811 }; 36812}); 36813function isSentryInternalFrame(frame, frameIndex, insideSentryWrapped) { 36814 if (frameIndex !== 0) { 36815 return false;
36816 } 36817 if (insideSentryWrapped && isLikelyMinifiedSentryWrappedFrame(frame)) { 36818 return true; 36819 } 36820 if (frame.function === "sentryWrapped") { 36821 return true; 36822 } 36823 if (!frame.context_line || !frame.filename) { 36824 return false; 36825 } 36826 if (!frame.filename.includes("sentry") || !frame.filename.includes("helpers") || // Filename would look something like this: 'node_modules/@sentry/browser/build/npm/esm/helpers.js' 36827 !frame.context_line.includes(SENTRY_INTERNAL_FN_APPLY)) { 36828 return false; 36829 } 36830 if (frame.pre_context) { 36831 const len = frame.pre_context.length; 36832 for(let i = 0; i < len; i++){ 36833 var _frame_pre_context_i; 36834 if ((_frame_pre_context_i = frame.pre_context[i]) === null || _frame_pre_context_i === void 0 ? void 0 : _frame_pre_context_i.includes(SENTRY_INTERNAL_COMMENT)) { 36835 return true; 36836 } 36837 } 36838 } 36839 return false; 36840} 36841function getBundleKeysForAllFramesWithFilenames(event, ignoreSentryInternalFrames, insideSentryWrapped) { 36842 const frames = (0, __TURBOPACK__imported__module__936032__7["getFramesFromEvent"])(event); 36843 if (!frames) { 36844 return void 0; 36845 } 36846 return frames.filter((frame, index)=>{ 36847 if (!frame.filename) { 36848 return false; 36849 } 36850 if (frame.lineno == null && frame.colno == null && frame.instruction_addr == null) { 36851 return false; 36852 } 36853 return !ignoreSentryInternalFrames || !isSentryInternalFrame(frame, index, !!insideSentryWrapped); 36854 }).map((frame)=>{ 36855 if (!frame.module_metadata) { 36856 return []; 36857 } 36858 return Object.keys(frame.module_metadata).filter((key)=>key.startsWith(BUNDLER_PLUGIN_APP_KEY_PREFIX)).map((key)=>key.slice(BUNDLER_PLUGIN_APP_KEY_PREFIX.length)); 36859 }); 36860} 36861function isLikelyMinifiedSentryWrappedFrame(frame) { 36862 return !frame.context_line && !frame.pre_context && !!frame.function && frame.function.length <= 2; 36863} 36864const BUNDLER_PLUGIN_APP_KEY_PREFIX = "_sentryBundlerPluginAppKey:"; 36865const SENTRY_INTERNAL_COMMENT = "Attempt to invoke user-land function"; 36866const SENTRY_INTERNAL_FN_APPLY = "fn.apply(this, wrappedArguments)"; 36867; 36868// MERGED MODULE: [project]/node_modules/@sentry/core/build/esm/integrations/extraerrordata.js [app-client] (ecmascript) 36869; 36870var __TURBOPACK__imported__module__901020__18 = __TURBOPACK__imported__module__901020__; 36871var __TURBOPACK__imported__module__272598__38 = __TURBOPACK__imported__module__272598__; 36872var __TURBOPACK__imported__module__453288__15 = __TURBOPACK__imported__module__453288__; 36873var __TURBOPACK__imported__module__45968__5 = __TURBOPACK__imported__module__45968__; 36874var __TURBOPACK__imported__module__685658__ = __turbopack_context__.i(685658); 36875var __TURBOPACK__imported__module__821593__7 = __TURBOPACK__imported__module__821593__; 36876; 36877; 36878; 36879; 36880; 36881; 36882; 36883const INTEGRATION_NAME10 = "ExtraErrorData"; 36884const _extraErrorDataIntegration = function() { 36885 let options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}; 36886 const { depth = 3, captureErrorCause = true } = options; 36887 return { 36888 name: INTEGRATION_NAME10, 36889 processEvent (event, hint, client) { 36890 const { maxValueLength } = client.getOptions(); 36891 return _enhanceEventWithErrorData(event, hint, depth, captureErrorCause, maxValueLength); 36892 } 36893 }; 36894}; 36895const extraErrorDataIntegration = defineIntegration(_extraErrorDataIntegration); 36896function _enhanceEventWithErrorData(event) { 36897 let hint = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, depth = arguments.length > 2 ? arguments[2] : void 0, captureErrorCause = arguments.length > 3 ? arguments[3] : void 0, maxValueLength = arguments.length > 4 ? arguments[4] : void 0; 36898 if (!hint.originalException || !(0, __TURBOPACK__imported__module__453288__15["isError"])(hint.originalException)) { 36899 return event; 36900 } 36901 const exceptionName = hint.originalException.name || hint.originalException.constructor.name; 36902 const errorData = _extractErrorData(hint.originalException, captureErrorCause, maxValueLength); 36903 if (errorData) { 36904 const contexts = { 36905 ...event.contexts 36906 }; 36907 const normalizedErrorData = (0, __TURBOPACK__imported__module__45968__5["normalize"])(errorData, depth); 36908 if ((0, __TURBOPACK__imported__module__453288__15["isPlainObject"])(normalizedErrorData)) { 36909 (0, __TURBOPACK__imported__module__685658__["setSkipNormalizationHint"])(normalizedErrorData); 36910 contexts[exceptionName] = normalizedErrorData; 36911 } 36912 return { 36913 ...event, 36914 contexts 36915 }; 36916 } 36917 return event; 36918} 36919function _extractErrorData(error, captureErrorCause, maxValueLength) { 36920 try { 36921 const nativeKeys = [ 36922 "name", 36923 "message", 36924 "stack", 36925 "line", 36926 "column", 36927 "fileName", 36928 "lineNumber", 36929 "columnNumber", 36930 "toJSON" 36931 ]; 36932 const extraErrorInfo = {}; 36933 for (const key of Object.keys(error)){ 36934 if (nativeKeys.indexOf(key) !== -1) { 36935 continue; 36936 } 36937 const value = error[key]; 36938 extraErrorInfo[key] = (0, __TURBOPACK__imported__module__453288__15["isError"])(value) || typeof value === "string" ? maxValueLength ? (0, __TURBOPACK__imported__module__821593__7["truncate"])("".concat(value), maxValueLength) : "".concat(value) : value; 36939 } 36940 if (captureErrorCause && error.cause !== void 0) { 36941 if ((0, __TURBOPACK__imported__module__453288__15["isError"])(error.cause)) { 36942 const errorName = error.cause.name || error.cause.constructor.name; 36943 extraErrorInfo.cause = { 36944 [errorName]: _extractErrorData(error.cause, false, maxValueLength) 36945 }; 36946 } else { 36947 extraErrorInfo.cause = error.cause; 36948 } 36949 } 36950 if (typeof error.toJSON === "function") { 36951 const serializedError = error.toJSON(); 36952 for (const key of Object.keys(serializedError)){
36953 const value = serializedError[key]; 36954 extraErrorInfo[key] = (0, __TURBOPACK__imported__module__453288__15["isError"])(value) ? value.toString() : value; 36955 } 36956 } 36957 return extraErrorInfo; 36958 } catch (oO) { 36959 __TURBOPACK__imported__module__901020__18["DEBUG_BUILD"] && __TURBOPACK__imported__module__272598__38["debug"].error("Unable to extract extra data from the Error object:", oO); 36960 } 36961 return null; 36962} 36963; 36964var __TURBOPACK__imported__module__662537__7 = __TURBOPACK__imported__module__662537__; 36965// MERGED MODULE: [project]/src/lib/getSentryTransactionSamplingRate.ts [app-client] (ecmascript) 36966; 36967const DEFAULT_RATE = 0.02; 36968const REDUCED_RATE = 0.01; 36969const MINIMUM_RATE = 0.005; 36970function getSentryTransactionSamplingRate(param) { 36971 let { name, inheritOrSampleWith } = param; 36972 // Sampling rates tuned based on trace volume analysis: 36973 // https://lightbasenl.sentry.io/explore/traces/?aggregateField=%7B%22groupBy%22%3A%22transaction%22%7D&aggregateField=%7B%22yAxes%22%3A%5B%22count%28span.duration%29%22%5D%7D&mode=aggregate&project=5908290&statsPeriod=30d 36974 if ([ 36975 "middleware GET", 36976 "GET /[locale]" 36977 ].includes(name)) { 36978 return MINIMUM_RATE; 36979 } 36980 if ([ 36981 "GET /[locale]/voertuigen/[mainCategoryId]/[mainCategorySlug]/[categoryId]/[categorySlug]", 36982 "GET /[locale]/voertuigen/[mainCategoryId]/[mainCategorySlug]", 36983 ":/locale", 36984 "GET /[locale]/[rootslug]", 36985 "/:locale/voertuigen/[mainCategoryId]/[mainCategorySlug]", 36986 ":/locale/:rest" 36987 ].includes(name)) { 36988 return REDUCED_RATE; 36989 } 36990 return inheritOrSampleWith(DEFAULT_RATE); 36991} 36992// MERGED MODULE: [project]/src/lib/isBotUserAgent.tsx [app-client] (ecmascript) 36993; 36994const BOT_USER_AGENT_REGEX = /bot|crawl|spider|marketingtracer/i; 36995function isBotUserAgent1(event, hint) { 36996 var _navigator, // Server-side: in a Next.js environment, you can sometimes access the user-agent 36997 // from a custom request object stored in the original exception. 36998 _originalException_req_headers, _originalException_req, // Server-side: Sentry may attach the user-agent from the original request here 36999 _event_request_headers, _event_request, _event_sdkProcessingMetadata_normalizedRequest_headers, _event_sdkProcessingMetadata_normalizedRequest, _event_sdkProcessingMetadata; 37000 const originalException = hint === null || hint === void 0 ? void 0 : hint.originalException; 37001 const userAgents = [ 37002 // Client-side: navigator.userAgent is typically available in browsers 37003 // and often provides accurate information about bots (e.g., Googlebot). 37004 typeof navigator !== "undefined" ? (_navigator = navigator) === null || _navigator === void 0 ? void 0 : _navigator.userAgent : undefined, 37005 originalException === null || originalException === void 0 ? void 0 : (_originalException_req = originalException.req) === null || _originalException_req === void 0 ? void 0 : (_originalException_req_headers = _originalException_req.headers) === null || _originalException_req_headers === void 0 ? void 0 : _originalException_req_headers["user-agent"], 37006 event === null || event === void 0 ? void 0 : (_event_request = event.request) === null || _event_request === void 0 ? void 0 : (_event_request_headers = _event_request.headers) === null || _event_request_headers === void 0 ? void 0 : _event_request_headers["user-agent"], 37007 event === null || event === void 0 ? void 0 : (_event_sdkProcessingMetadata = event.sdkProcessingMetadata) === null || _event_sdkProcessingMetadata === void 0 ? void 0 : (_event_sdkProcessingMetadata_normalizedRequest = _event_sdkProcessingMetadata.normalizedRequest) === null || _event_sdkProcessingMetadata_normalizedRequest === void 0 ? void 0 : (_event_sdkProcessingMetadata_normalizedRequest_headers = _event_sdkProcessingMetadata_normalizedRequest.headers) === null || _event_sdkProcessingMetadata_normalizedRequest_headers === void 0 ? void 0 : _event_sdkProcessingMetadata_normalizedRequest_headers["user-agent"] 37008 ]; 37009 return userAgents.some((agent)=>agent && BOT_USER_AGENT_REGEX.test(agent)); 37010} 37011function gatherDataForRangeError(event, _hint) { 37012 var _event_exception_values, _event_exception; 37013 const exception = (_event_exception = event.exception) === null || _event_exception === void 0 ? void 0 : (_event_exception_values = _event_exception.values) === null || _event_exception_values === void 0 ? void 0 : _event_exception_values[0]; 37014 if ((exception === null || exception === void 0 ? void 0 : exception.type) === "RangeError") { 37015 var _event_request, _navigator; 37016 return { 37017 ...event.extra, 37018 headers: event === null || event === void 0 ? void 0 : (_event_request = event.request) === null || _event_request === void 0 ? void 0 : _event_request.headers, 37019 userAgent: (_navigator = navigator) === null || _navigator === void 0 ? void 0 : _navigator.userAgent 37020 }; 37021 } 37022 return {}; 37023} 37024// MERGED MODULE: [project]/src/app/contants.ts [app-client] (ecmascript) 37025; 37026var __TURBOPACK__imported__module__247167__6 = __TURBOPACK__imported__module__247167__; 37027var _process_env_NEXT_PUBLIC_URL; 37028const APP_URL = __TURBOPACK__imported__module__247167__6["default"].env.VERCEL_BRANCH_URL ? "https://".concat(__TURBOPACK__imported__module__247167__6["default"].env.VERCEL_BRANCH_URL) : (_process_env_NEXT_PUBLIC_URL = ("TURBOPACK compile-time value", "https://diks.net")) !== null && _process_env_NEXT_PUBLIC_URL !== void 0 ? _process_env_NEXT_PUBLIC_URL : "https://diks.net"; 37029globalThis["_sentryRouteManifest"] = "{\"dynamicRoutes\":[{\"path\":\"/:locale/self-registration\",\"regex\":\"^/([^/]+)/self-registration$\",\"paramNames\":[\"locale\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/self-registration/complete\",\"regex\":\"^/([^/]+)/self-registration/complete$\",\"paramNames\":[\"locale\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/self-registration/customer-details/company\",\"regex\":\"^/([^/]+)/self-registration/customer-details/company$\",\"paramNames\":[\"locale\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/self-registration/customer-details/personal\",\"regex\":\"^/([^/]+)/self-registration/customer-details/personal$\",\"paramNames\":[\"locale\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/self-registration/drivers-license\",\"regex\":\"^/([^/]+)/self-registration/drivers-license$\",\"paramNames\":[\"locale\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/self-registration/extra-drivers\",\"regex\":\"^/([^/]+)/self-registration/extra-drivers$\",\"paramNames\":[\"locale\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/self-registration/pickup\",\"regex\":\"^/([^/]+)/self-registration/pickup$\",\"paramNames\":[\"locale\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/self-registration/start\",\"regex\":\"^/([^/]+)/self-registration/start$\",\"paramNames\":[\"locale\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/vergelijken\",\"regex\":\"^/([^/]+)/vergelijken$\",\"paramNames\":[\"locale\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/voertuigen\",\"regex\":\"^/([^/]+)/voertuigen$\",\"paramNames\":[\"locale\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/voertuigen/:mainCategoryId/:mainCategorySlug\",\"regex\":\"^/([^/]+)/voertuigen/([^/]+)/([^/]+)$\",\"paramNames\":[\"locale\",\"mainCategoryId\",\"mainCategorySlug\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/voertuigen/:mainCategoryId/:mainCategorySlug/:categoryId/:categorySlug\",\"regex\":\"^/([^/]+)/voertuigen/([^/]+)/([^/]+)/([^/]+)/([^/]+)$\",\"paramNames\":[\"locale\",\"mainCategoryId\",\"mainCategorySlug\",\"categoryId\",\"categorySlug\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/voertuigen/:mainCategoryId/:mainCategorySlug/:categoryId/:categorySlug/samenstellen\",\"regex\":\"^/([^/]+)/voertuigen/([^/]+)/([^/]+)/([^/]+)/([^/]+)/samenstellen$\",\"paramNames\":[\"locale\",\"mainCategoryId\",\"mainCategorySlug\",\"categoryId\",\"categorySlug\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/voertuigen/alternatieven/:mainCategoryId/:categoryId\",\"regex\":\"^/([^/]+)/voertuigen/alternatieven/([^/]+)/([^/]+)$\",\"paramNames\":[\"locale\",\"mainCategoryId\",\"categoryId\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/reserveren\",\"regex\":\"^/([^/]+)/reserveren$\",\"paramNames\":[\"locale\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/reserveren/mislukt\",\"regex\":\"^/([^/]+)/reserveren/mislukt$\",\"paramNames\":[\"locale\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/reserveren/voltooid\",\"regex\":\"^/([^/]+)/reserveren/voltooid$\",\"paramNames\":[\"locale\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/shortlease/:mainCategoryId/:mainCategorySlug\",\"regex\":\"^/([^/]+)/shortlease/([^/]+)/([^/]+)$\",\"paramNames\":[\"locale\",\"mainCategoryId\",\"mainCategorySlug\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/shortlease/:mainCategoryId/:mainCategorySlug/:categoryId/:categorySlug\",\"regex\":\"^/([^/]+)/shortlease/([^/]+)/([^/]+)/([^/]+)/([^/]+)$\",\"paramNames\":[\"locale\",\"mainCategoryId\",\"mainCategorySlug\",\"categoryId\",\"categorySlug\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/shortlease/gegevens\",\"regex\":\"^/([^/]+)/shortlease/gegevens$\",\"paramNames\":[\"locale\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/shortlease/voltooid\",\"regex\":\"^/([^/]+)/shortlease/voltooid$\",\"paramNames\":[\"locale\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/winkelwagen\",\"regex\":\"^/([^/]+)/winkelwagen$\",\"paramNames\":[\"locale\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/winkelwagen/aanpassen/:orderLineId\",\"regex\":\"^/([^/]+)/winkelwagen/aanpassen/([^/]+)$\",\"paramNames\":[\"locale\",\"orderLineId\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/:rootSlug\",\"regex\":\"^/([^/]+)/([^/]+)$\",\"paramNames\":[\"locale\",\"rootSlug\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/:rootSlug/:slug\",\"regex\":\"^/([^/]+)/([^/]+)/([^/]+)$\",\"paramNames\":[\"locale\",\"rootSlug\",\"slug\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/blogs\",\"regex\":\"^/([^/]+)/blogs$\",\"paramNames\":[\"locale\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/blogs/:slug\",\"regex\":\"^/([^/]+)/blogs/([^/]+)$\",\"paramNames\":[\"locale\",\"slug\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/nieuws\",\"regex\":\"^/([^/]+)/nieuws$\",\"paramNames\":[\"locale\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/nieuws/:slug\",\"regex\":\"^/([^/]+)/nieuws/([^/]+)$\",\"paramNames\":[\"locale\",\"slug\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/vestigingen\",\"regex\":\"^/([^/]+)/vestigingen$\",\"paramNames\":[\"locale\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/vestigingen/:slug\",\"regex\":\"^/([^/]+)/vestigingen/([^/]+)$\",\"paramNames\":[\"locale\",\"slug\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/werken-bij\",\"regex\":\"^/([^/]+)/werken-bij$\",\"paramNames\":[\"locale\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/werken-bij/vacature/:slug\",\"regex\":\"^/([^/]+)/werken-bij/vacature/([^/]+)$\",\"paramNames\":[\"locale\",\"slug\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/werken-bij/verhalen\",\"regex\":\"^/([^/]+)/werken-bij/verhalen$\",\"paramNames\":[\"locale\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/werken-bij/verhalen/:slug\",\"regex\":\"^/([^/]+)/werken-bij/verhalen/([^/]+)$\",\"paramNames\":[\"locale\",\"slug\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale\",\"regex\":\"^/([^/]+)$\",\"paramNames\":[\"locale\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/:rest*\",\"regex\":\"^/([^/]+)/(.+)$\",\"paramNames\":[\"locale\",\"rest\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/account/account-aanmaken\",\"regex\":\"^/([^/]+)/account/account-aanmaken$\",\"paramNames\":[\"locale\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/account/inloggen\",\"regex\":\"^/([^/]+)/account/inloggen$\",\"paramNames\":[\"locale\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/account/verificatie\",\"regex\":\"^/([^/]+)/account/verificatie$\",\"paramNames\":[\"locale\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/account/verificatie-afronden\",\"regex\":\"^/([^/]+)/account/verificatie-afronden$\",\"paramNames\":[\"locale\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/account/wachtwoord-vergeten\",\"regex\":\"^/([^/]+)/account/wachtwoord-vergeten$\",\"paramNames\":[\"locale\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/contact\",\"regex\":\"^/([^/]+)/contact$\",\"paramNames\":[\"locale\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/mijn-diks\",\"regex\":\"^/([^/]+)/mijn-diks$\",\"paramNames\":[\"locale\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/mijn-diks/facturen\",\"regex\":\"^/([^/]+)/mijn-diks/facturen$\",\"paramNames\":[\"locale\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/mijn-diks/favorieten\",\"regex\":\"^/([^/]+)/mijn-diks/favorieten$\",\"paramNames\":[\"locale\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/mijn-diks/opslag\",\"regex\":\"^/([^/]+)/mijn-diks/opslag$\",\"paramNames\":[\"locale\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/mijn-diks/profiel\",\"regex\":\"^/([^/]+)/mijn-diks/profiel$\",\"paramNames\":[\"locale\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/mijn-diks/reserveringen\",\"regex\":\"^/([^/]+)/mijn-diks/reserveringen$\",\"paramNames\":[\"locale\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/mijn-diks/reserveringen/aanpassen/:reservationId\",\"regex\":\"^/([^/]+)/mijn-diks/reserveringen/aanpassen/([^/]+)$\",\"paramNames\":[\"locale\",\"reservationId\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/opslag-huren/extras\",\"regex\":\"^/([^/]+)/opslag-huren/extras$\",\"paramNames\":[\"locale\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/opslag-huren/gegevens\",\"regex\":\"^/([^/]+)/opslag-huren/gegevens$\",\"paramNames\":[\"locale\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/opslag-huren/samenstellen\",\"regex\":\"^/([^/]+)/opslag-huren/samenstellen$\",\"paramNames\":[\"locale\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/opslag-huren/voltooid\",\"regex\":\"^/([^/]+)/opslag-huren/voltooid$\",\"paramNames\":[\"locale\"],\"hasOptionalPrefix\":true},{\"path\":\"/:locale/sitemap\",\"regex\":\"^/([^/]+)/sitemap$\",\"paramNames\":[\"locale\"],\"hasOptionalPrefix\":true}
37029,{\"path\":\"/beheer/shared-vehicles/:id\",\"regex\":\"^/beheer/shared-vehicles/([^/]+)$\",\"paramNames\":[\"id\"],\"hasOptionalPrefix\":false}],\"staticRoutes\":[{\"path\":\"/library\"},{\"path\":\"/library/better-date-picker\"},{\"path\":\"/library/birth-date-input\"},{\"path\":\"/library/breadcrumbs\"},{\"path\":\"/library/button\"},{\"path\":\"/library/button-link\"},{\"path\":\"/library/checkbox\"},{\"path\":\"/library/color\"},{\"path\":\"/library/date-time-input\"},{\"path\":\"/library/error-message\"},{\"path\":\"/library/full-page-loader\"},{\"path\":\"/library/info-banner\"},{\"path\":\"/library/input\"},{\"path\":\"/library/modal\"},{\"path\":\"/library/notification\"},{\"path\":\"/library/number-input\"},{\"path\":\"/library/pagination\"},{\"path\":\"/library/select\"},{\"path\":\"/library/spacing\"},{\"path\":\"/library/spinner\"},{\"path\":\"/library/tabs\"},{\"path\":\"/library/text\"},{\"path\":\"/library/text-area\"},{\"path\":\"/library/toggle\"},{\"path\":\"/library/vehicle-card\"},{\"path\":\"/beheer\"},{\"path\":\"/beheer/addons\"},{\"path\":\"/beheer/address-radius-check\"},{\"path\":\"/beheer/auto-invoicing\"},{\"path\":\"/beheer/availability\"},{\"path\":\"/beheer/availability-buffer\"},{\"path\":\"/beheer/bikes\"},{\"path\":\"/beheer/blacklist\"},{\"path\":\"/beheer/blacklist/email\"},{\"path\":\"/beheer/blacklist/telefoon\"},{\"path\":\"/beheer/business-rules\"},{\"path\":\"/beheer/city-fee\"},{\"path\":\"/beheer/customers\"},{\"path\":\"/beheer/divergent-opening-hours\"},{\"path\":\"/beheer/feature-flags\"},{\"path\":\"/beheer/hours-check-availability\"},{\"path\":\"/beheer/locations\"},{\"path\":\"/beheer/logs\"},{\"path\":\"/beheer/mcontact\"},{\"path\":\"/beheer/redirects\"},{\"path\":\"/beheer/shared-vehicles\"},{\"path\":\"/beheer/sync\"},{\"path\":\"/beheer/time-threshold\"},{\"path\":\"/beheer/transfers\"},{\"path\":\"/beheer/transfers/combinations\"},{\"path\":\"/beheer/transfers/executers\"},{\"path\":\"/beheer/transfers/logs\"},{\"path\":\"/beheer/transfers/pool-combinations\"},{\"path\":\"/beheer/users\"}],\"isrRoutes\":[]}"; 37030globalThis["_sentryNextJsVersion"] = "16.2.12"; 37031; 37032; 37033; 37034; 37035const onRouterTransitionStart = captureRouterTransitionStart; 37036init2({ 37037 enabled: ("TURBOPACK compile-time value", "true") === "true", 37038 environment: ("TURBOPACK compile-time value", "production"), 37039 dsn: "https://ae91a4dc5db6d7a20fbc5c6856f5aa6f@o4510788255350784.ingest.de.sentry.io/4510788269965392", 37040 sampleRate: 1, 37041 tracesSampler: getSentryTransactionSamplingRate, 37042 enableLogs: [ 37043 "production", 37044 "acceptance" 37045 ].includes(("TURBOPACK compile-time value", "production")), 37046 // Setting this option to true will print useful information to the console while you're setting 37047 // up Sentry. 37048 debug: false, 37049 replaysOnErrorSampleRate: 0, 37050 // This sets the sample rate to be 25%. You may want this to be 100% while 37051 // in development and sample at a lower rate in production 37052 replaysSessionSampleRate: 0, 37053 // You can remove this option if you're not planning to use the Sentry Session Replay feature: 37054 integrations: [ 37055 replayIntegration({ 37056 // Additional Replay configuration goes in here, for example: 37057 maskAllText: true, 37058 blockAllMedia: true 37059 }), 37060 thirdPartyErrorFilterIntegration({ 37061 // Specify the application keys that you specified in the Sentry bundler plugin 37062 filterKeys: [ 37063 "diks" 37064 ], 37065 // Defines how to handle errors that contain third party stack frames. 37066 // Possible values are: 37067 // - 'drop-error-if-contains-third-party-frames' 37068 // - 'drop-error-if-exclusively-contains-third-party-frames' 37069 // - 'apply-tag-if-contains-third-party-frames' 37070 // - 'apply-tag-if-exclusively-contains-third-party-frames' 37071 behaviour: "drop-error-if-contains-third-party-frames" 37072 }), 37073 extraErrorDataIntegration() 37074 ], 37075 beforeSend (event, hint) { 37076 if (isBotUserAgent1(event, hint)) { 37077 event.tags = { 37078 ...event.tags || {}, 37079 is_bot: "true" 37080 }; 37081 } 37082 event.extra = { 37083 ...event.extra, 37084 ...gatherDataForRangeError(event, hint) 37085 }; 37086 return event; 37087 }, 37088 ignoreErrors: [ 37089 // Our own ignored errors 37090 // -------- 37091 "ProgressEvent: Event `ProgressEvent` (type=error) captured as promise rejection", 37092 "An error occurred in the Server Components render.", 37093 "ResizeObserver loop completed with undelivered notifications.", 37094 "Load failed", 37095 "Failed to load client build manifest", 37096 "Error: Failed to load client build manifest", 37097 "Request aborted", 37098 "Cannot read properties of undefined (reading 'get')", 37099 "undefined is not an object (evaluating 'this.properties.get')", 37100 "Abort due to cancellation of share.", 37101 // Ignore 401 errors due to session expiry, rely on backend monitoring. 37102 "Request failed with status code 401", 37103 // Common ignored errors 37104 // -------- 37105 // Random plugins/extensions 37106 "top.GLOBALS", 37107 // See: http://blog.errorception.com/2012/03/tale-of-unfindable-js-error.html 37108 "originalCreateNotification", 37109 "canvas.contentDocument", 37110 "MyApp_RemoveAllHighlights", 37111 "http://tt.epicplay.com", 37112 "Can't find variable: ZiteReader", 37113 "jigsaw is not defined", 37114 "ComboSearch is not defined", 37115 "http://loading.retry.widdit.com/", 37116 "atomicFindClose", 37117 // Facebook borked 37118 "fb_xd_fragment", 37119 // ISP "optimizing" proxy - `Cache-Control: no-transform` seems to reduce this. (thanks @acdha) 37120 // See http://stackoverflow.com/questions/4113268/how-to-stop-javascript-injection-from-vodafone-proxy 37121 "bmi_SafeAddOnload", 37122 "EBCallBackMessageReceived", 37123 // See http://toolbar.conduit.com/Developer/HtmlAndGadget/Methods/JSInjection.aspx 37124 "conduitPage", 37125 "Script error.", 37126 // Avast extension error 37127 "_avast_submit", 37128 "CanceledError: canceled" 37129 ], 37130 // Common denied url errors 37131 denyUrls: [ 37132 // Google Adsense 37133 /pagead\/js/i, 37134 // Facebook flakiness 37135 /graph\.facebook\.com/i, 37136 // Facebook blocked 37137 /connect\.facebook\.net\/en_US\/all\.js/i, 37138 // Woopra flakiness
37139 /eatdifferent\.com\.woopra-ns\.com/i, 37140 /static\.woopra\.com\/js\/woopra\.js/i, 37141 // Chrome extensions 37142 /extensions\//i, 37143 /^chrome:\/\//i, 37144 // Other plugins 37145 /127\.0\.0\.1:4001\/isrunning/i, 37146 /webappstoolbarba\.texthelp\.com\//i, 37147 /metrics\.itunes\.apple\.com\.edgesuite\.net\//i 37148 ] 37149}); 37150__TURBOPACK__imported__module__662537__7["setTag"]("deployment", APP_URL); 37151__turbopack_context__.s([ 37152 "onRouterTransitionStart", 37153 0, 37154 onRouterTransitionStart 37155], 471217); 37156}), 371575526, ((__turbopack_context__, module, exports) => { 37158"use strict"; 37159 37160var __TURBOPACK__imported__module__247167__ = /*#__PURE__*/ __turbopack_context__.i(247167); 37161/** 37162 * This module imports the client instrumentation hook from the project root. 37163 * 37164 * The `private-next-instrumentation-client` module is automatically aliased to 37165 * the `instrumentation-client.ts` file in the project root by webpack or turbopack. 37166 */ "use strict"; 37167if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable 37168; 37169else { 37170 // eslint-disable-next-line @next/internal/typechecked-require -- Not a module. 37171 module.exports = __turbopack_context__.f({ 37172 "private-next-instrumentation-client": { 37173 id: ()=>471217, 37174 module: ()=>__turbopack_context__.r(471217) 37175 } 37176 })('private-next-instrumentation-client'); 37177} 37178}), 37179966849, ((__turbopack_context__, module, exports) => { 37180 37181"trimStart" in String.prototype || (String.prototype.trimStart = String.prototype.trimLeft), "trimEnd" in String.prototype || (String.prototype.trimEnd = String.prototype.trimRight), "description" in Symbol.prototype || Object.defineProperty(Symbol.prototype, "description", { 37182 configurable: !0, 37183 get: function() { 37184 var t = /\((.*)\)/.exec(this.toString()); 37185 return t ? t[1] : void 0; 37186 } 37187}), Array.prototype.flat || (Array.prototype.flat = function(t, r) { 37188 return r = this.concat.apply([], this), t > 1 && r.some(Array.isArray) ? r.flat(t - 1) : r; 37189}, Array.prototype.flatMap = function(t, r) { 37190 return this.map(t, r).flat(); 37191}), Promise.prototype.finally || (Promise.prototype.finally = function(t) { 37192 if ("function" != typeof t) return this.then(t, t); 37193 var r = this.constructor || Promise; 37194 return this.then(function(n) { 37195 return r.resolve(t()).then(function() { 37196 return n; 37197 }); 37198 }, function(n) { 37199 return r.resolve(t()).then(function() { 37200 throw n; 37201 }); 37202 }); 37203}), Object.fromEntries || (Object.fromEntries = function(t) { 37204 return Array.from(t).reduce(function(t, r) { 37205 return t[r[0]] = r[1], t; 37206 }, {}); 37207}), Array.prototype.at || (Array.prototype.at = function(t) { 37208 var r = Math.trunc(t) || 0; 37209 if (r < 0 && (r += this.length), !(r < 0 || r >= this.length)) return this[r]; 37210}), Object.hasOwn || (Object.hasOwn = function(t, r) { 37211 if (null == t) throw new TypeError("Cannot convert undefined or null to object"); 37212 return Object.prototype.hasOwnProperty.call(Object(t), r); 37213}), "canParse" in URL || (URL.canParse = function(t, r) { 37214 try { 37215 return !!new URL(t, r); 37216 } catch (t) { 37217 return !1; 37218 } 37219}); 37220}), 37221523911, ((__turbopack_context__, module, exports) => { 37222"use strict"; 37223 37224var __TURBOPACK__imported__module__247167__ = /*#__PURE__*/ __turbopack_context__.i(247167); 37225// imports polyfill from `@next/polyfill-module` after build. 37226"use strict"; 37227Object.defineProperty(exports, "__esModule", { 37228 value: true 37229}); 37230__turbopack_context__.r(966849); 37231// Only set up devtools for the dev server. 37232if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable 37233; 37234// Start listening for the instant navigation test cookie. The test framework 37235// (e.g. Playwright) sets/clears this cookie to control the navigation lock. 37236// Browser-only. 37237if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable 37238; 37239if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { 37240 Object.defineProperty(exports.default, '__esModule', { 37241 value: true 37242 });
37243 Object.assign(exports.default, exports); 37244 module.exports = exports.default; 37245} 37246}), 3724718576, ((__turbopack_context__, module, exports) => { 37248"use strict"; 37249 37250Object.defineProperty(exports, "__esModule", { 37251 value: true 37252}); 372530 && (module.exports = { 37254 WarningIcon: null, 37255 errorStyles: null, 37256 errorThemeCss: null 37257}); 37258function _export(target, all) { 37259 for(var name in all)Object.defineProperty(target, name, { 37260 enumerable: true, 37261 get: all[name] 37262 }); 37263} 37264_export(exports, { 37265 WarningIcon: function() { 37266 return WarningIcon; 37267 }, 37268 errorStyles: function() { 37269 return errorStyles; 37270 }, 37271 errorThemeCss: function() { 37272 return errorThemeCss; 37273 } 37274}); 37275const _interop_require_default = __turbopack_context__.r(563141); 37276const _jsxruntime = __turbopack_context__.r(843476); 37277const _react = /*#__PURE__*/ _interop_require_default._(__turbopack_context__.r(271645)); 37278const errorStyles = { 37279 container: { 37280 fontFamily: 'system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple
37280Color Emoji","Segoe UI Emoji"', 37281 height: '100vh', 37282 display: 'flex', 37283 alignItems: 'center', 37284 justifyContent: 'center' 37285 }, 37286 card: { 37287 marginTop: '-32px', 37288 maxWidth: '325px', 37289 padding: '32px 28px', 37290 textAlign: 'left' 37291 }, 37292 icon: { 37293 marginBottom: '24px' 37294 }, 37295 title: { 37296 fontSize: '24px', 37297 fontWeight: 500, 37298 letterSpacing: '-0.02em', 37299 lineHeight: '32px', 37300 margin: '0 0 12px 0', 37301 color: 'var(--next-error-title)' 37302 }, 37303 message: { 37304 fontSize: '14px', 37305 fontWeight: 400, 37306 lineHeight: '21px', 37307 margin: '0 0 20px 0', 37308 color: 'var(--next-error-message)' 37309 }, 37310 form: { 37311 margin: 0 37312 }, 37313 buttonGroup: { 37314 display: 'flex', 37315 gap: '8px', 37316 alignItems: 'center' 37317 }, 37318 button: { 37319 display: 'inline-flex', 37320 alignItems: 'center', 37321 justifyContent: 'center', 37322 height: '32px', 37323 padding: '0 12px', 37324 fontSize: '14px', 37325 fontWeight: 500, 37326 lineHeight: '20px', 37327 borderRadius: '6px', 37328 cursor: 'pointer', 37329 color: 'var(--next-error-btn-text)', 37330 background: 'var(--next-error-btn-bg)', 37331 border: 'var(--next-error-btn-border)' 37332 }, 37333 buttonSecondary: { 37334 display: 'inline-flex', 37335 alignItems: 'center', 37336 justifyContent: 'center', 37337 height: '32px', 37338 padding: '0 12px', 37339 fontSize: '14px', 37340 fontWeight: 500, 37341 lineHeight: '20px', 37342 borderRadius: '6px', 37343 cursor: 'pointer', 37344 color: 'var(--next-error-btn-secondary-text)', 37345 background: 'var(--next-error-btn-secondary-bg)', 37346 border: 'var(--next-error-btn-secondary-border)' 37347 }, 37348 digestFooter: { 37349 position: 'fixed', 37350 bottom: '32px', 37351 left: '0', 37352 right: '0', 37353 textAlign: 'center', 37354 fontFamily: 'ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,monospace', 37355 fontSize: '12px', 37356 lineHeight: '18px', 37357 fontWeight: 400, 37358 margin: '0', 37359 color: 'var(--next-error-digest)' 37360 } 37361}; 37362const errorThemeCss = "\n:root {\n --next-error-bg: #fff;\n --next-error-text: #171717;\n --next-error-title: #171717;\n --next-error-message: #171717;\n --next-error-digest: #666666;\n --next-error-btn-text: #fff;\n --next-error-btn-bg: #171717;\n --next-error-btn-border: none;\n --next-error-btn-secondary-text: #171717;\n --next-error-btn-secondary-bg: transparent;\n --next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);\n}\n@media (prefers-color-scheme: dark) {\n :root {\n --next-error-bg: #0a0a0a;\n --next-error-text: #ededed;\n --next-error-title: #ededed;\n --next-error-message: #ededed;\n --next-error-digest: #a0a0a0;\n --next-error-btn-text: #0a0a0a;\n --next-error-btn-bg: #ededed;\n --next-error-btn-border: none;\n --next-error-btn-secondary-text: #ededed;\n --next-error-btn-secondary-bg: transparent;\n --next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);\n }\n}\nbody { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }\n".replace(/\n\s*/g, ''); 37363function WarningIcon() { 37364 return /*#__PURE__*/ (0, _jsxruntime.jsx)("svg", { 37365 width: "32", 37366 height: "32",
37367 viewBox: "-0.2 -1.5 32 32", 37368 fill: "none", 37369 style: errorStyles.icon, 37370 children: /*#__PURE__*/ (0, _jsxruntime.jsx)("path", { 37371 d: "M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z", 37372 fill: "var(--next-error-title)" 37373 }) 37374 }); 37375} 37376if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { 37377 Object.defineProperty(exports.default, '__esModule', { 37378 value: true 37379 }); 37380 Object.assign(exports.default, exports); 37381 module.exports = exports.default; 37382} 37383}), 37384168027, ((__turbopack_context__, module, exports) => { 37385"use strict"; 37386 37387Object.defineProperty(exports, "__esModule", { 37388 value: true 37389}); 37390Object.defineProperty(exports, // supplied custom global error signatures. 37391"default", { 37392 enumerable: true, 37393 get: function() { 37394 return _default; 37395 } 37396}); 37397const _interop_require_default = __turbopack_context__.r(563141); 37398const _jsxruntime = __turbopack_context__.r(843476); 37399const _react = /*#__PURE__*/ _interop_require_default._(__turbopack_context__.r(271645)); 37400const _handleisrerror = __turbopack_context__.r(912354); 37401const _errorstyles = __turbopack_context__.r(18576); 37402function DefaultGlobalError(param) { 37403 let { error } = param; 37404 const digest = error === null || error === void 0 ? void 0 : error.digest; 37405 const isServerError = !!digest; 37406 const message = isServerError ? 'A server error occurred. Reload to try again.' : 'Reload to try again, or go back.'; 37407 (0, _handleisrerror.handleISRError)({ 37408 error 37409 }); 37410 return /*#__PURE__*/ (0, _jsxruntime.jsxs)("html", { 37411 id: "__next_error__", 37412 children: [ 37413 /*#__PURE__*/ (0, _jsxruntime.jsx)("head", { 37414 children: /*#__PURE__*/ (0, _jsxruntime.jsx)("style", { 37415 dangerouslySetInnerHTML: { 37416 __html: _errorstyles.errorThemeCss 37417 } 37418 }) 37419 }), 37420 /*#__PURE__*/ (0, _jsxruntime.jsxs)("body", { 37421 children: [ 37422 /*#__PURE__*/ (0, _jsxruntime.jsx)("div", { 37423 style: _errorstyles.errorStyles.container, 37424 children: /*#__PURE__*/ (0, _jsxruntime.jsxs)("div", { 37425 style: _errorstyles.errorStyles.card, 37426 children: [ 37427 /*#__PURE__*/ (0, _jsxruntime.jsx)(_errorstyles.WarningIcon, {}), 37428 /*#__PURE__*/ (0, _jsxruntime.jsx)("h1", { 37429 style: _errorstyles.errorStyles.title, 37430 children: "This page couldnât load" 37431 }), 37432 /*#__PURE__*/ (0, _jsxruntime.jsx)("p", { 37433 style: _errorstyles.errorStyles.message, 37434 children: message 37435 }), 37436 /*#__PURE__*/ (0, _jsxruntime.jsxs)("div", { 37437 style: _errorstyles.errorStyles.buttonGroup, 37438 children: [ 37439 /*#__PURE__*/ (0, _jsxruntime.jsx)("form", { 37440 style: _errorstyles.errorStyles.form, 37441 children: /*#__PURE__*/ (0, _jsxruntime.jsx)("button", { 37442 type: "submit", 37443 style: _errorstyles.errorStyles.button, 37444 children: "Reload" 37445 }) 37446 }), 37447 !isServerError && /*#__PURE__*/ (0, _jsxruntime.jsx)("button", { 37448 type: "button", 37449 style: _errorstyles.errorStyles.buttonSecondary, 37450 onClick: ()=>{ 37451 if (window.history.length > 1) { 37452 window.history.back(); 37453 } else { 37454 window.location.href = '/'; 37455 } 37456 }, 37457 children: "Back" 37458 }) 37459 ] 37460 }) 37461 ] 37462 }) 37463 }), 37464 digest && /*#__PURE__*/ (0, _jsxruntime.jsxs)("p", { 37465 style: _errorstyles.errorStyles.digestFooter, 37466 children: [ 37467 "ERROR ", 37468 digest 37469 ] 37470 }) 37471 ] 37472 }) 37473 ] 37474 }); 37475} 37476const _default = DefaultGlobalError; 37477if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { 37478 Object.defineProperty(exports.default, '__esModule', { 37479 value: true 37480 });
37481 Object.assign(exports.default, exports); 37482 module.exports = exports.default; 37483} 37484}), 37485851323, ((__turbopack_context__, module, exports) => { 37486"use strict"; 37487 37488var __TURBOPACK__imported__module__247167__ = /*#__PURE__*/ __turbopack_context__.i(247167); 37489// This file is only used in app router due to the specific error state handling. 37490"use strict"; 37491Object.defineProperty(exports, "__esModule", { 37492 value: true 37493}); 374940 && (module.exports = { 37495 onCaughtError: null, 37496 onUncaughtError: null 37497}); 37498function _export(target, all) { 37499 for(var name in all)Object.defineProperty(target, name, { 37500 enumerable: true, 37501 get: all[name] 37502 }); 37503} 37504_export(exports, { 37505 onCaughtError: function() { 37506 return onCaughtError; 37507 }, 37508 onUncaughtError: function() { 37509 return onUncaughtError; 37510 } 37511}); 37512const _interop_require_default = __turbopack_context__.r(563141); 37513const _isnextroutererror = __turbopack_context__.r(265713); 37514const _bailouttocsr = __turbopack_context__.r(132061); 37515const _reportglobalerror = __turbopack_context__.r(528279); 37516const _errorboundary = __turbopack_context__.r(972383); 37517const _globalerror = /*#__PURE__*/ _interop_require_default._(__turbopack_context__.r(168027)); 37518const devToolErrorMod = ("TURBOPACK compile-time falsy", 0) ? "TURBOPACK unreachable" : { 37519 decorateDevError: (error)=>error, 37520 handleClientError: ()=>{}, 37521 originConsoleError: console.error.bind(console) 37522}; 37523function onCaughtError(thrownValue, errorInfo) { 37524 var _errorInfo_errorBoundary; 37525 const errorBoundaryComponent = (_errorInfo_errorBoundary = errorInfo.errorBoundary) === null || _errorInfo_errorBoundary === void 0 ? void 0 : _errorInfo_errorBoundary.constructor; 37526 let isImplicitErrorBoundary; 37527 if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable 37528 ; 37529 isImplicitErrorBoundary = isImplicitErrorBoundary || errorBoundaryComponent === _errorboundary.ErrorBoundaryHandler && errorInfo.errorBoundary.props.errorComponent === _globalerror.default; 37530 // Skip the segment explorer triggered error 37531 if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable 37532 ; 37533 if (isImplicitErrorBoundary) { 37534 // We don't consider errors caught unless they're caught by an explicit error 37535 // boundary. The built-in ones are considered implicit. 37536 // This mimics how the same app would behave without Next.js. 37537 return onUncaughtError(thrownValue); 37538 } 37539 // Skip certain custom errors which are not expected to be reported on client 37540 if ((0, _bailouttocsr.isBailoutToCSRError)(thrownValue) || (0, _isnextroutererror.isNextRouterError)(thrownValue)) return; 37541 if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable 37542 { 37543 var _ref; 37544 var _errorInfo_componentStack; 37545 } else { 37546 devToolErrorMod.originConsoleError(thrownValue); 37547 } 37548} 37549function onUncaughtError(thrownValue) { 37550 // Skip certain custom errors which are not expected to be reported on client 37551 if ((0, _bailouttocsr.isBailoutToCSRError)(thrownValue) || (0, _isnextroutererror.isNextRouterError)(thrownValue)) return; 37552 if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable 37553 ; 37554 else { 37555 (0, _reportglobalerror.reportGlobalError)(thrownValue); 37556 } 37557} 37558if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { 37559 Object.defineProperty(exports.default, '__esModule', { 37560 value: true 37561 }); 37562 Object.assign(exports.default, exports); 37563 module.exports = exports.default; 37564} 37565}), 37566762634, ((__turbopack_context__, module, exports) => { 37567"use strict"; 37568 37569Object.defineProperty(exports, "__esModule", { 37570 value: true 37571}); 37572Object.defineProperty(exports, "AppRouterAnnouncer", { 37573 enumerable: true, 37574 get: function() { 37575 return AppRouterAnnouncer; 37576 } 37577}); 37578const _react = __turbopack_context__.r(271645); 37579const _reactdom = __turbopack_context__.r(174080); 37580const ANNOUNCER_TYPE = 'next-route-announcer'; 37581const ANNOUNCER_ID = '__next-route-announcer__'; 37582function getAnnouncerNode() { 37583 var _existingAnnouncer_shadowRoot; 37584 const existingAnnouncer = document.getElementsByName(ANNOUNCER_TYPE)[0]; 37585 if (existingAnnouncer === null || existingAnnouncer === void 0 ? void 0 : (_existingAnnouncer_shadowRoot = existingAnnouncer.shadowRoot) === null || _existingAnnouncer_shadowRoot === void 0 ? void 0 : _existingAnnouncer_shadowRoot.childNodes[0]) { 37586 return existingAnnouncer.shadowRoot.childNodes[0]; 37587 } else { 37588 const container = document.createElement(ANNOUNCER_TYPE); 37589 container.style.cssText = 'position:absolute'; 37590 const announcer = document.createElement('div'); 37591 announcer.ariaLive = 'assertive'; 37592 announcer.id = ANNOUNCER_ID; 37593 announcer.role = 'alert'; 37594 announcer.style.cssText = 'position:absolute;border:0;height:1px;margin:-1px;padding:0;width:1px;clip:rect(0 0 0 0);overflow:hidden;white-space:nowrap;word-wrap:normal'; 37595 // Use shadow DOM here to avoid any potential CSS bleed 37596 const shadow = container.attachShadow({ 37597 mode: 'open' 37598 }); 37599 shadow.appendChild(announcer); 37600 document.body.appendChild(container); 37601 return announcer; 37602 } 37603} 37604function AppRouterAnnouncer(param) { 37605 let { tree } = param; 37606 const [portalNode, setPortalNode] = (0, _react.useState)(null); 37607 (0, _react.useEffect)(()=>{ 37608 const announcer = getAnnouncerNode(); 37609 setPortalNode(announcer); 37610 return ()=>{ 37611 const container = document.getElementsByTagName(ANNOUNCER_TYPE)[0]; 37612 if (container === null || container === void 0 ? void 0 : container.isConnected) { 37613 document.body.removeChild(container); 37614 } 37615 }; 37616 }, []); 37617 const [routeAnnouncement, setRouteAnnouncement] = (0, _react.useState)(''); 37618 const previousTitle = (0, _react.useRef)(undefined); 37619 (0, _react.useEffect)(()=>{ 37620 let currentTitle = ''; 37621 if (document.title) { 37622 currentTitle = document.title; 37623 } else { 37624 const pageHeader = document.querySelector('h1'); 37625 if (pageHeader) { 37626 currentTitle = pageHeader.innerText || pageHeader.textContent || ''; 37627 } 37628 } 37629 // Only announce the title change, but not for the first load because screen 37630 // readers do that automatically. 37631 if (previousTitle.current !== undefined && previousTitle.current !== currentTitle) { 37632 setRouteAnnouncement(currentTitle); 37633 } 37634 previousTitle.current = currentTitle; 37635 }, [ 37636 tree 37637 ]); 37638 return portalNode ? /*#__PURE__*/ (0, _reactdom.createPortal)(routeAnnouncement, portalNode) : null; 37639} 37640if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { 37641 Object.defineProperty(exports.default, '__esModule', { 37642 value: true 37643 });
37644 Object.assign(exports.default, exports); 37645 module.exports = exports.default; 37646} 37647}), 37648425018, ((__turbopack_context__, module, exports) => { 37649"use strict"; 37650 37651Object.defineProperty(exports, "__esModule", { 37652 value: true 37653}); 37654Object.defineProperty(exports, "findHeadInCache", { 37655 enumerable: true, 37656 get: function() { 37657 return findHeadInCache; 37658 } 37659}); 37660const _segment = __turbopack_context__.r(813258); 37661const _createroutercachekey = __turbopack_context__.r(270725); 37662function findHeadInCache(cache, parallelRoutes) { 37663 return findHeadInCacheImpl(cache, parallelRoutes, '', ''); 37664} 37665function findHeadInCacheImpl(cache, parallelRoutes, keyPrefix, keyPrefixWithoutSearchParams) { 37666 const isLastItem = Object.keys(parallelRoutes).length === 0; 37667 if (isLastItem) { 37668 // Returns the entire Cache Node of the segment whose head we will render. 37669 return [ 37670 cache, 37671 keyPrefix, 37672 keyPrefixWithoutSearchParams 37673 ]; 37674 } 37675 // First try the 'children' parallel route if it exists 37676 // when starting from the "root", this corresponds with the main page component 37677 const parallelRoutesKeys = Object.keys(parallelRoutes).filter((key)=>key !== 'children'); 37678 // if we are at the root, we need to check the children slot first 37679 if ('children' in parallelRoutes) { 37680 parallelRoutesKeys.unshift('children'); 37681 } 37682 const slots = cache.slots; 37683 if (slots !== null) { 37684 for (const key of parallelRoutesKeys){ 37685 const [segment, childParallelRoutes] = parallelRoutes[key]; 37686 // If the parallel is not matched and using the default segment, 37687 // skip searching the head from it. 37688 if (segment === _segment.DEFAULT_SEGMENT_KEY) { 37689 continue; 37690 } 37691 const childCacheNode = slots[key]; 37692 if (!childCacheNode) { 37693 continue; 37694 } 37695 const cacheKey = (0, _createroutercachekey.createRouterCacheKey)(segment); 37696 const cacheKeyWithoutSearchParams = (0, _createroutercachekey.createRouterCacheKey)(segment, true); 37697 const item = findHeadInCacheImpl(childCacheNode, childParallelRoutes, keyPrefix + '/' + cacheKey, keyPrefix + '/' + cacheKeyWithoutSearchParams); 37698 if (item) { 37699 return item; 37700 } 37701 } 37702 } 37703 return null; 37704} 37705if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { 37706 Object.defineProperty(exports.default, '__esModule', { 37707 value: true 37708 }); 37709 Object.assign(exports.default, exports); 37710 module.exports = exports.default; 37711} 37712}), 37713241624, ((__turbopack_context__, module, exports) => { 37714"use strict"; 37715 37716Object.defineProperty(exports, "__esModule", { 37717 value: true 37718}); 377190 && (module.exports = { 37720 GracefulDegradeBoundary: null, 37721 default: null 37722}); 37723function _export(target, all) { 37724 for(var name in all)Object.defineProperty(target, name, { 37725 enumerable: true, 37726 get: all[name] 37727 }); 37728} 37729_export(exports, { 37730 GracefulDegradeBoundary: function() { 37731 return GracefulDegradeBoundary; 37732 }, 37733 default: function() { 37734 return _default; 37735 } 37736}); 37737const _jsxruntime = __turbopack_context__.r(843476); 37738const _react = __turbopack_context__.r(271645); 37739function getDomNodeAttributes(node) { 37740 const result = {}; 37741 for(let i = 0; i < node.attributes.length; i++){ 37742 const attr = node.attributes[i]; 37743 result[attr.name] = attr.value; 37744 } 37745 return result; 37746} 37747class GracefulDegradeBoundary extends _react.Component { 37748 static getDerivedStateFromError(_) { 37749 return { 37750 hasError: true 37751 }; 37752 } 37753 componentDidMount() { 37754 const htmlNode = this.htmlRef.current; 37755 if (this.state.hasError && htmlNode) { 37756 // Reapply the cached HTML attributes to the root element 37757 Object.entries(this.htmlAttributes).forEach((param)=>{ 37758 let [key, value] = param; 37759 htmlNode.setAttribute(key, value); 37760 }); 37761 } 37762 } 37763 render() { 37764 const { hasError } = this.state; 37765 // Cache the root HTML content on the first render 37766 if (typeof window !== 'undefined' && !this.rootHtml) { 37767 this.rootHtml = document.documentElement.innerHTML; 37768 this.htmlAttributes = getDomNodeAttributes(document.documentElement); 37769 } 37770 if (hasError) { 37771 // Render the current HTML content without hydration 37772 return /*#__PURE__*/ (0, _jsxruntime.jsx)("html", { 37773 ref: this.htmlRef, 37774 suppressHydrationWarning: true, 37775 dangerouslySetInnerHTML: { 37776 __html: this.rootHtml 37777 } 37778 }); 37779 } 37780 return this.props.children; 37781 } 37782 constructor(props){ 37783 super(props); 37784 this.state = { 37785 hasError: false 37786 }; 37787 this.rootHtml = ''; 37788 this.htmlAttributes = {}; 37789 this.htmlRef = /*#__PURE__*/ (0, _react.createRef)(); 37790 } 37791} 37792const _default = GracefulDegradeBoundary; 37793if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { 37794 Object.defineProperty(exports.default, '__esModule', { 37795 value: true 37796 });
37797 Object.assign(exports.default, exports); 37798 module.exports = exports.default; 37799} 37800}), 37801794109, ((__turbopack_context__, module, exports) => { 37802"use strict"; 37803 37804Object.defineProperty(exports, "__esModule", { 37805 value: true 37806}); 37807Object.defineProperty(exports, "default", { 37808 enumerable: true, 37809 get: function() { 37810 return RootErrorBoundary; 37811 } 37812}); 37813const _interop_require_default = __turbopack_context__.r(563141); 37814const _jsxruntime = __turbopack_context__.r(843476); 37815const _react = /*#__PURE__*/ _interop_require_default._(__turbopack_context__.r(271645)); 37816const _gracefuldegradeboundary = /*#__PURE__*/ _interop_require_default._(__turbopack_context__.r(241624)); 37817const _errorboundary = __turbopack_context__.r(972383); 37818const _isbot = __turbopack_context__.r(82604); 37819const isBotUserAgent = typeof window !== 'undefined' && (0, _isbot.isBot)(window.navigator.userAgent); 37820function RootErrorBoundary(param) { 37821 let { children, errorComponent, errorStyles, errorScripts } = param; 37822 if (isBotUserAgent) { 37823 // Preserve existing DOM/HTML for bots to avoid replacing content with an error UI 37824 // and to keep the original SSR output intact. 37825 return /*#__PURE__*/ (0, _jsxruntime.jsx)(_gracefuldegradeboundary.default, { 37826 children: children 37827 }); 37828 } 37829 return /*#__PURE__*/ (0, _jsxruntime.jsx)(_errorboundary.ErrorBoundary, { 37830 errorComponent: errorComponent, 37831 errorStyles: errorStyles, 37832 errorScripts: errorScripts, 37833 children: children 37834 }); 37835} 37836if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { 37837 Object.defineProperty(exports.default, '__esModule', { 37838 value: true 37839 }); 37840 Object.assign(exports.default, exports); 37841 module.exports = exports.default; 37842} 37843}), 37844875530, ((__turbopack_context__, module, exports) => { 37845"use strict"; 37846 37847var __TURBOPACK__imported__module__247167__ = /*#__PURE__*/ __turbopack_context__.i(247167); 37848"use strict"; 37849Object.defineProperty(exports, "__esModule", { 37850 value: true 37851}); 37852Object.defineProperty(exports, "default", { 37853 enumerable: true, 37854 get: function() { 37855 return AppRouter; 37856 } 37857}); 37858const _interop_require_default = __turbopack_context__.r(563141); 37859const _interop_require_wildcard = __turbopack_context__.r(151836); 37860const _jsxruntime = __turbopack_context__.r(843476); 37861const _react = /*#__PURE__*/ _interop_require_wildcard._(__turbopack_context__.r(271645)); 37862const _approutercontextsharedruntime = __turbopack_context__.r(8372); 37863const _routerreducertypes = __turbopack_context__.r(388540); 37864const _createhreffromurl = __turbopack_context__.r(451191); 37865const _hooksclientcontextsharedruntime = __turbopack_context__.r(47790); 37866const _useactionqueue = __turbopack_context__.r(941538); 37867const _committedstate = __turbopack_context__.r(494272); 37868const _approuterannouncer = __turbopack_context__.r(762634); 37869const _redirectboundary = __turbopack_context__.r(358442); 37870const _findheadincache = __turbopack_context__.r(425018); 37871const _unresolvedthenable = __turbopack_context__.r(201244); 37872const _removebasepath = __turbopack_context__.r(387250); 37873const _hasbasepath = __turbopack_context__.r(652817); 37874const _computechangedpath = __turbopack_context__.r(734727); 37875const _navfailurehandler = __turbopack_context__.r(178377); 37876const _approuterinstance = __turbopack_context__.r(699781); 37877const _redirect = __turbopack_context__.r(124063); 37878const _redirecterror = __turbopack_context__.r(968391); 37879const _links = __turbopack_context__.r(769688); 37880const _rooterrorboundary = /*#__PURE__*/ _interop_require_default._(__turbopack_context__.r(794109)); 37881const _globalerror = /*#__PURE__*/ _interop_require_default._(__turbopack_context__.r(168027)); 37882const _boundarycomponents = __turbopack_context__.r(897367); 37883const _deploymentid = __turbopack_context__.r(543369); 37884const globalMutable = {}; 37885function HistoryUpdater(param) { 37886 let { appRouterState } = param; 37887 (0, _react.useInsertionEffect)(()=>{ 37888 if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable 37889 ; 37890 const { tree, pushRef, canonicalUrl, renderedSearch } = appRouterState; 37891 const appHistoryState = { 37892 tree, 37893 renderedSearch 37894 }; 37895 // TODO: Use Navigation API if available 37896 const historyState = {
37897 ...pushRef.preserveCustomHistoryState ? window.history.state : {}, 37898 // Identifier is shortened intentionally. 37899 // __NA is used to identify if the history entry can be handled by the app-router. 37900 // __N is used to identify if the history entry can be handled by the old router. 37901 __NA: true, 37902 __PRIVATE_NEXTJS_INTERNALS_TREE: appHistoryState 37903 }; 37904 if (pushRef.pendingPush && // Skip pushing an additional history entry if the canonicalUrl is the same as the current url. 37905 // This mirrors the browser behavior for normal navigation. 37906 (0, _createhreffromurl.createHrefFromUrl)(new URL(window.location.href)) !== canonicalUrl) { 37907 // This intentionally mutates React state, pushRef is overwritten to ensure additional push/replace calls do not trigger an additional history entry. 37908 pushRef.pendingPush = false; 37909 window.history.pushState(historyState, '', canonicalUrl); 37910 } else { 37911 window.history.replaceState(historyState, '', canonicalUrl); 37912 } 37913 (0, _committedstate.setLastCommittedTree)(tree); 37914 }, [ 37915 appRouterState 37916 ]); 37917 (0, _react.useEffect)(()=>{ 37918 // The Next-Url and the base tree may affect the result of a prefetch 37919 // task. Re-prefetch all visible links with the updated values. In most 37920 // cases, this will not result in any new network requests, only if 37921 // the prefetch result actually varies on one of these inputs. 37922 (0, _links.pingVisibleLinks)(appRouterState.nextUrl, appRouterState.tree); 37923 }, [ 37924 appRouterState.nextUrl, 37925 appRouterState.tree 37926 ]); 37927 return null; 37928} 37929function copyNextJsInternalHistoryState(data) { 37930 if (data == null) data = {}; 37931 const currentState = window.history.state; 37932 const __NA = currentState === null || currentState === void 0 ? void 0 : currentState.__NA; 37933 if (__NA) { 37934 data.__NA = __NA; 37935 } 37936 const __PRIVATE_NEXTJS_INTERNALS_TREE = currentState === null || currentState === void 0 ? void 0 : currentState.__PRIVATE_NEXTJS_INTERNALS_TREE; 37937 if (__PRIVATE_NEXTJS_INTERNALS_TREE) { 37938 data.__PRIVATE_NEXTJS_INTERNALS_TREE = __PRIVATE_NEXTJS_INTERNALS_TREE; 37939 } 37940 return data; 37941} 37942function Head(param) { 37943 let { headCacheNode } = param; 37944 // If this segment has a `prefetchHead`, it's the statically prefetched data. 37945 // We should use that on initial render instead of `head`. Then we'll switch 37946 // to `head` when the dynamic response streams in. 37947 const head = headCacheNode !== null ? headCacheNode.head : null; 37948 const prefetchHead = headCacheNode !== null ? headCacheNode.prefetchHead : null; 37949 // If no prefetch data is available, then we go straight to rendering `head`. 37950 const resolvedPrefetchRsc = prefetchHead !== null ? prefetchHead : head; 37951 // We use `useDeferredValue` to handle switching between the prefetched and 37952 // final values. The second argument is returned on initial render, then it 37953 // re-renders with the first argument. 37954 return (0, _react.useDeferredValue)(head, resolvedPrefetchRsc); 37955} 37956/** 37957 * The global router that wraps the application components. 37958 */ function Router(param) { 37959 let { actionQueue, globalError, webSocket, staticIndicatorState } = param; 37960 const state = (0, _useactionqueue.useActionQueue)(actionQueue); 37961 const { canonicalUrl } = state; 37962 // Add memoized pathname/query for useSearchParams and usePathname. 37963 const { searchParams, pathname } = (0, _react.useMemo)(()=>{ 37964 const url = new URL(canonicalUrl, typeof window === 'undefined' ? 'http://n' : window.location.href); 37965 return { 37966 // This is turned into a readonly class in `useSearchParams` 37967 searchParams: url.searchParams, 37968 pathname: (0, _hasbasepath.hasBasePath)(url.pathname) ? (0, _removebasepath.removeBasePath)(url.pathname) : url.pathname 37969 }; 37970 }, [ 37971 canonicalUrl 37972 ]); 37973 if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable 37974 ; 37975 (0, _react.useEffect)(()=>{ 37976 const sourcePage = (0, _computechangedpath.extractSourcePageFromFlightRouterState)(state.tree); 37977 if (sourcePage !== undefined) { 37978 window.next.__internal_src_page = sourcePage; 37979 } else { 37980 delete window.next.__internal_src_page; 37981 } 37982 }, [ 37983 state.tree 37984 ]); 37985 (0, _react.useEffect)(()=>{ 37986 // If the app is restored from bfcache, it's possible that 37987 // pushRef.mpaNavigation is true, which would mean that any re-render of this component 37988 // would trigger the mpa navigation logic again from the lines below. 37989 // This will restore the router to the initial state in the event that the app is restored from bfcache. 37990 function handlePageShow(event) { 37991 var _window_history_state; 37992 if (!event.persisted || !((_window_history_state = window.history.state) === null || _window_history_state === void 0 ? void 0 : _window_history_state.__PRIVATE_NEXTJS_INTERNALS_TREE)) { 37993 return; 37994 } 37995 // Clear the pendingMpaPath value so that a subsequent MPA navigation to the same URL can be triggered. 37996 // This is necessary because if the browser restored from bfcache, the pendingMpaPath would still be set to the value 37997 // of the last MPA navigation. 37998 globalMutable.pendingMpaPath = undefined; 37999 (0, _useactionqueue.dispatchAppRouterAction)({ 38000 type: _routerreducertypes.ACTION_RESTORE, 38001 url: new URL(window.location.href), 38002 historyState: window.history.state.__PRIVATE_NEXTJS_INTERNALS_TREE 38003 }); 38004 } 38005 window.addEventListener('pageshow', handlePageShow); 38006 return ()=>{ 38007 window.removeEventListener('pageshow', handlePageShow); 38008 }; 38009 }, []); 38010 (0, _react.useEffect)(()=>{ 38011 // Ensure that any redirect errors that bubble up outside of the RedirectBoundary 38012 // are caught and handled by the router. 38013 function handleUnhandledRedirect(event) { 38014 const error = 'reason' in event ? event.reason : event.error; 38015 if ((0, _redirecterror.isRedirectError)(error)) { 38016 event.preventDefault(); 38017 const url = (0, _redirect.getURLFromRedirectError)(error); 38018 const redirectType = (0, _redirect.getRedirectTypeFromError)(error); 38019 // TODO: This should access the router methods directly, rather than 38020 // go through the public interface. 38021 if (redirectType === 'push') { 38022 _approuterinstance.publicAppRouterInstance.push(url, {}); 38023 } else { 38024 _approuterinstance.publicAppRouterInstance.replace(url, {}); 38025 } 38026 } 38027 } 38028 window.addEventListener('error', handleUnhandledRedirect); 38029 window.addEventListener('unhandledrejection', handleUnhandledRedirect); 38030 return ()=>{ 38031 window.removeEventListener('error', handleUnhandledRedirect); 38032 window.removeEventListener('unhandledrejection', handleUnhandledRedirect); 38033 }; 38034 }, []); 38035 // When mpaNavigation flag is set do a hard navigation to the new url. 38036 // Infinitely suspend because we don't actually want to rerender any child 38037 // components with the new URL and any entangled state updates shouldn't 38038 // commit either (eg: useTransition isPending should stay true until the page 38039 // unloads). 38040 // 38041 // This is a side effect in render. Don't try this at home, kids. It's 38042 // probably safe because we know this is a singleton component and it's never 38043 // in <Offscreen>. At least I hope so. (It will run twice in dev strict mode, 38044 // but that's... fine?) 38045 const { pushRef } = state; 38046 if (pushRef.mpaNavigation) { 38047 // if there's a re-render, we don't want to trigger another redirect if one is already in flight to the same URL 38048 if (globalMutable.pendingMpaPath !== canonicalUrl) { 38049 const location = window.location; 38050 if (pushRef.pendingPush) { 38051 location.assign(canonicalUrl); 38052 } else { 38053 location.replace(canonicalUrl); 38054 } 38055 globalMutable.pendingMpaPath = canonicalUrl; 38056 } 38057 // TODO-APP: Should we listen to navigateerror here to catch failed 38058 // navigations somehow? And should we call window.stop() if a SPA navigation 38059 // should interrupt an MPA one? 38060 // NOTE: This is intentionally using `throw` instead of `use` because we're
38061 // inside an externally mutable condition (pushRef.mpaNavigation), which 38062 // violates the rules of hooks. 38063 throw _unresolvedthenable.unresolvedThenable; 38064 } 38065 (0, _react.useEffect)(()=>{ 38066 const originalPushState = window.history.pushState.bind(window.history); 38067 const originalReplaceState = window.history.replaceState.bind(window.history); 38068 // Ensure the canonical URL in the Next.js Router is updated when the URL is changed so that `usePathname` and `useSearchParams` hold the pushed values. 38069 const applyUrlFromHistoryPushReplace = (url)=>{ 38070 var _window_history_state; 38071 const href = window.location.href; 38072 const appHistoryState = (_window_history_state = window.history.state) === null || _window_history_state === void 0 ? void 0 : _window_history_state.__PRIVATE_NEXTJS_INTERNALS_TREE; 38073 (0, _react.startTransition)(()=>{ 38074 (0, _useactionqueue.dispatchAppRouterAction)({ 38075 type: _routerreducertypes.ACTION_RESTORE, 38076 url: new URL(url !== null && url !== void 0 ? url : href, href), 38077 historyState: appHistoryState 38078 }); 38079 }); 38080 }; 38081 /** 38082 * Patch pushState to ensure external changes to the history are reflected in the Next.js Router. 38083 * Ensures Next.js internal history state is copied to the new history entry. 38084 * Ensures usePathname and useSearchParams hold the newly provided url. 38085 */ window.history.pushState = function pushState(data, _unused, url) { 38086 // TODO: Warn when Navigation API is available (navigation.navigate() should be used) 38087 // Avoid a loop when Next.js internals trigger pushState/replaceState 38088 if ((data === null || data === void 0 ? void 0 : data.__NA) || (data === null || data === void 0 ? void 0 : data._N)) { 38089 return originalPushState(data, _unused, url); 38090 } 38091 data = copyNextJsInternalHistoryState(data); 38092 if (url) { 38093 applyUrlFromHistoryPushReplace(url); 38094 } 38095 return originalPushState(data, _unused, url); 38096 }; 38097 /** 38098 * Patch replaceState to ensure external changes to the history are reflected in the Next.js Router. 38099 * Ensures Next.js internal history state is copied to the new history entry. 38100 * Ensures usePathname and useSearchParams hold the newly provided url. 38101 */ window.history.replaceState = function replaceState(data, _unused, url) { 38102 // TODO: Warn when Navigation API is available (navigation.navigate() should be used) 38103 // Avoid a loop when Next.js internals trigger pushState/replaceState 38104 if ((data === null || data === void 0 ? void 0 : data.__NA) || (data === null || data === void 0 ? void 0 : data._N)) { 38105 return originalReplaceState(data, _unused, url); 38106 } 38107 data = copyNextJsInternalHistoryState(data); 38108 if (url) { 38109 applyUrlFromHistoryPushReplace(url); 38110 } 38111 return originalReplaceState(data, _unused, url); 38112 }; 38113 /** 38114 * Handle popstate event, this is used to handle back/forward in the browser. 38115 * By default dispatches ACTION_RESTORE, however if the history entry was not pushed/replaced by app-router it will reload the page. 38116 * That case can happen when the old router injected the history entry. 38117 */ const onPopState = (event)=>{ 38118 if (!event.state) { 38119 // TODO-APP: this case only happens when pushState/replaceState was called outside of Next.js. It should probably reload the page in this case. 38120 return; 38121 } 38122 // This case happens when the history entry was pushed by the `pages` router. 38123 if (!event.state.__NA) { 38124 window.location.reload(); 38125 return; 38126 } 38127 // TODO-APP: Ideally the back button should not use startTransition as it should apply the updates synchronously
38128 // Without startTransition works if the cache is there for this path 38129 (0, _react.startTransition)(()=>{ 38130 (0, _approuterinstance.dispatchTraverseAction)(window.location.href, event.state.__PRIVATE_NEXTJS_INTERNALS_TREE); 38131 }); 38132 }; 38133 // Register popstate event to call onPopstate. 38134 window.addEventListener('popstate', onPopState); 38135 return ()=>{ 38136 window.history.pushState = originalPushState; 38137 window.history.replaceState = originalReplaceState; 38138 window.removeEventListener('popstate', onPopState); 38139 }; 38140 }, []); 38141 const { cache, tree, nextUrl, focusAndScrollRef, previousNextUrl } = state; 38142 const matchingHead = (0, _react.useMemo)(()=>{ 38143 return (0, _findheadincache.findHeadInCache)(cache, tree[1]); 38144 }, [ 38145 cache, 38146 tree 38147 ]); 38148 // Add memoized pathParams for useParams. 38149 const pathParams = (0, _react.useMemo)(()=>{ 38150 return (0, _computechangedpath.getSelectedParams)(tree); 38151 }, [ 38152 tree 38153 ]); 38154 // Create instrumented promises for navigation hooks (dev-only) 38155 // These are specially instrumented promises to show in the Suspense DevTools 38156 // Promises are cached outside of render to survive suspense retries. 38157 let instrumentedNavigationPromises = null; 38158 if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable 38159 ; 38160 const layoutRouterContext = (0, _react.useMemo)(()=>{ 38161 return { 38162 parentTree: tree, 38163 parentCacheNode: cache, 38164 parentSegmentPath: null, 38165 parentParams: {}, 38166 parentLoadingData: null, 38167 // This is the <Activity> "name" that shows up in the Suspense DevTools. 38168 // It represents the root of the app. 38169 debugNameContext: '/', 38170 // Root node always has `url` 38171 // Provided in AppTreeContext to ensure it can be overwritten in layout-router 38172 url: canonicalUrl, 38173 // Root segment is always active 38174 isActive: true 38175 }; 38176 }, [ 38177 tree, 38178 cache, 38179 canonicalUrl 38180 ]); 38181 const globalLayoutRouterContext = (0, _react.useMemo)(()=>{ 38182 return { 38183 tree, 38184 focusAndScrollRef, 38185 nextUrl, 38186 previousNextUrl 38187 }; 38188 }, [ 38189 tree, 38190 focusAndScrollRef, 38191 nextUrl, 38192 previousNextUrl 38193 ]); 38194 let head; 38195 if (matchingHead !== null) { 38196 // The head is wrapped in an extra component so we can use 38197 // `useDeferredValue` to swap between the prefetched and final versions of 38198 // the head. (This is what LayoutRouter does for segment data, too.) 38199 // 38200 // The `key` is used to remount the component whenever the head moves to 38201 // a different segment. 38202 const [headCacheNode, headKey, headKeyWithoutSearchParams] = matchingHead; 38203 head = /*#__PURE__*/ (0, _jsxruntime.jsx)(Head, { 38204 headCacheNode: headCacheNode 38205 }, typeof window === 'undefined' ? headKeyWithoutSearchParams : headKey); 38206 } else { 38207 head = null; 38208 } 38209 let content = /*#__PURE__*/ (0, _jsxruntime.jsxs)(_redirectboundary.RedirectBoundary, { 38210 children: [ 38211 head, 38212 /*#__PURE__*/ (0, _jsxruntime.jsx)(_boundarycomponents.RootLayoutBoundary, { 38213 children: cache.rsc 38214 }), 38215 /*#__PURE__*/ (0, _jsxruntime.jsx)(_approuterannouncer.AppRouterAnnouncer, { 38216 tree: tree 38217 }) 38218 ] 38219 }); 38220 if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable 38221 ; 38222 else { 38223 content = /*#__PURE__*/ (0, _jsxruntime.jsx)(_rooterrorboundary.default, { 38224 errorComponent: globalError[0], 38225 errorStyles: globalError[1], 38226 children: content 38227 }); 38228 } 38229 return /*#__PURE__*/ (0, _jsxruntime.jsxs)(_jsxruntime.Fragment, { 38230 children: [ 38231 /*#__PURE__*/ (0, _jsxruntime.jsx)(HistoryUpdater, { 38232 appRouterState: state 38233 }), 38234 ("TURBOPACK compile-time truthy", 1) ? null : /*#__PURE__*/ "TURBOPACK unreachable", 38235 /*#__PURE__*/ (0, _jsxruntime.jsx)(_hooksclientcontextsharedruntime.NavigationPromisesContext.Provider, { 38236 value: instrumentedNavigationPromises, 38237 children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_hooksclientcontextsharedruntime.PathParamsContext.Provider, { 38238 value: pathParams, 38239 children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_hooksclientcontextsharedruntime.PathnameContext.Provider, { 38240 value: pathname, 38241 children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_hooksclientcontextsharedruntime.SearchParamsContext.Provider, { 38242 value: searchParams, 38243 children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_approutercontextsharedruntime.GlobalLayoutRouterContext.Provider, { 38244 value: globalLayoutRouterContext, 38245 children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_approutercontextsharedruntime.AppRouterContext.Provider, { 38246 value: _approuterinstance.publicAppRouterInstance, 38247 children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_approutercontextsharedruntime.LayoutRouterContext.Provider, { 38248 value: layoutRouterContext, 38249 children: content 38250 }) 38251 }) 38252 }) 38253 }) 38254 }) 38255 }) 38256 }) 38257 ] 38258 }); 38259} 38260function AppRouter(param) {
38261 let { actionQueue, globalErrorState, webSocket, staticIndicatorState } = param; 38262 (0, _navfailurehandler.useNavFailureHandler)(); 38263 const router = /*#__PURE__*/ (0, _jsxruntime.jsx)(Router, { 38264 actionQueue: actionQueue, 38265 globalError: globalErrorState, 38266 webSocket: webSocket, 38267 staticIndicatorState: staticIndicatorState 38268 }); 38269 // At the very top level, use the default GlobalError component as the final fallback. 38270 // When the app router itself fails, which means the framework itself fails, we show the default error. 38271 return /*#__PURE__*/ (0, _jsxruntime.jsx)(_rooterrorboundary.default, { 38272 errorComponent: _globalerror.default, 38273 children: router 38274 }); 38275} 38276let runtimeStyles; 38277let runtimeStyleChanged; 38278if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable 38279; 38280function RuntimeStylesForWebpack() { 38281 var _ref; 38282 const [, forceUpdate] = _react.default.useState(0); 38283 const renderedStylesSize = (_ref = runtimeStyles === null || runtimeStyles === void 0 ? void 0 : runtimeStyles.size) !== null && _ref !== void 0 ? _ref : 0; 38284 (0, _react.useEffect)(()=>{ 38285 if (!runtimeStyles || !runtimeStyleChanged) return; 38286 const changed = ()=>forceUpdate((c)=>c + 1); 38287 runtimeStyleChanged.add(changed); 38288 if (renderedStylesSize !== runtimeStyles.size) { 38289 changed(); 38290 } 38291 return ()=>{ 38292 runtimeStyleChanged.delete(changed); 38293 }; 38294 }, [ 38295 renderedStylesSize, 38296 forceUpdate 38297 ]); 38298 const query = (0, _deploymentid.getAssetTokenQuery)(); 38299 return [ 38300 ...runtimeStyles || [] 38301 ].map((href, i)=>/*#__PURE__*/ (0, _jsxruntime.jsx)("link", { 38302 rel: "stylesheet", 38303 href: "".concat(href).concat(query), 38304 // @ts-ignore 38305 precedence: "next" 38306 }, i)); 38307} 38308if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { 38309 Object.defineProperty(exports.default, '__esModule', { 38310 value: true 38311 }); 38312 Object.assign(exports.default, exports); 38313 module.exports = exports.default; 38314} 38315}), 38316665716, ((__turbopack_context__, module, exports) => { 38317"use strict"; 38318 38319Object.defineProperty(exports, "__esModule", { 38320 value: true 38321}); 38322Object.defineProperty(exports, "createInitialRouterState", { 38323 enumerable: true, 38324 get: function() { 38325 return createInitialRouterState; 38326 } 38327}); 38328const _createhreffromurl = __turbopack_context__.r(451191); 38329const _computechangedpath = __turbopack_context__.r(734727); 38330const _flightdatahelpers = __turbopack_context__.r(450590); 38331const _pprnavigations = __turbopack_context__.r(595871); 38332const _cache = __turbopack_context__.r(620896); 38333const _types = __turbopack_context__.r(509396); 38334const _bfcache = __turbopack_context__.r(179027); 38335const _fetchserverresponse = __turbopack_context__.r(787288); 38336const _optimisticroutes = __turbopack_context__.r(496167); 38337function createInitialRouterState(param) { 38338 let { navigatedAt, initialRSCPayload, initialFlightStreamForCache, location } = param; 38339 var _ref; 38340 const { c: initialCanonicalUrlParts, f: initialFlightData, q: initialRenderedSearch, i: initialCouldBeIntercepted, S: initialSupportsPerSegmentPrefetching, s: initialStaleTime, l: initialStaticStageByteLength, h: initialHeadVaryParams, p: initialRuntimePrefetchStream, d: initialDynamicStaleTimeSeconds } = initialRSCPayload; 38341 // When initialized on the server, the canonical URL is provided as an array of parts. 38342 // This is to ensure that when the RSC payload streamed to the client, crawlers don't interpret it 38343 // as a URL that should be crawled. 38344 const initialCanonicalUrl = initialCanonicalUrlParts.join('/'); 38345 const normalizedFlightData = (0, _flightdatahelpers.getFlightDataPartsFromPath)(initialFlightData[0]); 38346 const { tree: initialTree, seedData: initialSeedData, head: initialHead } = normalizedFlightData; 38347 // For the SSR render, seed data should always be available (we only send back a `null` response 38348 // in the case of a `loading` segment, pre-PPR.) 38349 const canonicalUrl = // This is safe to do as canonicalUrl can't be rendered, it's only used to control the history updates in the useEffect further down in this file. 38350 location ? (0, _createhreffromurl.createHrefFromUrl)(location) : initialCanonicalUrl; 38351 // Convert the initial FlightRouterState into the RouteTree type. 38352 // NOTE: The metadataVaryPath isn't used for anything currently because the 38353 // head is embedded into the CacheNode tree, but eventually we'll lift it out 38354 // and store it on the top-level state object. 38355 // 38356 // TODO: For statically-generated-at-build-time HTML pages, the 38357 // FlightRouterState baked into the initial RSC payload won't have the 38358 // correct segment inlining hints (ParentInlinedIntoSelf, InlinedIntoChild) 38359 // because those are computed after the pre-render. The client will need to 38360 // fetch the correct hints from the route tree prefetch (/_tree) response 38361 // before acting on inlining decisions. 38362 const acc = { 38363 metadataVaryPath: null 38364 }; 38365 const initialRouteTree = (0, _cache.convertRootFlightRouterStateToRouteTree)(initialTree, initialRenderedSearch, acc); 38366 const metadataVaryPath = acc.metadataVaryPath; 38367 const initialTask = (0, _pprnavigations.createInitialCacheNodeForHydration)(navigatedAt, initialRouteTree, initialSeedData, initialHead, (0, _bfcache.computeDynamicStaleAt)(navigatedAt, initialDynamicStaleTimeSeconds !== null && initialDynamicStaleTimeSeconds !== void 0 ? initialDynamicStaleTimeSeconds : _bfcache.UnknownDynamicStaleTime)); 38368 // The following only applies in the browser (location !== null) since neither 38369 // route learning nor segment cache state persists from SSR to client. 38370 if (location !== null && metadataVaryPath !== null) { 38371 // Learn the route pattern so we can predict it for future navigations. 38372 (0, _optimisticroutes.discoverKnownRoute)(Date.now(), location.pathname, null, null, initialRouteTree, metadataVaryPath, initialCouldBeIntercepted, canonicalUrl, initialSupportsPerSegmentPrefetching, false // hasDynamicRewrite 38373 ); 38374 // Write the initial seed data into the segment cache so subsequent 38375 // navigations to the initial page can serve cached segments instantly. 38376 if (initialSeedData !== null && initialStaleTime !== undefined) { 38377 if (initialStaticStageByteLength !== undefined && initialFlightStreamForCache != null) { 38378 // Partially static page â truncate the cloned Flight stream at the 38379 // static stage byte boundary, decode, and cache the static subset. 38380 (0, _fetchserverresponse.decodeStaticStage)(initialFlightStreamForCache, initialStaticStageByteLength, undefined).then(async (staticStageResponse)=>{ 38381 const now = Date.now(); 38382 const staleAt = await (0, _cache.getStaleAt)(now, staticStageResponse.s); 38383 (0, _cache.writeStaticStageResponseIntoCache)(now, staticStageResponse.f, undefined, staticStageResponse.h, staleAt, initialTree, initialRenderedSearch, true // isResponsePartial 38384 ); 38385 }).catch(()=>{ 38386 // The static stage processing failed. Not fatal â the page 38387 // rendered normally, we just won't write into the cache. 38388 }); 38389 } else { 38390 // Fully static page â cache the entire decoded seed data as-is. We're 38391 // not using the initial response here (which would allow us to combine 38392 // the two branches) to avoid unnecessary decoding of the Flight data, 38393 // since we can just take the seed data that we already decoded during 38394 // hydration and write it into the cache directly. 38395 const now = Date.now(); 38396 (0, _cache.getStaleAt)(now, initialStaleTime).then((staleAt)=>{ 38397 (0, _cache.writeStaticStageResponseIntoCache)(now, initialFlightData, undefined, initialHeadVaryParams, staleAt, initialTree, initialRenderedSearch, false // isResponsePartial 38398 ); 38399 }).catch(()=>{ 38400 // The static stage processing failed. Not fatal â the page 38401 // rendered normally, we just won't write into the cache. 38402 }); 38403 // Cancel the stream clone â fully static path doesn't need it. 38404 initialFlightStreamForCache === null || initialFlightStreamForCache === void 0 ? void 0 : initialFlightStreamForCache.cancel(); 38405 } 38406 } else { 38407 // No caching â cancel the unused stream clone. 38408 initialFlightStreamForCache === null || initialFlightStreamForCache === void 0 ? void 0 : initialFlightStreamForCache.cancel(); 38409 } 38410 // If the initial RSC payload includes an embedded runtime prefetch stream, 38411 // decode it and write the runtime data into the segment cache. This allows 38412 // subsequent navigations to serve runtime-prefetchable content from cache 38413 // without a separate prefetch request. 38414 if (initialRuntimePrefetchStream != null) { 38415 (0, _cache.processRuntimePrefetchStream)(Date.now(), initialRuntimePrefetchStream, initialTree, initialRenderedSearch).then((processed)=>{ 38416 if (processed !== null) { 38417 (0, _cache.writeDynamicRenderResponseIntoCache)(Date.now(), _types.FetchStrategy.PPRRuntime, processed.flightDatas, processed.buildId, processed.isResponsePartial, processed.headVaryParams, processed.staleAt, processed.navigationSeed, null); 38418 } 38419 }).catch(()=>{ 38420 // Runtime prefetch cache write failed. Not fatal â the page rendered
38421 // normally, we just won't cache runtime data. 38422 }); 38423 } 38424 } 38425 // NOTE: We intentionally don't check if any data needs to be fetched from the 38426 // server. We assume the initial hydration payload is sufficient to render 38427 // the page. 38428 // 38429 // The completeness of the initial data is an important property that we rely 38430 // on as a last-ditch mechanism for recovering the app; we must always be able 38431 // to reload a fresh HTML document to get to a consistent state. 38432 // 38433 // In the future, there may be cases where the server intentionally sends 38434 // partial data and expects the client to fill in the rest, in which case this 38435 // logic may change. (There already is a similar case where the server sends 38436 // _no_ hydration data in the HTML document at all, and the client fetches it 38437 // separately, but that's different because we still end up hydrating with a 38438 // complete tree.) 38439 const initialState = { 38440 tree: initialTask.route, 38441 cache: initialTask.node, 38442 pushRef: { 38443 pendingPush: false, 38444 mpaNavigation: false, 38445 // First render needs to preserve the previous window.history.state 38446 // to avoid it being overwritten on navigation back/forward with MPA Navigation. 38447 preserveCustomHistoryState: true 38448 }, 38449 focusAndScrollRef: { 38450 scrollRef: null, 38451 forceScroll: false, 38452 onlyHashChange: false, 38453 hashFragment: null 38454 }, 38455 canonicalUrl, 38456 renderedSearch: initialRenderedSearch, 38457 // the || operator is intentional, the pathname can be an empty string 38458 nextUrl: (_ref = (0, _computechangedpath.extractPathFromFlightRouterState)(initialTree) || (location === null || location === void 0 ? void 0 : location.pathname)) !== null && _ref !== void 0 ? _ref : null, 38459 previousNextUrl: null, 38460 debugInfo: null 38461 }; 38462 return initialState; 38463} 38464if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { 38465 Object.defineProperty(exports.default, '__esModule', { 38466 value: true 38467 }); 38468 Object.assign(exports.default, exports); 38469 module.exports = exports.default; 38470} 38471}), 38472198569, ((__turbopack_context__, module, exports) => { 38473"use strict"; 38474 38475var __TURBOPACK__imported__module__247167__ = /*#__PURE__*/ __turbopack_context__.i(247167); 38476"use strict"; 38477Object.defineProperty(exports, "__esModule", { 38478 value: true 38479}); 38480Object.defineProperty(exports, "hydrate", { 38481 enumerable: true, 38482 get: function() { 38483 return hydrate; 38484 } 38485}); 38486const _interop_require_default = __turbopack_context__.r(563141); 38487const _jsxruntime = __turbopack_context__.r(843476); 38488__turbopack_context__.r(523911); 38489const _client = /*#__PURE__*/ _interop_require_default._(__turbopack_context__.r(88014)); 38490const _react = /*#__PURE__*/ _interop_require_default._(__turbopack_context__.r(271645)); 38491const _client1 = __turbopack_context__.r(235326); 38492const _headmanagercontextsharedruntime = __turbopack_context__.r(742732); 38493const _onrecoverableerror = __turbopack_context__.r(597238); 38494const _errorboundarycallbacks = __turbopack_context__.r(851323); 38495const _appcallserver = __turbopack_context__.r(132120); 38496const _appfindsourcemapurl = __turbopack_context__.r(92245); 38497const _approuterinstance = __turbopack_context__.r(699781); 38498const _approuter = /*#__PURE__*/ _interop_require_default._(__turbopack_context__.r(875530)); 38499const _createinitialrouterstate = __turbopack_context__.r(665716); 38500const _approutercontextsharedruntime = __turbopack_context__.r(8372); 38501const _flightdatahelpers = __turbopack_context__.r(450590); 38502const _deploymentid = __turbopack_context__.r(543369); 38503const _navigationbuildid = __turbopack_context__.r(732992); 38504/// <reference types="react-dom/experimental" /> 38505const createFromReadableStream = _client1.createFromReadableStream; 38506const createFromFetch = _client1.createFromFetch; 38507const appElement = document; 38508// Instant Navigation Testing API: captured once at module init. When truthy, 38509// this is the fetch promise for the static RSC payload (set by an injected 38510// <script> tag in the static shell HTML). 38511const instantTestStaticFetch = self.__next_instant_test ? self.__next_instant_test : undefined; 38512const encoder = new TextEncoder(); 38513let initialServerDataBuffer = undefined; 38514let initialServerDataWriter = undefined; 38515let initialServerDataLoaded = false;
38516let initialServerDataFlushed = false; 38517let initialFormStateData = null; 38518function nextServerDataCallback(seg) { 38519 if (seg[0] === 0) { 38520 initialServerDataBuffer = []; 38521 } else if (seg[0] === 1) { 38522 if (!initialServerDataBuffer) throw Object.defineProperty(new Error('Unexpected server data: missing bootstrap script.'), "__NEXT_ERROR_CODE", { 38523 value: "E18", 38524 enumerable: false, 38525 configurable: true 38526 }); 38527 if (initialServerDataWriter) { 38528 initialServerDataWriter.enqueue(encoder.encode(seg[1])); 38529 } else { 38530 initialServerDataBuffer.push(seg[1]); 38531 } 38532 } else if (seg[0] === 2) { 38533 initialFormStateData = seg[1]; 38534 } else if (seg[0] === 3) { 38535 if (!initialServerDataBuffer) throw Object.defineProperty(new Error('Unexpected server data: missing bootstrap script.'), "__NEXT_ERROR_CODE", { 38536 value: "E18", 38537 enumerable: false, 38538 configurable: true 38539 }); 38540 // Decode the base64 string back to binary data. 38541 const binaryString = atob(seg[1]); 38542 const decodedChunk = new Uint8Array(binaryString.length); 38543 for(var i = 0; i < binaryString.length; i++){ 38544 decodedChunk[i] = binaryString.charCodeAt(i); 38545 } 38546 if (initialServerDataWriter) { 38547 initialServerDataWriter.enqueue(decodedChunk); 38548 } else { 38549 initialServerDataBuffer.push(decodedChunk); 38550 } 38551 } 38552} 38553function isStreamErrorOrUnfinished(ctr) { 38554 // If `desiredSize` is null, it means the stream is closed or errored. If it is lower than 0, the stream is still unfinished. 38555 return ctr.desiredSize === null || ctr.desiredSize < 0; 38556} 38557// There might be race conditions between `nextServerDataRegisterWriter` and 38558// `DOMContentLoaded`. The former will be called when React starts to hydrate 38559// the root, the latter will be called when the DOM is fully loaded. 38560// For streaming, the former is called first due to partial hydration. 38561// For non-streaming, the latter can be called first. 38562// Hence, we use two variables `initialServerDataLoaded` and 38563// `initialServerDataFlushed` to make sure the writer will be closed and 38564// `initialServerDataBuffer` will be cleared in the right time. 38565function nextServerDataRegisterWriter(ctr) { 38566 if (initialServerDataBuffer) { 38567 initialServerDataBuffer.forEach((val)=>{ 38568 ctr.enqueue(typeof val === 'string' ? encoder.encode(val) : val); 38569 }); 38570 if (initialServerDataLoaded && !initialServerDataFlushed) { 38571 // Instant Navigation Testing API: don't close or error the inline 38572 // Flight stream. The static shell has no inline Flight data, so the 38573 // stream is empty. Closing it would cause React to log an error about 38574 // missing data. Leaving it open lets React treat any holes as 38575 // "still suspended." Hydration uses the separately fetched RSC payload 38576 // (self.__next_instant_test), not this stream. 38577 if (isStreamErrorOrUnfinished(ctr)) { 38578 if (!instantTestStaticFetch) { 38579 ctr.error(Object.defineProperty(new Error('The connection to the page was unexpectedly closed, possibly due to the stop button being clicked, loss of Wi-Fi, or an unstable internet connection.'), "__NEXT_ERROR_CODE", { 38580 value: "E117", 38581 enumerable: false, 38582 configurable: true 38583 })); 38584 } 38585 } else { 38586 ctr.close(); 38587 } 38588 initialServerDataFlushed = true; 38589 initialServerDataBuffer = undefined; 38590 } 38591 } 38592 initialServerDataWriter = ctr; 38593} 38594// When `DOMContentLoaded`, we can close all pending writers to finish hydration. 38595const DOMContentLoaded = function() { 38596 if (initialServerDataWriter && !initialServerDataFlushed) { 38597 initialServerDataWriter.close(); 38598 initialServerDataFlushed = true; 38599 initialServerDataBuffer = undefined; 38600 } 38601 initialServerDataLoaded = true; 38602}; 38603// It's possible that the DOM is already loaded. 38604if (document.readyState === 'loading') { 38605 document.addEventListener('DOMContentLoaded', DOMContentLoaded, false); 38606} else { 38607 // Delayed in marco task to ensure it's executed later than hydration 38608 setTimeout(DOMContentLoaded); 38609} 38610const nextServerDataLoadingGlobal = self.__next_f = self.__next_f || []; 38611// Consume all buffered chunks and clear the global data array right after to release memory. 38612// Otherwise it will be retained indefinitely. 38613nextServerDataLoadingGlobal.forEach(nextServerDataCallback); 38614nextServerDataLoadingGlobal.length = 0; 38615// Patch its push method so subsequent chunks are handled (but not actually pushed to the array). 38616nextServerDataLoadingGlobal.push = nextServerDataCallback; 38617let readable = new ReadableStream({ 38618 start (controller) { 38619 nextServerDataRegisterWriter(controller); 38620 } 38621}); 38622if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable 38623; 38624// When Cache Components is enabled, tee the inlined Flight stream so we can 38625// truncate a clone at the static stage byte boundary and cache it. We don't 38626// know if `l` is present until React decodes the payload, so always tee and 38627// cancel the clone if not needed. 38628let initialFlightStreamForCache = null; 38629if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable 38630; 38631let debugChannel; 38632if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable 38633; 38634let initialServerResponse; 38635if (instantTestStaticFetch) { 38636 // Instant Navigation Testing API: hydrate from the static RSC payload 38637 // fetch kicked off by an injected <script> tag, instead of the inline 38638 // Flight data (which is not present in the static shell). 38639 initialServerResponse = Promise.resolve(createFromFetch(instantTestStaticFetch, { 38640 callServer: _appcallserver.callServer, 38641 findSourceMapURL: _appfindsourcemapurl.findSourceMapURL, 38642 debugChannel, 38643 // The static fetch response is a partial stream (static-only Flight 38644 // data with no dynamic content). Allow it to close without error so 38645 // React treats dynamic holes as still-suspended rather than 38646 // triggering error recovery.
38647 unstable_allowPartialStream: true 38648 })).then(async (initialRSCPayload)=>{ 38649 return (0, _flightdatahelpers.createInitialRSCPayloadFromFallbackPrerender)(await instantTestStaticFetch, initialRSCPayload); 38650 }); 38651} else if (window.__NEXT_CLIENT_RESUME) { 38652 const clientResumeFetch = window.__NEXT_CLIENT_RESUME; 38653 initialServerResponse = Promise.resolve(createFromFetch(clientResumeFetch, { 38654 callServer: _appcallserver.callServer, 38655 findSourceMapURL: _appfindsourcemapurl.findSourceMapURL, 38656 debugChannel 38657 })).then(async (fallbackInitialRSCPayload)=>(0, _flightdatahelpers.createInitialRSCPayloadFromFallbackPrerender)(await clientResumeFetch, fallbackInitialRSCPayload)); 38658} else { 38659 initialServerResponse = createFromReadableStream(readable, { 38660 callServer: _appcallserver.callServer, 38661 findSourceMapURL: _appfindsourcemapurl.findSourceMapURL, 38662 debugChannel, 38663 startTime: 0 38664 }); 38665} 38666function ServerRoot(param) { 38667 let { initialRSCPayload, actionQueue, webSocket, staticIndicatorState } = param; 38668 const router = /*#__PURE__*/ (0, _jsxruntime.jsx)(_approuter.default, { 38669 actionQueue: actionQueue, 38670 globalErrorState: initialRSCPayload.G, 38671 webSocket: webSocket, 38672 staticIndicatorState: staticIndicatorState 38673 }); 38674 if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable 38675 ; 38676 return router; 38677} 38678const StrictModeIfEnabled = ("TURBOPACK compile-time truthy", 1) ? _react.default.StrictMode : "TURBOPACK unreachable"; 38679function Root(param) { 38680 let { children } = param; 38681 if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable 38682 ; 38683 return children; 38684} 38685const enableTransitionIndicator = ("TURBOPACK compile-time value", false); 38686function noDefaultTransitionIndicator() { 38687 return ()=>{}; 38688} 38689const reactRootOptions = { 38690 onDefaultTransitionIndicator: ("TURBOPACK compile-time falsy", 0) ? "TURBOPACK unreachable" : noDefaultTransitionIndicator, 38691 onRecoverableError: _onrecoverableerror.onRecoverableError, 38692 onCaughtError: _errorboundarycallbacks.onCaughtError, 38693 onUncaughtError: _errorboundarycallbacks.onUncaughtError 38694}; 38695async function hydrate(instrumentationHooks, assetPrefix) { 38696 let staticIndicatorState; 38697 let webSocket; 38698 if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable 38699 ; 38700 const initialRSCPayload = await initialServerResponse; 38701 // setNavigationBuildId should be called only once, during JS initialization 38702 // and before any components have hydrated. 38703 if (initialRSCPayload.b) { 38704 (0, _navigationbuildid.setNavigationBuildId)(initialRSCPayload.b); 38705 } else { 38706 (0, _navigationbuildid.setNavigationBuildId)((0, _deploymentid.getDeploymentId)()); 38707 } 38708 const initialTimestamp = Date.now(); 38709 const actionQueue = (0, _approuterinstance.createMutableActionQueue)((0, _createinitialrouterstate.createInitialRouterState)({ 38710 navigatedAt: initialTimestamp, 38711 initialRSCPayload, 38712 initialFlightStreamForCache, 38713 location: window.location 38714 }), instrumentationHooks); 38715 const reactEl = /*#__PURE__*/ (0, _jsxruntime.jsx)(StrictModeIfEnabled, { 38716 children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_headmanagercontextsharedruntime.HeadManagerContext.Provider, { 38717 value: { 38718 appDir: true 38719 }, 38720 children: /*#__PURE__*/ (0, _jsxruntime.jsx)(Root, { 38721 children: /*#__PURE__*/ (0, _jsxruntime.jsx)(ServerRoot, { 38722 initialRSCPayload: initialRSCPayload, 38723 actionQueue: actionQueue, 38724 webSocket: webSocket, 38725 staticIndicatorState: staticIndicatorState 38726 }) 38727 }) 38728 }) 38729 }); 38730 if (document.documentElement.id === '__next_error__') { 38731 let element = reactEl; 38732 // Server rendering failed, fall back to client-side rendering 38733 if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable 38734 ; 38735 _client.default.createRoot(appElement, reactRootOptions).render(element); 38736 } else { 38737 _react.default.startTransition(()=>{ 38738 _client.default.hydrateRoot(appElement, reactEl, { 38739 ...reactRootOptions, 38740 formState: initialFormStateData 38741 }); 38742 }); 38743 } 38744 // TODO-APP: Remove this logic when Float has GC built-in in development. 38745 if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable 38746 ; 38747} 38748if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { 38749 Object.defineProperty(exports.default, '__esModule', { 38750 value: true 38751 });
38752 Object.assign(exports.default, exports); 38753 module.exports = exports.default; 38754} 38755}), 38756494553, ((__turbopack_context__, module, exports) => { 38757"use strict"; 38758 38759var __TURBOPACK__imported__module__247167__ = /*#__PURE__*/ __turbopack_context__.i(247167); 38760"use strict"; 38761Object.defineProperty(exports, "__esModule", { 38762 value: true 38763}); 38764__turbopack_context__.r(423755); 38765const _appbootstrap = __turbopack_context__.r(396517); 38766const _onrecoverableerror = __turbopack_context__.r(597238); 38767window.next.turbopack = true; 38768self.__webpack_hash__ = ''; 38769// eslint-disable-next-line @next/internal/typechecked-require 38770const instrumentationHooks = __turbopack_context__.r(5526); 38771(0, _appbootstrap.appBootstrap)((assetPrefix)=>{ 38772 const { hydrate } = __turbopack_context__.r(198569); 38773 try { 38774 hydrate(instrumentationHooks, assetPrefix); 38775 } finally{ 38776 if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable 38777 ; 38778 } 38779}); 38780if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { 38781 Object.defineProperty(exports.default, '__esModule', { 38782 value: true 38783 }); 38784 Object.assign(exports.default, exports); 38785 module.exports = exports.default; 38786} 38787}), 38788]); 38789 38790//# debugId=a8795eda-1169-ad41-8b9e-d0f246524b9c
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.