@interfere/react 12.0.5 → 12.1.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 (182) hide show
  1. package/README.md +103 -0
  2. package/dist/actionable-DOmVf_ib.mjs +1 -0
  3. package/dist/activity-D18VXGTn.mjs +1 -0
  4. package/dist/{activity-BfYxFVcK.d.mts → activity-Duhfgvxt.d.mts} +1 -1
  5. package/dist/{api-DEVCOKkJ.d.mts → api-CMPV9rgU.d.mts} +1 -1
  6. package/dist/api-DXmjUMZE.mjs +1 -0
  7. package/dist/api.mjs +1 -1
  8. package/dist/bot-YLSbnCeg.mjs +1 -0
  9. package/dist/buffer-BRn_kSm-.mjs +1 -0
  10. package/dist/capture-BV2RlsYg.mjs +1 -0
  11. package/dist/capture-boundary-Cz0jO-y5.mjs +1 -0
  12. package/dist/chunking-Dvs3f50A.d.mts +39 -0
  13. package/dist/chunking-qZffPbyY.mjs +2 -0
  14. package/dist/compressor-host-BAz6860r.d.mts +9 -0
  15. package/dist/compressor-host-CrKngamF.mjs +1 -0
  16. package/dist/config-Bm8myQlS.mjs +1 -0
  17. package/dist/config-CBqqY1AV.d.mts +29 -0
  18. package/dist/config-DapTbKhs.mjs +1 -0
  19. package/dist/{config-Rm-ct4K1.d.mts → config-Dyc09HCZ.d.mts} +2 -1
  20. package/dist/consent-COUmLJLD.mjs +1 -0
  21. package/dist/console-patch-WNKoLE7U.mjs +1 -0
  22. package/dist/delivery-DehIJWRh.mjs +1 -0
  23. package/dist/device-6T3DYkLD.mjs +1 -0
  24. package/dist/device-DRK7hhLi.mjs +1 -0
  25. package/dist/device-metadata-Ffi__vup.mjs +1 -0
  26. package/dist/{dist-ByNfzdQp.mjs → dist-Bcb677YG.mjs} +2 -2
  27. package/dist/environment-CoEXhF1a.mjs +1 -0
  28. package/dist/environment-_LKcAXKG.d.mts +9 -0
  29. package/dist/error-boundary.d.mts +1 -1
  30. package/dist/error-boundary.mjs +1 -1
  31. package/dist/errors-BDmCWb5z.mjs +1 -0
  32. package/dist/event-capabilities-Dd0Hoaq2.mjs +1 -0
  33. package/dist/exporter-DjvOtWYJ.mjs +1 -0
  34. package/dist/exporter-logs-DS2AXWnV.mjs +1 -0
  35. package/dist/exporter-metrics-DZYqUo6_.mjs +1 -0
  36. package/dist/geo-D2wa9bGs.mjs +2 -0
  37. package/dist/global-DYq1Z4_H.mjs +1 -0
  38. package/dist/http-span-route-t2gig-KI.mjs +1 -0
  39. package/dist/hydration-BIp2cKhz.mjs +1 -0
  40. package/dist/index-DBsXraeJ.d.mts +4 -0
  41. package/dist/initial-navigation-YeK6UUHX.mjs +1 -0
  42. package/dist/{instrumentations-Bgm2EazU.d.mts → instrumentations-BuccMAMj.d.mts} +8 -1
  43. package/dist/instrumentations-CY8NcP_M.mjs +1 -0
  44. package/dist/internal/{activity.d.mts → activity/activity.d.mts} +1 -1
  45. package/dist/internal/activity/activity.mjs +1 -0
  46. package/dist/internal/browser-context.mjs +1 -1
  47. package/dist/internal/capture-boundary.d.mts +1 -1
  48. package/dist/internal/capture-boundary.mjs +1 -1
  49. package/dist/internal/capture.d.mts +1 -1
  50. package/dist/internal/capture.mjs +1 -1
  51. package/dist/internal/config.d.mts +2 -28
  52. package/dist/internal/config.mjs +1 -1
  53. package/dist/internal/consent.mjs +1 -1
  54. package/dist/internal/console-patch.mjs +1 -1
  55. package/dist/internal/device-metadata.d.mts +41 -0
  56. package/dist/internal/device-metadata.mjs +1 -0
  57. package/dist/internal/dom/actionable.d.mts +4 -13
  58. package/dist/internal/dom/actionable.mjs +1 -1
  59. package/dist/internal/dom/privacy.d.mts +2 -0
  60. package/dist/internal/dom/privacy.mjs +1 -0
  61. package/dist/internal/environment.d.mts +2 -0
  62. package/dist/internal/environment.mjs +1 -0
  63. package/dist/internal/event-capabilities.d.mts +3 -0
  64. package/dist/internal/event-capabilities.mjs +1 -0
  65. package/dist/internal/hydration.mjs +1 -1
  66. package/dist/internal/kernel-registry.d.mts +1 -1
  67. package/dist/internal/kernel-registry.mjs +1 -1
  68. package/dist/internal/kernel.d.mts +5 -3
  69. package/dist/internal/kernel.mjs +1 -1
  70. package/dist/internal/otel/exporter-logs.mjs +1 -1
  71. package/dist/internal/otel/exporter-metrics.mjs +1 -1
  72. package/dist/internal/otel/exporter.mjs +1 -1
  73. package/dist/internal/otel/http-span-route.mjs +1 -1
  74. package/dist/internal/otel/index.d.mts +3 -3
  75. package/dist/internal/otel/index.mjs +1 -1
  76. package/dist/internal/otel/initial-navigation.d.mts +1 -0
  77. package/dist/internal/otel/initial-navigation.mjs +1 -1
  78. package/dist/internal/otel/instrumentations.d.mts +1 -1
  79. package/dist/internal/otel/instrumentations.mjs +1 -1
  80. package/dist/internal/otel/navigation.mjs +1 -1
  81. package/dist/internal/otel/normalize-path.mjs +1 -1
  82. package/dist/internal/otel/page-scope-context-manager.mjs +1 -1
  83. package/dist/internal/otel/propagation.mjs +1 -1
  84. package/dist/internal/otel/provider.d.mts +1 -1
  85. package/dist/internal/otel/provider.mjs +1 -1
  86. package/dist/internal/otel/url-attrs.mjs +1 -1
  87. package/dist/internal/otel/web-vitals.mjs +1 -1
  88. package/dist/internal/{page-lifecycle.d.mts → page-lifecycle/page-lifecycle.d.mts} +1 -1
  89. package/dist/internal/page-lifecycle/page-lifecycle.mjs +1 -0
  90. package/dist/internal/plugins/plugin-runtime.d.mts +2 -0
  91. package/dist/internal/plugins/plugin-runtime.mjs +1 -0
  92. package/dist/internal/react-context.d.mts +1 -1
  93. package/dist/internal/react-context.mjs +1 -1
  94. package/dist/internal/server-digest.mjs +1 -1
  95. package/dist/internal/third-party-hosts.mjs +1 -1
  96. package/dist/internal/version.mjs +1 -1
  97. package/dist/internal/wrapper-singleton.d.mts +1 -1
  98. package/dist/internal/wrapper-singleton.mjs +1 -1
  99. package/dist/kernel-BD57JxiH.mjs +1 -0
  100. package/dist/kernel-registry-6f-3VCIy.mjs +1 -0
  101. package/dist/loader-BGwWwN2n.mjs +1 -0
  102. package/dist/log-D6Ht--tv.mjs +1 -0
  103. package/dist/navigation-DwkvuhFR.mjs +1 -0
  104. package/dist/normalize-path-BChqP8pA.mjs +1 -0
  105. package/dist/page-events-config-CiJvdAaJ.d.mts +12 -0
  106. package/dist/{internal/page-lifecycle.mjs → page-lifecycle-BhSFqjlK.mjs} +1 -1
  107. package/dist/page-scope-context-manager-DhArvVJ_.mjs +1 -0
  108. package/dist/plugin-runtime-CnFVGbJw.mjs +1 -0
  109. package/dist/plugins/device.d.mts +1 -1
  110. package/dist/plugins/device.mjs +1 -1
  111. package/dist/plugins/errors.d.mts +1 -1
  112. package/dist/plugins/errors.mjs +1 -1
  113. package/dist/plugins/lib/loader.d.mts +1 -1
  114. package/dist/plugins/lib/loader.mjs +1 -1
  115. package/dist/plugins/lib/types.d.mts +1 -1
  116. package/dist/plugins/logs.d.mts +1 -1
  117. package/dist/plugins/logs.mjs +1 -1
  118. package/dist/plugins/page-events-config.d.mts +2 -0
  119. package/dist/plugins/page-events-config.mjs +1 -0
  120. package/dist/plugins/page-events.d.mts +1 -1
  121. package/dist/plugins/rage-clicks.d.mts +1 -1
  122. package/dist/plugins/rage-clicks.mjs +1 -1
  123. package/dist/plugins/replay/buffer.d.mts +1 -1
  124. package/dist/plugins/replay/buffer.mjs +1 -1
  125. package/dist/plugins/replay/chunking.d.mts +2 -38
  126. package/dist/plugins/replay/chunking.mjs +1 -2
  127. package/dist/plugins/replay/compressor-host.d.mts +2 -8
  128. package/dist/plugins/replay/compressor-host.mjs +1 -1
  129. package/dist/plugins/replay/config.d.mts +1 -1
  130. package/dist/plugins/replay/config.mjs +1 -1
  131. package/dist/plugins/replay/delivery.d.mts +4 -4
  132. package/dist/plugins/replay/delivery.mjs +1 -1
  133. package/dist/plugins/replay/index.d.mts +1 -1
  134. package/dist/plugins/replay/index.mjs +1 -1
  135. package/dist/plugins/replay/recorder.d.mts +1 -1
  136. package/dist/plugins/replay/recorder.mjs +1 -1
  137. package/dist/plugins/replay/redact-urls.d.mts +6 -0
  138. package/dist/plugins/replay/redact-urls.mjs +1 -0
  139. package/dist/plugins/replay/sequence.mjs +1 -1
  140. package/dist/plugins/replay/upload.d.mts +1 -1
  141. package/dist/plugins/replay/upload.mjs +1 -1
  142. package/dist/privacy-CPKosXDP.d.mts +31 -0
  143. package/dist/privacy-CRuL0X8r.mjs +1 -0
  144. package/dist/propagation-DVcqCu_E.mjs +1 -0
  145. package/dist/{provider-DWgb6tn9.d.mts → provider-C68KiG80.d.mts} +55 -39
  146. package/dist/provider-NuAexTzU.mjs +1 -0
  147. package/dist/{provider-2LrbA-ld.d.mts → provider-VZtcX6ZS.d.mts} +4 -1
  148. package/dist/provider.d.mts +4 -3
  149. package/dist/provider.mjs +1 -1
  150. package/dist/react-context-c1uTUJfB.mjs +1 -0
  151. package/dist/react-error-handler.d.mts +1 -1
  152. package/dist/react-error-handler.mjs +1 -1
  153. package/dist/recorder-CM6Ae_0S.mjs +1 -0
  154. package/dist/redact-urls-CwFod9d4.mjs +1 -0
  155. package/dist/sequence-B4dYChb0.mjs +1 -0
  156. package/dist/server-digest-CzGdvjW1.mjs +1 -0
  157. package/dist/session-C30CtCVv.mjs +1 -0
  158. package/dist/session-retry-DJHvfDaO.mjs +1 -0
  159. package/dist/stringify-DvuHsAT4.mjs +1 -0
  160. package/dist/third-party-hosts-BoJNL3xG.mjs +1 -0
  161. package/dist/tracking/api.d.mts +1 -1
  162. package/dist/tracking/api.mjs +1 -1
  163. package/dist/tracking/device.mjs +1 -1
  164. package/dist/tracking/geo.mjs +1 -2
  165. package/dist/tracking/registration.fixture.d.mts +119 -109
  166. package/dist/tracking/registration.fixture.mjs +148 -26
  167. package/dist/tracking/session-retry.mjs +1 -1
  168. package/dist/tracking/session.mjs +1 -1
  169. package/dist/upload-BPaD3YcA.mjs +1 -0
  170. package/dist/url-attrs-BdcyE2n6.mjs +1 -0
  171. package/dist/util/bot.d.mts +1 -0
  172. package/dist/util/bot.mjs +1 -1
  173. package/dist/util/global.mjs +1 -1
  174. package/dist/util/log.mjs +1 -1
  175. package/dist/util/stringify.mjs +1 -1
  176. package/dist/{version-CsfyuVoF.mjs → version-BuN6IItu.mjs} +1 -1
  177. package/dist/web-vitals-CxXDUgpl.mjs +1 -0
  178. package/package.json +6 -6
  179. package/dist/index-DvFfO2V9.d.mts +0 -4
  180. package/dist/internal/activity.mjs +0 -1
  181. package/dist/internal/plugin-runtime.d.mts +0 -2
  182. package/dist/internal/plugin-runtime.mjs +0 -1
@@ -1,2 +1,2 @@
1
- import { a as IDLE_AFTER_MS, c as SessionResumeReason, i as EXPIRE_AFTER_MS, n as ActivitySession, o as KEEPALIVE_THROTTLE_MS, r as CHECK_INTERVAL_MS, s as MAX_AGE_MS, t as ActivityMonitor } from "../activity-BfYxFVcK.mjs";
1
+ import { a as IDLE_AFTER_MS, c as SessionResumeReason, i as EXPIRE_AFTER_MS, n as ActivitySession, o as KEEPALIVE_THROTTLE_MS, r as CHECK_INTERVAL_MS, s as MAX_AGE_MS, t as ActivityMonitor } from "../../activity-Duhfgvxt.mjs";
2
2
  export { ActivityMonitor, ActivitySession, CHECK_INTERVAL_MS, EXPIRE_AFTER_MS, IDLE_AFTER_MS, KEEPALIVE_THROTTLE_MS, MAX_AGE_MS, SessionResumeReason };
@@ -0,0 +1 @@
1
+ import{a as KEEPALIVE_THROTTLE_MS,i as IDLE_AFTER_MS,n as CHECK_INTERVAL_MS,o as MAX_AGE_MS,r as EXPIRE_AFTER_MS,t as ActivityMonitor}from"../../activity-D18VXGTn.mjs";export{ActivityMonitor,CHECK_INTERVAL_MS,EXPIRE_AFTER_MS,IDLE_AFTER_MS,KEEPALIVE_THROTTLE_MS,MAX_AGE_MS};
@@ -1 +1 @@
1
- import{UAParser}from"@ua-parser-js/pro-enterprise";import{InApps}from"@ua-parser-js/pro-enterprise/extensions";import{isFrozenUA}from"@ua-parser-js/pro-enterprise/helpers";const NOT_A_BRAND_REGEX=/not.a.brand/iu,HIGH_ENTROPY_HINTS=[`bitness`,`platformVersion`,`fullVersionList`];async function getDeviceMetadata(){if(typeof navigator>`u`)return null;let uaData=navigator.userAgentData,[parsed,hints]=await Promise.all([UAParser(navigator.userAgent,InApps).withClientHints(),uaData?.getHighEntropyValues?uaData.getHighEntropyValues(HIGH_ENTROPY_HINTS).catch(()=>({})):Promise.resolve({})]);if(parsed==null)return null;let fullVersion=hints.fullVersionList?.find(b=>!NOT_A_BRAND_REGEX.test(b.brand))?.version,metadata={...parsed,browser:{...parsed.browser},cpu:{...parsed.cpu},frozenUa:isFrozenUA(navigator.userAgent),os:{...parsed.os}};return fullVersion&&(metadata.browser.fullVersion=fullVersion),hints.bitness&&(metadata.cpu.bitness=hints.bitness),hints.platformVersion&&(metadata.os.versionFull=hints.platformVersion),metadata}function getBrowserMetadata(){if([typeof navigator,typeof screen,typeof globalThis].some(x=>x===`undefined`))return null;let{language}=navigator;return{display:{screen:{height:screen.availHeight,orientation:screen.orientation?.type,width:screen.availWidth}},language,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone}}async function collectContext(){return{browser:getBrowserMetadata(),device:await getDeviceMetadata(),runtime:`browser`}}export{collectContext};
1
+ import{t as deviceMetadata}from"../device-metadata-Ffi__vup.mjs";import{UAParser}from"@ua-parser-js/pro-enterprise";import{InApps}from"@ua-parser-js/pro-enterprise/extensions";const HIGH_ENTROPY_HINTS=[`bitness`,`platformVersion`,`fullVersionList`];async function getDeviceMetadata(){if(typeof navigator>`u`)return null;let uaData=navigator.userAgentData,[parsed,hints]=await Promise.all([Promise.resolve(UAParser(navigator.userAgent,InApps).withClientHints()).catch(()=>UAParser(navigator.userAgent,InApps)),uaData?.getHighEntropyValues?uaData.getHighEntropyValues(HIGH_ENTROPY_HINTS).catch(()=>({})):Promise.resolve({})]);return deviceMetadata(parsed,hints,navigator.userAgent)}function getBrowserMetadata(){if([typeof navigator,typeof screen,typeof globalThis].some(x=>x===`undefined`))return null;let{language}=navigator;return{display:{screen:{height:screen.availHeight,orientation:screen.orientation?.type,width:screen.availWidth}},language,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone}}async function collectContext(){return{browser:getBrowserMetadata(),device:await getDeviceMetadata(),runtime:`browser`}}export{collectContext};
@@ -1,4 +1,4 @@
1
- import { a as InterfereContextValue, i as InterfereContext } from "../provider-DWgb6tn9.mjs";
1
+ import { a as InterfereContextValue, i as InterfereContext } from "../provider-C68KiG80.mjs";
2
2
  import { Component, ContextType, ReactNode } from "react";
3
3
  //#region src/internal/capture-boundary.d.ts
4
4
  interface CaptureBoundaryProps {
@@ -1 +1 @@
1
- "use client";import{captureReactError}from"./capture.mjs";import{InterfereContext}from"./react-context.mjs";import{hasServerDigest}from"./server-digest.mjs";import{MECHANISM_TYPE}from"@interfere/types/sdk/errors";import{Component}from"react";var CaptureBoundary=class extends Component{static contextType=InterfereContext;state={error:null};static getDerivedStateFromError(error){return{error}}render(){if(this.state.error)throw hasServerDigest(this.state.error)||captureReactError(this.context?.kernel??null,this.state.error,null,{handled:!1,type:MECHANISM_TYPE.react.captureBoundary}),this.state.error;return this.props.children}};export{CaptureBoundary};
1
+ "use client";import{t as CaptureBoundary}from"../capture-boundary-Cz0jO-y5.mjs";export{CaptureBoundary};
@@ -1,4 +1,4 @@
1
- import { s as Kernel } from "../provider-DWgb6tn9.mjs";
1
+ import { s as Kernel } from "../provider-C68KiG80.mjs";
2
2
  import { ErrorMechanism } from "@interfere/types/sdk/plugins/payload/errors";
3
3
  //#region src/internal/capture.d.ts
4
4
  /**
@@ -1 +1 @@
1
- import{isHydrationError}from"./hydration.mjs";import{parseReactComponentStack}from"@interfere/types/sdk/errors";import{omitUndefined}from"@interfere/helpers/omit-undefined";function captureReactError(kernel,error,componentStack,mechanism){if(!kernel)return;let hydration=isHydrationError(error);kernel.recordException(error,omitUndefined({mechanism:hydration?{...mechanism,synthetic:!1}:mechanism,subtype:hydration?`hydration`:void 0,appendFrames:componentStack?parseReactComponentStack(componentStack):void 0,errorDigest:error.digest||void 0}))}export{captureReactError};
1
+ import{t as captureReactError}from"../capture-BV2RlsYg.mjs";export{captureReactError};
@@ -1,28 +1,2 @@
1
- //#region src/internal/config.d.ts
2
- /**
3
- * Force enable is the explicit opt-in for telemetry outside production. It
4
- * also overrides the bot gate, so a browser under test can start a kernel.
5
- */
6
- export declare function isForceEnableActive(): boolean;
7
- export declare function setIngestHost(host: string): void;
8
- export declare function resolveTargets(apiHost?: string, ingestHost?: string): {
9
- config: {
10
- headers: Record<string, string>;
11
- publicKeyHeader: {
12
- apiKey: string;
13
- } | undefined;
14
- timeoutInSeconds: number;
15
- maxRetries: number;
16
- baseUrl: string;
17
- };
18
- ingest: {
19
- headers: Record<string, string>;
20
- publicKeyHeader: {
21
- apiKey: string;
22
- } | undefined;
23
- timeoutInSeconds: number;
24
- maxRetries: number;
25
- baseUrl: string;
26
- };
27
- };
28
- //#endregion
1
+ import { n as resolveTargets, r as setIngestHost, t as isForceEnableActive } from "../config-CBqqY1AV.mjs";
2
+ export { isForceEnableActive, resolveTargets, setIngestHost };
@@ -1 +1 @@
1
- import{getGlobal,getStringGlobal,setGlobal}from"../util/global.mjs";import{API_URL}from"@interfere/constants/api";import{API_URL_GLOBAL,FORCE_ENABLE_GLOBAL,INGEST_URL_GLOBAL,PUBLIC_KEY_GLOBAL}from"@interfere/types/sdk/injected-globals";function resolvePublicKey(){let injected=getStringGlobal(PUBLIC_KEY_GLOBAL);if(injected)return injected;if(typeof process<`u`)return process.env.INTERFERE_PUBLIC_KEY??void 0}function isForceEnableActive(){return!!getGlobal(FORCE_ENABLE_GLOBAL)}function resolveApiHost(explicit){return explicit??getStringGlobal(API_URL_GLOBAL)}function resolveIngestHost(explicit){return explicit??getStringGlobal(INGEST_URL_GLOBAL)}function setIngestHost(host){setGlobal(INGEST_URL_GLOBAL,host)}function normalizeOrigin(host){try{return new URL(host).origin}catch{return API_URL}}function resolveTargets(apiHost,ingestHost){let publicKey=resolvePublicKey(),headers={};isForceEnableActive()&&(headers[`x-interfere-force-enable`]=`1`);let configHost=resolveApiHost(apiHost),configBaseUrl=configHost?normalizeOrigin(configHost):API_URL,resolvedIngestHost=resolveIngestHost(ingestHost),ingestBaseUrl=resolvedIngestHost?normalizeOrigin(resolvedIngestHost):configBaseUrl,options={headers,publicKeyHeader:publicKey?{apiKey:publicKey}:void 0,timeoutInSeconds:10,maxRetries:0};return{config:{...options,baseUrl:configBaseUrl},ingest:{...options,baseUrl:ingestBaseUrl}}}export{isForceEnableActive,resolveTargets,setIngestHost};
1
+ import{n as resolveTargets,r as setIngestHost,t as isForceEnableActive}from"../config-Bm8myQlS.mjs";export{isForceEnableActive,resolveTargets,setIngestHost};
@@ -1 +1 @@
1
- import{PLUGIN_MANIFEST}from"@interfere/types/sdk/plugins/manifest";const DEFAULT_CONSENT={analytics:!0,replay:!0},PLUGIN_CONSENT_BY_KEY=Object.fromEntries(PLUGIN_MANIFEST.map(plugin=>[plugin.name,plugin.consentCategory])),EVENT_CONSENT_BY_TYPE=Object.fromEntries(PLUGIN_MANIFEST.flatMap(plugin=>plugin.events.map(event=>[event.name,plugin.consentCategory]))),GATEABLE_CATEGORIES=Object.keys(DEFAULT_CONSENT);function getPluginConsentCategory(key){return PLUGIN_CONSENT_BY_KEY[key]}function isConsentAllowed(category,consentState){return category===`necessary`||consentState===null||consentState[category]===!0}function shouldCaptureEvent(type,consentState){return isConsentAllowed(EVENT_CONSENT_BY_TYPE[type],consentState)}function resolveGrantedConsent(consent){return consent===!0||consent===!1?{analytics:consent,replay:consent}:{...DEFAULT_CONSENT,...consent}}function hasConsentChanged(current,next){for(let category of GATEABLE_CATEGORIES)if(current?.[category]!==next?.[category])return!0;return!1}export{DEFAULT_CONSENT,getPluginConsentCategory,hasConsentChanged,isConsentAllowed,resolveGrantedConsent,shouldCaptureEvent};
1
+ import{a as resolveGrantedConsent,i as isConsentAllowed,n as getPluginConsentCategory,o as shouldCaptureEvent,r as hasConsentChanged,t as DEFAULT_CONSENT}from"../consent-COUmLJLD.mjs";export{DEFAULT_CONSENT,getPluginConsentCategory,hasConsentChanged,isConsentAllowed,resolveGrantedConsent,shouldCaptureEvent};
@@ -1 +1 @@
1
- const CONSOLE_LEVELS=[`debug`,`log`,`info`,`warn`,`error`],handlers=new Set,originals=new Map;let installed=!1;function install(){if(installed)return;installed=!0;let target=globalThis.console;for(let level of CONSOLE_LEVELS){let orig=target[level];typeof orig==`function`&&(originals.set(level,orig),target[level]=(...args)=>{orig.apply(globalThis.console,args);for(let handler of handlers)handler(level,args)})}}function uninstall(){if(!installed)return;installed=!1;let target=globalThis.console;for(let level of CONSOLE_LEVELS){let orig=originals.get(level);orig&&(target[level]=orig,originals.delete(level))}}function onConsoleCall(handler){return install(),handlers.add(handler),(()=>{handlers.delete(handler),handlers.size===0&&uninstall()})}function resetConsolePatchForTests(){handlers.clear(),uninstall()}export{CONSOLE_LEVELS,onConsoleCall,resetConsolePatchForTests};
1
+ import{n as onConsoleCall,r as resetConsolePatchForTests,t as CONSOLE_LEVELS}from"../console-patch-WNKoLE7U.mjs";export{CONSOLE_LEVELS,onConsoleCall,resetConsolePatchForTests};
@@ -0,0 +1,41 @@
1
+ import { IResult } from "@ua-parser-js/pro-enterprise";
2
+ //#region src/internal/device-metadata.d.ts
3
+ interface NavigatorUABrand {
4
+ brand: string;
5
+ version: string;
6
+ }
7
+ export interface HighEntropyValues {
8
+ bitness?: string;
9
+ fullVersionList?: NavigatorUABrand[];
10
+ platformVersion?: string;
11
+ }
12
+ export declare function deviceMetadata(parsed: IResult | null | undefined, hints: HighEntropyValues, userAgent: string): {
13
+ browser: {
14
+ fullVersion?: string | undefined;
15
+ major?: string | undefined;
16
+ name?: string | undefined;
17
+ type?: string | undefined;
18
+ version?: string | undefined;
19
+ };
20
+ cpu: {
21
+ architecture?: string | undefined;
22
+ bitness?: string | undefined;
23
+ };
24
+ device: {
25
+ model?: string | undefined;
26
+ type?: string | undefined;
27
+ vendor?: string | undefined;
28
+ };
29
+ engine: {
30
+ name?: string | undefined;
31
+ version?: string | undefined;
32
+ };
33
+ frozenUa?: boolean | undefined;
34
+ os: {
35
+ name?: string | undefined;
36
+ version?: string | undefined;
37
+ versionFull?: string | undefined;
38
+ };
39
+ ua: string;
40
+ } | null;
41
+ //#endregion
@@ -0,0 +1 @@
1
+ import{t as deviceMetadata}from"../device-metadata-Ffi__vup.mjs";export{deviceMetadata};
@@ -1,25 +1,16 @@
1
+ import { i as PrivacyPolicy, n as PrivacyLevel } from "../../privacy-CPKosXDP.mjs";
1
2
  //#region src/internal/dom/actionable.d.ts
2
- /**
3
- * Single source of truth for "what counts as a clickable element" across
4
- * the SDK. Used by both the `pages` plugin (which captures `ui_event`
5
- * envelopes) and the OTel `UserInteractionInstrumentation` enrichment
6
- * hook (which gates span creation + stamps target attrs). Before this
7
- * was extracted, the two sites diverged and produced inconsistent
8
- * notions of "actionable."
9
- *
10
- * `data-track-click` is the customer escape hatch — any element opted
11
- * in via that attribute is treated as actionable regardless of tag/role.
12
- */
13
3
  export declare function isActionable(el: Element): boolean;
14
4
  export declare function closestActionable(target: EventTarget | null): Element | null;
15
5
  export interface ActionableDescriptor {
16
6
  ariaLabel?: string | undefined;
17
- href?: string | undefined;
18
7
  id?: string | undefined;
8
+ label?: string | undefined;
19
9
  name?: string | undefined;
10
+ privacy?: Exclude<PrivacyLevel, "public"> | undefined;
20
11
  role?: string | undefined;
21
12
  tag: string;
22
13
  text?: string | undefined;
23
14
  }
24
- export declare function describeActionable(el: Element): ActionableDescriptor;
15
+ export declare function describeActionable(el: Element, policy: PrivacyPolicy): ActionableDescriptor;
25
16
  //#endregion
@@ -1 +1 @@
1
- const ACTIONABLE_TAGS=new Set([`a`,`button`,`input`,`select`,`textarea`,`summary`,`label`]),ACTIONABLE_ROLES=new Set([`button`,`link`,`menuitem`,`tab`,`checkbox`,`radio`,`switch`]);function isActionable(el){if(ACTIONABLE_TAGS.has(el.tagName.toLowerCase()))return!0;let role=el.getAttribute(`role`);return role&&ACTIONABLE_ROLES.has(role)?!0:(el instanceof HTMLElement||el instanceof SVGElement)&&Object.hasOwn(el.dataset,`trackClick`)}function closestActionable(target){if(!(target instanceof Element))return null;let el=target;for(;el;){if(isActionable(el))return el;el=el.parentElement}return null}function describeActionable(el){let desc={tag:el.tagName.toLowerCase()};el.id&&(desc.id=el.id);let role=el.getAttribute(`role`);role&&(desc.role=role);let name=el.getAttribute(`name`);name&&(desc.name=name);let ariaLabel=el.getAttribute(`aria-label`);ariaLabel&&(desc.ariaLabel=ariaLabel),el instanceof HTMLAnchorElement&&(desc.href=el.href);let text=el.textContent.trim().slice(0,120);return text&&(desc.text=text),desc}export{closestActionable,describeActionable,isActionable};
1
+ import{n as describeActionable,r as isActionable,t as closestActionable}from"../../actionable-DOmVf_ib.mjs";export{closestActionable,describeActionable,isActionable};
@@ -0,0 +1,2 @@
1
+ import { a as fieldLabel, c as resolvePrivacyPolicy, i as PrivacyPolicy, n as PrivacyLevel, o as privacyLevel, r as PrivacyOptions, s as publicText, t as DEFAULT_PRIVACY_POLICY } from "../../privacy-CPKosXDP.mjs";
2
+ export { DEFAULT_PRIVACY_POLICY, PrivacyLevel, PrivacyOptions, PrivacyPolicy, fieldLabel, privacyLevel, publicText, resolvePrivacyPolicy };
@@ -0,0 +1 @@
1
+ import{a as resolvePrivacyPolicy,i as publicText,n as fieldLabel,r as privacyLevel,t as DEFAULT_PRIVACY_POLICY}from"../../privacy-CRuL0X8r.mjs";export{DEFAULT_PRIVACY_POLICY,fieldLabel,privacyLevel,publicText,resolvePrivacyPolicy};
@@ -0,0 +1,2 @@
1
+ import { n as isEnvironmentEnabled, t as isEnabledByEnvironment } from "../environment-_LKcAXKG.mjs";
2
+ export { isEnabledByEnvironment, isEnvironmentEnabled };
@@ -0,0 +1 @@
1
+ import{n as isEnvironmentEnabled,t as isEnabledByEnvironment}from"../environment-CoEXhF1a.mjs";export{isEnabledByEnvironment,isEnvironmentEnabled};
@@ -0,0 +1,3 @@
1
+ //#region src/internal/event-capabilities.d.ts
2
+ export declare function hasEventListenerPair(add: typeof globalThis.addEventListener | undefined, remove: typeof globalThis.removeEventListener | undefined): boolean;
3
+ //#endregion
@@ -0,0 +1 @@
1
+ import{t as hasEventListenerPair}from"../event-capabilities-Dd0Hoaq2.mjs";export{hasEventListenerPair};
@@ -1 +1 @@
1
- const HYDRATION_CODE=/(?:Minified React error #|react\.dev\/errors\/)(?:418|423|425)/u,HYDRATION_TEXT=/hydration failed|error while hydrating|hydrated but|text content does not match|server[- ]rendered html|did(?:n't| not) match the client/iu;function isHydrationError(error){if(!(error instanceof Error))return!1;let{message}=error;return HYDRATION_CODE.test(message)||HYDRATION_TEXT.test(message)}export{isHydrationError};
1
+ import{t as isHydrationError}from"../hydration-BIp2cKhz.mjs";export{isHydrationError};
@@ -1,4 +1,4 @@
1
- import { s as Kernel } from "../provider-DWgb6tn9.mjs";
1
+ import { s as Kernel } from "../provider-C68KiG80.mjs";
2
2
  //#region src/internal/kernel-registry.d.ts
3
3
  export declare function registerKernel(kernel: Kernel): void;
4
4
  export declare function unregisterKernel(kernel: Kernel): void;
@@ -1 +1 @@
1
- import{createLogger}from"../util/log.mjs";const log=createLogger(`kernel-registry`);let active=null;function registerKernel(kernel){active&&active!==kernel&&log.warn(`init() called twice with different kernels; later one wins. The public capture()/span() helpers route only to the latest kernel — multi-surface apps should call kernel.recordException() directly.`),active=kernel}function unregisterKernel(kernel){active===kernel&&(active=null)}function activeKernel(){return active}export{activeKernel,registerKernel,unregisterKernel};
1
+ import{n as registerKernel,r as unregisterKernel,t as activeKernel}from"../kernel-registry-6f-3VCIy.mjs";export{activeKernel,registerKernel,unregisterKernel};
@@ -1,3 +1,5 @@
1
- import { _ as createKernel, c as KernelConsent, d as KernelInternalOptions, f as KernelOptions, g as buildSdkStack, h as TracingOptions, l as KernelDevice, m as RecordExceptionOpts, p as KernelSession, s as Kernel, u as KernelIdentity, v as isEnabledByEnvironment, y as readReleaseSlugFromGlobals } from "../provider-DWgb6tn9.mjs";
2
- import { i as HttpStatusCodeRange, n as CaptureFailedRequestsOption, r as CaptureFailedRequestsOptions } from "../instrumentations-Bgm2EazU.mjs";
3
- export { type CaptureFailedRequestsOption, type CaptureFailedRequestsOptions, type HttpStatusCodeRange, Kernel, KernelConsent, KernelDevice, KernelIdentity, KernelInternalOptions, KernelOptions, KernelSession, RecordExceptionOpts, TracingOptions, buildSdkStack, createKernel, isEnabledByEnvironment, readReleaseSlugFromGlobals };
1
+ import { r as PrivacyOptions } from "../privacy-CPKosXDP.mjs";
2
+ import { _ as createKernel, c as KernelConsent, d as KernelInternalOptions, f as KernelOptions, g as buildSdkStack, h as TracingOptions, l as KernelDevice, m as RecordExceptionOpts, p as KernelSession, s as Kernel, u as KernelIdentity, v as readReleaseSlugFromGlobals } from "../provider-C68KiG80.mjs";
3
+ import { i as HttpStatusCodeRange, n as CaptureFailedRequestsOption, r as CaptureFailedRequestsOptions } from "../instrumentations-BuccMAMj.mjs";
4
+ import { t as isEnabledByEnvironment } from "../environment-_LKcAXKG.mjs";
5
+ export { type CaptureFailedRequestsOption, type CaptureFailedRequestsOptions, type HttpStatusCodeRange, Kernel, KernelConsent, KernelDevice, KernelIdentity, KernelInternalOptions, KernelOptions, KernelSession, type PrivacyOptions, RecordExceptionOpts, TracingOptions, buildSdkStack, createKernel, isEnabledByEnvironment, readReleaseSlugFromGlobals };
@@ -1 +1 @@
1
- import{createLogger}from"../util/log.mjs";import{onPageHidden}from"./page-lifecycle.mjs";import{getGlobal}from"../util/global.mjs";import{resolveTargets,setIngestHost}from"./config.mjs";import{SessionTracker}from"../tracking/api.mjs";import{safeStringify}from"../util/stringify.mjs";import{t as PRODUCER_VERSION}from"../version-CsfyuVoF.mjs";import{INGEST_IGNORE_RE}from"./otel/exporter.mjs";import{recordInitialNavigation}from"./otel/initial-navigation.mjs";import{PluginRuntime}from"./plugin-runtime.mjs";import{isNonErrorException,shouldDropBrowserExtensionNoise,shouldDropUnresolvableStack,toExceptions}from"@interfere/types/sdk/errors";import{trace}from"@opentelemetry/api";import{omitUndefined}from"@interfere/helpers/omit-undefined";import{FORCE_ENABLE_GLOBAL,RELEASE_SLUG_GLOBAL,SDK_STACK_GLOBAL}from"@interfere/types/sdk/injected-globals";import{InterfereClient}from"@interfere/javascript";import{releaseSlugSchema}from"@interfere/types/releases/slug";import{readBakedPlugins,remoteConfigInputSchema}from"@interfere/types/sdk/remote-config";const log=createLogger(`kernel`),REPLAY_UPLOAD_RE=/\/v3\/replay\/upload\//u;function buildSdkStack(wrapperVersions){return[...wrapperVersions??[],PRODUCER_VERSION]}function buildExceptionEventAttrs(value,opts){let attrs={"interfere.exception.handled":opts.mechanism.handled,"interfere.exception.mechanism":opts.mechanism.type};if(opts.errorDigest&&(attrs[`interfere.error.digest`]=opts.errorDigest),opts.subtype&&(attrs[`interfere.exception.subtype`]=opts.subtype),isNonErrorException(value))return attrs[`exception.type`]=value.type,attrs[`exception.message`]=value.value,attrs[`interfere.exception.kind`]=`non-error`,attrs[`interfere.exception.serialized`]=safeStringify(value.serialized),attrs;attrs[`exception.type`]=value.name,attrs[`exception.message`]=value.message,attrs[`interfere.exception.kind`]=`error`,value.stack&&(attrs[`exception.stacktrace`]=value.stack),attrs[`interfere.exception.chain`]=safeStringify(toExceptions(value,opts.mechanism));let debugIds=getGlobal(`_debugIds`);return typeof debugIds==`object`&&debugIds&&Object.keys(debugIds).length>0&&(attrs[`interfere.exception.debug_ids`]=safeStringify(debugIds)),opts.appendFrames&&opts.appendFrames.length>0&&(attrs[`interfere.exception.appended_frames`]=safeStringify(opts.appendFrames)),opts.fallbackFrames&&opts.fallbackFrames.length>0&&(attrs[`interfere.exception.fallback_frames`]=safeStringify(opts.fallbackFrames)),attrs}var Kernel=class{consent;identity;device;session;seen=new WeakSet;initialNavigationSeen=new Set;runtime=null;otel=null;otelDispose=null;otelControls=null;deviceInfoCaptureEnabled=!1;unsubscribePageHidden=null;tracker;constructor(tracker){this.tracker=tracker,this.consent={get:()=>this.requireRuntime().getConsent(),set:value=>{let runtime=this.requireRuntime();value===void 0?runtime.resetConsent():runtime.setConsent(value)}},this.identity={clear:()=>{this.tracker.reset()},get:()=>this.tracker.getIdentity(),set:async params=>this.tracker.identify(params)},this.device={getDeviceId:()=>this.tracker.getDeviceId(),getFpHash:()=>this.tracker.getFpHash()},this.session={getId:()=>this.tracker.sessionId(),getWindowId:()=>this.tracker.windowId()},this.unsubscribePageHidden=onPageHidden(()=>{this.flush().catch(()=>{})})}attachRuntime(runtime){this.runtime=runtime}requireRuntime(){if(!this.runtime)throw Error(`Kernel runtime not attached. createKernel must call attachRuntime before any consent/dispose path runs.`);return this.runtime}getSessionId(){return this.tracker.sessionId()??``}getWindowId(){return this.tracker.windowId()??``}onSessionPause(handler){return this.tracker.onSessionPause(handler)}onSessionResume(handler){return this.tracker.onSessionResume(handler)}getPluginConfigState(key){return this.requireRuntime().getPluginConfigState(key)}getReplayConfig(){return this.requireRuntime().getReplayConfig()}subscribePluginConfigState(key,listener){return this.requireRuntime().subscribePluginConfigState(key,listener)}getTracer(name){return this.otel?.tracerProvider.getTracer(name)??trace.getTracer(name)}startPageEventsCapture(){let{otelControls:controls,otel}=this;return!controls||!otel?null:(controls.setPageEventsEnabled(!0),this.recordInitialNavigation(otel.loggerProvider),(()=>{controls.setPageEventsEnabled(!1)}))}startDeviceInfoCapture(){return this.tracker.startDeviceIdentity(),this.deviceInfoCaptureEnabled=!0,(reason=>{this.deviceInfoCaptureEnabled=!1,reason===`consent-revoked`&&this.tracker.discardDeviceIdentity()})}isDeviceInfoCaptureEnabled(){return this.deviceInfoCaptureEnabled}recordException(value,opts){if(!isNonErrorException(value)){if(this.seen.has(value))return;this.seen.add(value)}if(!isNonErrorException(value)){let stacks=[],current=value;for(let depth=0;current&&depth<5;depth+=1)current.stack&&stacks.push(current.stack),current=current.cause instanceof Error?current.cause:void 0;if(shouldDropBrowserExtensionNoise(stacks)||shouldDropUnresolvableStack(stacks))return}let attrs=buildExceptionEventAttrs(value,opts),active=trace.getActiveSpan();if(active?.isRecording()){active.addEvent(`exception`,attrs);return}let span=this.otel?.tracerProvider.getTracer(`@interfere/react/exception`).startSpan(`interfere.exception.capture`);span&&(span.addEvent(`exception`,attrs),span.end())}recordLog(input){this.otel&&this.otel.loggerProvider.getLogger(`@interfere/react`).emit(omitUndefined({body:input.body,severityNumber:input.severityNumber,severityText:input.severityText,attributes:input.attributes}))}recordInitialNavigation(loggerProvider){recordInitialNavigation({getSessionId:()=>this.session.getId(),getWindowId:()=>this.session.getWindowId(),loggerProvider,seen:this.initialNavigationSeen})}async flush(){this.otel&&await this.otel.flush()}attachOtel(handle,dispose,controls){this.otel=handle,this.otelDispose=dispose,this.otelControls=controls??null}syncProviderConfig(config){this.requireRuntime().applyProviderConfig(config.plugins,config.consent)}async dispose(){this.unsubscribePageHidden?.(),this.unsubscribePageHidden=null,this.runtime&&await this.runtime.dispose(),this.tracker.dispose(),this.otelDispose?.(),this.otelDispose=null,this.otel&&=(await this.otel.shutdown(),null)}};async function createKernel(input={}){let{opts={}}=input,fetcher=opts.fetch??globalThis.fetch.bind(globalThis),remotePlugins=await resolveRemotePlugins(opts,fetcher),targets=resolveTargets(opts.apiHost);log.info(`ingest: %s`,targets.ingest.baseUrl),getGlobal(FORCE_ENABLE_GLOBAL)&&log.warn(`FORCE_ENABLE is active. Events will be dropped by production ingest. This should only be set during local development.`);let tracker=new SessionTracker({fetcher,target:targets.ingest});opts._wrapperVersions?.length&&Object.assign(globalThis,{[SDK_STACK_GLOBAL]:opts._wrapperVersions});let kernel=new Kernel(tracker),runtime=new PluginRuntime(kernel,opts.consent,remotePlugins??{});if(kernel.attachRuntime(runtime),tracker.start(),runtime.start(),opts.tracing!==!1){let resolvedTracing={...typeof opts.tracing==`object`?opts.tracing:void 0};opts.serviceName&&(resolvedTracing.serviceName=opts.serviceName),opts.serviceNamespace!==void 0&&(resolvedTracing.serviceNamespace=opts.serviceNamespace),opts._internalAdditionalSpanProcessors&&(resolvedTracing.additionalSpanProcessors=opts._internalAdditionalSpanProcessors),opts._internalAdditionalLogRecordProcessors&&(resolvedTracing.additionalLogRecordProcessors=opts._internalAdditionalLogRecordProcessors),opts._internalAdditionalMetricReaders&&(resolvedTracing.additionalMetricReaders=opts._internalAdditionalMetricReaders),await wireOtel(kernel,targets,opts._wrapperVersions,resolvedTracing)}return remotePlugins?runtime.applyRemoteConfig(remotePlugins):runtime.applyRemoteConfigDefaults(),kernel}async function resolveRemotePlugins(opts,fetcher){let baked=readBakedPlugins();if(baked)return baked;let remoteConfig=await fetchRemoteConfig(resolveTargets(opts.apiHost).config,fetcher);return remoteConfig?.ingestUrl&&setIngestHost(remoteConfig.ingestUrl),remoteConfig?.plugins??null}async function wireOtel(kernel,targets,wrapperVersions,tracing){let{buildOtelProvider,captureWebVitals,createPageScopeRotator,installNavigationScope,PAGE_SCOPE_MAX_AGE_MS,readPropagationFromDocument,registerBundledInstrumentations,seedPageScope}=await import(`./otel/index.mjs`),releaseSlug=readReleaseSlugFromGlobals(),handle=buildOtelProvider(omitUndefined({clientOptions:targets.ingest,getDeviceId:()=>kernel.device.getDeviceId(),getSessionId:()=>kernel.session.getId(),getPropagationSessionId:()=>kernel.consent.get()?.analytics===!1?null:kernel.session.getId(),isDeviceInfoEnabled:()=>kernel.isDeviceInfoCaptureEnabled(),releaseSlug,sdkStack:buildSdkStack(wrapperVersions),serviceName:tracing.serviceName||void 0,serviceNamespace:tracing.serviceNamespace,additionalSpanProcessors:tracing.additionalSpanProcessors,additionalLogRecordProcessors:tracing.additionalLogRecordProcessors,additionalMetricReaders:tracing.additionalMetricReaders})),scopeSpanInput=omitUndefined({tracer:handle.tracerProvider.getTracer(`@interfere/react/navigation`),resolveRoute:tracing.resolveRoute}),extracted=readPropagationFromDocument();handle.contextManager.setPageScope(extracted??seedPageScope(scopeSpanInput)),handle.contextManager.setRotation(createPageScopeRotator(scopeSpanInput),PAGE_SCOPE_MAX_AGE_MS);let disposeNavigationScope=installNavigationScope({...scopeSpanInput,setPageScope:ctx=>{handle.contextManager.setPageScope(ctx)}}),instrumentations=registerBundledInstrumentations(omitUndefined({tracerProvider:handle.tracerProvider,loggerProvider:handle.loggerProvider,ignoreUrls:[INGEST_IGNORE_RE,`${targets.config.baseUrl}/v3/config`,`${targets.ingest.baseUrl}/v3/session`,REPLAY_UPLOAD_RE],apiHosts:tracing.apiHosts,propagateContextUrls:tracing.propagateContextUrls,resolveRoute:tracing.resolveRoute,captureFailedRequests:tracing.captureFailedRequests}));tracing.webVitals!==!1&&captureWebVitals(omitUndefined({flush:async()=>handle.flush(),meter:handle.meterProvider.getMeter(`@interfere/react/web-vitals`),resolveRoute:tracing.resolveRoute})),kernel.attachOtel(handle,()=>{disposeNavigationScope(),instrumentations.dispose()},{setPageEventsEnabled:instrumentations.setPageEventsEnabled})}async function fetchRemoteConfig(configTarget,fetcher){try{let client=new InterfereClient({...configTarget,fetch:Object.assign(async(url,init)=>fetcher(url,{...init,credentials:`omit`}),fetcher)});return remoteConfigInputSchema.parse(await client.config.getSdkConfig())}catch{return log.warn(`remote config fetch failed, using local defaults`),null}}function isEnabledByEnvironment(){if(typeof process>`u`||process.env===void 0||process.env===null)return!0;let nodeEnv=process.env.NODE_ENV;return nodeEnv===`production`||nodeEnv===void 0||!!getGlobal(FORCE_ENABLE_GLOBAL)||!!process.env.INTERFERE_FORCE_ENABLE}function readReleaseSlugFromGlobals(){let value=getGlobal(RELEASE_SLUG_GLOBAL);return typeof value==`string`?releaseSlugSchema.parse(value):null}export{Kernel,buildSdkStack,createKernel,isEnabledByEnvironment,readReleaseSlugFromGlobals};
1
+ import{t as isEnabledByEnvironment}from"../environment-CoEXhF1a.mjs";import{i as readReleaseSlugFromGlobals,n as buildSdkStack,r as createKernel,t as Kernel}from"../kernel-BD57JxiH.mjs";export{Kernel,buildSdkStack,createKernel,isEnabledByEnvironment,readReleaseSlugFromGlobals};
@@ -1 +1 @@
1
- import{ExportResultCode}from"@opentelemetry/core";import{JsonLogsSerializer}from"@opentelemetry/otlp-transformer";var IngestLogExporter=class{send;constructor(send){this.send=send}export(logs,resultCallback){if(logs.length===0){resultCallback({code:ExportResultCode.SUCCESS});return}this.send(JsonLogsSerializer.serializeRequest(logs),resultCallback)}async shutdown(){return Promise.resolve()}async forceFlush(){return Promise.resolve()}};export{IngestLogExporter};
1
+ import{t as IngestLogExporter}from"../../exporter-logs-DS2AXWnV.mjs";export{IngestLogExporter};
@@ -1 +1 @@
1
- import{JsonMetricsSerializer}from"@opentelemetry/otlp-transformer";import{resourceFromAttributes}from"@opentelemetry/resources";import{AggregationTemporality}from"@opentelemetry/sdk-metrics";var IngestMetricExporter=class{gatedResourceAttributes;send;constructor(send,gatedResourceAttributes){this.send=send,this.gatedResourceAttributes=gatedResourceAttributes??null}export(metrics,resultCallback){let gated=this.gatedResourceAttributes,payload=gated?.isEnabled()===!0?{...metrics,resource:metrics.resource.merge(resourceFromAttributes(gated.attributes))}:metrics;this.send(JsonMetricsSerializer.serializeRequest(payload),resultCallback)}selectAggregationTemporality(){return AggregationTemporality.DELTA}async forceFlush(){return Promise.resolve()}async shutdown(){return Promise.resolve()}};export{IngestMetricExporter};
1
+ import{t as IngestMetricExporter}from"../../exporter-metrics-DZYqUo6_.mjs";export{IngestMetricExporter};
@@ -1 +1 @@
1
- import{t as PRODUCER_VERSION}from"../../version-CsfyuVoF.mjs";import{IngestLogExporter}from"./exporter-logs.mjs";import{IngestMetricExporter}from"./exporter-metrics.mjs";import{toError}from"@interfere/types/sdk/errors";import{InterfereClient,InterfereError}from"@interfere/javascript";import{ExportResultCode}from"@opentelemetry/core";import{JsonTraceSerializer}from"@opentelemetry/otlp-transformer";import{z}from"zod";const INGEST_IGNORE_RE=/\/drain\/v1\/(?:traces|logs|metrics)(?:\?|$)/u;let ingestHalted=!1,consecutiveAuthRejections=0;function resetIngestHalt(){ingestHalted=!1,consecutiveAuthRejections=0}function isIngestHalted(){return ingestHalted}function detectUnacceptableExport(error){if(ingestHalted||error.statusCode!==422&&error.statusCode!==401)return;let body=error.body;if(typeof body==`object`&&body&&`code`in body){if(error.statusCode===422&&body.code===`RELEASE_NOT_FOUND`){ingestHalted=!0,console.warn(`[interfere] the ingest endpoint does not recognize this build's release. Telemetry export is disabled for this page load. Check that source-map upload and finalization succeeded and that build and runtime use the same surface key.`);return}if(error.statusCode===401&&body.code===`AUTH_PK_INVALID`){if(consecutiveAuthRejections+=1,consecutiveAuthRejections<3)return;ingestHalted=!0,console.warn(`[interfere] the ingest endpoint rejected this page's public key ${consecutiveAuthRejections} times in a row — telemetry export is disabled for this page load. Check that INTERFERE_PUBLIC_KEY matches an active surface.`)}}}function makeSender(input,signal){let client=new InterfereClient({...input.clientOptions,maxRetries:0,fetch:Object.assign(async(url,init)=>globalThis.fetch(url,{...init,credentials:`omit`,keepalive:!0}),globalThis.fetch)});return((payload,resultCallback)=>{if(!payload||payload.byteLength===0){resultCallback({code:ExportResultCode.SUCCESS});return}if(ingestHalted){resultCallback({code:ExportResultCode.FAILED,error:Error(`ingest halted: the ingest endpoint rejected this build's release`)});return}(async()=>{try{let body=z.record(z.string(),z.unknown()).parse(JSON.parse(new TextDecoder().decode(payload)));await client.drain.otlpExport({signal,body},{headers:{"x-interfere-producer-version":PRODUCER_VERSION}}),consecutiveAuthRejections=0,resultCallback({code:ExportResultCode.SUCCESS})}catch(error){error instanceof InterfereError&&detectUnacceptableExport(error),resultCallback({code:ExportResultCode.FAILED,error:toError(error)})}})()})}var IngestTraceExporter=class{send;constructor(send){this.send=send}export(spans,resultCallback){if(spans.length===0){resultCallback({code:ExportResultCode.SUCCESS});return}this.send(JsonTraceSerializer.serializeRequest(spans),resultCallback)}async shutdown(){return Promise.resolve()}async forceFlush(){return Promise.resolve()}};function createTraceExporter(input){return new IngestTraceExporter(makeSender(input,`traces`))}function createMetricExporter(input,gatedResourceAttributes){return new IngestMetricExporter(makeSender(input,`metrics`),gatedResourceAttributes)}function createLogExporter(input){return new IngestLogExporter(makeSender(input,`logs`))}export{INGEST_IGNORE_RE,createLogExporter,createMetricExporter,createTraceExporter,isIngestHalted,resetIngestHalt};
1
+ import{a as isIngestHalted,i as createTraceExporter,n as createLogExporter,o as resetIngestHalt,r as createMetricExporter,t as INGEST_IGNORE_RE}from"../../exporter-DjvOtWYJ.mjs";export{INGEST_IGNORE_RE,createLogExporter,createMetricExporter,createTraceExporter,isIngestHalted,resetIngestHalt};
@@ -1 +1 @@
1
- import{normalizePath}from"./normalize-path.mjs";import{ATTR_HTTP_ROUTE}from"./url-attrs.mjs";function stampHttpSpanRoute(span,method,pathname,resolveRoute){let template=resolveRoute?.(pathname),route=template??normalizePath(pathname);span.setAttribute(ATTR_HTTP_ROUTE,route),span.setAttribute(`interfere.route.source`,template?`template`:`normalized`),span.updateName(`${method} ${route}`)}export{stampHttpSpanRoute};
1
+ import{t as stampHttpSpanRoute}from"../../http-span-route-t2gig-KI.mjs";export{stampHttpSpanRoute};
@@ -1,7 +1,7 @@
1
- import { a as InstrumentationsInput, i as HttpStatusCodeRange, n as CaptureFailedRequestsOption, o as registerBundledInstrumentations, r as CaptureFailedRequestsOptions, t as BundledInstrumentations } from "../../instrumentations-Bgm2EazU.mjs";
1
+ import { a as InstrumentationsInput, i as HttpStatusCodeRange, n as CaptureFailedRequestsOption, o as registerBundledInstrumentations, r as CaptureFailedRequestsOptions, t as BundledInstrumentations } from "../../instrumentations-BuccMAMj.mjs";
2
2
  import { a as seedPageScope, i as installNavigationScope, n as PAGE_SCOPE_MAX_AGE_MS, r as createPageScopeRotator, t as NavigationScopeInput } from "../../navigation-CkiV6lJY.mjs";
3
3
  import { t as readPropagationFromDocument } from "../../propagation-CssinKCy.mjs";
4
- import { n as OtelProviderInput, r as buildOtelProvider, t as OtelProviderHandle } from "../../provider-2LrbA-ld.mjs";
4
+ import { n as OtelProviderInput, r as buildOtelProvider, t as OtelProviderHandle } from "../../provider-VZtcX6ZS.mjs";
5
5
  import { n as captureWebVitals } from "../../web-vitals-x8y70B5x.mjs";
6
- import "../../index-DvFfO2V9.mjs";
6
+ import "../../index-DBsXraeJ.mjs";
7
7
  export { type BundledInstrumentations, type CaptureFailedRequestsOption, type CaptureFailedRequestsOptions, type HttpStatusCodeRange, type InstrumentationsInput, type NavigationScopeInput, type OtelProviderHandle, type OtelProviderInput, PAGE_SCOPE_MAX_AGE_MS, buildOtelProvider, captureWebVitals, createPageScopeRotator, installNavigationScope, readPropagationFromDocument, registerBundledInstrumentations, seedPageScope };
@@ -1 +1 @@
1
- import{registerBundledInstrumentations}from"./instrumentations.mjs";import{PAGE_SCOPE_MAX_AGE_MS,createPageScopeRotator,installNavigationScope,seedPageScope}from"./navigation.mjs";import{readPropagationFromDocument}from"./propagation.mjs";import{buildOtelProvider}from"./provider.mjs";import{captureWebVitals}from"./web-vitals.mjs";export{PAGE_SCOPE_MAX_AGE_MS,buildOtelProvider,captureWebVitals,createPageScopeRotator,installNavigationScope,readPropagationFromDocument,registerBundledInstrumentations,seedPageScope};
1
+ import{t as registerBundledInstrumentations}from"../../instrumentations-CY8NcP_M.mjs";import{i as seedPageScope,n as createPageScopeRotator,r as installNavigationScope,t as PAGE_SCOPE_MAX_AGE_MS}from"../../navigation-DwkvuhFR.mjs";import{t as readPropagationFromDocument}from"../../propagation-DVcqCu_E.mjs";import{t as buildOtelProvider}from"../../provider-NuAexTzU.mjs";import{t as captureWebVitals}from"../../web-vitals-CxXDUgpl.mjs";export{PAGE_SCOPE_MAX_AGE_MS,buildOtelProvider,captureWebVitals,createPageScopeRotator,installNavigationScope,readPropagationFromDocument,registerBundledInstrumentations,seedPageScope};
@@ -5,6 +5,7 @@ export interface InitialNavigationInput {
5
5
  getSessionId: () => string | null;
6
6
  getWindowId: () => string | null;
7
7
  loggerProvider: LoggerProvider;
8
+ redactUrl?: (url: string) => string;
8
9
  seen: Set<string>;
9
10
  }
10
11
  export declare function recordInitialNavigation(input: InitialNavigationInput): void;
@@ -1 +1 @@
1
- function recordInitialNavigation(input){let url=input.getLocationHref?input.getLocationHref():globalThis.location?.href;if(!url)return;let sessionId=input.getSessionId();if(!sessionId)return;let key=`${sessionId}:${input.getWindowId()??``}:${url}`;input.seen.has(key)||(input.seen.add(key),input.loggerProvider.getLogger(`@opentelemetry/instrumentation-browser-navigation`).emit({attributes:{"browser.navigation.type":`pageload`,"url.full":url},severityNumber:0}))}export{recordInitialNavigation};
1
+ import{t as recordInitialNavigation}from"../../initial-navigation-YeK6UUHX.mjs";export{recordInitialNavigation};
@@ -1,2 +1,2 @@
1
- import { a as InstrumentationsInput, c as testOnlyApplyXhrSpanAttrs, d as testOnlyResolveFailureRanges, i as HttpStatusCodeRange, l as testOnlyClassifyNetworkError, n as CaptureFailedRequestsOption, o as registerBundledInstrumentations, r as CaptureFailedRequestsOptions, s as testOnlyApplyFetchSpanAttrs, t as BundledInstrumentations, u as testOnlyCreateFailureGate } from "../../instrumentations-Bgm2EazU.mjs";
1
+ import { a as InstrumentationsInput, c as testOnlyApplyXhrSpanAttrs, d as testOnlyResolveFailureRanges, i as HttpStatusCodeRange, l as testOnlyClassifyNetworkError, n as CaptureFailedRequestsOption, o as registerBundledInstrumentations, r as CaptureFailedRequestsOptions, s as testOnlyApplyFetchSpanAttrs, t as BundledInstrumentations, u as testOnlyCreateFailureGate } from "../../instrumentations-BuccMAMj.mjs";
2
2
  export { BundledInstrumentations, CaptureFailedRequestsOption, CaptureFailedRequestsOptions, HttpStatusCodeRange, InstrumentationsInput, registerBundledInstrumentations, testOnlyApplyFetchSpanAttrs, testOnlyApplyXhrSpanAttrs, testOnlyClassifyNetworkError, testOnlyCreateFailureGate, testOnlyResolveFailureRanges };
@@ -1 +1 @@
1
- import{THIRD_PARTY_IGNORE}from"../third-party-hosts.mjs";import{describeActionable,isActionable}from"../dom/actionable.mjs";import{ATTR_URL_FULL,ATTR_URL_PATH,stampUrlAttrs}from"./url-attrs.mjs";import{stampHttpSpanRoute}from"./http-span-route.mjs";import{MECHANISM_TYPE}from"@interfere/types/sdk/errors";import{omitUndefined}from"@interfere/helpers/omit-undefined";import{registerInstrumentations}from"@opentelemetry/instrumentation";import{BrowserNavigationInstrumentation,defaultSanitizeUrl}from"@opentelemetry/instrumentation-browser-navigation";import{DocumentLoadInstrumentation}from"@opentelemetry/instrumentation-document-load";import{FetchInstrumentation}from"@opentelemetry/instrumentation-fetch";import{LongTaskInstrumentation}from"@opentelemetry/instrumentation-long-task";import{UserInteractionInstrumentation}from"@opentelemetry/instrumentation-user-interaction";import{XMLHttpRequestInstrumentation}from"@opentelemetry/instrumentation-xml-http-request";const DEFAULT_FAILURE_RANGES=[[400,599]];function resolveFailureRanges(opt){if(opt===!1)return null;if(opt===void 0||opt===!0)return DEFAULT_FAILURE_RANGES;let codes=opt.statusCodes;return codes&&codes.length>0?codes:DEFAULT_FAILURE_RANGES}function createFailureGate(){let seen=new Set,windowStart=0,windowCount=0;return(key=>{if(seen.has(key))return!1;let now=Date.now();return now-windowStart>6e4&&(windowStart=now,windowCount=0),windowCount>=20?!1:(seen.size>=100&&seen.clear(),seen.add(key),windowCount+=1,!0)})}function failureKey(method,discriminator,url){let path;try{path=new URL(url).pathname}catch{path=url}return`${method} ${discriminator} ${path}`}function statusMatches(status,ranges){for(let range of ranges)if(typeof range==`number`){if(status===range)return!0}else if(status>=range[0]&&status<=range[1])return!0;return!1}function recordHttpFailure(span,status,method,url,mechanism){span.addEvent(`exception`,{"exception.message":`HTTP ${status} ${method} ${url}`,"exception.type":`HttpResponseError`,"interfere.exception.handled":!1,"interfere.exception.kind":`error`,"interfere.exception.mechanism":mechanism})}function maybeCaptureFetchFailure(span,result,failureRanges,method,url,gate){if(!failureRanges)return;let status=result?.status;typeof status!=`number`||status<=0||!statusMatches(status,failureRanges)||(!gate||gate(failureKey(method,status,url)))&&recordHttpFailure(span,status,method,url,MECHANISM_TYPE.browser.fetchFailedResponse)}const NETWORK_TIMEOUT_RE=/timeout|timed out/iu,NETWORK_ABORT_RE=/abort/iu;function classifyNetworkError(message){return NETWORK_TIMEOUT_RE.test(message)?`timeout`:NETWORK_ABORT_RE.test(message)?`abort`:`network`}function recordNetworkFailure(span,kind,method,url,mechanism){span.addEvent(`exception`,{"exception.message":`Network ${kind} ${method} ${url}`,"exception.type":`NetworkError`,"interfere.exception.handled":!1,"interfere.exception.kind":`error`,"interfere.exception.mechanism":mechanism,"interfere.exception.subtype":kind})}function maybeCaptureNetworkFailure(span,result,failureRanges,method,url,gate){if(!failureRanges)return;let{message}=result;if(typeof message!=`string`||message.length===0)return;let kind=classifyNetworkError(message);(!gate||gate(failureKey(method,kind,url)))&&recordNetworkFailure(span,kind,method,url,MECHANISM_TYPE.browser.fetchNetworkError)}function applyFetchSpanAttrs(span,request,result,failureRanges,isTrackedUrl,resolveRoute,gate){let url=resolveFetchUrl(span,request,result);if(!url)return;let parsed;try{parsed=new URL(url)}catch{return}span.setAttribute(ATTR_URL_PATH,parsed.pathname);let tracked=isTrackedUrl(url),method=resolveFetchMethod(request);tracked&&(stampHttpSpanRoute(span,method,parsed.pathname,resolveRoute),result instanceof Response?maybeCaptureFetchFailure(span,result,failureRanges,method,url,gate):maybeCaptureNetworkFailure(span,result,failureRanges,method,url,gate))}function applyXhrSpanAttrs(span,xhr,failureRanges,isTrackedUrl,gate,resolveRoute){let url=xhr.responseURL||spanUrlFull(span);if(!(url&&isTrackedUrl(url)))return;let parsed;try{parsed=new URL(url)}catch{return}let method=isReadableSpan(span)?String(span.attributes[`http.request.method`]??span.attributes[`http.method`]??`XHR`):`XHR`;if(span.setAttribute(ATTR_URL_PATH,parsed.pathname),stampHttpSpanRoute(span,method,parsed.pathname,resolveRoute),!failureRanges)return;let{status}=xhr;if(typeof status==`number`){if(status===0){(!gate||gate(failureKey(`XHR`,`network`,url)))&&recordNetworkFailure(span,`network`,`XHR`,url,MECHANISM_TYPE.browser.xhrNetworkError);return}statusMatches(status,failureRanges)&&(!gate||gate(failureKey(`XHR`,status,url)))&&recordHttpFailure(span,status,`XHR`,url,MECHANISM_TYPE.browser.xhrFailedResponse)}}function resolveFetchUrl(span,request,result){return responseUrl(result)??requestUrl(request)??spanUrlFull(span)}function isReadableSpan(span){return`attributes`in span}function spanUrlFull(span){if(!isReadableSpan(span))return null;let url=span.attributes[`url.full`]??span.attributes[`http.url`];return typeof url==`string`?url:null}function responseUrl(result){return result instanceof Response&&result.url?result.url:null}function requestUrl(request){return typeof request==`string`?request:readStringProp(request,`url`)??readStringProp(request,`href`)}function resolveFetchMethod(request){return readStringProp(request,`method`)??`GET`}function readStringProp(value,key){if(!(typeof value==`object`&&value&&key in value))return null;let prop=Reflect.get(value,key);return typeof prop==`string`?prop:null}const testOnlyApplyFetchSpanAttrs=applyFetchSpanAttrs,testOnlyApplyXhrSpanAttrs=applyXhrSpanAttrs,testOnlyResolveFailureRanges=resolveFailureRanges,testOnlyCreateFailureGate=createFailureGate,testOnlyClassifyNetworkError=classifyNetworkError,NEVER_MATCH=/^$/u,ESCAPE_RE=/[.*+?^${}()|[\]\\]/gu;function sameOriginPattern(){if(typeof window>`u`)return NEVER_MATCH;let{protocol,host}=globalThis.location;return RegExp(`^${protocol}//${host.replace(ESCAPE_RE,String.raw`\$&`)}`,`u`)}function stampInteractionAttrs(eventType,element,span){let desc=describeActionable(element);span.setAttribute(`ui.event_type`,eventType),span.setAttribute(`ui.target.tag`,desc.tag),desc.id&&span.setAttribute(`ui.target.id`,desc.id),desc.name&&span.setAttribute(`ui.target.name`,desc.name),desc.role&&span.setAttribute(`ui.target.role`,desc.role),desc.ariaLabel&&span.setAttribute(`ui.target.aria_label`,desc.ariaLabel),desc.text&&span.setAttribute(`ui.target.text`,desc.text)}const PREFETCH_HEADER_NAMES=[`next-router-prefetch`,`next-router-segment-prefetch`];function isPrefetchRequest(request){let headers;try{headers=typeof Request<`u`&&request instanceof Request?request.headers:new Headers(request.headers)}catch{return!1}return PREFETCH_HEADER_NAMES.some(name=>headers.has(name))||headers.get(`purpose`)===`prefetch`||headers.get(`sec-purpose`)?.includes(`prefetch`)===!0}function escapeRegExp(value){return value.replaceAll(/[.*+?^${}()|[\]\\]/gu,String.raw`\$&`)}function apiHostToMatcher(host){return RegExp(`^https?://${escapeRegExp(host)}(:\\d+)?([/?#]|$)`,`u`)}function registerBundledInstrumentations(input){let{tracerProvider,loggerProvider,ignoreUrls,apiHosts=[],propagateContextUrls=[]}=input,{resolveRoute}=input,origin=sameOriginPattern(),propagateMatchers=[...apiHosts.map(host=>apiHostToMatcher(host)),...propagateContextUrls],fetchIgnore=[...ignoreUrls,...THIRD_PARTY_IGNORE],failureRanges=resolveFailureRanges(input.captureFailedRequests),failureGate=createFailureGate();function isTrackedUrl(url){return origin.test(url)||propagateMatchers.some(re=>re instanceof RegExp?re.test(url):url.includes(re))}let pageEventsEnabled=!1,coreInstrumentations=[new FetchInstrumentation({applyCustomAttributesOnSpan:(span,request,result)=>{applyFetchSpanAttrs(span,request,result,failureRanges,isTrackedUrl,resolveRoute,failureGate)},ignoreUrls:fetchIgnore,measureRequestSize:!0,propagateTraceHeaderCorsUrls:[origin,...propagateMatchers],requestHook:(span,request)=>{isPrefetchRequest(request)&&span.setAttribute(`http.request.prefetch`,!0)}}),new XMLHttpRequestInstrumentation({applyCustomAttributesOnSpan:(span,xhr)=>{applyXhrSpanAttrs(span,xhr,failureRanges,isTrackedUrl,failureGate,resolveRoute)},ignoreUrls:fetchIgnore,propagateTraceHeaderCorsUrls:[origin,...propagateMatchers]}),new LongTaskInstrumentation({observerCallback:(span,info)=>{stampUrlAttrs(span,resolveRoute);let containerType=info.longtaskEntry.attribution[0]?.containerType;containerType&&span.setAttribute(`longtask.container_type`,containerType)}}),new UserInteractionInstrumentation({eventNames:[`click`,`submit`],shouldPreventSpanCreation:(eventType,element,span)=>!pageEventsEnabled||eventType===`click`&&!isActionable(element)||(stampInteractionAttrs(eventType,element,span),stampUrlAttrs(span,resolveRoute),!1)})],pageEventsInstrumentations=[new DocumentLoadInstrumentation({applyCustomAttributesOnSpan:{resourceFetch:(span,entry)=>{let name=entry?.name;if(typeof name!=`string`)return;let url;try{url=new URL(name)}catch{return}let isCrossOrigin=typeof window<`u`&&url.origin!==globalThis.location.origin;span.updateName(isCrossOrigin?`resource: ${url.host}${url.pathname}`:`resource: ${url.pathname}`),span.setAttribute(ATTR_URL_FULL,name),span.setAttribute(ATTR_URL_PATH,url.pathname),span.setAttribute(`server.address`,url.host)}},enabled:!1}),new BrowserNavigationInstrumentation({enabled:!1,sanitizeUrl:defaultSanitizeUrl})],unregisterCore=registerInstrumentations(omitUndefined({tracerProvider,loggerProvider,instrumentations:coreInstrumentations})),unregisterPageEvents=null,setPageEventsEnabled=enabled=>{if(pageEventsEnabled=enabled,enabled){unregisterPageEvents??=registerInstrumentations(omitUndefined({tracerProvider,loggerProvider,instrumentations:pageEventsInstrumentations}));return}unregisterPageEvents?.(),unregisterPageEvents=null};return{dispose:()=>{setPageEventsEnabled(!1),unregisterCore()},setPageEventsEnabled}}export{registerBundledInstrumentations,testOnlyApplyFetchSpanAttrs,testOnlyApplyXhrSpanAttrs,testOnlyClassifyNetworkError,testOnlyCreateFailureGate,testOnlyResolveFailureRanges};
1
+ import{a as testOnlyCreateFailureGate,i as testOnlyClassifyNetworkError,n as testOnlyApplyFetchSpanAttrs,o as testOnlyResolveFailureRanges,r as testOnlyApplyXhrSpanAttrs,t as registerBundledInstrumentations}from"../../instrumentations-CY8NcP_M.mjs";export{registerBundledInstrumentations,testOnlyApplyFetchSpanAttrs,testOnlyApplyXhrSpanAttrs,testOnlyClassifyNetworkError,testOnlyCreateFailureGate,testOnlyResolveFailureRanges};
@@ -1 +1 @@
1
- import{stampUrlAttrs}from"./url-attrs.mjs";import{ROOT_CONTEXT,trace}from"@opentelemetry/api";const PAGE_SCOPE_MAX_AGE_MS=18e5;function startScopeContext(input,trigger,options={}){let span=input.tracer.startSpan(`navigation`,{...options,attributes:{"navigation.trigger":trigger}},ROOT_CONTEXT);return stampUrlAttrs(span,input.resolveRoute),span.end(),trace.setSpan(ROOT_CONTEXT,span)}function seedPageScope(input){return startScopeContext(input,`pageload`,{startTime:0})}function createPageScopeRotator(input){return(previous=>{let previousSpan=trace.getSpan(previous);return startScopeContext(input,`max_age`,{links:previousSpan?[{context:previousSpan.spanContext()}]:[]})})}function comparableHref(href){let url=new URL(href),pathname=url.pathname!==`/`&&url.pathname.endsWith(`/`)?url.pathname.slice(0,-1):url.pathname;return`${url.origin}${pathname}${url.search}`}function installNavigationScope(input){if(typeof window>`u`)return(()=>{});let lastHref=comparableHref(globalThis.location.href),onNavigate=trigger=>{let current=comparableHref(globalThis.location.href);current!==lastHref&&(lastHref=current,input.setPageScope(startScopeContext(input,trigger)))},originalPushState=globalThis.history.pushState,originalReplaceState=globalThis.history.replaceState;globalThis.history.pushState=function(...args){originalPushState.apply(this,args),onNavigate(`push`)},globalThis.history.replaceState=function(...args){originalReplaceState.apply(this,args),onNavigate(`replace`)};let onPopstate=()=>{onNavigate(`popstate`)};return globalThis.addEventListener(`popstate`,onPopstate),(()=>{globalThis.history.pushState=originalPushState,globalThis.history.replaceState=originalReplaceState,globalThis.removeEventListener(`popstate`,onPopstate)})}export{PAGE_SCOPE_MAX_AGE_MS,createPageScopeRotator,installNavigationScope,seedPageScope};
1
+ import{i as seedPageScope,n as createPageScopeRotator,r as installNavigationScope,t as PAGE_SCOPE_MAX_AGE_MS}from"../../navigation-DwkvuhFR.mjs";export{PAGE_SCOPE_MAX_AGE_MS,createPageScopeRotator,installNavigationScope,seedPageScope};
@@ -1 +1 @@
1
- const UUID_SEGMENT_RE=/[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}/gu,LONG_HEX_RE=/[0-9a-fA-F]{16,}/gu,DIGIT_RUN_RE=/[0-9]{2,}/gu;function normalizePath(pathname){return pathname.replaceAll(UUID_SEGMENT_RE,`{id}`).replaceAll(LONG_HEX_RE,`{hash}`).replaceAll(DIGIT_RUN_RE,`{n}`)}export{normalizePath};
1
+ import{t as normalizePath}from"../../normalize-path-BChqP8pA.mjs";export{normalizePath};
@@ -1 +1 @@
1
- import{ROOT_CONTEXT,trace}from"@opentelemetry/api";import{ZoneContextManager}from"@opentelemetry/context-zone";var PageScopeContextManager=class extends ZoneContextManager{pageScope=ROOT_CONTEXT;pageSpans=new WeakSet;pageScopeSetAtMs=0;rotator=null;maxAgeMs=1/0;rotating=!1;setPageScope(ctx){this.pageScope=ctx,this.pageScopeSetAtMs=Date.now();let span=trace.getSpan(ctx);span&&this.pageSpans.add(span)}setRotation(rotator,maxAgeMs){this.rotator=rotator,this.maxAgeMs=maxAgeMs}active(){let ctx=super.active(),span=trace.getSpan(ctx);if(span&&!this.pageSpans.has(span))return ctx;if(this.pageScope!==ROOT_CONTEXT&&this.rotator&&!this.rotating&&Date.now()-this.pageScopeSetAtMs>this.maxAgeMs){this.rotating=!0;try{this.setPageScope(this.rotator(this.pageScope))}finally{this.rotating=!1}}if(ctx===ROOT_CONTEXT)return this.pageScope;let pageSpan=trace.getSpan(this.pageScope);return pageSpan?trace.setSpan(ctx,pageSpan):ctx}};export{PageScopeContextManager};
1
+ import{t as PageScopeContextManager}from"../../page-scope-context-manager-DhArvVJ_.mjs";export{PageScopeContextManager};
@@ -1 +1 @@
1
- import{ROOT_CONTEXT,defaultTextMapGetter,trace}from"@opentelemetry/api";import{omitUndefined}from"@interfere/helpers/omit-undefined";import{W3CBaggagePropagator,W3CTraceContextPropagator}from"@opentelemetry/core";import{TRACESTATE_FRESHNESS_KEY,isFreshnessStampExpired}from"@interfere/types/sdk/trace-freshness";const TRACESTATE_META=`tracestate`,BAGGAGE_META=`baggage`,W3C_PROPAGATOR=new W3CTraceContextPropagator,W3C_BAGGAGE_PROPAGATOR=new W3CBaggagePropagator;function readMeta(name){return typeof document>`u`?null:document.querySelector(`meta[name="${name}"]`)?.getAttribute(`content`)??null}function readTracestateMeta(){if(typeof document>`u`)return null;let contents=[...document.querySelectorAll(`meta[name="${TRACESTATE_META}"]`)].flatMap(el=>{let content=el.getAttribute(`content`);return content===null?[]:[content]});return contents.find(content=>RegExp(`(?:^|,)\\s*${TRACESTATE_FRESHNESS_KEY}=`,`u`).test(content))??contents.at(0)??null}function readPropagationFromDocument(){let traceparent=readMeta(`traceparent`);if(!traceparent)return null;let carrier=omitUndefined({traceparent,[TRACESTATE_META]:readTracestateMeta()||void 0,[BAGGAGE_META]:readMeta(BAGGAGE_META)||void 0}),withTrace=W3C_PROPAGATOR.extract(ROOT_CONTEXT,carrier,defaultTextMapGetter),extracted=W3C_BAGGAGE_PROPAGATOR.extract(withTrace,carrier,defaultTextMapGetter),spanCtx=trace.getSpanContext(extracted);return!spanCtx||spanCtx.traceId===`00000000000000000000000000000000`||!(spanCtx.traceFlags&1)||isStaleTraceparent(spanCtx.traceState?.get(TRACESTATE_FRESHNESS_KEY))?null:extracted}function isStaleTraceparent(freshnessStamp){return freshnessStamp?isFreshnessStampExpired(freshnessStamp,Date.now()):!1}export{readPropagationFromDocument};
1
+ import{t as readPropagationFromDocument}from"../../propagation-DVcqCu_E.mjs";export{readPropagationFromDocument};
@@ -1,2 +1,2 @@
1
- import { n as OtelProviderInput, r as buildOtelProvider, t as OtelProviderHandle } from "../../provider-2LrbA-ld.mjs";
1
+ import { n as OtelProviderInput, r as buildOtelProvider, t as OtelProviderHandle } from "../../provider-VZtcX6ZS.mjs";
2
2
  export { OtelProviderHandle, OtelProviderInput, buildOtelProvider };
@@ -1 +1 @@
1
- import{getStringGlobal}from"../../util/global.mjs";import{n as SDK_NAME,r as SDK_VERSION}from"../../version-CsfyuVoF.mjs";import{createLogExporter,createMetricExporter,createTraceExporter}from"./exporter.mjs";import{PageScopeContextManager}from"./page-scope-context-manager.mjs";import{context,propagation}from"@opentelemetry/api";import{omitUndefined}from"@interfere/helpers/omit-undefined";import{ENVIRONMENT_GLOBAL}from"@interfere/types/sdk/injected-globals";import{CompositePropagator,W3CBaggagePropagator,W3CTraceContextPropagator}from"@opentelemetry/core";import{defaultServiceName,detectResources,resourceFromAttributes}from"@opentelemetry/resources";import{MeterProvider,PeriodicExportingMetricReader}from"@opentelemetry/sdk-metrics";import{resolveEnvironment}from"@interfere/types/sdk/runtime";import{browserDetector}from"@opentelemetry/opentelemetry-browser-detector";import{BatchLogRecordProcessor,LoggerProvider}from"@opentelemetry/sdk-logs";import{BatchSpanProcessor}from"@opentelemetry/sdk-trace-base";import{WebTracerProvider}from"@opentelemetry/sdk-trace-web";import{createSessionLogRecordProcessor,createSessionSpanProcessor}from"@opentelemetry/web-common";const ATTR_DEVICE_ID=`device.id`,BROWSER_BATCH_OPTIONS={exportTimeoutMillis:1e4,maxExportBatchSize:10,maxQueueSize:2048,scheduledDelayMillis:2e3};function createSessionBaggagePropagator(getSessionId){let propagator=new W3CBaggagePropagator;return{fields:()=>propagator.fields(),extract:(ctx,carrier,getter)=>propagator.extract(ctx,carrier,getter),inject:(ctx,carrier,setter)=>{let sessionId=getSessionId(),baggage=propagation.getBaggage(ctx)??propagation.createBaggage(),updated=sessionId?baggage.setEntry(`session.id`,{value:sessionId}):baggage.removeEntry(`session.id`);propagator.inject(propagation.setBaggage(ctx,updated),carrier,setter)}}}function createDeviceSpanProcessor(opts){return{forceFlush:async()=>Promise.resolve(),onEnd(){},onStart(span){let id=opts.getDeviceId();id&&span.setAttribute(ATTR_DEVICE_ID,id)},shutdown:async()=>Promise.resolve()}}function createDeviceLogRecordProcessor(opts){return{forceFlush:async()=>Promise.resolve(),onEmit(logRecord){let id=opts.getDeviceId();id&&logRecord.setAttribute(ATTR_DEVICE_ID,id)},shutdown:async()=>Promise.resolve()}}function stampGatedAttributes(target,opts){if(opts.isEnabled())for(let[key,value]of Object.entries(opts.attributes))value!==void 0&&target.setAttribute(key,value)}function createDeviceInfoSpanProcessor(opts){return{forceFlush:async()=>Promise.resolve(),onEnd(){},onStart:span=>{stampGatedAttributes(span,opts)},shutdown:async()=>Promise.resolve()}}function createDeviceInfoLogRecordProcessor(opts){return{forceFlush:async()=>Promise.resolve(),onEmit:logRecord=>{stampGatedAttributes(logRecord,opts)},shutdown:async()=>Promise.resolve()}}function buildOtelProvider(input){let environment=resolveEnvironment({explicit:getStringGlobal(ENVIRONMENT_GLOBAL),env:typeof process>`u`?{}:{INTERFERE_ENVIRONMENT:process.env.INTERFERE_ENVIRONMENT,NODE_ENV:process.env.NODE_ENV,VERCEL_ENV:process.env.VERCEL_ENV}}),resource=resourceFromAttributes(omitUndefined({"service.name":input.serviceName||defaultServiceName(),"service.namespace":input.serviceNamespace,"deployment.environment.name":environment,"telemetry.sdk.language":`webjs`,"interfere.sdk.name":SDK_NAME,"interfere.sdk.version":SDK_VERSION,"interfere.sdk.stack":input.sdkStack.join(`, `),"release.slug":input.releaseSlug||void 0})),deviceInfoAttributes=detectResources({detectors:[browserDetector]}).attributes,isDeviceInfoEnabled=input.isDeviceInfoEnabled??(()=>!1),traceExporter=createTraceExporter({clientOptions:input.clientOptions}),{getSessionId}=input,{getDeviceId}=input,spanProcessors=[createSessionSpanProcessor({getSessionId}),createDeviceSpanProcessor({getDeviceId}),createDeviceInfoSpanProcessor({attributes:deviceInfoAttributes,isEnabled:isDeviceInfoEnabled}),new BatchSpanProcessor(traceExporter,BROWSER_BATCH_OPTIONS),...input.additionalSpanProcessors??[]],tracerProvider=new WebTracerProvider({resource,spanProcessors}),contextManager=new PageScopeContextManager;contextManager.enable(),context.setGlobalContextManager(contextManager)||contextManager.disable();let isShutdown=!1,getPropagationSessionId=input.getPropagationSessionId??getSessionId;propagation.fields().length===0&&propagation.setGlobalPropagator(new CompositePropagator({propagators:[new W3CTraceContextPropagator,createSessionBaggagePropagator(()=>isShutdown?null:getPropagationSessionId())]}));let metricExporter=createMetricExporter({clientOptions:input.clientOptions},{attributes:deviceInfoAttributes,isEnabled:isDeviceInfoEnabled}),metricReader=new PeriodicExportingMetricReader({exportIntervalMillis:3e4,exporter:metricExporter}),meterProvider=new MeterProvider({readers:[metricReader,...input.additionalMetricReaders??[]],resource}),logExporter=createLogExporter({clientOptions:input.clientOptions}),loggerProvider=new LoggerProvider({processors:[createSessionLogRecordProcessor({getSessionId}),createDeviceLogRecordProcessor({getDeviceId}),createDeviceInfoLogRecordProcessor({attributes:deviceInfoAttributes,isEnabled:isDeviceInfoEnabled}),new BatchLogRecordProcessor({exporter:logExporter,...BROWSER_BATCH_OPTIONS}),...input.additionalLogRecordProcessors??[]],resource});return{contextManager,flush:async()=>{await Promise.allSettled([tracerProvider.forceFlush(),metricReader.forceFlush(),loggerProvider.forceFlush()])},loggerProvider,meterProvider,metricReader,shutdown:async()=>{isShutdown=!0,await Promise.allSettled([tracerProvider.shutdown(),meterProvider.shutdown(),loggerProvider.shutdown()])},tracerProvider}}export{buildOtelProvider};
1
+ import{t as buildOtelProvider}from"../../provider-NuAexTzU.mjs";export{buildOtelProvider};
@@ -1 +1 @@
1
- const ATTR_HTTP_ROUTE=`http.route`,ATTR_URL_FULL=`url.full`,ATTR_URL_PATH=`url.path`;function stampUrlAttrs(span,resolveRoute){if(typeof window>`u`)return;let{pathname}=globalThis.location,route=resolveRoute?.(pathname);span.setAttribute(ATTR_URL_PATH,route??pathname),span.setAttribute(ATTR_URL_FULL,globalThis.location.href),route&&span.setAttribute(ATTR_HTTP_ROUTE,route)}export{ATTR_HTTP_ROUTE,ATTR_URL_FULL,ATTR_URL_PATH,stampUrlAttrs};
1
+ import{i as stampUrlAttrs,n as ATTR_URL_FULL,r as ATTR_URL_PATH,t as ATTR_HTTP_ROUTE}from"../../url-attrs-BdcyE2n6.mjs";export{ATTR_HTTP_ROUTE,ATTR_URL_FULL,ATTR_URL_PATH,stampUrlAttrs};
@@ -1 +1 @@
1
- import{omitUndefined}from"@interfere/helpers/omit-undefined";import{onCLS,onFCP,onINP,onLCP,onTTFB}from"web-vitals";const LOAD_VITALS=new Set([`TTFB`,`FCP`,`LCP`]);function captureWebVitals(input){if(typeof window>`u`)return;let{meter,resolveRoute,flush}=input,lcp=meter.createHistogram(`web_vitals.lcp`,{advice:{explicitBucketBoundaries:[.5,1,1.5,2,2.5,3,4,5,7.5,10]},description:`Largest Contentful Paint`,unit:`s`}),fcp=meter.createHistogram(`web_vitals.fcp`,{advice:{explicitBucketBoundaries:[.5,1,1.5,1.8,2,2.5,3,4,5,7.5]},description:`First Contentful Paint`,unit:`s`}),ttfb=meter.createHistogram(`web_vitals.ttfb`,{advice:{explicitBucketBoundaries:[.1,.2,.3,.5,.8,1,1.5,2,3,5]},description:`Time to First Byte`,unit:`s`}),inp=meter.createHistogram(`web_vitals.inp`,{advice:{explicitBucketBoundaries:[.05,.1,.15,.2,.3,.4,.5,.75,1,2]},description:`Interaction to Next Paint`,unit:`s`}),vitals={CLS:{histogram:meter.createHistogram(`web_vitals.cls`,{advice:{explicitBucketBoundaries:[.01,.025,.05,.075,.1,.15,.2,.25,.5,1]},description:`Cumulative Layout Shift`,unit:`1`}),toSeconds:!1},FCP:{histogram:fcp,toSeconds:!0},INP:{histogram:inp,toSeconds:!0},LCP:{histogram:lcp,toSeconds:!0},TTFB:{histogram:ttfb,toSeconds:!0}},received=new Set,flushed=!1;function report(metric){let entry=vitals[metric.name];if(entry===void 0)return;let value=entry.toSeconds?metric.value*.001:metric.value,{pathname}=globalThis.location,route=resolveRoute?.(pathname)??pathname;entry.histogram.record(value,omitUndefined({"url.path":route,"web_vital.rating":metric.rating||void 0,"web_vital.navigation_type":metric.navigationType||void 0})),!flushed&&LOAD_VITALS.has(metric.name)&&(received.add(metric.name),received.size===LOAD_VITALS.size&&(flushed=!0,flush().catch(()=>{})))}onLCP(report),onCLS(report),onINP(report),onTTFB(report),onFCP(report)}export{captureWebVitals};
1
+ import{t as captureWebVitals}from"../../web-vitals-CxXDUgpl.mjs";export{captureWebVitals};
@@ -1,4 +1,4 @@
1
- //#region src/internal/page-lifecycle.d.ts
1
+ //#region src/internal/page-lifecycle/page-lifecycle.d.ts
2
2
  type Handler = () => void;
3
3
  export declare function onPageHidden(handler: Handler): () => void;
4
4
  export declare function onPageShown(handler: Handler): () => void;
@@ -0,0 +1 @@
1
+ import{n as onPageShown,r as resetPageLifecycleForTests,t as onPageHidden}from"../../page-lifecycle-BhSFqjlK.mjs";export{onPageHidden,onPageShown,resetPageLifecycleForTests};
@@ -0,0 +1,2 @@
1
+ import { y as PluginRuntime } from "../../provider-C68KiG80.mjs";
2
+ export { PluginRuntime };
@@ -0,0 +1 @@
1
+ import{t as PluginRuntime}from"../../plugin-runtime-CnFVGbJw.mjs";export{PluginRuntime};
@@ -1,2 +1,2 @@
1
- import { a as InterfereContextValue, i as InterfereContext, o as NULL_CONTEXT_VALUE } from "../provider-DWgb6tn9.mjs";
1
+ import { a as InterfereContextValue, i as InterfereContext, o as NULL_CONTEXT_VALUE } from "../provider-C68KiG80.mjs";
2
2
  export { InterfereContext, InterfereContextValue, NULL_CONTEXT_VALUE };
@@ -1 +1 @@
1
- "use client";import{createContext}from"react";const NULL_CONTEXT_VALUE={consent:{get:()=>null,set:()=>{}},device:{getDeviceId:()=>null,getFpHash:()=>null},identity:{clear:()=>{},get:()=>null,set:async()=>Promise.resolve()},kernel:null,session:{getId:()=>null,getWindowId:()=>null}},InterfereContext=createContext(null);export{InterfereContext,NULL_CONTEXT_VALUE};
1
+ "use client";import{n as NULL_CONTEXT_VALUE,t as InterfereContext}from"../react-context-c1uTUJfB.mjs";export{InterfereContext,NULL_CONTEXT_VALUE};
@@ -1 +1 @@
1
- function hasServerDigest(value){return typeof value==`object`&&!!value&&`digest`in value&&typeof value.digest==`string`}export{hasServerDigest};
1
+ import{t as hasServerDigest}from"../server-digest-CzGdvjW1.mjs";export{hasServerDigest};
@@ -1 +1 @@
1
- const THIRD_PARTY_IGNORE=[/(?:^|\/\/)clerk\./u,/\.clerk\./u,/\.sentry\./u,/\.intercom\./u,/\.posthog\./u,/\.googletagmanager\.com/u,/\.google-analytics\.com/u,/\.googleapis\.com/u,/\.doubleclick\.net/u,/\.facebook\.com/u,/\.fbcdn\.net/u,/\.analytics\.google\.com/u,/px\.ads\.linkedin\.com/u,/\/__nextjs_/u];export{THIRD_PARTY_IGNORE};
1
+ import{t as THIRD_PARTY_IGNORE}from"../third-party-hosts-BoJNL3xG.mjs";export{THIRD_PARTY_IGNORE};
@@ -1 +1 @@
1
- import{n as SDK_NAME,r as SDK_VERSION,t as PRODUCER_VERSION}from"../version-CsfyuVoF.mjs";export{PRODUCER_VERSION,SDK_NAME,SDK_VERSION};
1
+ import{n as SDK_NAME,r as SDK_VERSION,t as PRODUCER_VERSION}from"../version-BuN6IItu.mjs";export{PRODUCER_VERSION,SDK_NAME,SDK_VERSION};
@@ -1,4 +1,4 @@
1
- import { f as KernelOptions, s as Kernel } from "../provider-DWgb6tn9.mjs";
1
+ import { f as KernelOptions, s as Kernel } from "../provider-C68KiG80.mjs";
2
2
  import { ConsentInput, ConsentState } from "@interfere/types/sdk/plugins/manifest";
3
3
  import { IdentifyParams } from "@interfere/types/sdk/identify";
4
4
  //#region src/internal/wrapper-singleton.d.ts
@@ -1 +1 @@
1
- import{registerKernel,unregisterKernel}from"./kernel-registry.mjs";import{isForceEnableActive}from"./config.mjs";import{createKernel,isEnabledByEnvironment}from"./kernel.mjs";import{isBotUserAgent}from"../util/bot.mjs";function createWrapperSingleton(input){let kernel=null,pending=null,listeners=new Set;function emit(){for(let listener of listeners)listener()}async function initKernel(internalOpts){try{let k=await createKernel({opts:internalOpts});return kernel=k,registerKernel(k),emit(),k}finally{pending=null}}return{async close(){if(!kernel)return;let previous=kernel;await previous.dispose(),kernel=null,unregisterKernel(previous),emit()},consent:{get:()=>kernel?.consent.get()??null,set:value=>kernel?.consent.set(value)},getKernel(){if(!kernel)throw Error(`Interfere SDK not initialized. Call init() from your ${input.initEntryName} entrypoint.`);return kernel},getKernelOrNull(){return kernel},identity:{clear:()=>kernel?.identity.clear(),get:()=>kernel?.identity.get()??null,set:async params=>kernel?.identity.set(params)??Promise.resolve()},async init(opts={}){return kernel||pending||(!(opts.enabled??isEnabledByEnvironment())||!isForceEnableActive()&&isBotUserAgent()?null:(pending=initKernel({...opts,_wrapperVersions:[input.producerVersion]}),pending))},subscribeToKernel(listener){return listeners.add(listener),(()=>{listeners.delete(listener)})}}}export{createWrapperSingleton};
1
+ import{n as registerKernel,r as unregisterKernel}from"../kernel-registry-6f-3VCIy.mjs";import{t as isForceEnableActive}from"../config-Bm8myQlS.mjs";import{t as isEnabledByEnvironment}from"../environment-CoEXhF1a.mjs";import{r as createKernel}from"../kernel-BD57JxiH.mjs";import{n as isBotUserAgent}from"../bot-YLSbnCeg.mjs";function createWrapperSingleton(input){let kernel=null,pending=null,listeners=new Set;function emit(){for(let listener of listeners)listener()}async function initKernel(internalOpts){try{let k=await createKernel({opts:internalOpts});return kernel=k,registerKernel(k),emit(),k}finally{pending=null}}return{async close(){if(!kernel)return;let previous=kernel;await previous.dispose(),kernel=null,unregisterKernel(previous),emit()},consent:{get:()=>kernel?.consent.get()??null,set:value=>kernel?.consent.set(value)},getKernel(){if(!kernel)throw Error(`Interfere SDK not initialized. Call init() from your ${input.initEntryName} entrypoint.`);return kernel},getKernelOrNull(){return kernel},identity:{clear:()=>kernel?.identity.clear(),get:()=>kernel?.identity.get()??null,set:async params=>kernel?.identity.set(params)??Promise.resolve()},async init(opts={}){return kernel||pending||(!(opts.enabled??isEnabledByEnvironment())||!isForceEnableActive()&&isBotUserAgent()?null:(pending=initKernel({...opts,_wrapperVersions:[input.producerVersion]}),pending))},subscribeToKernel(listener){return listeners.add(listener),(()=>{listeners.delete(listener)})}}}export{createWrapperSingleton};
@@ -0,0 +1 @@
1
+ import{t as createLogger}from"./log-D6Ht--tv.mjs";import{t as getGlobal}from"./global-DYq1Z4_H.mjs";import{n as resolveTargets,r as setIngestHost}from"./config-Bm8myQlS.mjs";import{t as onPageHidden}from"./page-lifecycle-BhSFqjlK.mjs";import{t as SessionTracker}from"./api-DXmjUMZE.mjs";import{t as safeStringify}from"./stringify-DvuHsAT4.mjs";import{a as resolvePrivacyPolicy}from"./privacy-CRuL0X8r.mjs";import{t as PRODUCER_VERSION}from"./version-BuN6IItu.mjs";import{t as INGEST_IGNORE_RE}from"./exporter-DjvOtWYJ.mjs";import{t as recordInitialNavigation}from"./initial-navigation-YeK6UUHX.mjs";import{t as PluginRuntime}from"./plugin-runtime-CnFVGbJw.mjs";import{isNonErrorException,shouldDropBrowserExtensionNoise,shouldDropUnresolvableStack,toExceptions}from"@interfere/types/sdk/errors";import{trace}from"@opentelemetry/api";import{omitUndefined}from"@interfere/helpers/omit-undefined";import{FORCE_ENABLE_GLOBAL,RELEASE_SLUG_GLOBAL,SDK_STACK_GLOBAL}from"@interfere/types/sdk/injected-globals";import{InterfereClient}from"@interfere/javascript";import{releaseSlugSchema}from"@interfere/types/releases/slug";import{readBakedPlugins,remoteConfigInputSchema}from"@interfere/types/sdk/remote-config";import{redactUrl,resolveUrlRedaction}from"@interfere/types/sdk/url-redaction";const log=createLogger(`kernel`),REPLAY_UPLOAD_RE=/\/v3\/replay\/upload\//u;function buildSdkStack(wrapperVersions){return[...wrapperVersions??[],PRODUCER_VERSION]}function buildExceptionEventAttrs(value,opts){let attrs={"interfere.exception.handled":opts.mechanism.handled,"interfere.exception.mechanism":opts.mechanism.type};if(opts.errorDigest&&(attrs[`interfere.error.digest`]=opts.errorDigest),opts.subtype&&(attrs[`interfere.exception.subtype`]=opts.subtype),isNonErrorException(value))return attrs[`exception.type`]=value.type,attrs[`exception.message`]=value.value,attrs[`interfere.exception.kind`]=`non-error`,attrs[`interfere.exception.serialized`]=safeStringify(value.serialized),attrs;attrs[`exception.type`]=value.name,attrs[`exception.message`]=value.message,attrs[`interfere.exception.kind`]=`error`,value.stack&&(attrs[`exception.stacktrace`]=value.stack),attrs[`interfere.exception.chain`]=safeStringify(toExceptions(value,opts.mechanism));let debugIds=getGlobal(`_debugIds`);return typeof debugIds==`object`&&debugIds&&Object.keys(debugIds).length>0&&(attrs[`interfere.exception.debug_ids`]=safeStringify(debugIds)),opts.appendFrames&&opts.appendFrames.length>0&&(attrs[`interfere.exception.appended_frames`]=safeStringify(opts.appendFrames)),opts.fallbackFrames&&opts.fallbackFrames.length>0&&(attrs[`interfere.exception.fallback_frames`]=safeStringify(opts.fallbackFrames)),attrs}var Kernel=class{consent;identity;device;session;privacyPolicy;urlRedaction;redactUrl=url=>redactUrl(url,this.urlRedaction);seen=new WeakSet;initialNavigationSeen=new Set;runtime=null;otel=null;otelDispose=null;otelControls=null;deviceInfoCaptureEnabled=!1;unsubscribePageHidden=null;tracker;constructor(tracker,privacy={}){this.tracker=tracker,this.privacyPolicy=resolvePrivacyPolicy(privacy),this.urlRedaction=resolveUrlRedaction(privacy.urls),this.consent={get:()=>this.requireRuntime().getConsent(),set:value=>{let runtime=this.requireRuntime();value===void 0?runtime.resetConsent():runtime.setConsent(value)}},this.identity={clear:()=>{this.tracker.reset()},get:()=>this.tracker.getIdentity(),set:async params=>this.tracker.identify(params)},this.device={getDeviceId:()=>this.tracker.getDeviceId(),getFpHash:()=>this.tracker.getFpHash()},this.session={getId:()=>this.tracker.sessionId(),getWindowId:()=>this.tracker.windowId()},this.unsubscribePageHidden=onPageHidden(()=>{this.flush().catch(()=>{})})}attachRuntime(runtime){this.runtime=runtime}requireRuntime(){if(!this.runtime)throw Error(`Kernel runtime not attached. createKernel must call attachRuntime before any consent/dispose path runs.`);return this.runtime}getSessionId(){return this.tracker.sessionId()??``}getWindowId(){return this.tracker.windowId()??``}onSessionPause(handler){return this.tracker.onSessionPause(handler)}onSessionResume(handler){return this.tracker.onSessionResume(handler)}getPluginConfigState(key){return this.requireRuntime().getPluginConfigState(key)}getReplayConfig(){return this.requireRuntime().getReplayConfig()}isInteractionCaptureEnabled(){return this.requireRuntime().isInteractionCaptureEnabled()}subscribePluginConfigState(key,listener){return this.requireRuntime().subscribePluginConfigState(key,listener)}getTracer(name){return this.otel?.tracerProvider.getTracer(name)??trace.getTracer(name)}startPageEventsCapture(){let{otelControls:controls,otel}=this;return!controls||!otel?null:(controls.setPageEventsEnabled(!0),this.recordInitialNavigation(otel.loggerProvider),(()=>{controls.setPageEventsEnabled(!1)}))}startDeviceInfoCapture(){return this.tracker.startDeviceIdentity(),this.deviceInfoCaptureEnabled=!0,(reason=>{this.deviceInfoCaptureEnabled=!1,reason===`consent-revoked`&&this.tracker.discardDeviceIdentity()})}isDeviceInfoCaptureEnabled(){return this.deviceInfoCaptureEnabled}recordException(value,opts){if(!isNonErrorException(value)){if(this.seen.has(value))return;this.seen.add(value)}if(!isNonErrorException(value)){let stacks=[],current=value;for(let depth=0;current&&depth<5;depth+=1)current.stack&&stacks.push(current.stack),current=current.cause instanceof Error?current.cause:void 0;if(shouldDropBrowserExtensionNoise(stacks)||shouldDropUnresolvableStack(stacks))return}let attrs=buildExceptionEventAttrs(value,opts),active=trace.getActiveSpan();if(active?.isRecording()){active.addEvent(`exception`,attrs);return}let span=this.otel?.tracerProvider.getTracer(`@interfere/react/exception`).startSpan(`interfere.exception.capture`);span&&(span.addEvent(`exception`,attrs),span.end())}recordLog(input){this.otel&&this.otel.loggerProvider.getLogger(`@interfere/react`).emit(omitUndefined({body:input.body,severityNumber:input.severityNumber,severityText:input.severityText,attributes:input.attributes}))}recordInitialNavigation(loggerProvider){recordInitialNavigation({getSessionId:()=>this.session.getId(),getWindowId:()=>this.session.getWindowId(),loggerProvider,redactUrl:this.redactUrl,seen:this.initialNavigationSeen})}async flush(){this.otel&&await this.otel.flush()}attachOtel(handle,dispose,controls){this.otel=handle,this.otelDispose=dispose,this.otelControls=controls??null}syncProviderConfig(config){this.requireRuntime().applyProviderConfig(config.plugins,config.consent)}async dispose(){this.unsubscribePageHidden?.(),this.unsubscribePageHidden=null,this.runtime&&await this.runtime.dispose(),this.tracker.dispose(),this.otelDispose?.(),this.otelDispose=null,this.otel&&=(await this.otel.shutdown(),null)}};async function createKernel(input={}){let{opts={}}=input,fetcher=opts.fetch??globalThis.fetch.bind(globalThis),remotePlugins=await resolveRemotePlugins(opts,fetcher),targets=resolveTargets(opts.apiHost);log.info(`ingest: %s`,targets.ingest.baseUrl),getGlobal(FORCE_ENABLE_GLOBAL)&&log.warn(`FORCE_ENABLE is active. Events will be dropped by production ingest. This should only be set during local development.`);let tracker=new SessionTracker({fetcher,target:targets.ingest});opts._wrapperVersions?.length&&Object.assign(globalThis,{[SDK_STACK_GLOBAL]:opts._wrapperVersions});let kernel=new Kernel(tracker,opts.privacy),runtime=new PluginRuntime(kernel,opts.consent,remotePlugins??{});if(kernel.attachRuntime(runtime),tracker.start(),runtime.start(),opts.tracing!==!1){let resolvedTracing={...typeof opts.tracing==`object`?opts.tracing:void 0};opts.serviceName&&(resolvedTracing.serviceName=opts.serviceName),opts.serviceNamespace!==void 0&&(resolvedTracing.serviceNamespace=opts.serviceNamespace),opts._internalAdditionalSpanProcessors&&(resolvedTracing.additionalSpanProcessors=opts._internalAdditionalSpanProcessors),opts._internalAdditionalLogRecordProcessors&&(resolvedTracing.additionalLogRecordProcessors=opts._internalAdditionalLogRecordProcessors),opts._internalAdditionalMetricReaders&&(resolvedTracing.additionalMetricReaders=opts._internalAdditionalMetricReaders),await wireOtel(kernel,targets,opts._wrapperVersions,resolvedTracing)}return remotePlugins?runtime.applyRemoteConfig(remotePlugins):runtime.applyRemoteConfigDefaults(),kernel}async function resolveRemotePlugins(opts,fetcher){let baked=readBakedPlugins();if(baked)return baked;let remoteConfig=await fetchRemoteConfig(resolveTargets(opts.apiHost).config,fetcher);return remoteConfig?.ingestUrl&&setIngestHost(remoteConfig.ingestUrl),remoteConfig?.plugins??null}async function wireOtel(kernel,targets,wrapperVersions,tracing){let{buildOtelProvider,captureWebVitals,createPageScopeRotator,installNavigationScope,PAGE_SCOPE_MAX_AGE_MS,readPropagationFromDocument,registerBundledInstrumentations,seedPageScope}=await import(`./internal/otel/index.mjs`),releaseSlug=readReleaseSlugFromGlobals(),handle=buildOtelProvider(omitUndefined({clientOptions:targets.ingest,getDeviceId:()=>kernel.device.getDeviceId(),getSessionId:()=>kernel.session.getId(),getPropagationSessionId:()=>kernel.consent.get()?.analytics===!1?null:kernel.session.getId(),isDeviceInfoEnabled:()=>kernel.isDeviceInfoCaptureEnabled(),releaseSlug,sdkStack:buildSdkStack(wrapperVersions),serviceName:tracing.serviceName||void 0,serviceNamespace:tracing.serviceNamespace,additionalSpanProcessors:[...tracing.spanProcessors??[],...tracing.additionalSpanProcessors??[]],additionalLogRecordProcessors:tracing.additionalLogRecordProcessors,additionalMetricReaders:tracing.additionalMetricReaders,urlRedaction:kernel.urlRedaction})),scopeSpanInput=omitUndefined({tracer:handle.tracerProvider.getTracer(`@interfere/react/navigation`),resolveRoute:tracing.resolveRoute}),extracted=readPropagationFromDocument();handle.contextManager.setPageScope(extracted??seedPageScope(scopeSpanInput)),handle.contextManager.setRotation(createPageScopeRotator(scopeSpanInput),PAGE_SCOPE_MAX_AGE_MS);let disposeNavigationScope=installNavigationScope({...scopeSpanInput,setPageScope:ctx=>{handle.contextManager.setPageScope(ctx)}}),instrumentations=registerBundledInstrumentations(omitUndefined({tracerProvider:handle.tracerProvider,loggerProvider:handle.loggerProvider,ignoreUrls:[INGEST_IGNORE_RE,`${targets.config.baseUrl}/v3/config`,`${targets.ingest.baseUrl}/v3/session`,REPLAY_UPLOAD_RE],apiHosts:tracing.apiHosts,propagateContextUrls:tracing.propagateContextUrls,resolveRoute:tracing.resolveRoute,captureFailedRequests:tracing.captureFailedRequests,redactUrl:kernel.redactUrl,privacyPolicy:kernel.privacyPolicy,isInteractionCaptureEnabled:()=>kernel.isInteractionCaptureEnabled()}));tracing.webVitals!==!1&&captureWebVitals(omitUndefined({flush:async()=>handle.flush(),meter:handle.meterProvider.getMeter(`@interfere/react/web-vitals`),resolveRoute:tracing.resolveRoute})),kernel.attachOtel(handle,()=>{disposeNavigationScope(),instrumentations.dispose()},{setPageEventsEnabled:instrumentations.setPageEventsEnabled})}async function fetchRemoteConfig(configTarget,fetcher){try{let client=new InterfereClient({...configTarget,fetch:Object.assign(async(url,init)=>fetcher(url,{...init,credentials:`omit`}),fetcher)});return remoteConfigInputSchema.parse(await client.config.getSdkConfig())}catch{return log.warn(`remote config fetch failed, using local defaults`),null}}function readReleaseSlugFromGlobals(){let value=getGlobal(RELEASE_SLUG_GLOBAL);return typeof value==`string`?releaseSlugSchema.parse(value):null}export{readReleaseSlugFromGlobals as i,buildSdkStack as n,createKernel as r,Kernel as t};
@@ -0,0 +1 @@
1
+ import{t as createLogger}from"./log-D6Ht--tv.mjs";const log=createLogger(`kernel-registry`);let active=null;function registerKernel(kernel){active&&active!==kernel&&log.warn(`init() called twice with different kernels; later one wins. The public capture()/span() helpers route only to the latest kernel — multi-surface apps should call kernel.recordException() directly.`),active=kernel}function unregisterKernel(kernel){active===kernel&&(active=null)}function activeKernel(){return active}export{registerKernel as n,unregisterKernel as r,activeKernel as t};
@@ -0,0 +1 @@
1
+ import{t as createLogger}from"./log-D6Ht--tv.mjs";import{t as errorsPlugin}from"./errors-BDmCWb5z.mjs";import{PLUGIN_MANIFEST}from"@interfere/types/sdk/plugins/manifest";const log=createLogger(`plugins`),LOADERS={device:async()=>import(`./plugins/device.mjs`),errors:()=>errorsPlugin,logs:async()=>import(`./plugins/logs.mjs`),pageEvents:async()=>import(`./plugins/page-events.mjs`),rageClick:async()=>import(`./plugins/rage-clicks.mjs`),replay:async()=>import(`./plugins/replay/index.mjs`)},DEFAULTS=Object.fromEntries(PLUGIN_MANIFEST.map(p=>[p.name,p.defaultEnabled]));function resolveFeatures(overrides){if(!overrides)return{...DEFAULTS};let{pageEvents,replay,...rest}=overrides;return{...DEFAULTS,...rest,pageEvents:pageEvents===void 0?DEFAULTS.pageEvents:pageEvents!==!1,replay:replay===void 0?DEFAULTS.replay:replay!==!1}}function resolvePlugin(mod){return`default`in mod?mod.default:mod}async function loadPlugin(key,context){let loader=LOADERS[key];if(loader===void 0)return null;try{let cleanup=resolvePlugin(await loader()).setup(context);return log.debug(`loaded %s`,key),cleanup??null}catch{return log.error(`failed to load plugin %s`,key),null}}export{loadPlugin as n,resolveFeatures as r,LOADERS as t};
@@ -0,0 +1 @@
1
+ const PRIORITY={debug:0,error:3,info:1,none:4,warn:2},CONSOLE_FN={debug:`debug`,error:`error`,info:`info`,warn:`warn`};let currentLevel=`warn`;function setLogLevel(level){currentLevel=level}function getLogLevel(){return currentLevel}function emit(level,prefix,args){if(PRIORITY[level]<PRIORITY[currentLevel])return;let fn=CONSOLE_FN[level];globalThis.console[fn](prefix,...args)}function createLogger(scope){let prefix=`[Interfere:${scope}]`;return{debug:(...args)=>{emit(`debug`,prefix,args)},error:(...args)=>{emit(`error`,prefix,args)},info:(...args)=>{emit(`info`,prefix,args)},warn:(...args)=>{emit(`warn`,prefix,args)}}}export{getLogLevel as n,setLogLevel as r,createLogger as t};
@@ -0,0 +1 @@
1
+ import{i as stampUrlAttrs}from"./url-attrs-BdcyE2n6.mjs";import{ROOT_CONTEXT,trace}from"@opentelemetry/api";const PAGE_SCOPE_MAX_AGE_MS=18e5;function startScopeContext(input,trigger,options={}){let span=input.tracer.startSpan(`navigation`,{...options,attributes:{"navigation.trigger":trigger}},ROOT_CONTEXT);return stampUrlAttrs(span,input.resolveRoute),span.end(),trace.setSpan(ROOT_CONTEXT,span)}function seedPageScope(input){return startScopeContext(input,`pageload`,{startTime:0})}function createPageScopeRotator(input){return(previous=>{let previousSpan=trace.getSpan(previous);return startScopeContext(input,`max_age`,{links:previousSpan?[{context:previousSpan.spanContext()}]:[]})})}function comparableHref(href){let url=new URL(href),pathname=url.pathname!==`/`&&url.pathname.endsWith(`/`)?url.pathname.slice(0,-1):url.pathname;return`${url.origin}${pathname}${url.search}`}function installNavigationScope(input){if(typeof window>`u`)return(()=>{});let lastHref=comparableHref(globalThis.location.href),onNavigate=trigger=>{let current=comparableHref(globalThis.location.href);current!==lastHref&&(lastHref=current,input.setPageScope(startScopeContext(input,trigger)))},originalPushState=globalThis.history.pushState,originalReplaceState=globalThis.history.replaceState;globalThis.history.pushState=function(...args){originalPushState.apply(this,args),onNavigate(`push`)},globalThis.history.replaceState=function(...args){originalReplaceState.apply(this,args),onNavigate(`replace`)};let onPopstate=()=>{onNavigate(`popstate`)};return globalThis.addEventListener(`popstate`,onPopstate),(()=>{globalThis.history.pushState=originalPushState,globalThis.history.replaceState=originalReplaceState,globalThis.removeEventListener(`popstate`,onPopstate)})}export{seedPageScope as i,createPageScopeRotator as n,installNavigationScope as r,PAGE_SCOPE_MAX_AGE_MS as t};
@@ -0,0 +1 @@
1
+ const UUID_SEGMENT_RE=/[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}/gu,LONG_HEX_RE=/[0-9a-fA-F]{16,}/gu,DIGIT_RUN_RE=/[0-9]{2,}/gu;function normalizePath(pathname){return pathname.replaceAll(UUID_SEGMENT_RE,`{id}`).replaceAll(LONG_HEX_RE,`{hash}`).replaceAll(DIGIT_RUN_RE,`{n}`)}export{normalizePath as t};
@@ -0,0 +1,12 @@
1
+ //#region src/plugins/page-events-config.d.ts
2
+ interface PageEventsConfig {
3
+ /**
4
+ * `false` stops click and submit capture while navigation, document-load
5
+ * and resource timing continue. Defaults to `true`.
6
+ */
7
+ interactions?: boolean;
8
+ }
9
+ /** `true` enables page events, `false` disables them, and an object enables them with that config. */
10
+ type PageEventsOption = boolean | PageEventsConfig;
11
+ //#endregion
12
+ export { PageEventsOption as n, PageEventsConfig as t };
@@ -1 +1 @@
1
- const hiddenHandlers=new Set,shownHandlers=new Set;let installed=!1;function fire(set){for(let handler of set)handler()}function fireHidden(){fire(hiddenHandlers)}function fireShown(){fire(shownHandlers)}function onVisibilityChange(){if(!(typeof document>`u`)){if(document.visibilityState===`hidden`){fireHidden();return}fireShown()}}function install(){installed||typeof globalThis.addEventListener!=`function`||(installed=!0,globalThis.addEventListener(`visibilitychange`,onVisibilityChange),globalThis.addEventListener(`beforeunload`,fireHidden))}function onPageHidden(handler){return install(),hiddenHandlers.add(handler),(()=>{hiddenHandlers.delete(handler)})}function onPageShown(handler){return install(),shownHandlers.add(handler),(()=>{shownHandlers.delete(handler)})}function resetPageLifecycleForTests(){hiddenHandlers.clear(),shownHandlers.clear(),installed&&typeof globalThis.removeEventListener==`function`&&(globalThis.removeEventListener(`visibilitychange`,onVisibilityChange),globalThis.removeEventListener(`beforeunload`,fireHidden)),installed=!1}export{onPageHidden,onPageShown,resetPageLifecycleForTests};
1
+ const hiddenHandlers=new Set,shownHandlers=new Set;let installed=!1;function fire(set){for(let handler of set)handler()}function fireHidden(){fire(hiddenHandlers)}function fireShown(){fire(shownHandlers)}function onVisibilityChange(){if(!(typeof document>`u`)){if(document.visibilityState===`hidden`){fireHidden();return}fireShown()}}function install(){installed||typeof globalThis.addEventListener!=`function`||(installed=!0,globalThis.addEventListener(`visibilitychange`,onVisibilityChange),globalThis.addEventListener(`beforeunload`,fireHidden))}function onPageHidden(handler){return install(),hiddenHandlers.add(handler),(()=>{hiddenHandlers.delete(handler)})}function onPageShown(handler){return install(),shownHandlers.add(handler),(()=>{shownHandlers.delete(handler)})}function resetPageLifecycleForTests(){hiddenHandlers.clear(),shownHandlers.clear(),installed&&typeof globalThis.removeEventListener==`function`&&(globalThis.removeEventListener(`visibilitychange`,onVisibilityChange),globalThis.removeEventListener(`beforeunload`,fireHidden)),installed=!1}export{onPageShown as n,resetPageLifecycleForTests as r,onPageHidden as t};