@interfere/react 11.1.1 → 12.0.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 (136) hide show
  1. package/README.md +4 -4
  2. package/dist/activity-BfYxFVcK.d.mts +36 -0
  3. package/dist/api-wpS4xoMY.d.mts +70 -0
  4. package/dist/api.d.mts +8 -7
  5. package/dist/api.mjs +1 -1
  6. package/dist/config-Rm-ct4K1.d.mts +12 -0
  7. package/dist/device-vFtWy12y.d.mts +35 -0
  8. package/dist/error-boundary.d.mts +7 -7
  9. package/dist/error-boundary.mjs +1 -1
  10. package/dist/exporter-logs-CeGwMiMo.d.mts +51 -0
  11. package/dist/geo-PDfIZY4L.d.mts +16 -0
  12. package/dist/index-CatPKbtv.d.mts +4 -0
  13. package/dist/instrumentations-Bgm2EazU.d.mts +91 -0
  14. package/dist/internal/activity.d.mts +1 -35
  15. package/dist/internal/activity.mjs +1 -1
  16. package/dist/internal/browser-context.d.mts +44 -4
  17. package/dist/internal/browser-context.mjs +1 -1
  18. package/dist/internal/capture-boundary.d.mts +6 -5
  19. package/dist/internal/capture-boundary.mjs +1 -1
  20. package/dist/internal/capture.d.mts +3 -4
  21. package/dist/internal/capture.mjs +1 -1
  22. package/dist/internal/config.d.mts +26 -27
  23. package/dist/internal/config.mjs +1 -1
  24. package/dist/internal/consent.d.mts +16 -8
  25. package/dist/internal/console-patch.d.mts +6 -7
  26. package/dist/internal/console-patch.mjs +1 -1
  27. package/dist/internal/dom/actionable.d.mts +5 -7
  28. package/dist/internal/dom/actionable.mjs +1 -1
  29. package/dist/internal/hydration.d.mts +2 -3
  30. package/dist/internal/kernel-registry.d.mts +5 -6
  31. package/dist/internal/kernel.d.mts +2 -292
  32. package/dist/internal/kernel.mjs +1 -1
  33. package/dist/internal/otel/exporter-logs.d.mts +1 -12
  34. package/dist/internal/otel/exporter-logs.mjs +1 -1
  35. package/dist/internal/otel/exporter-metrics.d.mts +2 -14
  36. package/dist/internal/otel/exporter-metrics.mjs +1 -1
  37. package/dist/internal/otel/exporter.d.mts +2 -29
  38. package/dist/internal/otel/exporter.mjs +1 -1
  39. package/dist/internal/otel/http-span-route.d.mts +4 -0
  40. package/dist/internal/otel/http-span-route.mjs +1 -0
  41. package/dist/internal/otel/index.d.mts +7 -5
  42. package/dist/internal/otel/index.mjs +1 -1
  43. package/dist/internal/otel/initial-navigation.d.mts +3 -4
  44. package/dist/internal/otel/initial-navigation.mjs +1 -1
  45. package/dist/internal/otel/instrumentations.d.mts +2 -89
  46. package/dist/internal/otel/instrumentations.mjs +1 -1
  47. package/dist/internal/otel/navigation.d.mts +2 -0
  48. package/dist/internal/otel/navigation.mjs +1 -0
  49. package/dist/internal/otel/normalize-path.d.mts +9 -0
  50. package/dist/internal/otel/normalize-path.mjs +1 -0
  51. package/dist/internal/otel/page-scope-context-manager.d.mts +2 -31
  52. package/dist/internal/otel/page-scope-context-manager.mjs +1 -1
  53. package/dist/internal/otel/propagation.d.mts +1 -19
  54. package/dist/internal/otel/propagation.mjs +1 -1
  55. package/dist/internal/otel/provider.d.mts +1 -86
  56. package/dist/internal/otel/provider.mjs +1 -1
  57. package/dist/internal/otel/url-attrs.d.mts +7 -0
  58. package/dist/internal/otel/url-attrs.mjs +1 -0
  59. package/dist/internal/otel/web-vitals.d.mts +1 -33
  60. package/dist/internal/otel/web-vitals.mjs +1 -1
  61. package/dist/internal/page-lifecycle.d.mts +4 -5
  62. package/dist/internal/page-lifecycle.mjs +1 -1
  63. package/dist/internal/plugin-runtime.d.mts +1 -38
  64. package/dist/internal/plugin-runtime.mjs +1 -1
  65. package/dist/internal/react-context.d.mts +1 -43
  66. package/dist/internal/react-context.mjs +1 -1
  67. package/dist/internal/server-digest.d.mts +4 -3
  68. package/dist/internal/server-digest.mjs +1 -1
  69. package/dist/internal/sw-queue.d.mts +4 -5
  70. package/dist/internal/sw-queue.mjs +1 -1
  71. package/dist/internal/third-party-hosts.d.mts +2 -3
  72. package/dist/internal/third-party-hosts.mjs +1 -1
  73. package/dist/internal/version.d.mts +4 -5
  74. package/dist/internal/version.mjs +1 -1
  75. package/dist/internal/wrapper-singleton.d.mts +5 -6
  76. package/dist/internal/wrapper-singleton.mjs +1 -1
  77. package/dist/navigation-CkiV6lJY.d.mts +54 -0
  78. package/dist/page-scope-context-manager-r92ZMJok.d.mts +17 -0
  79. package/dist/plugins/device.d.mts +5 -0
  80. package/dist/plugins/device.mjs +1 -0
  81. package/dist/plugins/errors.d.mts +1 -1
  82. package/dist/plugins/errors.mjs +1 -1
  83. package/dist/plugins/lib/loader.d.mts +2 -11
  84. package/dist/plugins/lib/loader.mjs +1 -1
  85. package/dist/plugins/lib/types.d.mts +2 -24
  86. package/dist/plugins/logs.d.mts +1 -1
  87. package/dist/plugins/logs.mjs +1 -1
  88. package/dist/plugins/page-events.d.mts +5 -0
  89. package/dist/plugins/page-events.mjs +1 -0
  90. package/dist/plugins/rage-clicks.d.mts +1 -1
  91. package/dist/plugins/rage-clicks.mjs +1 -1
  92. package/dist/plugins/replay/buffer.d.mts +9 -6
  93. package/dist/plugins/replay/buffer.mjs +1 -1
  94. package/dist/plugins/replay/chunking.d.mts +18 -9
  95. package/dist/plugins/replay/chunking.mjs +1 -1
  96. package/dist/plugins/replay/compressor-host.d.mts +3 -4
  97. package/dist/plugins/replay/compressor-host.mjs +1 -1
  98. package/dist/plugins/replay/config.d.mts +1 -11
  99. package/dist/plugins/replay/config.mjs +1 -1
  100. package/dist/plugins/replay/delivery.d.mts +8 -9
  101. package/dist/plugins/replay/delivery.mjs +1 -1
  102. package/dist/plugins/replay/index.d.mts +1 -1
  103. package/dist/plugins/replay/index.mjs +1 -1
  104. package/dist/plugins/replay/recorder.d.mts +12 -6
  105. package/dist/plugins/replay/recorder.mjs +1 -1
  106. package/dist/plugins/replay/sequence.d.mts +5 -4
  107. package/dist/plugins/replay/sequence.mjs +1 -1
  108. package/dist/plugins/replay/upload.d.mts +4 -0
  109. package/dist/plugins/replay/upload.mjs +1 -0
  110. package/dist/propagation-CssinKCy.d.mts +26 -0
  111. package/dist/provider-50LbJ4Tl.d.mts +466 -0
  112. package/dist/provider-Cp6noibq.d.mts +101 -0
  113. package/dist/provider.d.mts +2 -58
  114. package/dist/provider.mjs +1 -1
  115. package/dist/react-error-handler.d.mts +9 -11
  116. package/dist/react-error-handler.mjs +1 -1
  117. package/dist/rrweb-CE6GKCEq.mjs +150 -0
  118. package/dist/tracking/api.d.mts +1 -54
  119. package/dist/tracking/api.mjs +1 -1
  120. package/dist/tracking/device.d.mts +1 -32
  121. package/dist/tracking/device.mjs +1 -1
  122. package/dist/tracking/geo.d.mts +1 -13
  123. package/dist/tracking/geo.mjs +1 -1
  124. package/dist/tracking/session.d.mts +6 -7
  125. package/dist/tracking/session.mjs +1 -1
  126. package/dist/util/bot.d.mts +2 -3
  127. package/dist/util/bot.mjs +1 -1
  128. package/dist/util/global.d.mts +4 -10
  129. package/dist/util/global.mjs +1 -1
  130. package/dist/util/log.d.mts +11 -7
  131. package/dist/util/log.mjs +1 -1
  132. package/dist/util/stringify.d.mts +2 -3
  133. package/dist/version-BniHrwLD.mjs +1 -0
  134. package/dist/web-vitals-x8y70B5x.d.mts +34 -0
  135. package/package.json +67 -48
  136. package/dist/package.mjs +0 -1
@@ -1 +1 @@
1
- import{getGlobal,setGlobal}from"../util/global.mjs";import{API_PATHS,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";const TRAILING_SLASH_RE=/\/$/u,RELATIVE_URL_BASE=`https://interfere.local`;function resolvePublicKey(){let injected=getGlobal(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??getGlobal(API_URL_GLOBAL)}function resolveIngestHost(explicit){return explicit??getGlobal(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 serializeUrl(input,url){return input.startsWith(`/`)?`${url.pathname}${url.search}`:url.toString()}function withQueryParam(url,key,value){let next=new URL(url,RELATIVE_URL_BASE);return next.searchParams.set(key,value),serializeUrl(url,next)}function appendPublicKey(url,publicKey){return publicKey?withQueryParam(url,`pk`,publicKey):url}function appendPathBeforeQuery(url,path){let next=new URL(url,RELATIVE_URL_BASE),suffix=path.startsWith(`/`)?path:`/${path}`;return next.pathname=`${next.pathname.replace(TRAILING_SLASH_RE,``)}${suffix}`,serializeUrl(url,next)}function resolveTargets(apiHost,ingestHost){let publicKey=resolvePublicKey(),headers=new Headers({"content-type":`application/json`});isForceEnableActive()&&headers.set(`x-interfere-force-enable`,`1`);let configHost=resolveApiHost(apiHost),configBaseUrl=configHost?normalizeOrigin(configHost):API_URL,resolvedIngestHost=resolveIngestHost(ingestHost),ingestBaseUrl=resolvedIngestHost?normalizeOrigin(resolvedIngestHost):configBaseUrl;return{collectorBaseUrl:appendPublicKey(ingestBaseUrl,publicKey),config:{url:appendPublicKey(`${configBaseUrl}${API_PATHS.CONFIG}`,publicKey),headers},ingest:{headers},session:{url:appendPublicKey(`${ingestBaseUrl}${API_PATHS.SESSION}`,publicKey),headers}}}export{appendPathBeforeQuery,resolveTargets,setIngestHost,withQueryParam};
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,14 +1,22 @@
1
1
  import { ConsentCategory, ConsentState, PluginKey } from "@interfere/types/sdk/plugins/manifest";
2
2
  import { EventType } from "@interfere/types/sdk/envelope";
3
3
  //#region src/internal/consent.d.ts
4
- declare const DEFAULT_CONSENT: {
4
+ export declare const DEFAULT_CONSENT: {
5
5
  readonly analytics: true;
6
6
  readonly replay: true;
7
7
  };
8
- declare function getPluginConsentCategory(key: PluginKey): ConsentCategory;
9
- declare function isConsentAllowed(category: ConsentCategory, consentState: ConsentState | null): boolean;
10
- declare function shouldCaptureEvent(type: EventType, consentState: ConsentState | null): boolean;
11
- declare function resolveGrantedConsent(consent?: ConsentState): ConsentState;
12
- declare function hasConsentChanged(current: ConsentState | null, next: ConsentState | null): boolean;
13
- //#endregion
14
- export { DEFAULT_CONSENT, getPluginConsentCategory, hasConsentChanged, isConsentAllowed, resolveGrantedConsent, shouldCaptureEvent };
8
+ export declare function getPluginConsentCategory(key: PluginKey): "analytics" | "necessary" | "replay";
9
+ export declare function isConsentAllowed(category: ConsentCategory, consentState: ConsentState | null): boolean;
10
+ export declare function shouldCaptureEvent(type: EventType, consentState: ConsentState | null): boolean;
11
+ export declare function resolveGrantedConsent(consent?: ConsentState): {
12
+ analytics: true;
13
+ replay: true;
14
+ } | {
15
+ replay: boolean;
16
+ analytics: boolean;
17
+ } | {
18
+ analytics: boolean;
19
+ replay: boolean;
20
+ };
21
+ export declare function hasConsentChanged(current: ConsentState | null, next: ConsentState | null): boolean;
22
+ //#endregion
@@ -9,11 +9,10 @@
9
9
  * subscription, fans out to every subscriber, and is uninstalled on the
10
10
  * last unsubscription. Handlers never wrap each other; they observe.
11
11
  */
12
- declare const CONSOLE_LEVELS: readonly ["debug", "log", "info", "warn", "error"];
13
- type ConsoleLevel = (typeof CONSOLE_LEVELS)[number];
14
- type ConsoleHandler = (level: ConsoleLevel, args: unknown[]) => void;
15
- declare function onConsoleCall(handler: ConsoleHandler): () => void;
12
+ export declare const CONSOLE_LEVELS: readonly ["debug", "log", "info", "warn", "error"];
13
+ export type ConsoleLevel = (typeof CONSOLE_LEVELS)[number];
14
+ export type ConsoleHandler = (level: ConsoleLevel, args: unknown[]) => void;
15
+ export declare function onConsoleCall(handler: ConsoleHandler): () => void;
16
16
  /** Test hook — drops every handler and restores originals. */
17
- declare function _resetConsolePatchForTests(): void;
18
- //#endregion
19
- export { CONSOLE_LEVELS, ConsoleHandler, ConsoleLevel, _resetConsolePatchForTests, onConsoleCall };
17
+ export declare function resetConsolePatchForTests(): void;
18
+ //#endregion
@@ -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,_resetConsolePatchForTests,onConsoleCall};
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};
@@ -10,9 +10,9 @@
10
10
  * `data-track-click` is the customer escape hatch — any element opted
11
11
  * in via that attribute is treated as actionable regardless of tag/role.
12
12
  */
13
- declare function isActionable(el: Element): boolean;
14
- declare function closestActionable(target: EventTarget | null): Element | null;
15
- interface ActionableDescriptor {
13
+ export declare function isActionable(el: Element): boolean;
14
+ export declare function closestActionable(target: EventTarget | null): Element | null;
15
+ export interface ActionableDescriptor {
16
16
  ariaLabel?: string | undefined;
17
17
  href?: string | undefined;
18
18
  id?: string | undefined;
@@ -20,8 +20,6 @@ interface ActionableDescriptor {
20
20
  role?: string | undefined;
21
21
  tag: string;
22
22
  text?: string | undefined;
23
- [key: string]: unknown;
24
23
  }
25
- declare function describeActionable(el: Element): ActionableDescriptor;
26
- //#endregion
27
- export { ActionableDescriptor, closestActionable, describeActionable, isActionable };
24
+ export declare function describeActionable(el: Element): ActionableDescriptor;
25
+ //#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
+ 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};
@@ -5,6 +5,5 @@
5
5
  * message wording (development). String-matches React internals, so it tracks
6
6
  * React's phrasing; the numeric error codes are the durable anchor.
7
7
  */
8
- declare function isHydrationError(error: unknown): boolean;
9
- //#endregion
10
- export { isHydrationError };
8
+ export declare function isHydrationError(error: unknown): boolean;
9
+ //#endregion
@@ -1,7 +1,6 @@
1
- import { Kernel } from "./kernel.mjs";
1
+ import { s as Kernel } from "../provider-50LbJ4Tl.mjs";
2
2
  //#region src/internal/kernel-registry.d.ts
3
- declare function registerKernel(kernel: Kernel): void;
4
- declare function unregisterKernel(kernel: Kernel): void;
5
- declare function activeKernel(): Kernel | null;
6
- //#endregion
7
- export { activeKernel, registerKernel, unregisterKernel };
3
+ export declare function registerKernel(kernel: Kernel): void;
4
+ export declare function unregisterKernel(kernel: Kernel): void;
5
+ export declare function activeKernel(): Kernel | null;
6
+ //#endregion
@@ -1,293 +1,3 @@
1
- import { ReplayConfig } from "../plugins/replay/config.mjs";
2
- import { SessionResumeReason } from "./activity.mjs";
3
- import { PluginConfigState, PluginContext } from "../plugins/lib/types.mjs";
4
- import { PluginOverrides } from "../plugins/lib/loader.mjs";
5
- import { SessionTracker } from "../tracking/api.mjs";
6
- import { CaptureFailedRequestsOption, CaptureFailedRequestsOptions, HttpStatusCodeRange } from "./otel/instrumentations.mjs";
7
- import { OtelProviderHandle } from "./otel/provider.mjs";
8
- import "./otel/index.mjs";
9
- import { PluginRuntime } from "./plugin-runtime.mjs";
10
- import { NonErrorException } from "@interfere/types/sdk/errors";
11
- import { ConsentState, PluginKey } from "@interfere/types/sdk/plugins/manifest";
12
- import { ReleaseSlug } from "@interfere/types/releases/slug";
13
- import { MetricReader } from "@opentelemetry/sdk-metrics";
14
- import { LogRecordProcessor, LoggerProvider } from "@opentelemetry/sdk-logs";
15
- import { SpanProcessor } from "@opentelemetry/sdk-trace-base";
16
- import { IngestedFrame } from "@interfere/types/data/frame";
17
- import { SessionId } from "@interfere/types/data/session";
18
- import { IdentifyParams } from "@interfere/types/sdk/identify";
19
- import { ErrorMechanism } from "@interfere/types/sdk/plugins/payload/errors";
20
- //#region src/internal/kernel.d.ts
21
- declare function buildSdkStack(wrapperVersions?: string[]): string[];
22
- interface KernelOptions {
23
- /**
24
- * The endpoint the SDK posts telemetry to. Defaults to Interfere's
25
- * endpoint. Set it to a subdomain of your own site that resolves to
26
- * Interfere via a DNS record (e.g. `"https://in.example.com"`) to
27
- * survive ad-blockers, or to a regional endpoint. Must be a full URL.
28
- */
29
- apiHost?: string;
30
- /**
31
- * Override the automatic dev-mode guard. When `undefined`, the SDK
32
- * auto-detects: it disables itself if `process.env["NODE_ENV"]` is not
33
- * `"production"` (Node / webpack / Next.js). In environments where
34
- * `process` does not exist (Vite, CRA, plain browser) the SDK
35
- * defaults to **enabled** — pass `false` to disable explicitly.
36
- */
37
- enabled?: boolean;
38
- /** Override `globalThis.fetch` for tests / non-browser hosts. */
39
- fetch?: typeof globalThis.fetch;
40
- /**
41
- * Override the OTel `service.name` resource attribute. Defaults to
42
- * `"interfere-sdk"`. Customers running multiple frontends in one
43
- * monitoring backend (e.g. `"@interfere/website"` vs
44
- * `"@interfere/app"`) set this so spans/metrics/logs slice
45
- * cleanly by surface.
46
- */
47
- serviceName?: string;
48
- /**
49
- * `false` skips the OTel module entirely — the bundler code-splits
50
- * `internal/otel/*` out of this path so the error-only bundle never
51
- * imports the OTel SDK. `true` (default) loads it with default
52
- * instrumentation config. An object loads it with the supplied
53
- * config.
54
- */
55
- tracing?: boolean | TracingOptions;
56
- }
57
- /**
58
- * Per-instrumentation tuning. Every field is optional; defaults match
59
- * what `interfere/homepage` and `interfere/dashboard` use today via
60
- * the internal `observability/browser/rum.ts`. New customers don't
61
- * need to touch any of these — sensible defaults ship out of the box.
62
- */
63
- interface TracingOptions {
64
- /**
65
- * Hostnames where your backend runs, e.g. `["api.example.com"]`. Every
66
- * request to a listed host carries the W3C `traceparent` header so the
67
- * browser trace continues on the server. Same-origin requests always
68
- * propagate — you only need this when your API is on a different host
69
- * than your app. Matched by hostname (any path, port, or scheme); no regex.
70
- */
71
- apiHosts?: string[];
72
- /**
73
- * Promote failed `fetch` / `XHR` responses to exception events on the
74
- * active span. **On by default** — captures same-origin (and
75
- * `propagateContextUrls`) 4xx + 5xx, deduped by `method+status+path` and
76
- * rate-limited so a flapping endpoint can't flood. Pass `false` to
77
- * disable, or `{ statusCodes }` to tune the ranges.
78
- * See {@link CaptureFailedRequestsOption}.
79
- */
80
- captureFailedRequests?: CaptureFailedRequestsOption;
81
- /**
82
- * Additional URL patterns to skip when creating fetch / XHR spans.
83
- * The SDK's own collector endpoint is always ignored; customer-side
84
- * third-party SDKs (Clerk, Sentry, GTM, etc.) are also skipped by
85
- * default — supplement with anything specific to your app.
86
- */
87
- ignoreUrls?: (string | RegExp)[];
88
- /**
89
- * @deprecated Prefer {@link apiHosts} — it takes plain hostnames and
90
- * needs no regex. Still fully supported: raw URL patterns injected with
91
- * `traceparent` + `baggage` on outgoing fetch / XHR. Note string entries
92
- * match the full request URL by exact equality (an OpenTelemetry quirk),
93
- * so cross-origin values usually have to be a `RegExp`.
94
- */
95
- propagateContextUrls?: (string | RegExp)[];
96
- /**
97
- * Resolve a URL pathname to a low-cardinality route template
98
- * (e.g. `/blog/[slug]`). Without this, dynamic routes produce one
99
- * unique span / metric label per visited slug — a cardinality
100
- * hazard. Used by fetch, document-load resource enrichment,
101
- * user-interaction, long-task, and web-vitals.
102
- */
103
- resolveRoute?: (pathname: string) => string | undefined;
104
- /**
105
- * `false` disables Core Web Vitals capture (LCP/FCP/TTFB/INP/CLS).
106
- * Defaults to enabled; customers who run their own vitals reporting
107
- * can opt out.
108
- */
109
- webVitals?: boolean;
110
- }
111
- /**
112
- * Framework wrappers (`@interfere/next`, `@interfere/vite`) pass extra
113
- * fields through `createKernel` that customers never set themselves.
114
- * Kept off the customer-facing `KernelOptions` to make the public surface
115
- * clean.
116
- *
117
- * @internal
118
- */
119
- interface KernelInternalOptions extends KernelOptions {
120
- /** @internal */
121
- _internalAdditionalLogRecordProcessors?: LogRecordProcessor[];
122
- /** @internal */
123
- _internalAdditionalMetricReaders?: MetricReader[];
124
- /** @internal */
125
- _internalAdditionalSpanProcessors?: SpanProcessor[];
126
- /** Wrapper SDK versions (e.g. `@interfere/next@10.0.0`). */
127
- _wrapperVersions?: string[];
128
- }
129
- interface KernelConsent {
130
- get: () => ConsentState | null;
131
- set: (value?: ConsentState) => void;
132
- }
133
- interface KernelIdentity {
134
- clear: () => void;
135
- get: () => IdentifyParams | null;
136
- set: (params: IdentifyParams) => Promise<void>;
137
- }
138
- interface KernelDevice {
139
- getDeviceId: () => string | null;
140
- getFpHash: () => string | null;
141
- }
142
- interface KernelSession {
143
- getId: () => SessionId | null;
144
- getWindowId: () => string | null;
145
- }
146
- interface RecordExceptionOpts {
147
- /**
148
- * Frames always appended to the first exception's stack. Used by
149
- * `<ErrorBoundary>` to inject React's component-stack frames as
150
- * supplementary context — these add on top of the real JS frames, they
151
- * don't replace them.
152
- */
153
- readonly appendFrames?: readonly IngestedFrame[];
154
- /**
155
- * `error.digest` from React when an RSC server-side throw is
156
- * sanitised and rebuilt as a synthetic Error on the client. The only
157
- * identifier that pairs the redacted client capture with the
158
- * unredacted server capture — enrichment mixes this into the
159
- * fingerprint so both events group as one problem.
160
- */
161
- readonly errorDigest?: string;
162
- /**
163
- * Frames adopted only when the first exception's parsed stack is empty.
164
- * Used by the `window.onerror` handler when the browser hands us
165
- * source/line/col but the `Error` itself has a degenerate stack — never
166
- * glued on top of a real stack.
167
- */
168
- readonly fallbackFrames?: readonly IngestedFrame[];
169
- readonly mechanism: ErrorMechanism;
170
- /**
171
- * A distinct error sub-classification layered on top of the mechanism —
172
- * currently `"hydration"` for React hydration mismatches. Lets Interfere
173
- * triage by kind without re-parsing the message.
174
- */
175
- readonly subtype?: string;
176
- }
177
- /**
178
- * The replacement for the old `Client` god-object. Pure construction graph
179
- * via `createKernel`; no module-level mutable state, no global lookups.
180
- * Framework wrappers (`@interfere/next`, `@interfere/vite`) own the
181
- * singleton lifecycle.
182
- *
183
- * Implements `PluginContext` directly: plugins are wired with the kernel
184
- * itself rather than a closure adapter. The kernel⇄runtime cycle is
185
- * resolved by constructing the kernel first and binding the runtime via
186
- * `attachRuntime` immediately after.
187
- */
188
- declare class Kernel implements PluginContext {
189
- readonly consent: KernelConsent;
190
- readonly identity: KernelIdentity;
191
- readonly device: KernelDevice;
192
- readonly session: KernelSession;
193
- private readonly tracker;
194
- private readonly seen;
195
- private readonly initialNavigationSeen;
196
- private runtime;
197
- private otel;
198
- private otelDispose;
199
- private unsubscribePageHidden;
200
- constructor(tracker: SessionTracker);
201
- /**
202
- * Bound by `createKernel` immediately after construction.
203
- *
204
- * @internal
205
- */
206
- attachRuntime(runtime: PluginRuntime): void;
207
- private requireRuntime;
208
- /** PluginContext shim: plugins expect a non-null string. */
209
- getSessionId(): string;
210
- getWindowId(): string;
211
- onSessionPause(handler: () => void): () => void;
212
- onSessionResume(handler: (reason: SessionResumeReason) => void): () => void;
213
- getPluginConfigState(key: PluginKey): PluginConfigState;
214
- getReplayConfig(): ReplayConfig;
215
- subscribePluginConfigState(key: PluginKey, listener: (state: PluginConfigState) => void): () => void;
216
- /**
217
- * Records an exception event on the active OTel span. No envelope
218
- * path — the SDK is OTel-only. Single dedup boundary: drops repeats
219
- * of the same `Error` instance, plus browser-extension noise and
220
- * unresolvable stacks. Upstream callers (the errors plugin's
221
- * `window.onerror` / `console.error` / `unhandledrejection`, the
222
- * React error boundary) just call this — they don't pre-filter.
223
- *
224
- * Does NOT mark the active span as failed. A console.error inside a
225
- * customer-owned `span()` block would otherwise taint the customer's
226
- * span even when the customer caught the error explicitly. The
227
- * customer's `span()` helper sets status itself when it observes a
228
- * throw.
229
- *
230
- * `appendFrames` are always appended (component-stack supplements);
231
- * `fallbackFrames` are only adopted when the parsed stack is empty
232
- * (`window.onerror` source/line/col when the Error has no usable
233
- * stack). Both ride on the serialised `interfere.exception.chain`
234
- * attribute when the chain is non-trivial.
235
- */
236
- recordException(value: Error | NonErrorException, opts: RecordExceptionOpts): void;
237
- /**
238
- * Emits an OTel `LogRecord` via the kernel's logger provider. Used by
239
- * `plugins/logs.ts` to capture string-only `console.*` calls (the
240
- * errors plugin still owns Error-bearing console calls — class
241
- * boundary). No-ops when OTel is not wired (`tracing: false`) since
242
- * there's no logger provider to emit through.
243
- */
244
- recordLog(input: {
245
- severityText: string;
246
- severityNumber: number;
247
- body: string;
248
- attributes?: Record<string, string>;
249
- }): void;
250
- recordInitialNavigation(loggerProvider: LoggerProvider): void;
251
- /**
252
- * Force-flushes the OTel exporters. Returns once they've settled
253
- * (success or failure) so callers driving unload — page-lifecycle
254
- * handlers, integration test teardown — can actually await
255
- * completion. The OTel SDK swallows export errors internally; we
256
- * surface the resolution either way.
257
- */
258
- flush(): Promise<void>;
259
- /**
260
- * Wired by `createKernel` after the OTel module has been
261
- * lazy-loaded. Held on the kernel so `flush()` and `dispose()` can fan
262
- * out to the providers. The tracer/meter providers stay private —
263
- * customers don't get raw OTel access; the public surface is the
264
- * `span()` / `capture()` helpers in `api.ts`.
265
- *
266
- * @internal
267
- */
268
- attachOtel(handle: OtelProviderHandle, dispose: () => void): void;
269
- syncProviderConfig(config: {
270
- consent?: ConsentState | undefined;
271
- plugins?: PluginOverrides | undefined;
272
- }): void;
273
- dispose(): Promise<void>;
274
- }
275
- interface CreateKernelInput {
276
- opts?: KernelInternalOptions;
277
- }
278
- declare function createKernel(input?: CreateKernelInput): Promise<Kernel>;
279
- declare function isEnabledByEnvironment(): boolean;
280
- /**
281
- * Build-time-derived release slug. The build step
282
- * (`@interfere/next/withInterfere`, `@interfere/vite/plugin`) takes the
283
- * leading 16 hex chars of the commit SHA (`rel_<16hex>`) and stamps it into
284
- * the bundle as `__INTERFERE_RELEASE_SLUG__`. The collector derives the same
285
- * value from the create-release request, so the bundle's runtime slug is
286
- * guaranteed to match the row without a round-trip.
287
- *
288
- * Returns `null` when no slug was injected (dev builds, customers who
289
- * haven't wired up the plugin).
290
- */
291
- declare function readReleaseSlugFromGlobals(): ReleaseSlug | null;
292
- //#endregion
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-50LbJ4Tl.mjs";
2
+ import { i as HttpStatusCodeRange, n as CaptureFailedRequestsOption, r as CaptureFailedRequestsOptions } from "../instrumentations-Bgm2EazU.mjs";
293
3
  export { type CaptureFailedRequestsOption, type CaptureFailedRequestsOptions, type HttpStatusCodeRange, Kernel, KernelConsent, KernelDevice, KernelIdentity, KernelInternalOptions, KernelOptions, KernelSession, 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{recordInitialNavigation}from"./otel/initial-navigation.mjs";import{PluginRuntime}from"./plugin-runtime.mjs";import{PRODUCER_VERSION}from"./version.mjs";import{isNonErrorException,shouldDropBrowserExtensionNoise,shouldDropUnresolvableStack,toExceptions}from"@interfere/types/sdk/errors";import{trace}from"@opentelemetry/api";import{FORCE_ENABLE_GLOBAL,RELEASE_SLUG_GLOBAL,SDK_STACK_GLOBAL}from"@interfere/types/sdk/injected-globals";import{omitUndefined}from"@interfere/helpers/omit-undefined";import{releaseSlugSchema}from"@interfere/types/releases/slug";import{readBakedPlugins}from"@interfere/types/sdk/remote-config";const log=createLogger(`kernel`),TRAILING_SLASH_RE=/\/$/u,REPLAY_UPLOAD_RE=/\/v2\/replay\/upload\//u;function buildSdkStack(wrapperVersions){return[...wrapperVersions??[],PRODUCER_VERSION]}function buildExceptionEventAttrs(value,opts){let attrs={"interfere.exception.mechanism":opts.mechanism.type,"interfere.exception.handled":opts.mechanism.handled};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=globalThis._debugIds;return debugIds&&typeof debugIds==`object`&&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;tracker;seen=new WeakSet;initialNavigationSeen=new Set;runtime=null;otel=null;otelDispose=null;unsubscribePageHidden=null;constructor(tracker){this.tracker=tracker,this.consent={get:()=>this.requireRuntime().getConsent(),set:value=>{let runtime=this.requireRuntime();value?runtime.setConsent(value):runtime.resetConsent()}},this.identity={clear:()=>this.tracker.reset(),get:()=>this.tracker.getIdentity(),set: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)}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({severityText:input.severityText,severityNumber:input.severityNumber,body:input.body,...input.attributes?{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){this.otel=handle,this.otelDispose=dispose}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(`collector: %s`,targets.collectorBaseUrl),getGlobal(FORCE_ENABLE_GLOBAL)&&log.warn(`FORCE_ENABLE is active. Events will be dropped by production collectors. This should only be set during local development.`);let tracker=new SessionTracker({target:targets.session,fetcher});opts._wrapperVersions?.length&&(globalThis[SDK_STACK_GLOBAL]=opts._wrapperVersions);let kernel=new Kernel(tracker),runtime=new PluginRuntime(kernel);if(kernel.attachRuntime(runtime),tracker.start(),runtime.start(),opts.tracing!==!1){let tracingOpts=typeof opts.tracing==`object`?opts.tracing:void 0;await wireOtel(kernel,targets,opts._wrapperVersions,{...tracingOpts,...opts.serviceName?{serviceName:opts.serviceName}:{},...opts._internalAdditionalSpanProcessors?{additionalSpanProcessors:opts._internalAdditionalSpanProcessors}:{},...opts._internalAdditionalLogRecordProcessors?{additionalLogRecordProcessors:opts._internalAdditionalLogRecordProcessors}:{},...opts._internalAdditionalMetricReaders?{additionalMetricReaders:opts._internalAdditionalMetricReaders}:{}})}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,readPropagationFromDocument,registerBundledInstrumentations}=await import(`./otel/index.mjs`),collectorUrl=targets.collectorBaseUrl.replace(TRAILING_SLASH_RE,``),releaseSlug=readReleaseSlugFromGlobals(),handle=buildOtelProvider({collectorUrl,authHeaders:targets.ingest.headers,sdkStack:buildSdkStack(wrapperVersions),getSessionId:()=>kernel.session.getId(),getDeviceId:()=>kernel.device.getDeviceId(),releaseSlug,...tracing.serviceName?{serviceName:tracing.serviceName}:{},...tracing.additionalSpanProcessors?{additionalSpanProcessors:tracing.additionalSpanProcessors}:{},...tracing.additionalLogRecordProcessors?{additionalLogRecordProcessors:tracing.additionalLogRecordProcessors}:{},...tracing.additionalMetricReaders?{additionalMetricReaders:tracing.additionalMetricReaders}:{}}),extracted=readPropagationFromDocument();extracted&&handle.contextManager.setPageScope(extracted);let dispose=registerBundledInstrumentations(omitUndefined({tracerProvider:handle.tracerProvider,loggerProvider:handle.loggerProvider,ignoreUrls:[`${collectorUrl}/v2/sink`,targets.config.url,targets.session.url,REPLAY_UPLOAD_RE],...tracing.apiHosts?{apiHosts:tracing.apiHosts}:{},...tracing.propagateContextUrls?{propagateContextUrls:tracing.propagateContextUrls}:{},...tracing.resolveRoute?{resolveRoute:tracing.resolveRoute}:{},captureFailedRequests:tracing.captureFailedRequests}));tracing.webVitals!==!1&&captureWebVitals({meter:handle.meterProvider.getMeter(`@interfere/react/web-vitals`),flush:()=>handle.flush(),...tracing.resolveRoute?{resolveRoute:tracing.resolveRoute}:{}}),kernel.attachOtel(handle,dispose),kernel.recordInitialNavigation(handle.loggerProvider)}async function fetchRemoteConfig(configTarget,fetcher){try{let headers=Object.fromEntries(configTarget.headers.entries()),res=await fetcher(configTarget.url,{method:`GET`,headers,credentials:`omit`,signal:AbortSignal.timeout(1e4)});return res.ok?await res.json():null}catch{return log.warn(`remote config fetch failed, using local defaults`),null}}function isEnabledByEnvironment(){if(typeof process>`u`||!process.env)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{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-BniHrwLD.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?runtime.setConsent(value):runtime.resetConsent()}},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._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(),isDeviceInfoEnabled:()=>kernel.isDeviceInfoCaptureEnabled(),releaseSlug,sdkStack:buildSdkStack(wrapperVersions),serviceName:tracing.serviceName||void 0,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,13 +1,2 @@
1
- import { SignalSender } from "./exporter.mjs";
2
- import { ExportResult } from "@opentelemetry/core";
3
- import { LogRecordExporter, ReadableLogRecord } from "@opentelemetry/sdk-logs";
4
- //#region src/internal/otel/exporter-logs.d.ts
5
- declare class IngestLogExporter implements LogRecordExporter {
6
- private readonly send;
7
- constructor(send: SignalSender);
8
- export(logs: ReadableLogRecord[], resultCallback: (result: ExportResult) => void): void;
9
- shutdown(): Promise<void>;
10
- forceFlush(): Promise<void>;
11
- }
12
- //#endregion
1
+ import { t as IngestLogExporter } from "../../exporter-logs-CeGwMiMo.mjs";
13
2
  export { IngestLogExporter };
@@ -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)}shutdown(){return Promise.resolve()}forceFlush(){return Promise.resolve()}};export{IngestLogExporter};
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,14 +1,2 @@
1
- import { SignalSender } from "./exporter.mjs";
2
- import { ExportResult } from "@opentelemetry/core";
3
- import { AggregationTemporality, PushMetricExporter, ResourceMetrics } from "@opentelemetry/sdk-metrics";
4
- //#region src/internal/otel/exporter-metrics.d.ts
5
- declare class IngestMetricExporter implements PushMetricExporter {
6
- private readonly send;
7
- constructor(send: SignalSender);
8
- export(metrics: ResourceMetrics, resultCallback: (result: ExportResult) => void): void;
9
- selectAggregationTemporality(): AggregationTemporality;
10
- forceFlush(): Promise<void>;
11
- shutdown(): Promise<void>;
12
- }
13
- //#endregion
14
- export { IngestMetricExporter };
1
+ import { l as GatedResourceAttributes, u as IngestMetricExporter } from "../../exporter-logs-CeGwMiMo.mjs";
2
+ export { GatedResourceAttributes, IngestMetricExporter };
@@ -1 +1 @@
1
- import{JsonMetricsSerializer}from"@opentelemetry/otlp-transformer";import{AggregationTemporality}from"@opentelemetry/sdk-metrics";var IngestMetricExporter=class{send;constructor(send){this.send=send}export(metrics,resultCallback){this.send(JsonMetricsSerializer.serializeRequest(metrics),resultCallback)}selectAggregationTemporality(){return AggregationTemporality.DELTA}forceFlush(){return Promise.resolve()}shutdown(){return Promise.resolve()}};export{IngestMetricExporter};
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,29 +1,2 @@
1
- import { IngestMetricExporter } from "./exporter-metrics.mjs";
2
- import { IngestLogExporter } from "./exporter-logs.mjs";
3
- import { ExportResult } from "@opentelemetry/core";
4
- import { SpanExporter } from "@opentelemetry/sdk-trace-base";
5
- //#region src/internal/otel/exporter.d.ts
6
- type SignalSender = (payload: Uint8Array | undefined, resultCallback: (result: ExportResult) => void) => void;
7
- interface ExporterCommon {
8
- /**
9
- * Kept for wrapper compatibility. Public-key identity is baked into
10
- * `collectorUrl` as a `pk` query parameter before exporters are built.
11
- */
12
- authHeaders: Headers;
13
- /** Base collector URL — the opaque sink path is appended. */
14
- collectorUrl: string;
15
- }
16
- /** Exported for direct unit testing. */
17
- declare function buildSinkUrl(collectorUrl: string): string;
18
- /**
19
- * Ingest URL carrying the producer-version query while preserving the
20
- * `pk` query already baked into `collectorUrl`.
21
- *
22
- * Exported for direct unit testing.
23
- */
24
- declare function buildIngestUrl(collectorUrl: string): string;
25
- declare function createTraceExporter(input: ExporterCommon): SpanExporter;
26
- declare function createMetricExporter(input: ExporterCommon): IngestMetricExporter;
27
- declare function createLogExporter(input: ExporterCommon): IngestLogExporter;
28
- //#endregion
29
- export { SignalSender, buildIngestUrl, buildSinkUrl, createLogExporter, createMetricExporter, createTraceExporter };
1
+ import { a as createMetricExporter, c as resetIngestHalt, i as createLogExporter, n as INGEST_IGNORE_RE, o as createTraceExporter, r as SignalSender, s as isIngestHalted } from "../../exporter-logs-CeGwMiMo.mjs";
2
+ export { INGEST_IGNORE_RE, SignalSender, createLogExporter, createMetricExporter, createTraceExporter, isIngestHalted, resetIngestHalt };
@@ -1 +1 @@
1
- import{appendPathBeforeQuery,withQueryParam}from"../config.mjs";import{PRODUCER_VERSION}from"../version.mjs";import{IngestLogExporter}from"./exporter-logs.mjs";import{IngestMetricExporter}from"./exporter-metrics.mjs";import{ExportResultCode}from"@opentelemetry/core";import{JsonTraceSerializer}from"@opentelemetry/otlp-transformer";function buildSinkUrl(collectorUrl){return appendPathBeforeQuery(collectorUrl,`/v2/sink`)}function buildIngestUrl(collectorUrl){return withQueryParam(buildSinkUrl(collectorUrl),`_pv`,PRODUCER_VERSION)}function makeSender(input){let url=buildIngestUrl(input.collectorUrl);return(payload,resultCallback)=>{payload&&payload.byteLength>0&&fetch(url,{method:`POST`,keepalive:!0,credentials:`omit`,headers:{"content-type":`application/json`},body:payload}).catch(()=>{}),resultCallback({code:ExportResultCode.SUCCESS})}}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)}shutdown(){return Promise.resolve()}forceFlush(){return Promise.resolve()}};function createTraceExporter(input){return new IngestTraceExporter(makeSender(input))}function createMetricExporter(input){return new IngestMetricExporter(makeSender(input))}function createLogExporter(input){return new IngestLogExporter(makeSender(input))}export{buildIngestUrl,buildSinkUrl,createLogExporter,createMetricExporter,createTraceExporter};
1
+ import{t as PRODUCER_VERSION}from"../../version-BniHrwLD.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};
@@ -0,0 +1,4 @@
1
+ import { Span } from "@opentelemetry/api";
2
+ //#region src/internal/otel/http-span-route.d.ts
3
+ export declare function stampHttpSpanRoute(span: Span, method: string, pathname: string, resolveRoute: ((pathname: string) => string | undefined) | undefined): void;
4
+ //#endregion
@@ -0,0 +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,5 +1,7 @@
1
- import { CaptureFailedRequestsOption, CaptureFailedRequestsOptions, HttpStatusCodeRange, InstrumentationsInput, registerBundledInstrumentations } from "./instrumentations.mjs";
2
- import { readPropagationFromDocument } from "./propagation.mjs";
3
- import { OtelProviderHandle, OtelProviderInput, buildOtelProvider } from "./provider.mjs";
4
- import { captureWebVitals } from "./web-vitals.mjs";
5
- export { type CaptureFailedRequestsOption, type CaptureFailedRequestsOptions, type HttpStatusCodeRange, type InstrumentationsInput, type OtelProviderHandle, type OtelProviderInput, buildOtelProvider, captureWebVitals, readPropagationFromDocument, registerBundledInstrumentations };
1
+ import { a as InstrumentationsInput, i as HttpStatusCodeRange, n as CaptureFailedRequestsOption, o as registerBundledInstrumentations, r as CaptureFailedRequestsOptions, t as BundledInstrumentations } from "../../instrumentations-Bgm2EazU.mjs";
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
+ import { t as readPropagationFromDocument } from "../../propagation-CssinKCy.mjs";
4
+ import { n as OtelProviderInput, r as buildOtelProvider, t as OtelProviderHandle } from "../../provider-Cp6noibq.mjs";
5
+ import { n as captureWebVitals } from "../../web-vitals-x8y70B5x.mjs";
6
+ import "../../index-CatPKbtv.mjs";
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{readPropagationFromDocument}from"./propagation.mjs";import{buildOtelProvider}from"./provider.mjs";import{captureWebVitals}from"./web-vitals.mjs";export{buildOtelProvider,captureWebVitals,readPropagationFromDocument,registerBundledInstrumentations};
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,12 +1,11 @@
1
1
  import { LoggerProvider } from "@opentelemetry/sdk-logs";
2
2
  //#region src/internal/otel/initial-navigation.d.ts
3
- interface InitialNavigationInput {
3
+ export interface InitialNavigationInput {
4
4
  getLocationHref?: () => string | undefined;
5
5
  getSessionId: () => string | null;
6
6
  getWindowId: () => string | null;
7
7
  loggerProvider: LoggerProvider;
8
8
  seen: Set<string>;
9
9
  }
10
- declare function recordInitialNavigation(input: InitialNavigationInput): void;
11
- //#endregion
12
- export { InitialNavigationInput, recordInitialNavigation };
10
+ export declare function recordInitialNavigation(input: InitialNavigationInput): void;
11
+ //#endregion
@@ -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({severityNumber:0,attributes:{"browser.navigation.type":`pageload`,"url.full":url}}))}export{recordInitialNavigation};
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};