@sentry/browser 8.39.0 → 8.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/build/npm/cjs/client.js +2 -3
  2. package/build/npm/cjs/client.js.map +1 -1
  3. package/build/npm/cjs/eventbuilder.js +18 -19
  4. package/build/npm/cjs/eventbuilder.js.map +1 -1
  5. package/build/npm/cjs/helpers.js +6 -7
  6. package/build/npm/cjs/helpers.js.map +1 -1
  7. package/build/npm/cjs/integrations/breadcrumbs.js +14 -15
  8. package/build/npm/cjs/integrations/breadcrumbs.js.map +1 -1
  9. package/build/npm/cjs/integrations/browserapierrors.js +14 -15
  10. package/build/npm/cjs/integrations/browserapierrors.js.map +1 -1
  11. package/build/npm/cjs/integrations/contextlines.js +3 -4
  12. package/build/npm/cjs/integrations/contextlines.js.map +1 -1
  13. package/build/npm/cjs/integrations/globalhandlers.js +7 -8
  14. package/build/npm/cjs/integrations/globalhandlers.js.map +1 -1
  15. package/build/npm/cjs/integrations/httpclient.js +8 -9
  16. package/build/npm/cjs/integrations/httpclient.js.map +1 -1
  17. package/build/npm/cjs/integrations/linkederrors.js +1 -2
  18. package/build/npm/cjs/integrations/linkederrors.js.map +1 -1
  19. package/build/npm/cjs/integrations/reportingobserver.js +2 -3
  20. package/build/npm/cjs/integrations/reportingobserver.js.map +1 -1
  21. package/build/npm/cjs/integrations/spotlight.js +4 -5
  22. package/build/npm/cjs/integrations/spotlight.js.map +1 -1
  23. package/build/npm/cjs/profiling/integration.js +3 -4
  24. package/build/npm/cjs/profiling/integration.js.map +1 -1
  25. package/build/npm/cjs/profiling/startProfileForSpan.js +7 -8
  26. package/build/npm/cjs/profiling/startProfileForSpan.js.map +1 -1
  27. package/build/npm/cjs/profiling/utils.js +21 -22
  28. package/build/npm/cjs/profiling/utils.js.map +1 -1
  29. package/build/npm/cjs/sdk.js +8 -9
  30. package/build/npm/cjs/sdk.js.map +1 -1
  31. package/build/npm/cjs/stack-parsers.js +17 -10
  32. package/build/npm/cjs/stack-parsers.js.map +1 -1
  33. package/build/npm/cjs/tracing/backgroundtab.js +2 -3
  34. package/build/npm/cjs/tracing/backgroundtab.js.map +1 -1
  35. package/build/npm/cjs/tracing/browserTracingIntegration.js +10 -11
  36. package/build/npm/cjs/tracing/browserTracingIntegration.js.map +1 -1
  37. package/build/npm/cjs/tracing/request.js +12 -13
  38. package/build/npm/cjs/tracing/request.js.map +1 -1
  39. package/build/npm/cjs/transports/fetch.js +2 -3
  40. package/build/npm/cjs/transports/fetch.js.map +1 -1
  41. package/build/npm/cjs/transports/offline.js +3 -4
  42. package/build/npm/cjs/transports/offline.js.map +1 -1
  43. package/build/npm/cjs/userfeedback.js +3 -3
  44. package/build/npm/cjs/userfeedback.js.map +1 -1
  45. package/build/npm/esm/client.js +1 -2
  46. package/build/npm/esm/client.js.map +1 -1
  47. package/build/npm/esm/eventbuilder.js +1 -2
  48. package/build/npm/esm/eventbuilder.js.map +1 -1
  49. package/build/npm/esm/helpers.js +1 -2
  50. package/build/npm/esm/helpers.js.map +1 -1
  51. package/build/npm/esm/integrations/breadcrumbs.js +1 -2
  52. package/build/npm/esm/integrations/breadcrumbs.js.map +1 -1
  53. package/build/npm/esm/integrations/browserapierrors.js +1 -2
  54. package/build/npm/esm/integrations/browserapierrors.js.map +1 -1
  55. package/build/npm/esm/integrations/contextlines.js +1 -2
  56. package/build/npm/esm/integrations/contextlines.js.map +1 -1
  57. package/build/npm/esm/integrations/globalhandlers.js +1 -2
  58. package/build/npm/esm/integrations/globalhandlers.js.map +1 -1
  59. package/build/npm/esm/integrations/httpclient.js +1 -2
  60. package/build/npm/esm/integrations/httpclient.js.map +1 -1
  61. package/build/npm/esm/integrations/linkederrors.js +1 -2
  62. package/build/npm/esm/integrations/linkederrors.js.map +1 -1
  63. package/build/npm/esm/integrations/reportingobserver.js +1 -2
  64. package/build/npm/esm/integrations/reportingobserver.js.map +1 -1
  65. package/build/npm/esm/integrations/spotlight.js +1 -2
  66. package/build/npm/esm/integrations/spotlight.js.map +1 -1
  67. package/build/npm/esm/package.json +1 -1
  68. package/build/npm/esm/profiling/integration.js +1 -2
  69. package/build/npm/esm/profiling/integration.js.map +1 -1
  70. package/build/npm/esm/profiling/startProfileForSpan.js +1 -2
  71. package/build/npm/esm/profiling/startProfileForSpan.js.map +1 -1
  72. package/build/npm/esm/profiling/utils.js +1 -2
  73. package/build/npm/esm/profiling/utils.js.map +1 -1
  74. package/build/npm/esm/sdk.js +1 -2
  75. package/build/npm/esm/sdk.js.map +1 -1
  76. package/build/npm/esm/stack-parsers.js +8 -1
  77. package/build/npm/esm/stack-parsers.js.map +1 -1
  78. package/build/npm/esm/tracing/backgroundtab.js +1 -2
  79. package/build/npm/esm/tracing/backgroundtab.js.map +1 -1
  80. package/build/npm/esm/tracing/browserTracingIntegration.js +1 -2
  81. package/build/npm/esm/tracing/browserTracingIntegration.js.map +1 -1
  82. package/build/npm/esm/tracing/request.js +1 -2
  83. package/build/npm/esm/tracing/request.js.map +1 -1
  84. package/build/npm/esm/transports/fetch.js +1 -2
  85. package/build/npm/esm/transports/fetch.js.map +1 -1
  86. package/build/npm/esm/transports/offline.js +1 -2
  87. package/build/npm/esm/transports/offline.js.map +1 -1
  88. package/build/npm/esm/userfeedback.js +1 -1
  89. package/build/npm/esm/userfeedback.js.map +1 -1
  90. package/build/npm/types/client.d.ts.map +1 -1
  91. package/build/npm/types/eventbuilder.d.ts.map +1 -1
  92. package/build/npm/types/helpers.d.ts +1 -1
  93. package/build/npm/types/helpers.d.ts.map +1 -1
  94. package/build/npm/types/index.d.ts.map +1 -1
  95. package/build/npm/types/integrations/contextlines.d.ts.map +1 -1
  96. package/build/npm/types/integrations/spotlight.d.ts.map +1 -1
  97. package/build/npm/types/integrations-bundle/index.debug.d.ts.map +1 -1
  98. package/build/npm/types/integrations-bundle/index.sessiontiming.d.ts.map +1 -1
  99. package/build/npm/types/profiling/startProfileForSpan.d.ts.map +1 -1
  100. package/build/npm/types/profiling/utils.d.ts.map +1 -1
  101. package/build/npm/types/sdk.d.ts.map +1 -1
  102. package/build/npm/types/stack-parsers.d.ts.map +1 -1
  103. package/build/npm/types/tracing/browserTracingIntegration.d.ts.map +1 -1
  104. package/build/npm/types/tracing/request.d.ts.map +1 -1
  105. package/build/npm/types/transports/fetch.d.ts.map +1 -1
  106. package/build/npm/types/transports/offline.d.ts.map +1 -1
  107. package/build/npm/types/userfeedback.d.ts.map +1 -1
  108. package/build/npm/types-ts3.8/helpers.d.ts +1 -1
  109. package/package.json +8 -9
@@ -2,7 +2,6 @@ Object.defineProperty(exports, '__esModule', { value: true });
2
2
 
3
3
  const browserUtils = require('@sentry-internal/browser-utils');
4
4
  const core = require('@sentry/core');
5
- const utils = require('@sentry/utils');
6
5
  const debugBuild = require('../debug-build.js');
7
6
 
8
7
  const INTEGRATION_NAME = 'SpotlightBrowser';
@@ -13,7 +12,7 @@ const _spotlightIntegration = ((options = {}) => {
13
12
  return {
14
13
  name: INTEGRATION_NAME,
15
14
  setup: () => {
16
- debugBuild.DEBUG_BUILD && utils.logger.log('Using Sidecar URL', sidecarUrl);
15
+ debugBuild.DEBUG_BUILD && core.logger.log('Using Sidecar URL', sidecarUrl);
17
16
  },
18
17
  // We don't want to send interaction transactions/root spans created from
19
18
  // clicks within Spotlight to Sentry. Neither do we want them to be sent to
@@ -31,13 +30,13 @@ function setupSidecarForwarding(client, sidecarUrl) {
31
30
 
32
31
  client.on('beforeEnvelope', (envelope) => {
33
32
  if (failCount > 3) {
34
- utils.logger.warn('[Spotlight] Disabled Sentry -> Spotlight integration due to too many failed requests:', failCount);
33
+ core.logger.warn('[Spotlight] Disabled Sentry -> Spotlight integration due to too many failed requests:', failCount);
35
34
  return;
36
35
  }
37
36
 
38
37
  makeFetch(sidecarUrl, {
39
38
  method: 'POST',
40
- body: utils.serializeEnvelope(envelope),
39
+ body: core.serializeEnvelope(envelope),
41
40
  headers: {
42
41
  'Content-Type': 'application/x-sentry-envelope',
43
42
  },
@@ -51,7 +50,7 @@ function setupSidecarForwarding(client, sidecarUrl) {
51
50
  },
52
51
  err => {
53
52
  failCount++;
54
- utils.logger.error(
53
+ core.logger.error(
55
54
  "Sentry SDK can't connect to Sidecar is it running? See: https://spotlightjs.com/sidecar/npx/",
56
55
  err,
57
56
  );
@@ -1 +1 @@
1
- {"version":3,"file":"spotlight.js","sources":["../../../../src/integrations/spotlight.ts"],"sourcesContent":["import { getNativeImplementation } from '@sentry-internal/browser-utils';\nimport { defineIntegration } from '@sentry/core';\nimport type { Client, Envelope, Event, IntegrationFn } from '@sentry/types';\nimport { logger, serializeEnvelope } from '@sentry/utils';\nimport type { WINDOW } from '../helpers';\n\nimport { DEBUG_BUILD } from '../debug-build';\n\nexport type SpotlightConnectionOptions = {\n /**\n * Set this if the Spotlight Sidecar is not running on localhost:8969\n * By default, the Url is set to http://localhost:8969/stream\n */\n sidecarUrl?: string;\n};\n\nexport const INTEGRATION_NAME = 'SpotlightBrowser';\n\nconst _spotlightIntegration = ((options: Partial<SpotlightConnectionOptions> = {}) => {\n const sidecarUrl = options.sidecarUrl || 'http://localhost:8969/stream';\n\n return {\n name: INTEGRATION_NAME,\n setup: () => {\n DEBUG_BUILD && logger.log('Using Sidecar URL', sidecarUrl);\n },\n // We don't want to send interaction transactions/root spans created from\n // clicks within Spotlight to Sentry. Neither do we want them to be sent to\n // spotlight.\n processEvent: event => (isSpotlightInteraction(event) ? null : event),\n afterAllSetup: (client: Client) => {\n setupSidecarForwarding(client, sidecarUrl);\n },\n };\n}) satisfies IntegrationFn;\n\nfunction setupSidecarForwarding(client: Client, sidecarUrl: string): void {\n const makeFetch: typeof WINDOW.fetch | undefined = getNativeImplementation('fetch');\n let failCount = 0;\n\n client.on('beforeEnvelope', (envelope: Envelope) => {\n if (failCount > 3) {\n logger.warn('[Spotlight] Disabled Sentry -> Spotlight integration due to too many failed requests:', failCount);\n return;\n }\n\n makeFetch(sidecarUrl, {\n method: 'POST',\n body: serializeEnvelope(envelope),\n headers: {\n 'Content-Type': 'application/x-sentry-envelope',\n },\n mode: 'cors',\n }).then(\n res => {\n if (res.status >= 200 && res.status < 400) {\n // Reset failed requests counter on success\n failCount = 0;\n }\n },\n err => {\n failCount++;\n logger.error(\n \"Sentry SDK can't connect to Sidecar is it running? See: https://spotlightjs.com/sidecar/npx/\",\n err,\n );\n },\n );\n });\n}\n\n/**\n * Use this integration to send errors and transactions to Spotlight.\n *\n * Learn more about spotlight at https://spotlightjs.com\n */\nexport const spotlightBrowserIntegration = defineIntegration(_spotlightIntegration);\n\n/**\n * Flags if the event is a transaction created from an interaction with the spotlight UI.\n */\nexport function isSpotlightInteraction(event: Event): boolean {\n return Boolean(\n event.type === 'transaction' &&\n event.spans &&\n event.contexts &&\n event.contexts.trace &&\n event.contexts.trace.op === 'ui.action.click' &&\n event.spans.some(({ description }) => description && description.includes('#sentry-spotlight')),\n );\n}\n"],"names":["DEBUG_BUILD","logger","getNativeImplementation","serializeEnvelope","defineIntegration"],"mappings":";;;;;;;AAgBO,MAAM,gBAAiB,GAAE;;AAEhC,MAAM,qBAAA,IAAyB,CAAC,OAAO,GAAwC,EAAE,KAAK;AACtF,EAAE,MAAM,UAAW,GAAE,OAAO,CAAC,UAAA,IAAc,8BAA8B;;AAEzE,EAAE,OAAO;AACT,IAAI,IAAI,EAAE,gBAAgB;AAC1B,IAAI,KAAK,EAAE,MAAM;AACjB,MAAMA,sBAAA,IAAeC,YAAM,CAAC,GAAG,CAAC,mBAAmB,EAAE,UAAU,CAAC;AAChE,KAAK;AACL;AACA;AACA;AACA,IAAI,YAAY,EAAE,KAAM,KAAI,sBAAsB,CAAC,KAAK,CAAE,GAAE,IAAK,GAAE,KAAK,CAAC;AACzE,IAAI,aAAa,EAAE,CAAC,MAAM,KAAa;AACvC,MAAM,sBAAsB,CAAC,MAAM,EAAE,UAAU,CAAC;AAChD,KAAK;AACL,GAAG;AACH,CAAC,CAAE;;AAEH,SAAS,sBAAsB,CAAC,MAAM,EAAU,UAAU,EAAgB;AAC1E,EAAE,MAAM,SAAS,GAAoCC,oCAAuB,CAAC,OAAO,CAAC;AACrF,EAAE,IAAI,SAAU,GAAE,CAAC;;AAEnB,EAAE,MAAM,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,QAAQ,KAAe;AACtD,IAAI,IAAI,SAAU,GAAE,CAAC,EAAE;AACvB,MAAMD,YAAM,CAAC,IAAI,CAAC,uFAAuF,EAAE,SAAS,CAAC;AACrH,MAAM;AACN;;AAEA,IAAI,SAAS,CAAC,UAAU,EAAE;AAC1B,MAAM,MAAM,EAAE,MAAM;AACpB,MAAM,IAAI,EAAEE,uBAAiB,CAAC,QAAQ,CAAC;AACvC,MAAM,OAAO,EAAE;AACf,QAAQ,cAAc,EAAE,+BAA+B;AACvD,OAAO;AACP,MAAM,IAAI,EAAE,MAAM;AAClB,KAAK,CAAC,CAAC,IAAI;AACX,MAAM,OAAO;AACb,QAAQ,IAAI,GAAG,CAAC,MAAO,IAAG,GAAI,IAAG,GAAG,CAAC,MAAO,GAAE,GAAG,EAAE;AACnD;AACA,UAAU,SAAA,GAAY,CAAC;AACvB;AACA,OAAO;AACP,MAAM,OAAO;AACb,QAAQ,SAAS,EAAE;AACnB,QAAQF,YAAM,CAAC,KAAK;AACpB,UAAU,8FAA8F;AACxG,UAAU,GAAG;AACb,SAAS;AACT,OAAO;AACP,KAAK;AACL,GAAG,CAAC;AACJ;;AAEA;AACA;AACA;AACA;AACA;MACa,2BAA4B,GAAEG,sBAAiB,CAAC,qBAAqB;;AAElF;AACA;AACA;AACO,SAAS,sBAAsB,CAAC,KAAK,EAAkB;AAC9D,EAAE,OAAO,OAAO;AAChB,IAAI,KAAK,CAAC,IAAK,KAAI,aAAc;AACjC,MAAM,KAAK,CAAC,KAAM;AAClB,MAAM,KAAK,CAAC,QAAS;AACrB,MAAM,KAAK,CAAC,QAAQ,CAAC,KAAM;AAC3B,MAAM,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAA,KAAO,iBAAkB;AACpD,MAAM,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,WAAY,EAAC,KAAK,WAAA,IAAe,WAAW,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;AACrG,GAAG;AACH;;;;;;"}
1
+ {"version":3,"file":"spotlight.js","sources":["../../../../src/integrations/spotlight.ts"],"sourcesContent":["import { getNativeImplementation } from '@sentry-internal/browser-utils';\nimport { defineIntegration } from '@sentry/core';\nimport { logger, serializeEnvelope } from '@sentry/core';\nimport type { Client, Envelope, Event, IntegrationFn } from '@sentry/types';\nimport type { WINDOW } from '../helpers';\n\nimport { DEBUG_BUILD } from '../debug-build';\n\nexport type SpotlightConnectionOptions = {\n /**\n * Set this if the Spotlight Sidecar is not running on localhost:8969\n * By default, the Url is set to http://localhost:8969/stream\n */\n sidecarUrl?: string;\n};\n\nexport const INTEGRATION_NAME = 'SpotlightBrowser';\n\nconst _spotlightIntegration = ((options: Partial<SpotlightConnectionOptions> = {}) => {\n const sidecarUrl = options.sidecarUrl || 'http://localhost:8969/stream';\n\n return {\n name: INTEGRATION_NAME,\n setup: () => {\n DEBUG_BUILD && logger.log('Using Sidecar URL', sidecarUrl);\n },\n // We don't want to send interaction transactions/root spans created from\n // clicks within Spotlight to Sentry. Neither do we want them to be sent to\n // spotlight.\n processEvent: event => (isSpotlightInteraction(event) ? null : event),\n afterAllSetup: (client: Client) => {\n setupSidecarForwarding(client, sidecarUrl);\n },\n };\n}) satisfies IntegrationFn;\n\nfunction setupSidecarForwarding(client: Client, sidecarUrl: string): void {\n const makeFetch: typeof WINDOW.fetch | undefined = getNativeImplementation('fetch');\n let failCount = 0;\n\n client.on('beforeEnvelope', (envelope: Envelope) => {\n if (failCount > 3) {\n logger.warn('[Spotlight] Disabled Sentry -> Spotlight integration due to too many failed requests:', failCount);\n return;\n }\n\n makeFetch(sidecarUrl, {\n method: 'POST',\n body: serializeEnvelope(envelope),\n headers: {\n 'Content-Type': 'application/x-sentry-envelope',\n },\n mode: 'cors',\n }).then(\n res => {\n if (res.status >= 200 && res.status < 400) {\n // Reset failed requests counter on success\n failCount = 0;\n }\n },\n err => {\n failCount++;\n logger.error(\n \"Sentry SDK can't connect to Sidecar is it running? See: https://spotlightjs.com/sidecar/npx/\",\n err,\n );\n },\n );\n });\n}\n\n/**\n * Use this integration to send errors and transactions to Spotlight.\n *\n * Learn more about spotlight at https://spotlightjs.com\n */\nexport const spotlightBrowserIntegration = defineIntegration(_spotlightIntegration);\n\n/**\n * Flags if the event is a transaction created from an interaction with the spotlight UI.\n */\nexport function isSpotlightInteraction(event: Event): boolean {\n return Boolean(\n event.type === 'transaction' &&\n event.spans &&\n event.contexts &&\n event.contexts.trace &&\n event.contexts.trace.op === 'ui.action.click' &&\n event.spans.some(({ description }) => description && description.includes('#sentry-spotlight')),\n );\n}\n"],"names":["DEBUG_BUILD","logger","getNativeImplementation","serializeEnvelope","defineIntegration"],"mappings":";;;;;;AAgBO,MAAM,gBAAiB,GAAE;;AAEhC,MAAM,qBAAA,IAAyB,CAAC,OAAO,GAAwC,EAAE,KAAK;AACtF,EAAE,MAAM,UAAW,GAAE,OAAO,CAAC,UAAA,IAAc,8BAA8B;;AAEzE,EAAE,OAAO;AACT,IAAI,IAAI,EAAE,gBAAgB;AAC1B,IAAI,KAAK,EAAE,MAAM;AACjB,MAAMA,sBAAA,IAAeC,WAAM,CAAC,GAAG,CAAC,mBAAmB,EAAE,UAAU,CAAC;AAChE,KAAK;AACL;AACA;AACA;AACA,IAAI,YAAY,EAAE,KAAM,KAAI,sBAAsB,CAAC,KAAK,CAAE,GAAE,IAAK,GAAE,KAAK,CAAC;AACzE,IAAI,aAAa,EAAE,CAAC,MAAM,KAAa;AACvC,MAAM,sBAAsB,CAAC,MAAM,EAAE,UAAU,CAAC;AAChD,KAAK;AACL,GAAG;AACH,CAAC,CAAE;;AAEH,SAAS,sBAAsB,CAAC,MAAM,EAAU,UAAU,EAAgB;AAC1E,EAAE,MAAM,SAAS,GAAoCC,oCAAuB,CAAC,OAAO,CAAC;AACrF,EAAE,IAAI,SAAU,GAAE,CAAC;;AAEnB,EAAE,MAAM,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,QAAQ,KAAe;AACtD,IAAI,IAAI,SAAU,GAAE,CAAC,EAAE;AACvB,MAAMD,WAAM,CAAC,IAAI,CAAC,uFAAuF,EAAE,SAAS,CAAC;AACrH,MAAM;AACN;;AAEA,IAAI,SAAS,CAAC,UAAU,EAAE;AAC1B,MAAM,MAAM,EAAE,MAAM;AACpB,MAAM,IAAI,EAAEE,sBAAiB,CAAC,QAAQ,CAAC;AACvC,MAAM,OAAO,EAAE;AACf,QAAQ,cAAc,EAAE,+BAA+B;AACvD,OAAO;AACP,MAAM,IAAI,EAAE,MAAM;AAClB,KAAK,CAAC,CAAC,IAAI;AACX,MAAM,OAAO;AACb,QAAQ,IAAI,GAAG,CAAC,MAAO,IAAG,GAAI,IAAG,GAAG,CAAC,MAAO,GAAE,GAAG,EAAE;AACnD;AACA,UAAU,SAAA,GAAY,CAAC;AACvB;AACA,OAAO;AACP,MAAM,OAAO;AACb,QAAQ,SAAS,EAAE;AACnB,QAAQF,WAAM,CAAC,KAAK;AACpB,UAAU,8FAA8F;AACxG,UAAU,GAAG;AACb,SAAS;AACT,OAAO;AACP,KAAK;AACL,GAAG,CAAC;AACJ;;AAEA;AACA;AACA;AACA;AACA;MACa,2BAA4B,GAAEG,sBAAiB,CAAC,qBAAqB;;AAElF;AACA;AACA;AACO,SAAS,sBAAsB,CAAC,KAAK,EAAkB;AAC9D,EAAE,OAAO,OAAO;AAChB,IAAI,KAAK,CAAC,IAAK,KAAI,aAAc;AACjC,MAAM,KAAK,CAAC,KAAM;AAClB,MAAM,KAAK,CAAC,QAAS;AACrB,MAAM,KAAK,CAAC,QAAQ,CAAC,KAAM;AAC3B,MAAM,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAA,KAAO,iBAAkB;AACpD,MAAM,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,WAAY,EAAC,KAAK,WAAA,IAAe,WAAW,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;AACrG,GAAG;AACH;;;;;;"}
@@ -1,7 +1,6 @@
1
1
  Object.defineProperty(exports, '__esModule', { value: true });
2
2
 
3
3
  const core = require('@sentry/core');
4
- const utils$1 = require('@sentry/utils');
5
4
  const debugBuild = require('../debug-build.js');
6
5
  const startProfileForSpan = require('./startProfileForSpan.js');
7
6
  const utils = require('./utils.js');
@@ -46,12 +45,12 @@ const _browserProfilingIntegration = (() => {
46
45
  const start_timestamp = context && context['profile'] && context['profile']['start_timestamp'];
47
46
 
48
47
  if (typeof profile_id !== 'string') {
49
- debugBuild.DEBUG_BUILD && utils$1.logger.log('[Profiling] cannot find profile for a span without a profile context');
48
+ debugBuild.DEBUG_BUILD && core.logger.log('[Profiling] cannot find profile for a span without a profile context');
50
49
  continue;
51
50
  }
52
51
 
53
52
  if (!profile_id) {
54
- debugBuild.DEBUG_BUILD && utils$1.logger.log('[Profiling] cannot find profile for a span without a profile context');
53
+ debugBuild.DEBUG_BUILD && core.logger.log('[Profiling] cannot find profile for a span without a profile context');
55
54
  continue;
56
55
  }
57
56
 
@@ -62,7 +61,7 @@ const _browserProfilingIntegration = (() => {
62
61
 
63
62
  const profile = utils.takeProfileFromGlobalCache(profile_id);
64
63
  if (!profile) {
65
- debugBuild.DEBUG_BUILD && utils$1.logger.log(`[Profiling] Could not retrieve profile for span: ${profile_id}`);
64
+ debugBuild.DEBUG_BUILD && core.logger.log(`[Profiling] Could not retrieve profile for span: ${profile_id}`);
66
65
  continue;
67
66
  }
68
67
 
@@ -1 +1 @@
1
- {"version":3,"file":"integration.js","sources":["../../../../src/profiling/integration.ts"],"sourcesContent":["import { defineIntegration, getActiveSpan, getRootSpan } from '@sentry/core';\nimport type { EventEnvelope, IntegrationFn, Profile, Span } from '@sentry/types';\nimport { logger } from '@sentry/utils';\n\nimport { DEBUG_BUILD } from '../debug-build';\nimport { startProfileForSpan } from './startProfileForSpan';\nimport type { ProfiledEvent } from './utils';\nimport { isAutomatedPageLoadSpan, shouldProfileSpan } from './utils';\nimport {\n addProfilesToEnvelope,\n createProfilingEvent,\n findProfiledTransactionsFromEnvelope,\n getActiveProfilesCount,\n takeProfileFromGlobalCache,\n} from './utils';\n\nconst INTEGRATION_NAME = 'BrowserProfiling';\n\nconst _browserProfilingIntegration = (() => {\n return {\n name: INTEGRATION_NAME,\n setup(client) {\n const activeSpan = getActiveSpan();\n const rootSpan = activeSpan && getRootSpan(activeSpan);\n\n if (rootSpan && isAutomatedPageLoadSpan(rootSpan)) {\n if (shouldProfileSpan(rootSpan)) {\n startProfileForSpan(rootSpan);\n }\n }\n\n client.on('spanStart', (span: Span) => {\n if (span === getRootSpan(span) && shouldProfileSpan(span)) {\n startProfileForSpan(span);\n }\n });\n\n client.on('beforeEnvelope', (envelope): void => {\n // if not profiles are in queue, there is nothing to add to the envelope.\n if (!getActiveProfilesCount()) {\n return;\n }\n\n const profiledTransactionEvents = findProfiledTransactionsFromEnvelope(envelope);\n if (!profiledTransactionEvents.length) {\n return;\n }\n\n const profilesToAddToEnvelope: Profile[] = [];\n\n for (const profiledTransaction of profiledTransactionEvents) {\n const context = profiledTransaction && profiledTransaction.contexts;\n const profile_id = context && context['profile'] && context['profile']['profile_id'];\n const start_timestamp = context && context['profile'] && context['profile']['start_timestamp'];\n\n if (typeof profile_id !== 'string') {\n DEBUG_BUILD && logger.log('[Profiling] cannot find profile for a span without a profile context');\n continue;\n }\n\n if (!profile_id) {\n DEBUG_BUILD && logger.log('[Profiling] cannot find profile for a span without a profile context');\n continue;\n }\n\n // Remove the profile from the span context before sending, relay will take care of the rest.\n if (context && context['profile']) {\n delete context.profile;\n }\n\n const profile = takeProfileFromGlobalCache(profile_id);\n if (!profile) {\n DEBUG_BUILD && logger.log(`[Profiling] Could not retrieve profile for span: ${profile_id}`);\n continue;\n }\n\n const profileEvent = createProfilingEvent(\n profile_id,\n start_timestamp as number | undefined,\n profile,\n profiledTransaction as ProfiledEvent,\n );\n if (profileEvent) {\n profilesToAddToEnvelope.push(profileEvent);\n }\n }\n\n addProfilesToEnvelope(envelope as EventEnvelope, profilesToAddToEnvelope);\n });\n },\n };\n}) satisfies IntegrationFn;\n\nexport const browserProfilingIntegration = defineIntegration(_browserProfilingIntegration);\n"],"names":["getActiveSpan","getRootSpan","isAutomatedPageLoadSpan","shouldProfileSpan","startProfileForSpan","getActiveProfilesCount","findProfiledTransactionsFromEnvelope","DEBUG_BUILD","logger","takeProfileFromGlobalCache","createProfilingEvent","addProfilesToEnvelope","defineIntegration"],"mappings":";;;;;;;;AAgBA,MAAM,gBAAA,GAAmB,kBAAkB;;AAE3C,MAAM,4BAA6B,IAAG,MAAM;AAC5C,EAAE,OAAO;AACT,IAAI,IAAI,EAAE,gBAAgB;AAC1B,IAAI,KAAK,CAAC,MAAM,EAAE;AAClB,MAAM,MAAM,UAAA,GAAaA,kBAAa,EAAE;AACxC,MAAM,MAAM,WAAW,UAAA,IAAcC,gBAAW,CAAC,UAAU,CAAC;;AAE5D,MAAM,IAAI,QAAS,IAAGC,6BAAuB,CAAC,QAAQ,CAAC,EAAE;AACzD,QAAQ,IAAIC,uBAAiB,CAAC,QAAQ,CAAC,EAAE;AACzC,UAAUC,uCAAmB,CAAC,QAAQ,CAAC;AACvC;AACA;;AAEA,MAAM,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,IAAI,KAAW;AAC7C,QAAQ,IAAI,IAAK,KAAIH,gBAAW,CAAC,IAAI,CAAA,IAAKE,uBAAiB,CAAC,IAAI,CAAC,EAAE;AACnE,UAAUC,uCAAmB,CAAC,IAAI,CAAC;AACnC;AACA,OAAO,CAAC;;AAER,MAAM,MAAM,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,QAAQ,KAAW;AACtD;AACA,QAAQ,IAAI,CAACC,4BAAsB,EAAE,EAAE;AACvC,UAAU;AACV;;AAEA,QAAQ,MAAM,yBAA0B,GAAEC,0CAAoC,CAAC,QAAQ,CAAC;AACxF,QAAQ,IAAI,CAAC,yBAAyB,CAAC,MAAM,EAAE;AAC/C,UAAU;AACV;;AAEA,QAAQ,MAAM,uBAAuB,GAAc,EAAE;;AAErD,QAAQ,KAAK,MAAM,mBAAoB,IAAG,yBAAyB,EAAE;AACrE,UAAU,MAAM,OAAQ,GAAE,uBAAuB,mBAAmB,CAAC,QAAQ;AAC7E,UAAU,MAAM,UAAW,GAAE,OAAQ,IAAG,OAAO,CAAC,SAAS,CAAE,IAAG,OAAO,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC;AAC9F,UAAU,MAAM,eAAgB,GAAE,OAAQ,IAAG,OAAO,CAAC,SAAS,CAAE,IAAG,OAAO,CAAC,SAAS,CAAC,CAAC,iBAAiB,CAAC;;AAExG,UAAU,IAAI,OAAO,UAAW,KAAI,QAAQ,EAAE;AAC9C,YAAYC,0BAAeC,cAAM,CAAC,GAAG,CAAC,sEAAsE,CAAC;AAC7G,YAAY;AACZ;;AAEA,UAAU,IAAI,CAAC,UAAU,EAAE;AAC3B,YAAYD,0BAAeC,cAAM,CAAC,GAAG,CAAC,sEAAsE,CAAC;AAC7G,YAAY;AACZ;;AAEA;AACA,UAAU,IAAI,OAAQ,IAAG,OAAO,CAAC,SAAS,CAAC,EAAE;AAC7C,YAAY,OAAO,OAAO,CAAC,OAAO;AAClC;;AAEA,UAAU,MAAM,OAAQ,GAAEC,gCAA0B,CAAC,UAAU,CAAC;AAChE,UAAU,IAAI,CAAC,OAAO,EAAE;AACxB,YAAYF,sBAAA,IAAeC,cAAM,CAAC,GAAG,CAAC,CAAC,iDAAiD,EAAE,UAAU,CAAC,CAAA,CAAA;AACA,YAAA;AACA;;AAEA,UAAA,MAAA,YAAA,GAAAE,0BAAA;AACA,YAAA,UAAA;AACA,YAAA,eAAA;AACA,YAAA,OAAA;AACA,YAAA,mBAAA;AACA,WAAA;AACA,UAAA,IAAA,YAAA,EAAA;AACA,YAAA,uBAAA,CAAA,IAAA,CAAA,YAAA,CAAA;AACA;AACA;;AAEA,QAAAC,2BAAA,CAAA,QAAA,GAAA,uBAAA,CAAA;AACA,OAAA,CAAA;AACA,KAAA;AACA,GAAA;AACA,CAAA,CAAA;;AAEA,MAAA,2BAAA,GAAAC,sBAAA,CAAA,4BAAA;;;;"}
1
+ {"version":3,"file":"integration.js","sources":["../../../../src/profiling/integration.ts"],"sourcesContent":["import { defineIntegration, getActiveSpan, getRootSpan } from '@sentry/core';\nimport { logger } from '@sentry/core';\nimport type { EventEnvelope, IntegrationFn, Profile, Span } from '@sentry/types';\n\nimport { DEBUG_BUILD } from '../debug-build';\nimport { startProfileForSpan } from './startProfileForSpan';\nimport type { ProfiledEvent } from './utils';\nimport { isAutomatedPageLoadSpan, shouldProfileSpan } from './utils';\nimport {\n addProfilesToEnvelope,\n createProfilingEvent,\n findProfiledTransactionsFromEnvelope,\n getActiveProfilesCount,\n takeProfileFromGlobalCache,\n} from './utils';\n\nconst INTEGRATION_NAME = 'BrowserProfiling';\n\nconst _browserProfilingIntegration = (() => {\n return {\n name: INTEGRATION_NAME,\n setup(client) {\n const activeSpan = getActiveSpan();\n const rootSpan = activeSpan && getRootSpan(activeSpan);\n\n if (rootSpan && isAutomatedPageLoadSpan(rootSpan)) {\n if (shouldProfileSpan(rootSpan)) {\n startProfileForSpan(rootSpan);\n }\n }\n\n client.on('spanStart', (span: Span) => {\n if (span === getRootSpan(span) && shouldProfileSpan(span)) {\n startProfileForSpan(span);\n }\n });\n\n client.on('beforeEnvelope', (envelope): void => {\n // if not profiles are in queue, there is nothing to add to the envelope.\n if (!getActiveProfilesCount()) {\n return;\n }\n\n const profiledTransactionEvents = findProfiledTransactionsFromEnvelope(envelope);\n if (!profiledTransactionEvents.length) {\n return;\n }\n\n const profilesToAddToEnvelope: Profile[] = [];\n\n for (const profiledTransaction of profiledTransactionEvents) {\n const context = profiledTransaction && profiledTransaction.contexts;\n const profile_id = context && context['profile'] && context['profile']['profile_id'];\n const start_timestamp = context && context['profile'] && context['profile']['start_timestamp'];\n\n if (typeof profile_id !== 'string') {\n DEBUG_BUILD && logger.log('[Profiling] cannot find profile for a span without a profile context');\n continue;\n }\n\n if (!profile_id) {\n DEBUG_BUILD && logger.log('[Profiling] cannot find profile for a span without a profile context');\n continue;\n }\n\n // Remove the profile from the span context before sending, relay will take care of the rest.\n if (context && context['profile']) {\n delete context.profile;\n }\n\n const profile = takeProfileFromGlobalCache(profile_id);\n if (!profile) {\n DEBUG_BUILD && logger.log(`[Profiling] Could not retrieve profile for span: ${profile_id}`);\n continue;\n }\n\n const profileEvent = createProfilingEvent(\n profile_id,\n start_timestamp as number | undefined,\n profile,\n profiledTransaction as ProfiledEvent,\n );\n if (profileEvent) {\n profilesToAddToEnvelope.push(profileEvent);\n }\n }\n\n addProfilesToEnvelope(envelope as EventEnvelope, profilesToAddToEnvelope);\n });\n },\n };\n}) satisfies IntegrationFn;\n\nexport const browserProfilingIntegration = defineIntegration(_browserProfilingIntegration);\n"],"names":["getActiveSpan","getRootSpan","isAutomatedPageLoadSpan","shouldProfileSpan","startProfileForSpan","getActiveProfilesCount","findProfiledTransactionsFromEnvelope","DEBUG_BUILD","logger","takeProfileFromGlobalCache","createProfilingEvent","addProfilesToEnvelope","defineIntegration"],"mappings":";;;;;;;AAgBA,MAAM,gBAAA,GAAmB,kBAAkB;;AAE3C,MAAM,4BAA6B,IAAG,MAAM;AAC5C,EAAE,OAAO;AACT,IAAI,IAAI,EAAE,gBAAgB;AAC1B,IAAI,KAAK,CAAC,MAAM,EAAE;AAClB,MAAM,MAAM,UAAA,GAAaA,kBAAa,EAAE;AACxC,MAAM,MAAM,WAAW,UAAA,IAAcC,gBAAW,CAAC,UAAU,CAAC;;AAE5D,MAAM,IAAI,QAAS,IAAGC,6BAAuB,CAAC,QAAQ,CAAC,EAAE;AACzD,QAAQ,IAAIC,uBAAiB,CAAC,QAAQ,CAAC,EAAE;AACzC,UAAUC,uCAAmB,CAAC,QAAQ,CAAC;AACvC;AACA;;AAEA,MAAM,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,IAAI,KAAW;AAC7C,QAAQ,IAAI,IAAK,KAAIH,gBAAW,CAAC,IAAI,CAAA,IAAKE,uBAAiB,CAAC,IAAI,CAAC,EAAE;AACnE,UAAUC,uCAAmB,CAAC,IAAI,CAAC;AACnC;AACA,OAAO,CAAC;;AAER,MAAM,MAAM,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,QAAQ,KAAW;AACtD;AACA,QAAQ,IAAI,CAACC,4BAAsB,EAAE,EAAE;AACvC,UAAU;AACV;;AAEA,QAAQ,MAAM,yBAA0B,GAAEC,0CAAoC,CAAC,QAAQ,CAAC;AACxF,QAAQ,IAAI,CAAC,yBAAyB,CAAC,MAAM,EAAE;AAC/C,UAAU;AACV;;AAEA,QAAQ,MAAM,uBAAuB,GAAc,EAAE;;AAErD,QAAQ,KAAK,MAAM,mBAAoB,IAAG,yBAAyB,EAAE;AACrE,UAAU,MAAM,OAAQ,GAAE,uBAAuB,mBAAmB,CAAC,QAAQ;AAC7E,UAAU,MAAM,UAAW,GAAE,OAAQ,IAAG,OAAO,CAAC,SAAS,CAAE,IAAG,OAAO,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC;AAC9F,UAAU,MAAM,eAAgB,GAAE,OAAQ,IAAG,OAAO,CAAC,SAAS,CAAE,IAAG,OAAO,CAAC,SAAS,CAAC,CAAC,iBAAiB,CAAC;;AAExG,UAAU,IAAI,OAAO,UAAW,KAAI,QAAQ,EAAE;AAC9C,YAAYC,0BAAeC,WAAM,CAAC,GAAG,CAAC,sEAAsE,CAAC;AAC7G,YAAY;AACZ;;AAEA,UAAU,IAAI,CAAC,UAAU,EAAE;AAC3B,YAAYD,0BAAeC,WAAM,CAAC,GAAG,CAAC,sEAAsE,CAAC;AAC7G,YAAY;AACZ;;AAEA;AACA,UAAU,IAAI,OAAQ,IAAG,OAAO,CAAC,SAAS,CAAC,EAAE;AAC7C,YAAY,OAAO,OAAO,CAAC,OAAO;AAClC;;AAEA,UAAU,MAAM,OAAQ,GAAEC,gCAA0B,CAAC,UAAU,CAAC;AAChE,UAAU,IAAI,CAAC,OAAO,EAAE;AACxB,YAAYF,sBAAA,IAAeC,WAAM,CAAC,GAAG,CAAC,CAAC,iDAAiD,EAAE,UAAU,CAAC,CAAA,CAAA;AACA,YAAA;AACA;;AAEA,UAAA,MAAA,YAAA,GAAAE,0BAAA;AACA,YAAA,UAAA;AACA,YAAA,eAAA;AACA,YAAA,OAAA;AACA,YAAA,mBAAA;AACA,WAAA;AACA,UAAA,IAAA,YAAA,EAAA;AACA,YAAA,uBAAA,CAAA,IAAA,CAAA,YAAA,CAAA;AACA;AACA;;AAEA,QAAAC,2BAAA,CAAA,QAAA,GAAA,uBAAA,CAAA;AACA,OAAA,CAAA;AACA,KAAA;AACA,GAAA;AACA,CAAA,CAAA;;AAEA,MAAA,2BAAA,GAAAC,sBAAA,CAAA,4BAAA;;;;"}
@@ -1,7 +1,6 @@
1
1
  Object.defineProperty(exports, '__esModule', { value: true });
2
2
 
3
3
  const core = require('@sentry/core');
4
- const utils$1 = require('@sentry/utils');
5
4
  const debugBuild = require('../debug-build.js');
6
5
  const helpers = require('../helpers.js');
7
6
  const utils = require('./utils.js');
@@ -15,7 +14,7 @@ function startProfileForSpan(span) {
15
14
  // Start the profiler and get the profiler instance.
16
15
  let startTimestamp;
17
16
  if (utils.isAutomatedPageLoadSpan(span)) {
18
- startTimestamp = utils$1.timestampInSeconds() * 1000;
17
+ startTimestamp = core.timestampInSeconds() * 1000;
19
18
  }
20
19
 
21
20
  const profiler = utils.startJSSelfProfile();
@@ -27,13 +26,13 @@ function startProfileForSpan(span) {
27
26
  }
28
27
 
29
28
  if (debugBuild.DEBUG_BUILD) {
30
- utils$1.logger.log(`[Profiling] started profiling span: ${core.spanToJSON(span).description}`);
29
+ core.logger.log(`[Profiling] started profiling span: ${core.spanToJSON(span).description}`);
31
30
  }
32
31
 
33
32
  // We create "unique" span names to avoid concurrent spans with same names
34
33
  // from being ignored by the profiler. From here on, only this span name should be used when
35
34
  // calling the profiler methods. Note: we log the original name to the user to avoid confusion.
36
- const profileId = utils$1.uuid4();
35
+ const profileId = core.uuid4();
37
36
 
38
37
  core.getCurrentScope().setContext('profile', {
39
38
  profile_id: profileId,
@@ -62,13 +61,13 @@ function startProfileForSpan(span) {
62
61
  }
63
62
 
64
63
  if (debugBuild.DEBUG_BUILD) {
65
- utils$1.logger.log(`[Profiling] stopped profiling of span: ${core.spanToJSON(span).description}`);
64
+ core.logger.log(`[Profiling] stopped profiling of span: ${core.spanToJSON(span).description}`);
66
65
  }
67
66
 
68
67
  // In case of an overlapping span, stopProfiling may return null and silently ignore the overlapping profile.
69
68
  if (!profile) {
70
69
  if (debugBuild.DEBUG_BUILD) {
71
- utils$1.logger.log(
70
+ core.logger.log(
72
71
  `[Profiling] profiler returned null profile for: ${core.spanToJSON(span).description}`,
73
72
  'this may indicate an overlapping span or a call to stopProfiling with a profile title that was never started',
74
73
  );
@@ -80,7 +79,7 @@ function startProfileForSpan(span) {
80
79
  })
81
80
  .catch(error => {
82
81
  if (debugBuild.DEBUG_BUILD) {
83
- utils$1.logger.log('[Profiling] error while stopping profiler:', error);
82
+ core.logger.log('[Profiling] error while stopping profiler:', error);
84
83
  }
85
84
  });
86
85
  }
@@ -88,7 +87,7 @@ function startProfileForSpan(span) {
88
87
  // Enqueue a timeout to prevent profiles from running over max duration.
89
88
  let maxDurationTimeoutID = helpers.WINDOW.setTimeout(() => {
90
89
  if (debugBuild.DEBUG_BUILD) {
91
- utils$1.logger.log('[Profiling] max profile duration elapsed, stopping profiling for:', core.spanToJSON(span).description);
90
+ core.logger.log('[Profiling] max profile duration elapsed, stopping profiling for:', core.spanToJSON(span).description);
92
91
  }
93
92
  // If the timeout exceeds, we want to stop profiling, but not finish the span
94
93
  // eslint-disable-next-line @typescript-eslint/no-floating-promises
@@ -1 +1 @@
1
- {"version":3,"file":"startProfileForSpan.js","sources":["../../../../src/profiling/startProfileForSpan.ts"],"sourcesContent":["import { getCurrentScope, spanToJSON } from '@sentry/core';\nimport type { Span } from '@sentry/types';\nimport { logger, timestampInSeconds, uuid4 } from '@sentry/utils';\n\nimport { DEBUG_BUILD } from '../debug-build';\nimport { WINDOW } from '../helpers';\nimport type { JSSelfProfile } from './jsSelfProfiling';\nimport { MAX_PROFILE_DURATION_MS, addProfileToGlobalCache, isAutomatedPageLoadSpan, startJSSelfProfile } from './utils';\n\n/**\n * Wraps startTransaction and stopTransaction with profiling related logic.\n * startProfileForTransaction is called after the call to startTransaction in order to avoid our own code from\n * being profiled. Because of that same reason, stopProfiling is called before the call to stopTransaction.\n */\nexport function startProfileForSpan(span: Span): void {\n // Start the profiler and get the profiler instance.\n let startTimestamp: number | undefined;\n if (isAutomatedPageLoadSpan(span)) {\n startTimestamp = timestampInSeconds() * 1000;\n }\n\n const profiler = startJSSelfProfile();\n\n // We failed to construct the profiler, so we skip.\n // No need to log anything as this has already been logged in startProfile.\n if (!profiler) {\n return;\n }\n\n if (DEBUG_BUILD) {\n logger.log(`[Profiling] started profiling span: ${spanToJSON(span).description}`);\n }\n\n // We create \"unique\" span names to avoid concurrent spans with same names\n // from being ignored by the profiler. From here on, only this span name should be used when\n // calling the profiler methods. Note: we log the original name to the user to avoid confusion.\n const profileId = uuid4();\n\n // A couple of important things to note here:\n // `CpuProfilerBindings.stopProfiling` will be scheduled to run in 30seconds in order to exceed max profile duration.\n // Whichever of the two (span.finish/timeout) is first to run, the profiling will be stopped and the gathered profile\n // will be processed when the original span is finished. Since onProfileHandler can be invoked multiple times in the\n // event of an error or user mistake (calling span.finish multiple times), it is important that the behavior of onProfileHandler\n // is idempotent as we do not want any timings or profiles to be overridden by the last call to onProfileHandler.\n // After the original finish method is called, the event will be reported through the integration and delegated to transport.\n const processedProfile: JSSelfProfile | null = null;\n\n getCurrentScope().setContext('profile', {\n profile_id: profileId,\n start_timestamp: startTimestamp,\n });\n\n /**\n * Idempotent handler for profile stop\n */\n async function onProfileHandler(): Promise<void> {\n // Check if the profile exists and return it the behavior has to be idempotent as users may call span.finish multiple times.\n if (!span) {\n return;\n }\n // Satisfy the type checker, but profiler will always be defined here.\n if (!profiler) {\n return;\n }\n if (processedProfile) {\n if (DEBUG_BUILD) {\n logger.log('[Profiling] profile for:', spanToJSON(span).description, 'already exists, returning early');\n }\n return;\n }\n\n return profiler\n .stop()\n .then((profile: JSSelfProfile): void => {\n if (maxDurationTimeoutID) {\n WINDOW.clearTimeout(maxDurationTimeoutID);\n maxDurationTimeoutID = undefined;\n }\n\n if (DEBUG_BUILD) {\n logger.log(`[Profiling] stopped profiling of span: ${spanToJSON(span).description}`);\n }\n\n // In case of an overlapping span, stopProfiling may return null and silently ignore the overlapping profile.\n if (!profile) {\n if (DEBUG_BUILD) {\n logger.log(\n `[Profiling] profiler returned null profile for: ${spanToJSON(span).description}`,\n 'this may indicate an overlapping span or a call to stopProfiling with a profile title that was never started',\n );\n }\n return;\n }\n\n addProfileToGlobalCache(profileId, profile);\n })\n .catch(error => {\n if (DEBUG_BUILD) {\n logger.log('[Profiling] error while stopping profiler:', error);\n }\n });\n }\n\n // Enqueue a timeout to prevent profiles from running over max duration.\n let maxDurationTimeoutID: number | undefined = WINDOW.setTimeout(() => {\n if (DEBUG_BUILD) {\n logger.log('[Profiling] max profile duration elapsed, stopping profiling for:', spanToJSON(span).description);\n }\n // If the timeout exceeds, we want to stop profiling, but not finish the span\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n onProfileHandler();\n }, MAX_PROFILE_DURATION_MS);\n\n // We need to reference the original end call to avoid creating an infinite loop\n const originalEnd = span.end.bind(span);\n\n /**\n * Wraps span `end()` with profiling related logic.\n * startProfiling is called after the call to spanStart in order to avoid our own code from\n * being profiled. Because of that same reason, stopProfiling is called before the call to spanEnd.\n */\n function profilingWrappedSpanEnd(): Span {\n if (!span) {\n return originalEnd();\n }\n // onProfileHandler should always return the same profile even if this is called multiple times.\n // Always call onProfileHandler to ensure stopProfiling is called and the timeout is cleared.\n void onProfileHandler().then(\n () => {\n originalEnd();\n },\n () => {\n // If onProfileHandler fails, we still want to call the original finish method.\n originalEnd();\n },\n );\n\n return span;\n }\n\n span.end = profilingWrappedSpanEnd;\n}\n"],"names":["isAutomatedPageLoadSpan","timestampInSeconds","startJSSelfProfile","DEBUG_BUILD","logger","spanToJSON","uuid4","getCurrentScope","WINDOW","addProfileToGlobalCache","MAX_PROFILE_DURATION_MS"],"mappings":"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"}
1
+ {"version":3,"file":"startProfileForSpan.js","sources":["../../../../src/profiling/startProfileForSpan.ts"],"sourcesContent":["import { getCurrentScope, spanToJSON } from '@sentry/core';\nimport { logger, timestampInSeconds, uuid4 } from '@sentry/core';\nimport type { Span } from '@sentry/types';\n\nimport { DEBUG_BUILD } from '../debug-build';\nimport { WINDOW } from '../helpers';\nimport type { JSSelfProfile } from './jsSelfProfiling';\nimport { MAX_PROFILE_DURATION_MS, addProfileToGlobalCache, isAutomatedPageLoadSpan, startJSSelfProfile } from './utils';\n\n/**\n * Wraps startTransaction and stopTransaction with profiling related logic.\n * startProfileForTransaction is called after the call to startTransaction in order to avoid our own code from\n * being profiled. Because of that same reason, stopProfiling is called before the call to stopTransaction.\n */\nexport function startProfileForSpan(span: Span): void {\n // Start the profiler and get the profiler instance.\n let startTimestamp: number | undefined;\n if (isAutomatedPageLoadSpan(span)) {\n startTimestamp = timestampInSeconds() * 1000;\n }\n\n const profiler = startJSSelfProfile();\n\n // We failed to construct the profiler, so we skip.\n // No need to log anything as this has already been logged in startProfile.\n if (!profiler) {\n return;\n }\n\n if (DEBUG_BUILD) {\n logger.log(`[Profiling] started profiling span: ${spanToJSON(span).description}`);\n }\n\n // We create \"unique\" span names to avoid concurrent spans with same names\n // from being ignored by the profiler. From here on, only this span name should be used when\n // calling the profiler methods. Note: we log the original name to the user to avoid confusion.\n const profileId = uuid4();\n\n // A couple of important things to note here:\n // `CpuProfilerBindings.stopProfiling` will be scheduled to run in 30seconds in order to exceed max profile duration.\n // Whichever of the two (span.finish/timeout) is first to run, the profiling will be stopped and the gathered profile\n // will be processed when the original span is finished. Since onProfileHandler can be invoked multiple times in the\n // event of an error or user mistake (calling span.finish multiple times), it is important that the behavior of onProfileHandler\n // is idempotent as we do not want any timings or profiles to be overridden by the last call to onProfileHandler.\n // After the original finish method is called, the event will be reported through the integration and delegated to transport.\n const processedProfile: JSSelfProfile | null = null;\n\n getCurrentScope().setContext('profile', {\n profile_id: profileId,\n start_timestamp: startTimestamp,\n });\n\n /**\n * Idempotent handler for profile stop\n */\n async function onProfileHandler(): Promise<void> {\n // Check if the profile exists and return it the behavior has to be idempotent as users may call span.finish multiple times.\n if (!span) {\n return;\n }\n // Satisfy the type checker, but profiler will always be defined here.\n if (!profiler) {\n return;\n }\n if (processedProfile) {\n if (DEBUG_BUILD) {\n logger.log('[Profiling] profile for:', spanToJSON(span).description, 'already exists, returning early');\n }\n return;\n }\n\n return profiler\n .stop()\n .then((profile: JSSelfProfile): void => {\n if (maxDurationTimeoutID) {\n WINDOW.clearTimeout(maxDurationTimeoutID);\n maxDurationTimeoutID = undefined;\n }\n\n if (DEBUG_BUILD) {\n logger.log(`[Profiling] stopped profiling of span: ${spanToJSON(span).description}`);\n }\n\n // In case of an overlapping span, stopProfiling may return null and silently ignore the overlapping profile.\n if (!profile) {\n if (DEBUG_BUILD) {\n logger.log(\n `[Profiling] profiler returned null profile for: ${spanToJSON(span).description}`,\n 'this may indicate an overlapping span or a call to stopProfiling with a profile title that was never started',\n );\n }\n return;\n }\n\n addProfileToGlobalCache(profileId, profile);\n })\n .catch(error => {\n if (DEBUG_BUILD) {\n logger.log('[Profiling] error while stopping profiler:', error);\n }\n });\n }\n\n // Enqueue a timeout to prevent profiles from running over max duration.\n let maxDurationTimeoutID: number | undefined = WINDOW.setTimeout(() => {\n if (DEBUG_BUILD) {\n logger.log('[Profiling] max profile duration elapsed, stopping profiling for:', spanToJSON(span).description);\n }\n // If the timeout exceeds, we want to stop profiling, but not finish the span\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n onProfileHandler();\n }, MAX_PROFILE_DURATION_MS);\n\n // We need to reference the original end call to avoid creating an infinite loop\n const originalEnd = span.end.bind(span);\n\n /**\n * Wraps span `end()` with profiling related logic.\n * startProfiling is called after the call to spanStart in order to avoid our own code from\n * being profiled. Because of that same reason, stopProfiling is called before the call to spanEnd.\n */\n function profilingWrappedSpanEnd(): Span {\n if (!span) {\n return originalEnd();\n }\n // onProfileHandler should always return the same profile even if this is called multiple times.\n // Always call onProfileHandler to ensure stopProfiling is called and the timeout is cleared.\n void onProfileHandler().then(\n () => {\n originalEnd();\n },\n () => {\n // If onProfileHandler fails, we still want to call the original finish method.\n originalEnd();\n },\n );\n\n return span;\n }\n\n span.end = profilingWrappedSpanEnd;\n}\n"],"names":["isAutomatedPageLoadSpan","timestampInSeconds","startJSSelfProfile","DEBUG_BUILD","logger","spanToJSON","uuid4","getCurrentScope","WINDOW","addProfileToGlobalCache","MAX_PROFILE_DURATION_MS"],"mappings":"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"}
@@ -1,7 +1,6 @@
1
1
  Object.defineProperty(exports, '__esModule', { value: true });
2
2
 
3
3
  const core = require('@sentry/core');
4
- const utils = require('@sentry/utils');
5
4
  const debugBuild = require('../debug-build.js');
6
5
  const helpers = require('../helpers.js');
7
6
 
@@ -77,7 +76,7 @@ function getTraceId(event) {
77
76
  // warn users that this is happening if they enable debug flag
78
77
  if (typeof traceId === 'string' && traceId.length !== 32) {
79
78
  if (debugBuild.DEBUG_BUILD) {
80
- utils.logger.log(`[Profiling] Invalid traceId: ${traceId} on profiled event`);
79
+ core.logger.log(`[Profiling] Invalid traceId: ${traceId} on profiled event`);
81
80
  }
82
81
  }
83
82
  if (typeof traceId !== 'string') {
@@ -123,8 +122,8 @@ function createProfilePayload(
123
122
  ? start_timestamp
124
123
  : typeof event.start_timestamp === 'number'
125
124
  ? event.start_timestamp * 1000
126
- : utils.timestampInSeconds() * 1000;
127
- const transactionEndMs = typeof event.timestamp === 'number' ? event.timestamp * 1000 : utils.timestampInSeconds() * 1000;
125
+ : core.timestampInSeconds() * 1000;
126
+ const transactionEndMs = typeof event.timestamp === 'number' ? event.timestamp * 1000 : core.timestampInSeconds() * 1000;
128
127
 
129
128
  const profile = {
130
129
  event_id: profile_id,
@@ -156,7 +155,7 @@ function createProfilePayload(
156
155
  transactions: [
157
156
  {
158
157
  name: event.transaction || '',
159
- id: event.event_id || utils.uuid4(),
158
+ id: event.event_id || core.uuid4(),
160
159
  trace_id: traceId,
161
160
  active_thread_id: THREAD_ID_STRING,
162
161
  relative_start_ns: '0',
@@ -208,8 +207,8 @@ function convertJSSelfProfileToSampledFormat(input) {
208
207
  // Since JS self profiling time origin is always initialized to performance.timeOrigin, we need to adjust for
209
208
  // the drift between the SDK selected value and our profile time origin.
210
209
  const origin =
211
- typeof performance.timeOrigin === 'number' ? performance.timeOrigin : utils.browserPerformanceTimeOrigin || 0;
212
- const adjustForOriginChange = origin - (utils.browserPerformanceTimeOrigin || origin);
210
+ typeof performance.timeOrigin === 'number' ? performance.timeOrigin : core.browserPerformanceTimeOrigin || 0;
211
+ const adjustForOriginChange = origin - (core.browserPerformanceTimeOrigin || origin);
213
212
 
214
213
  input.samples.forEach((jsSample, i) => {
215
214
  // If sample has no stack, add an empty sample
@@ -291,7 +290,7 @@ function addProfilesToEnvelope(envelope, profiles) {
291
290
  function findProfiledTransactionsFromEnvelope(envelope) {
292
291
  const events = [];
293
292
 
294
- utils.forEachEnvelopeItem(envelope, (item, type) => {
293
+ core.forEachEnvelopeItem(envelope, (item, type) => {
295
294
  if (type !== 'transaction') {
296
295
  return;
297
296
  }
@@ -320,7 +319,7 @@ function applyDebugMetadata(resource_paths) {
320
319
  return [];
321
320
  }
322
321
 
323
- return utils.getDebugImagesForResources(stackParser, resource_paths);
322
+ return core.getDebugImagesForResources(stackParser, resource_paths);
324
323
  }
325
324
 
326
325
  /**
@@ -330,7 +329,7 @@ function isValidSampleRate(rate) {
330
329
  // we need to check NaN explicitly because it's of type 'number' and therefore wouldn't get caught by this typecheck
331
330
  if ((typeof rate !== 'number' && typeof rate !== 'boolean') || (typeof rate === 'number' && isNaN(rate))) {
332
331
  debugBuild.DEBUG_BUILD &&
333
- utils.logger.warn(
332
+ core.logger.warn(
334
333
  `[Profiling] Invalid sample rate. Sample rate must be a boolean or a number between 0 and 1. Got ${JSON.stringify(
335
334
  rate,
336
335
  )} of type ${JSON.stringify(typeof rate)}.`,
@@ -345,7 +344,7 @@ function isValidSampleRate(rate) {
345
344
 
346
345
  // in case sampleRate is a boolean, it will get automatically cast to 1 if it's true and 0 if it's false
347
346
  if (rate < 0 || rate > 1) {
348
- debugBuild.DEBUG_BUILD && utils.logger.warn(`[Profiling] Invalid sample rate. Sample rate must be between 0 and 1. Got ${rate}.`);
347
+ debugBuild.DEBUG_BUILD && core.logger.warn(`[Profiling] Invalid sample rate. Sample rate must be between 0 and 1. Got ${rate}.`);
349
348
  return false;
350
349
  }
351
350
  return true;
@@ -357,14 +356,14 @@ function isValidProfile(profile) {
357
356
  // Log a warning if the profile has less than 2 samples so users can know why
358
357
  // they are not seeing any profiling data and we cant avoid the back and forth
359
358
  // of asking them to provide us with a dump of the profile data.
360
- utils.logger.log('[Profiling] Discarding profile because it contains less than 2 samples');
359
+ core.logger.log('[Profiling] Discarding profile because it contains less than 2 samples');
361
360
  }
362
361
  return false;
363
362
  }
364
363
 
365
364
  if (!profile.frames.length) {
366
365
  if (debugBuild.DEBUG_BUILD) {
367
- utils.logger.log('[Profiling] Discarding profile because it contains no frames');
366
+ core.logger.log('[Profiling] Discarding profile because it contains no frames');
368
367
  }
369
368
  return false;
370
369
  }
@@ -394,7 +393,7 @@ function startJSSelfProfile() {
394
393
 
395
394
  if (!isJSProfilerSupported(JSProfilerConstructor)) {
396
395
  if (debugBuild.DEBUG_BUILD) {
397
- utils.logger.log(
396
+ core.logger.log(
398
397
  '[Profiling] Profiling is not supported by this browser, Profiler interface missing on window object.',
399
398
  );
400
399
  }
@@ -413,10 +412,10 @@ function startJSSelfProfile() {
413
412
  return new JSProfilerConstructor({ sampleInterval: samplingIntervalMS, maxBufferSize: maxSamples });
414
413
  } catch (e) {
415
414
  if (debugBuild.DEBUG_BUILD) {
416
- utils.logger.log(
415
+ core.logger.log(
417
416
  "[Profiling] Failed to initialize the Profiling constructor, this is likely due to a missing 'Document-Policy': 'js-profiling' header.",
418
417
  );
419
- utils.logger.log('[Profiling] Disabling profiling for current user session.');
418
+ core.logger.log('[Profiling] Disabling profiling for current user session.');
420
419
  }
421
420
  PROFILING_CONSTRUCTOR_FAILED = true;
422
421
  }
@@ -431,14 +430,14 @@ function shouldProfileSpan(span) {
431
430
  // If constructor failed once, it will always fail, so we can early return.
432
431
  if (PROFILING_CONSTRUCTOR_FAILED) {
433
432
  if (debugBuild.DEBUG_BUILD) {
434
- utils.logger.log('[Profiling] Profiling has been disabled for the duration of the current user session.');
433
+ core.logger.log('[Profiling] Profiling has been disabled for the duration of the current user session.');
435
434
  }
436
435
  return false;
437
436
  }
438
437
 
439
438
  if (!span.isRecording()) {
440
439
  if (debugBuild.DEBUG_BUILD) {
441
- utils.logger.log('[Profiling] Discarding profile because transaction was not sampled.');
440
+ core.logger.log('[Profiling] Discarding profile because transaction was not sampled.');
442
441
  }
443
442
  return false;
444
443
  }
@@ -446,7 +445,7 @@ function shouldProfileSpan(span) {
446
445
  const client = core.getClient();
447
446
  const options = client && client.getOptions();
448
447
  if (!options) {
449
- debugBuild.DEBUG_BUILD && utils.logger.log('[Profiling] Profiling disabled, no options found.');
448
+ debugBuild.DEBUG_BUILD && core.logger.log('[Profiling] Profiling disabled, no options found.');
450
449
  return false;
451
450
  }
452
451
 
@@ -456,14 +455,14 @@ function shouldProfileSpan(span) {
456
455
  // Since this is coming from the user (or from a function provided by the user), who knows what we might get. (The
457
456
  // only valid values are booleans or numbers between 0 and 1.)
458
457
  if (!isValidSampleRate(profilesSampleRate)) {
459
- debugBuild.DEBUG_BUILD && utils.logger.warn('[Profiling] Discarding profile because of invalid sample rate.');
458
+ debugBuild.DEBUG_BUILD && core.logger.warn('[Profiling] Discarding profile because of invalid sample rate.');
460
459
  return false;
461
460
  }
462
461
 
463
462
  // if the function returned 0 (or false), or if `profileSampleRate` is 0, it's a sign the profile should be dropped
464
463
  if (!profilesSampleRate) {
465
464
  debugBuild.DEBUG_BUILD &&
466
- utils.logger.log(
465
+ core.logger.log(
467
466
  '[Profiling] Discarding profile because a negative sampling decision was inherited or profileSampleRate is set to 0',
468
467
  );
469
468
  return false;
@@ -475,7 +474,7 @@ function shouldProfileSpan(span) {
475
474
  // Check if we should sample this profile
476
475
  if (!sampled) {
477
476
  debugBuild.DEBUG_BUILD &&
478
- utils.logger.log(
477
+ core.logger.log(
479
478
  `[Profiling] Discarding profile because it's not included in the random sample (sampling rate = ${Number(
480
479
  profilesSampleRate,
481
480
  )})`,
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../../../src/profiling/utils.ts"],"sourcesContent":["/* eslint-disable max-lines */\n\nimport { DEFAULT_ENVIRONMENT, getClient, spanToJSON } from '@sentry/core';\nimport type { DebugImage, Envelope, Event, EventEnvelope, Profile, Span, ThreadCpuProfile } from '@sentry/types';\nimport {\n browserPerformanceTimeOrigin,\n forEachEnvelopeItem,\n getDebugImagesForResources,\n logger,\n timestampInSeconds,\n uuid4,\n} from '@sentry/utils';\n\nimport { DEBUG_BUILD } from '../debug-build';\nimport { WINDOW } from '../helpers';\nimport type { JSSelfProfile, JSSelfProfileStack, JSSelfProfiler, JSSelfProfilerConstructor } from './jsSelfProfiling';\n\nconst MS_TO_NS = 1e6;\n// Use 0 as main thread id which is identical to threadId in node:worker_threads\n// where main logs 0 and workers seem to log in increments of 1\nconst THREAD_ID_STRING = String(0);\nconst THREAD_NAME = 'main';\n\n// Machine properties (eval only once)\nlet OS_PLATFORM = '';\nlet OS_PLATFORM_VERSION = '';\nlet OS_ARCH = '';\nlet OS_BROWSER = (WINDOW.navigator && WINDOW.navigator.userAgent) || '';\nlet OS_MODEL = '';\nconst OS_LOCALE =\n (WINDOW.navigator && WINDOW.navigator.language) ||\n (WINDOW.navigator && WINDOW.navigator.languages && WINDOW.navigator.languages[0]) ||\n '';\n\ntype UAData = {\n platform?: string;\n architecture?: string;\n model?: string;\n platformVersion?: string;\n fullVersionList?: {\n brand: string;\n version: string;\n }[];\n};\n\ninterface UserAgentData {\n getHighEntropyValues: (keys: string[]) => Promise<UAData>;\n}\n\nfunction isUserAgentData(data: unknown): data is UserAgentData {\n return typeof data === 'object' && data !== null && 'getHighEntropyValues' in data;\n}\n\n// @ts-expect-error userAgentData is not part of the navigator interface yet\nconst userAgentData = WINDOW.navigator && WINDOW.navigator.userAgentData;\n\nif (isUserAgentData(userAgentData)) {\n userAgentData\n .getHighEntropyValues(['architecture', 'model', 'platform', 'platformVersion', 'fullVersionList'])\n .then((ua: UAData) => {\n OS_PLATFORM = ua.platform || '';\n OS_ARCH = ua.architecture || '';\n OS_MODEL = ua.model || '';\n OS_PLATFORM_VERSION = ua.platformVersion || '';\n\n if (ua.fullVersionList && ua.fullVersionList.length > 0) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const firstUa = ua.fullVersionList[ua.fullVersionList.length - 1]!;\n OS_BROWSER = `${firstUa.brand} ${firstUa.version}`;\n }\n })\n .catch(e => void e);\n}\n\nfunction isProcessedJSSelfProfile(profile: ThreadCpuProfile | JSSelfProfile): profile is JSSelfProfile {\n return !('thread_metadata' in profile);\n}\n\n// Enriches the profile with threadId of the current thread.\n// This is done in node as we seem to not be able to get the info from C native code.\n/**\n *\n */\nexport function enrichWithThreadInformation(profile: ThreadCpuProfile | JSSelfProfile): ThreadCpuProfile {\n if (!isProcessedJSSelfProfile(profile)) {\n return profile;\n }\n\n return convertJSSelfProfileToSampledFormat(profile);\n}\n\n// Profile is marked as optional because it is deleted from the metadata\n// by the integration before the event is processed by other integrations.\nexport interface ProfiledEvent extends Event {\n sdkProcessingMetadata: {\n profile?: JSSelfProfile;\n };\n}\n\nfunction getTraceId(event: Event): string {\n const traceId: unknown = event && event.contexts && event.contexts['trace'] && event.contexts['trace']['trace_id'];\n // Log a warning if the profile has an invalid traceId (should be uuidv4).\n // All profiles and transactions are rejected if this is the case and we want to\n // warn users that this is happening if they enable debug flag\n if (typeof traceId === 'string' && traceId.length !== 32) {\n if (DEBUG_BUILD) {\n logger.log(`[Profiling] Invalid traceId: ${traceId} on profiled event`);\n }\n }\n if (typeof traceId !== 'string') {\n return '';\n }\n\n return traceId;\n}\n/**\n * Creates a profiling event envelope from a Sentry event. If profile does not pass\n * validation, returns null.\n * @param event\n * @param dsn\n * @param metadata\n * @param tunnel\n * @returns {EventEnvelope | null}\n */\n\n/**\n * Creates a profiling event envelope from a Sentry event.\n */\nexport function createProfilePayload(\n profile_id: string,\n start_timestamp: number | undefined,\n processed_profile: JSSelfProfile,\n event: ProfiledEvent,\n): Profile {\n if (event.type !== 'transaction') {\n // createProfilingEventEnvelope should only be called for transactions,\n // we type guard this behavior with isProfiledTransactionEvent.\n throw new TypeError('Profiling events may only be attached to transactions, this should never occur.');\n }\n\n if (processed_profile === undefined || processed_profile === null) {\n throw new TypeError(\n `Cannot construct profiling event envelope without a valid profile. Got ${processed_profile} instead.`,\n );\n }\n\n const traceId = getTraceId(event);\n const enrichedThreadProfile = enrichWithThreadInformation(processed_profile);\n const transactionStartMs = start_timestamp\n ? start_timestamp\n : typeof event.start_timestamp === 'number'\n ? event.start_timestamp * 1000\n : timestampInSeconds() * 1000;\n const transactionEndMs = typeof event.timestamp === 'number' ? event.timestamp * 1000 : timestampInSeconds() * 1000;\n\n const profile: Profile = {\n event_id: profile_id,\n timestamp: new Date(transactionStartMs).toISOString(),\n platform: 'javascript',\n version: '1',\n release: event.release || '',\n environment: event.environment || DEFAULT_ENVIRONMENT,\n runtime: {\n name: 'javascript',\n version: WINDOW.navigator.userAgent,\n },\n os: {\n name: OS_PLATFORM,\n version: OS_PLATFORM_VERSION,\n build_number: OS_BROWSER,\n },\n device: {\n locale: OS_LOCALE,\n model: OS_MODEL,\n manufacturer: OS_BROWSER,\n architecture: OS_ARCH,\n is_emulator: false,\n },\n debug_meta: {\n images: applyDebugMetadata(processed_profile.resources),\n },\n profile: enrichedThreadProfile,\n transactions: [\n {\n name: event.transaction || '',\n id: event.event_id || uuid4(),\n trace_id: traceId,\n active_thread_id: THREAD_ID_STRING,\n relative_start_ns: '0',\n relative_end_ns: ((transactionEndMs - transactionStartMs) * 1e6).toFixed(0),\n },\n ],\n };\n\n return profile;\n}\n\n/**\n *\n */\nexport function isProfiledTransactionEvent(event: Event): event is ProfiledEvent {\n return !!(event.sdkProcessingMetadata && event.sdkProcessingMetadata['profile']);\n}\n\n/*\n See packages/browser-utils/src/browser/router.ts\n*/\n/**\n *\n */\nexport function isAutomatedPageLoadSpan(span: Span): boolean {\n return spanToJSON(span).op === 'pageload';\n}\n\n/**\n * Converts a JSSelfProfile to a our sampled format.\n * Does not currently perform stack indexing.\n */\nexport function convertJSSelfProfileToSampledFormat(input: JSSelfProfile): Profile['profile'] {\n let EMPTY_STACK_ID: undefined | number = undefined;\n let STACK_ID = 0;\n\n // Initialize the profile that we will fill with data\n const profile: Profile['profile'] = {\n samples: [],\n stacks: [],\n frames: [],\n thread_metadata: {\n [THREAD_ID_STRING]: { name: THREAD_NAME },\n },\n };\n\n const firstSample = input.samples[0];\n if (!firstSample) {\n return profile;\n }\n\n // We assert samples.length > 0 above and timestamp should always be present\n const start = firstSample.timestamp;\n // The JS SDK might change it's time origin based on some heuristic (see See packages/utils/src/time.ts)\n // when that happens, we need to ensure we are correcting the profile timings so the two timelines stay in sync.\n // Since JS self profiling time origin is always initialized to performance.timeOrigin, we need to adjust for\n // the drift between the SDK selected value and our profile time origin.\n const origin =\n typeof performance.timeOrigin === 'number' ? performance.timeOrigin : browserPerformanceTimeOrigin || 0;\n const adjustForOriginChange = origin - (browserPerformanceTimeOrigin || origin);\n\n input.samples.forEach((jsSample, i) => {\n // If sample has no stack, add an empty sample\n if (jsSample.stackId === undefined) {\n if (EMPTY_STACK_ID === undefined) {\n EMPTY_STACK_ID = STACK_ID;\n profile.stacks[EMPTY_STACK_ID] = [];\n STACK_ID++;\n }\n\n profile['samples'][i] = {\n // convert ms timestamp to ns\n elapsed_since_start_ns: ((jsSample.timestamp + adjustForOriginChange - start) * MS_TO_NS).toFixed(0),\n stack_id: EMPTY_STACK_ID,\n thread_id: THREAD_ID_STRING,\n };\n return;\n }\n\n let stackTop: JSSelfProfileStack | undefined = input.stacks[jsSample.stackId];\n\n // Functions in top->down order (root is last)\n // We follow the stackTop.parentId trail and collect each visited frameId\n const stack: number[] = [];\n\n while (stackTop) {\n stack.push(stackTop.frameId);\n\n const frame = input.frames[stackTop.frameId];\n\n // If our frame has not been indexed yet, index it\n if (frame && profile.frames[stackTop.frameId] === undefined) {\n profile.frames[stackTop.frameId] = {\n function: frame.name,\n abs_path: typeof frame.resourceId === 'number' ? input.resources[frame.resourceId] : undefined,\n lineno: frame.line,\n colno: frame.column,\n };\n }\n\n stackTop = stackTop.parentId === undefined ? undefined : input.stacks[stackTop.parentId];\n }\n\n const sample: Profile['profile']['samples'][0] = {\n // convert ms timestamp to ns\n elapsed_since_start_ns: ((jsSample.timestamp + adjustForOriginChange - start) * MS_TO_NS).toFixed(0),\n stack_id: STACK_ID,\n thread_id: THREAD_ID_STRING,\n };\n\n profile['stacks'][STACK_ID] = stack;\n profile['samples'][i] = sample;\n STACK_ID++;\n });\n\n return profile;\n}\n\n/**\n * Adds items to envelope if they are not already present - mutates the envelope.\n * @param envelope\n */\nexport function addProfilesToEnvelope(envelope: EventEnvelope, profiles: Profile[]): Envelope {\n if (!profiles.length) {\n return envelope;\n }\n\n for (const profile of profiles) {\n envelope[1].push([{ type: 'profile' }, profile]);\n }\n return envelope;\n}\n\n/**\n * Finds transactions with profile_id context in the envelope\n * @param envelope\n * @returns\n */\nexport function findProfiledTransactionsFromEnvelope(envelope: Envelope): Event[] {\n const events: Event[] = [];\n\n forEachEnvelopeItem(envelope, (item, type) => {\n if (type !== 'transaction') {\n return;\n }\n\n for (let j = 1; j < item.length; j++) {\n const event = item[j] as Event;\n\n if (event && event.contexts && event.contexts['profile'] && event.contexts['profile']['profile_id']) {\n events.push(item[j] as Event);\n }\n }\n });\n\n return events;\n}\n\n/**\n * Applies debug meta data to an event from a list of paths to resources (sourcemaps)\n */\nexport function applyDebugMetadata(resource_paths: ReadonlyArray<string>): DebugImage[] {\n const client = getClient();\n const options = client && client.getOptions();\n const stackParser = options && options.stackParser;\n\n if (!stackParser) {\n return [];\n }\n\n return getDebugImagesForResources(stackParser, resource_paths);\n}\n\n/**\n * Checks the given sample rate to make sure it is valid type and value (a boolean, or a number between 0 and 1).\n */\nexport function isValidSampleRate(rate: unknown): boolean {\n // we need to check NaN explicitly because it's of type 'number' and therefore wouldn't get caught by this typecheck\n if ((typeof rate !== 'number' && typeof rate !== 'boolean') || (typeof rate === 'number' && isNaN(rate))) {\n DEBUG_BUILD &&\n logger.warn(\n `[Profiling] Invalid sample rate. Sample rate must be a boolean or a number between 0 and 1. Got ${JSON.stringify(\n rate,\n )} of type ${JSON.stringify(typeof rate)}.`,\n );\n return false;\n }\n\n // Boolean sample rates are always valid\n if (rate === true || rate === false) {\n return true;\n }\n\n // in case sampleRate is a boolean, it will get automatically cast to 1 if it's true and 0 if it's false\n if (rate < 0 || rate > 1) {\n DEBUG_BUILD && logger.warn(`[Profiling] Invalid sample rate. Sample rate must be between 0 and 1. Got ${rate}.`);\n return false;\n }\n return true;\n}\n\nfunction isValidProfile(profile: JSSelfProfile): profile is JSSelfProfile & { profile_id: string } {\n if (profile.samples.length < 2) {\n if (DEBUG_BUILD) {\n // Log a warning if the profile has less than 2 samples so users can know why\n // they are not seeing any profiling data and we cant avoid the back and forth\n // of asking them to provide us with a dump of the profile data.\n logger.log('[Profiling] Discarding profile because it contains less than 2 samples');\n }\n return false;\n }\n\n if (!profile.frames.length) {\n if (DEBUG_BUILD) {\n logger.log('[Profiling] Discarding profile because it contains no frames');\n }\n return false;\n }\n\n return true;\n}\n\n// Keep a flag value to avoid re-initializing the profiler constructor. If it fails\n// once, it will always fail and this allows us to early return.\nlet PROFILING_CONSTRUCTOR_FAILED: boolean = false;\nexport const MAX_PROFILE_DURATION_MS = 30_000;\n\n/**\n * Check if profiler constructor is available.\n * @param maybeProfiler\n */\nfunction isJSProfilerSupported(maybeProfiler: unknown): maybeProfiler is typeof JSSelfProfilerConstructor {\n return typeof maybeProfiler === 'function';\n}\n\n/**\n * Starts the profiler and returns the profiler instance.\n */\nexport function startJSSelfProfile(): JSSelfProfiler | undefined {\n // Feature support check first\n const JSProfilerConstructor = WINDOW.Profiler;\n\n if (!isJSProfilerSupported(JSProfilerConstructor)) {\n if (DEBUG_BUILD) {\n logger.log(\n '[Profiling] Profiling is not supported by this browser, Profiler interface missing on window object.',\n );\n }\n return;\n }\n\n // From initial testing, it seems that the minimum value for sampleInterval is 10ms.\n const samplingIntervalMS = 10;\n // Start the profiler\n const maxSamples = Math.floor(MAX_PROFILE_DURATION_MS / samplingIntervalMS);\n\n // Attempt to initialize the profiler constructor, if it fails, we disable profiling for the current user session.\n // This is likely due to a missing 'Document-Policy': 'js-profiling' header. We do not want to throw an error if this happens\n // as we risk breaking the user's application, so just disable profiling and log an error.\n try {\n return new JSProfilerConstructor({ sampleInterval: samplingIntervalMS, maxBufferSize: maxSamples });\n } catch (e) {\n if (DEBUG_BUILD) {\n logger.log(\n \"[Profiling] Failed to initialize the Profiling constructor, this is likely due to a missing 'Document-Policy': 'js-profiling' header.\",\n );\n logger.log('[Profiling] Disabling profiling for current user session.');\n }\n PROFILING_CONSTRUCTOR_FAILED = true;\n }\n\n return;\n}\n\n/**\n * Determine if a profile should be profiled.\n */\nexport function shouldProfileSpan(span: Span): boolean {\n // If constructor failed once, it will always fail, so we can early return.\n if (PROFILING_CONSTRUCTOR_FAILED) {\n if (DEBUG_BUILD) {\n logger.log('[Profiling] Profiling has been disabled for the duration of the current user session.');\n }\n return false;\n }\n\n if (!span.isRecording()) {\n if (DEBUG_BUILD) {\n logger.log('[Profiling] Discarding profile because transaction was not sampled.');\n }\n return false;\n }\n\n const client = getClient();\n const options = client && client.getOptions();\n if (!options) {\n DEBUG_BUILD && logger.log('[Profiling] Profiling disabled, no options found.');\n return false;\n }\n\n // @ts-expect-error profilesSampleRate is not part of the browser options yet\n const profilesSampleRate: number | boolean | undefined = options.profilesSampleRate;\n\n // Since this is coming from the user (or from a function provided by the user), who knows what we might get. (The\n // only valid values are booleans or numbers between 0 and 1.)\n if (!isValidSampleRate(profilesSampleRate)) {\n DEBUG_BUILD && logger.warn('[Profiling] Discarding profile because of invalid sample rate.');\n return false;\n }\n\n // if the function returned 0 (or false), or if `profileSampleRate` is 0, it's a sign the profile should be dropped\n if (!profilesSampleRate) {\n DEBUG_BUILD &&\n logger.log(\n '[Profiling] Discarding profile because a negative sampling decision was inherited or profileSampleRate is set to 0',\n );\n return false;\n }\n\n // Now we roll the dice. Math.random is inclusive of 0, but not of 1, so strict < is safe here. In case sampleRate is\n // a boolean, the < comparison will cause it to be automatically cast to 1 if it's true and 0 if it's false.\n const sampled = profilesSampleRate === true ? true : Math.random() < profilesSampleRate;\n // Check if we should sample this profile\n if (!sampled) {\n DEBUG_BUILD &&\n logger.log(\n `[Profiling] Discarding profile because it's not included in the random sample (sampling rate = ${Number(\n profilesSampleRate,\n )})`,\n );\n return false;\n }\n\n return true;\n}\n\n/**\n * Creates a profiling envelope item, if the profile does not pass validation, returns null.\n * @param event\n * @returns {Profile | null}\n */\nexport function createProfilingEvent(\n profile_id: string,\n start_timestamp: number | undefined,\n profile: JSSelfProfile,\n event: ProfiledEvent,\n): Profile | null {\n if (!isValidProfile(profile)) {\n return null;\n }\n\n return createProfilePayload(profile_id, start_timestamp, profile, event);\n}\n\n// TODO (v8): We need to obtain profile ids in @sentry-internal/tracing,\n// but we don't have access to this map because importing this map would\n// cause a circular dependency. We need to resolve this in v8.\nconst PROFILE_MAP: Map<string, JSSelfProfile> = new Map();\n/**\n *\n */\nexport function getActiveProfilesCount(): number {\n return PROFILE_MAP.size;\n}\n\n/**\n * Retrieves profile from global cache and removes it.\n */\nexport function takeProfileFromGlobalCache(profile_id: string): JSSelfProfile | undefined {\n const profile = PROFILE_MAP.get(profile_id);\n if (profile) {\n PROFILE_MAP.delete(profile_id);\n }\n return profile;\n}\n/**\n * Adds profile to global cache and evicts the oldest profile if the cache is full.\n */\nexport function addProfileToGlobalCache(profile_id: string, profile: JSSelfProfile): void {\n PROFILE_MAP.set(profile_id, profile);\n\n if (PROFILE_MAP.size > 30) {\n const last: string = PROFILE_MAP.keys().next().value;\n PROFILE_MAP.delete(last);\n }\n}\n"],"names":["WINDOW","DEBUG_BUILD","logger","timestampInSeconds","DEFAULT_ENVIRONMENT","uuid4","spanToJSON","browserPerformanceTimeOrigin","forEachEnvelopeItem","getClient","getDebugImagesForResources"],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sources":["../../../../src/profiling/utils.ts"],"sourcesContent":["/* eslint-disable max-lines */\n\nimport { DEFAULT_ENVIRONMENT, getClient, spanToJSON } from '@sentry/core';\nimport {\n browserPerformanceTimeOrigin,\n forEachEnvelopeItem,\n getDebugImagesForResources,\n logger,\n timestampInSeconds,\n uuid4,\n} from '@sentry/core';\nimport type { DebugImage, Envelope, Event, EventEnvelope, Profile, Span, ThreadCpuProfile } from '@sentry/types';\n\nimport { DEBUG_BUILD } from '../debug-build';\nimport { WINDOW } from '../helpers';\nimport type { JSSelfProfile, JSSelfProfileStack, JSSelfProfiler, JSSelfProfilerConstructor } from './jsSelfProfiling';\n\nconst MS_TO_NS = 1e6;\n// Use 0 as main thread id which is identical to threadId in node:worker_threads\n// where main logs 0 and workers seem to log in increments of 1\nconst THREAD_ID_STRING = String(0);\nconst THREAD_NAME = 'main';\n\n// Machine properties (eval only once)\nlet OS_PLATFORM = '';\nlet OS_PLATFORM_VERSION = '';\nlet OS_ARCH = '';\nlet OS_BROWSER = (WINDOW.navigator && WINDOW.navigator.userAgent) || '';\nlet OS_MODEL = '';\nconst OS_LOCALE =\n (WINDOW.navigator && WINDOW.navigator.language) ||\n (WINDOW.navigator && WINDOW.navigator.languages && WINDOW.navigator.languages[0]) ||\n '';\n\ntype UAData = {\n platform?: string;\n architecture?: string;\n model?: string;\n platformVersion?: string;\n fullVersionList?: {\n brand: string;\n version: string;\n }[];\n};\n\ninterface UserAgentData {\n getHighEntropyValues: (keys: string[]) => Promise<UAData>;\n}\n\nfunction isUserAgentData(data: unknown): data is UserAgentData {\n return typeof data === 'object' && data !== null && 'getHighEntropyValues' in data;\n}\n\n// @ts-expect-error userAgentData is not part of the navigator interface yet\nconst userAgentData = WINDOW.navigator && WINDOW.navigator.userAgentData;\n\nif (isUserAgentData(userAgentData)) {\n userAgentData\n .getHighEntropyValues(['architecture', 'model', 'platform', 'platformVersion', 'fullVersionList'])\n .then((ua: UAData) => {\n OS_PLATFORM = ua.platform || '';\n OS_ARCH = ua.architecture || '';\n OS_MODEL = ua.model || '';\n OS_PLATFORM_VERSION = ua.platformVersion || '';\n\n if (ua.fullVersionList && ua.fullVersionList.length > 0) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const firstUa = ua.fullVersionList[ua.fullVersionList.length - 1]!;\n OS_BROWSER = `${firstUa.brand} ${firstUa.version}`;\n }\n })\n .catch(e => void e);\n}\n\nfunction isProcessedJSSelfProfile(profile: ThreadCpuProfile | JSSelfProfile): profile is JSSelfProfile {\n return !('thread_metadata' in profile);\n}\n\n// Enriches the profile with threadId of the current thread.\n// This is done in node as we seem to not be able to get the info from C native code.\n/**\n *\n */\nexport function enrichWithThreadInformation(profile: ThreadCpuProfile | JSSelfProfile): ThreadCpuProfile {\n if (!isProcessedJSSelfProfile(profile)) {\n return profile;\n }\n\n return convertJSSelfProfileToSampledFormat(profile);\n}\n\n// Profile is marked as optional because it is deleted from the metadata\n// by the integration before the event is processed by other integrations.\nexport interface ProfiledEvent extends Event {\n sdkProcessingMetadata: {\n profile?: JSSelfProfile;\n };\n}\n\nfunction getTraceId(event: Event): string {\n const traceId: unknown = event && event.contexts && event.contexts['trace'] && event.contexts['trace']['trace_id'];\n // Log a warning if the profile has an invalid traceId (should be uuidv4).\n // All profiles and transactions are rejected if this is the case and we want to\n // warn users that this is happening if they enable debug flag\n if (typeof traceId === 'string' && traceId.length !== 32) {\n if (DEBUG_BUILD) {\n logger.log(`[Profiling] Invalid traceId: ${traceId} on profiled event`);\n }\n }\n if (typeof traceId !== 'string') {\n return '';\n }\n\n return traceId;\n}\n/**\n * Creates a profiling event envelope from a Sentry event. If profile does not pass\n * validation, returns null.\n * @param event\n * @param dsn\n * @param metadata\n * @param tunnel\n * @returns {EventEnvelope | null}\n */\n\n/**\n * Creates a profiling event envelope from a Sentry event.\n */\nexport function createProfilePayload(\n profile_id: string,\n start_timestamp: number | undefined,\n processed_profile: JSSelfProfile,\n event: ProfiledEvent,\n): Profile {\n if (event.type !== 'transaction') {\n // createProfilingEventEnvelope should only be called for transactions,\n // we type guard this behavior with isProfiledTransactionEvent.\n throw new TypeError('Profiling events may only be attached to transactions, this should never occur.');\n }\n\n if (processed_profile === undefined || processed_profile === null) {\n throw new TypeError(\n `Cannot construct profiling event envelope without a valid profile. Got ${processed_profile} instead.`,\n );\n }\n\n const traceId = getTraceId(event);\n const enrichedThreadProfile = enrichWithThreadInformation(processed_profile);\n const transactionStartMs = start_timestamp\n ? start_timestamp\n : typeof event.start_timestamp === 'number'\n ? event.start_timestamp * 1000\n : timestampInSeconds() * 1000;\n const transactionEndMs = typeof event.timestamp === 'number' ? event.timestamp * 1000 : timestampInSeconds() * 1000;\n\n const profile: Profile = {\n event_id: profile_id,\n timestamp: new Date(transactionStartMs).toISOString(),\n platform: 'javascript',\n version: '1',\n release: event.release || '',\n environment: event.environment || DEFAULT_ENVIRONMENT,\n runtime: {\n name: 'javascript',\n version: WINDOW.navigator.userAgent,\n },\n os: {\n name: OS_PLATFORM,\n version: OS_PLATFORM_VERSION,\n build_number: OS_BROWSER,\n },\n device: {\n locale: OS_LOCALE,\n model: OS_MODEL,\n manufacturer: OS_BROWSER,\n architecture: OS_ARCH,\n is_emulator: false,\n },\n debug_meta: {\n images: applyDebugMetadata(processed_profile.resources),\n },\n profile: enrichedThreadProfile,\n transactions: [\n {\n name: event.transaction || '',\n id: event.event_id || uuid4(),\n trace_id: traceId,\n active_thread_id: THREAD_ID_STRING,\n relative_start_ns: '0',\n relative_end_ns: ((transactionEndMs - transactionStartMs) * 1e6).toFixed(0),\n },\n ],\n };\n\n return profile;\n}\n\n/**\n *\n */\nexport function isProfiledTransactionEvent(event: Event): event is ProfiledEvent {\n return !!(event.sdkProcessingMetadata && event.sdkProcessingMetadata['profile']);\n}\n\n/*\n See packages/browser-utils/src/browser/router.ts\n*/\n/**\n *\n */\nexport function isAutomatedPageLoadSpan(span: Span): boolean {\n return spanToJSON(span).op === 'pageload';\n}\n\n/**\n * Converts a JSSelfProfile to a our sampled format.\n * Does not currently perform stack indexing.\n */\nexport function convertJSSelfProfileToSampledFormat(input: JSSelfProfile): Profile['profile'] {\n let EMPTY_STACK_ID: undefined | number = undefined;\n let STACK_ID = 0;\n\n // Initialize the profile that we will fill with data\n const profile: Profile['profile'] = {\n samples: [],\n stacks: [],\n frames: [],\n thread_metadata: {\n [THREAD_ID_STRING]: { name: THREAD_NAME },\n },\n };\n\n const firstSample = input.samples[0];\n if (!firstSample) {\n return profile;\n }\n\n // We assert samples.length > 0 above and timestamp should always be present\n const start = firstSample.timestamp;\n // The JS SDK might change it's time origin based on some heuristic (see See packages/utils/src/time.ts)\n // when that happens, we need to ensure we are correcting the profile timings so the two timelines stay in sync.\n // Since JS self profiling time origin is always initialized to performance.timeOrigin, we need to adjust for\n // the drift between the SDK selected value and our profile time origin.\n const origin =\n typeof performance.timeOrigin === 'number' ? performance.timeOrigin : browserPerformanceTimeOrigin || 0;\n const adjustForOriginChange = origin - (browserPerformanceTimeOrigin || origin);\n\n input.samples.forEach((jsSample, i) => {\n // If sample has no stack, add an empty sample\n if (jsSample.stackId === undefined) {\n if (EMPTY_STACK_ID === undefined) {\n EMPTY_STACK_ID = STACK_ID;\n profile.stacks[EMPTY_STACK_ID] = [];\n STACK_ID++;\n }\n\n profile['samples'][i] = {\n // convert ms timestamp to ns\n elapsed_since_start_ns: ((jsSample.timestamp + adjustForOriginChange - start) * MS_TO_NS).toFixed(0),\n stack_id: EMPTY_STACK_ID,\n thread_id: THREAD_ID_STRING,\n };\n return;\n }\n\n let stackTop: JSSelfProfileStack | undefined = input.stacks[jsSample.stackId];\n\n // Functions in top->down order (root is last)\n // We follow the stackTop.parentId trail and collect each visited frameId\n const stack: number[] = [];\n\n while (stackTop) {\n stack.push(stackTop.frameId);\n\n const frame = input.frames[stackTop.frameId];\n\n // If our frame has not been indexed yet, index it\n if (frame && profile.frames[stackTop.frameId] === undefined) {\n profile.frames[stackTop.frameId] = {\n function: frame.name,\n abs_path: typeof frame.resourceId === 'number' ? input.resources[frame.resourceId] : undefined,\n lineno: frame.line,\n colno: frame.column,\n };\n }\n\n stackTop = stackTop.parentId === undefined ? undefined : input.stacks[stackTop.parentId];\n }\n\n const sample: Profile['profile']['samples'][0] = {\n // convert ms timestamp to ns\n elapsed_since_start_ns: ((jsSample.timestamp + adjustForOriginChange - start) * MS_TO_NS).toFixed(0),\n stack_id: STACK_ID,\n thread_id: THREAD_ID_STRING,\n };\n\n profile['stacks'][STACK_ID] = stack;\n profile['samples'][i] = sample;\n STACK_ID++;\n });\n\n return profile;\n}\n\n/**\n * Adds items to envelope if they are not already present - mutates the envelope.\n * @param envelope\n */\nexport function addProfilesToEnvelope(envelope: EventEnvelope, profiles: Profile[]): Envelope {\n if (!profiles.length) {\n return envelope;\n }\n\n for (const profile of profiles) {\n envelope[1].push([{ type: 'profile' }, profile]);\n }\n return envelope;\n}\n\n/**\n * Finds transactions with profile_id context in the envelope\n * @param envelope\n * @returns\n */\nexport function findProfiledTransactionsFromEnvelope(envelope: Envelope): Event[] {\n const events: Event[] = [];\n\n forEachEnvelopeItem(envelope, (item, type) => {\n if (type !== 'transaction') {\n return;\n }\n\n for (let j = 1; j < item.length; j++) {\n const event = item[j] as Event;\n\n if (event && event.contexts && event.contexts['profile'] && event.contexts['profile']['profile_id']) {\n events.push(item[j] as Event);\n }\n }\n });\n\n return events;\n}\n\n/**\n * Applies debug meta data to an event from a list of paths to resources (sourcemaps)\n */\nexport function applyDebugMetadata(resource_paths: ReadonlyArray<string>): DebugImage[] {\n const client = getClient();\n const options = client && client.getOptions();\n const stackParser = options && options.stackParser;\n\n if (!stackParser) {\n return [];\n }\n\n return getDebugImagesForResources(stackParser, resource_paths);\n}\n\n/**\n * Checks the given sample rate to make sure it is valid type and value (a boolean, or a number between 0 and 1).\n */\nexport function isValidSampleRate(rate: unknown): boolean {\n // we need to check NaN explicitly because it's of type 'number' and therefore wouldn't get caught by this typecheck\n if ((typeof rate !== 'number' && typeof rate !== 'boolean') || (typeof rate === 'number' && isNaN(rate))) {\n DEBUG_BUILD &&\n logger.warn(\n `[Profiling] Invalid sample rate. Sample rate must be a boolean or a number between 0 and 1. Got ${JSON.stringify(\n rate,\n )} of type ${JSON.stringify(typeof rate)}.`,\n );\n return false;\n }\n\n // Boolean sample rates are always valid\n if (rate === true || rate === false) {\n return true;\n }\n\n // in case sampleRate is a boolean, it will get automatically cast to 1 if it's true and 0 if it's false\n if (rate < 0 || rate > 1) {\n DEBUG_BUILD && logger.warn(`[Profiling] Invalid sample rate. Sample rate must be between 0 and 1. Got ${rate}.`);\n return false;\n }\n return true;\n}\n\nfunction isValidProfile(profile: JSSelfProfile): profile is JSSelfProfile & { profile_id: string } {\n if (profile.samples.length < 2) {\n if (DEBUG_BUILD) {\n // Log a warning if the profile has less than 2 samples so users can know why\n // they are not seeing any profiling data and we cant avoid the back and forth\n // of asking them to provide us with a dump of the profile data.\n logger.log('[Profiling] Discarding profile because it contains less than 2 samples');\n }\n return false;\n }\n\n if (!profile.frames.length) {\n if (DEBUG_BUILD) {\n logger.log('[Profiling] Discarding profile because it contains no frames');\n }\n return false;\n }\n\n return true;\n}\n\n// Keep a flag value to avoid re-initializing the profiler constructor. If it fails\n// once, it will always fail and this allows us to early return.\nlet PROFILING_CONSTRUCTOR_FAILED: boolean = false;\nexport const MAX_PROFILE_DURATION_MS = 30_000;\n\n/**\n * Check if profiler constructor is available.\n * @param maybeProfiler\n */\nfunction isJSProfilerSupported(maybeProfiler: unknown): maybeProfiler is typeof JSSelfProfilerConstructor {\n return typeof maybeProfiler === 'function';\n}\n\n/**\n * Starts the profiler and returns the profiler instance.\n */\nexport function startJSSelfProfile(): JSSelfProfiler | undefined {\n // Feature support check first\n const JSProfilerConstructor = WINDOW.Profiler;\n\n if (!isJSProfilerSupported(JSProfilerConstructor)) {\n if (DEBUG_BUILD) {\n logger.log(\n '[Profiling] Profiling is not supported by this browser, Profiler interface missing on window object.',\n );\n }\n return;\n }\n\n // From initial testing, it seems that the minimum value for sampleInterval is 10ms.\n const samplingIntervalMS = 10;\n // Start the profiler\n const maxSamples = Math.floor(MAX_PROFILE_DURATION_MS / samplingIntervalMS);\n\n // Attempt to initialize the profiler constructor, if it fails, we disable profiling for the current user session.\n // This is likely due to a missing 'Document-Policy': 'js-profiling' header. We do not want to throw an error if this happens\n // as we risk breaking the user's application, so just disable profiling and log an error.\n try {\n return new JSProfilerConstructor({ sampleInterval: samplingIntervalMS, maxBufferSize: maxSamples });\n } catch (e) {\n if (DEBUG_BUILD) {\n logger.log(\n \"[Profiling] Failed to initialize the Profiling constructor, this is likely due to a missing 'Document-Policy': 'js-profiling' header.\",\n );\n logger.log('[Profiling] Disabling profiling for current user session.');\n }\n PROFILING_CONSTRUCTOR_FAILED = true;\n }\n\n return;\n}\n\n/**\n * Determine if a profile should be profiled.\n */\nexport function shouldProfileSpan(span: Span): boolean {\n // If constructor failed once, it will always fail, so we can early return.\n if (PROFILING_CONSTRUCTOR_FAILED) {\n if (DEBUG_BUILD) {\n logger.log('[Profiling] Profiling has been disabled for the duration of the current user session.');\n }\n return false;\n }\n\n if (!span.isRecording()) {\n if (DEBUG_BUILD) {\n logger.log('[Profiling] Discarding profile because transaction was not sampled.');\n }\n return false;\n }\n\n const client = getClient();\n const options = client && client.getOptions();\n if (!options) {\n DEBUG_BUILD && logger.log('[Profiling] Profiling disabled, no options found.');\n return false;\n }\n\n // @ts-expect-error profilesSampleRate is not part of the browser options yet\n const profilesSampleRate: number | boolean | undefined = options.profilesSampleRate;\n\n // Since this is coming from the user (or from a function provided by the user), who knows what we might get. (The\n // only valid values are booleans or numbers between 0 and 1.)\n if (!isValidSampleRate(profilesSampleRate)) {\n DEBUG_BUILD && logger.warn('[Profiling] Discarding profile because of invalid sample rate.');\n return false;\n }\n\n // if the function returned 0 (or false), or if `profileSampleRate` is 0, it's a sign the profile should be dropped\n if (!profilesSampleRate) {\n DEBUG_BUILD &&\n logger.log(\n '[Profiling] Discarding profile because a negative sampling decision was inherited or profileSampleRate is set to 0',\n );\n return false;\n }\n\n // Now we roll the dice. Math.random is inclusive of 0, but not of 1, so strict < is safe here. In case sampleRate is\n // a boolean, the < comparison will cause it to be automatically cast to 1 if it's true and 0 if it's false.\n const sampled = profilesSampleRate === true ? true : Math.random() < profilesSampleRate;\n // Check if we should sample this profile\n if (!sampled) {\n DEBUG_BUILD &&\n logger.log(\n `[Profiling] Discarding profile because it's not included in the random sample (sampling rate = ${Number(\n profilesSampleRate,\n )})`,\n );\n return false;\n }\n\n return true;\n}\n\n/**\n * Creates a profiling envelope item, if the profile does not pass validation, returns null.\n * @param event\n * @returns {Profile | null}\n */\nexport function createProfilingEvent(\n profile_id: string,\n start_timestamp: number | undefined,\n profile: JSSelfProfile,\n event: ProfiledEvent,\n): Profile | null {\n if (!isValidProfile(profile)) {\n return null;\n }\n\n return createProfilePayload(profile_id, start_timestamp, profile, event);\n}\n\n// TODO (v8): We need to obtain profile ids in @sentry-internal/tracing,\n// but we don't have access to this map because importing this map would\n// cause a circular dependency. We need to resolve this in v8.\nconst PROFILE_MAP: Map<string, JSSelfProfile> = new Map();\n/**\n *\n */\nexport function getActiveProfilesCount(): number {\n return PROFILE_MAP.size;\n}\n\n/**\n * Retrieves profile from global cache and removes it.\n */\nexport function takeProfileFromGlobalCache(profile_id: string): JSSelfProfile | undefined {\n const profile = PROFILE_MAP.get(profile_id);\n if (profile) {\n PROFILE_MAP.delete(profile_id);\n }\n return profile;\n}\n/**\n * Adds profile to global cache and evicts the oldest profile if the cache is full.\n */\nexport function addProfileToGlobalCache(profile_id: string, profile: JSSelfProfile): void {\n PROFILE_MAP.set(profile_id, profile);\n\n if (PROFILE_MAP.size > 30) {\n const last: string = PROFILE_MAP.keys().next().value;\n PROFILE_MAP.delete(last);\n }\n}\n"],"names":["WINDOW","DEBUG_BUILD","logger","timestampInSeconds","DEFAULT_ENVIRONMENT","uuid4","spanToJSON","browserPerformanceTimeOrigin","forEachEnvelopeItem","getClient","getDebugImagesForResources"],"mappings":"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"}