@interfere/react 12.1.1 → 12.1.2

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 (44) hide show
  1. package/LICENSE +21 -0
  2. package/THIRD_PARTY_NOTICES.md +90 -0
  3. package/dist/api.d.mts +1 -8
  4. package/dist/error-boundary.d.mts +1 -1
  5. package/dist/{exporter-3w57pctH.mjs → exporter-BPldbwPH.mjs} +1 -1
  6. package/dist/index-BQDRTFUY.d.mts +4 -0
  7. package/dist/{instrumentations-BuccMAMj.d.mts → instrumentations-CpTaahVx.d.mts} +0 -7
  8. package/dist/internal/capture-boundary.d.mts +1 -1
  9. package/dist/internal/capture.d.mts +1 -1
  10. package/dist/internal/hydration.d.mts +0 -6
  11. package/dist/internal/kernel-registry.d.mts +1 -1
  12. package/dist/internal/kernel.d.mts +2 -2
  13. package/dist/internal/kernel.mjs +1 -1
  14. package/dist/internal/otel/exporter.mjs +1 -1
  15. package/dist/internal/otel/index.d.mts +3 -3
  16. package/dist/internal/otel/index.mjs +1 -1
  17. package/dist/internal/otel/instrumentations.d.mts +1 -1
  18. package/dist/internal/otel/provider.d.mts +1 -1
  19. package/dist/internal/otel/provider.mjs +1 -1
  20. package/dist/internal/plugins/plugin-runtime.d.mts +1 -1
  21. package/dist/internal/react-context.d.mts +1 -1
  22. package/dist/internal/version.mjs +1 -1
  23. package/dist/internal/wrapper-singleton.d.mts +1 -1
  24. package/dist/internal/wrapper-singleton.mjs +1 -1
  25. package/dist/{kernel-CwyJyyNf.mjs → kernel-CQ_zaX1p.mjs} +1 -1
  26. package/dist/plugins/device.d.mts +1 -1
  27. package/dist/plugins/errors.d.mts +1 -1
  28. package/dist/plugins/lib/loader.d.mts +1 -1
  29. package/dist/plugins/lib/types.d.mts +1 -1
  30. package/dist/plugins/logs.d.mts +1 -1
  31. package/dist/plugins/page-events.d.mts +1 -1
  32. package/dist/plugins/rage-clicks.d.mts +1 -1
  33. package/dist/plugins/replay/delivery.d.mts +1 -1
  34. package/dist/plugins/replay/index.d.mts +1 -1
  35. package/dist/{provider-DlD5S0wG.mjs → provider-BPAkt1DP.mjs} +1 -1
  36. package/dist/{provider-C68KiG80.d.mts → provider-D42pbUQM.d.mts} +6 -57
  37. package/dist/{provider-VZtcX6ZS.d.mts → provider-cUByhzgv.d.mts} +0 -4
  38. package/dist/provider.d.mts +1 -1
  39. package/dist/react-error-handler.d.mts +2 -8
  40. package/dist/tracking/registration.fixture.d.mts +3 -3
  41. package/dist/util/stringify.d.mts +0 -5
  42. package/dist/{version-B5O6bg5e.mjs → version-Bankk_vC.mjs} +1 -1
  43. package/package.json +41 -41
  44. package/dist/index-DBsXraeJ.d.mts +0 -4
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Interfere, Inc.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,90 @@
1
+ # Third-party notices
2
+
3
+ The MIT license in LICENSE applies to code authored by Interfere. Third-party components retain their respective licenses.
4
+
5
+ ## UAParser.js PRO Enterprise
6
+
7
+ - Package: `@ua-parser-js/pro-enterprise`
8
+ - Version: 2.0.10
9
+ - Project: https://uaparser.dev/
10
+ - License: UAParser.js PRO Enterprise, Version 2, July 2024
11
+
12
+ The React SDK uses this package for browser, device, and bot detection. The Next.js and Vite SDKs depend on the React SDK. UAParser is not covered by the Interfere SDKs' MIT license.
13
+
14
+ The license below restricts client use to the original functionality provided by the license holder and prohibits extracting, reproducing, or reusing UAParser independently. It also requires written consent for the open-source distribution described in its restrictions. This notice does not grant additional rights or replace any required permission.
15
+
16
+ ### Upstream license
17
+
18
+ ```text
19
+ # UAPARSER.JS PRO ENTERPRISE LICENSE
20
+
21
+ Version 2, July 2024
22
+
23
+ Copyright (C) 2023-2024 Faisal Salman <f+ua-parser-js@faisalman.com>
24
+
25
+ ---
26
+
27
+ ## Definitions
28
+
29
+ "We" are the team behind UAParser.js.
30
+
31
+ "You" are the individual, organization, or company who is responsible for purchasing this license.
32
+
33
+ "The Code" is UAParser.js.
34
+
35
+ "Project" is what you built with The Code.
36
+
37
+ ---
38
+
39
+ ## License
40
+
41
+ We retain all title, intellectual property, and ownership rights to The Code.
42
+
43
+ The Code is licensed, not sold, to You for use solely subject to the terms and conditions detailed here.
44
+
45
+ We grant You (and only You) a limited, non-exclusive, non-transferable, non-sublicensable, royalty-free right to use, copy, and modify The Code.
46
+
47
+ This license is only valid for You as one (1) individual, organization, or company and cannot be transferred to another individual, organization, or company.
48
+
49
+ ---
50
+
51
+ ## Rights
52
+
53
+ You may use, copy, and modify The Code for an indefinite number of Projects.
54
+
55
+ You have the right to receive lifetime updates and one (1) year of support, starting from the time you make the purchase.
56
+
57
+ ---
58
+
59
+ ## Restrictions
60
+
61
+ You may not redistribute The Code, as-is or modified, except as a part of a Project that you made.
62
+
63
+ If You transfer a Project to a client, the use of The Code must be limited to the original functionality that You created for them. The Code must not be extracted, reproduced, or used in any other way. You must inform your client of this condition.
64
+
65
+ You may not deliver a Project that contains The Code as an open-source Project that might be used for commercial purposes by the general public, except with our written consent.
66
+
67
+ You may not use The Code for unlawful, inappropriate, illegal, or offensive purposes.
68
+
69
+ ---
70
+
71
+ ## Limitations
72
+
73
+ The Code is provided 'as is' without warranty of any kind, expressed or implied.
74
+
75
+ We shall not be liable for any damages, including but not limited to, direct, indirect, special, incidental, or consequential damages or losses that occur by the use of The Code.
76
+
77
+ We reserve the right to discontinue the lifetime updates for The Code at any time, with or without notice.
78
+
79
+ We offer support only for questions within the scope of The Code's functionality or related issues at our sole discretion.
80
+
81
+ ---
82
+
83
+ ## Termination
84
+
85
+ This license is effective indefinitely but can be revoked at any time if there is a violation of any of the terms.
86
+
87
+ ---
88
+
89
+ END OF TERMS AND CONDITIONS
90
+ ```
package/dist/api.d.mts CHANGED
@@ -13,13 +13,6 @@ import { Span, SpanOptions } from "@opentelemetry/api";
13
13
  * return value, so call sites don't need defensive checks.
14
14
  */
15
15
  export declare function span<T>(name: string, fn: (span: Span) => T, options?: SpanOptions): T;
16
- /**
17
- * Captures an error. Records on the active OTel span (when present) AND on
18
- * the legacy envelope path. Accepts any thrown value; non-Error inputs that
19
- * carry structure (objects without a recoverable nested Error) are preserved
20
- * via `toException` so the original shape survives to the wire.
21
- *
22
- * Safe to call before init — drops silently if no kernel is registered.
23
- */
16
+ /** Captures any thrown value; calls before initialization are dropped. */
24
17
  export declare function capture(error: unknown): void;
25
18
  //#endregion
@@ -1,4 +1,4 @@
1
- import { a as InterfereContextValue, i as InterfereContext } from "./provider-C68KiG80.mjs";
1
+ import { a as InterfereContextValue, i as InterfereContext } from "./provider-D42pbUQM.mjs";
2
2
  import { Component, ContextType, ErrorInfo, ReactNode } from "react";
3
3
  //#region src/error-boundary.d.ts
4
4
  export interface ErrorBoundaryProps {
@@ -1 +1 @@
1
- import{t as PRODUCER_VERSION}from"./version-B5O6bg5e.mjs";import{t as IngestLogExporter}from"./exporter-logs-DS2AXWnV.mjs";import{t as IngestMetricExporter}from"./exporter-metrics-DZYqUo6_.mjs";import{toError}from"@interfere/types/sdk/errors";import{InterfereClient,InterfereError}from"@interfere/javascript";import{TELEMETRY_EXPORT_TIMEOUT_MS,retryTelemetry}from"@interfere/helpers/retry-telemetry";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}const textEncoder=new TextEncoder;let keepaliveBodyBytes=0;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,timeoutInSeconds:TELEMETRY_EXPORT_TIMEOUT_MS/1e3,fetch:Object.assign(async(url,init)=>{let body=init?.body,bytes=typeof body==`string`?textEncoder.encode(body).byteLength:0,keepalive=keepaliveBodyBytes+bytes<=6e4;keepalive&&(keepaliveBodyBytes+=bytes);try{return await retryTelemetry(async abortSignal=>globalThis.fetch(url,{...init,credentials:`omit`,keepalive,signal:abortSignal}),init?.signal)}finally{keepalive&&(keepaliveBodyBytes-=bytes)}},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{isIngestHalted as a,createTraceExporter as i,createLogExporter as n,resetIngestHalt as o,createMetricExporter as r,INGEST_IGNORE_RE as t};
1
+ import{t as PRODUCER_VERSION}from"./version-Bankk_vC.mjs";import{t as IngestLogExporter}from"./exporter-logs-DS2AXWnV.mjs";import{t as IngestMetricExporter}from"./exporter-metrics-DZYqUo6_.mjs";import{toError}from"@interfere/types/sdk/errors";import{InterfereClient,InterfereError}from"@interfere/javascript";import{TELEMETRY_EXPORT_TIMEOUT_MS,retryTelemetry}from"@interfere/helpers/retry-telemetry";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}const textEncoder=new TextEncoder;let keepaliveBodyBytes=0;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,timeoutInSeconds:TELEMETRY_EXPORT_TIMEOUT_MS/1e3,fetch:Object.assign(async(url,init)=>{let body=init?.body,bytes=typeof body==`string`?textEncoder.encode(body).byteLength:0,keepalive=keepaliveBodyBytes+bytes<=6e4;keepalive&&(keepaliveBodyBytes+=bytes);try{return await retryTelemetry(async abortSignal=>globalThis.fetch(url,{...init,credentials:`omit`,keepalive,signal:abortSignal}),init?.signal)}finally{keepalive&&(keepaliveBodyBytes-=bytes)}},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{isIngestHalted as a,createTraceExporter as i,createLogExporter as n,resetIngestHalt as o,createMetricExporter as r,INGEST_IGNORE_RE as t};
@@ -0,0 +1,4 @@
1
+ import "./instrumentations-CpTaahVx.mjs";
2
+ import "./navigation-CkiV6lJY.mjs";
3
+ import "./provider-cUByhzgv.mjs";
4
+ import "./web-vitals-x8y70B5x.mjs";
@@ -22,13 +22,6 @@ interface CaptureFailedRequestsOptions {
22
22
  */
23
23
  type CaptureFailedRequestsOption = boolean | CaptureFailedRequestsOptions;
24
24
  declare function resolveFailureRanges(opt: CaptureFailedRequestsOption | undefined): readonly HttpStatusCodeRange[] | null;
25
- /**
26
- * Per-instrumentation gate that keeps failed-request capture low-noise:
27
- * dedupes by `method+status+path` (so a flapping endpoint is captured once)
28
- * and rate-limits to {@link FAILURE_RATE_MAX} captures per
29
- * {@link FAILURE_RATE_WINDOW_MS} as a flood backstop. State lives in the
30
- * closure — one gate per kernel instance, no module-level mutable state.
31
- */
32
25
  declare function createFailureGate(): (key: string) => boolean;
33
26
  declare function classifyNetworkError(message: string): "abort" | "network" | "timeout";
34
27
  declare function applyFetchSpanAttrs(span: Span, request: FetchSpanRequest, result: Response | FetchError, failureRanges: readonly HttpStatusCodeRange[] | null, isTrackedUrl: (url: string) => boolean, resolveRoute: ((pathname: string) => string | undefined) | undefined, gate?: (key: string) => boolean): void;
@@ -1,4 +1,4 @@
1
- import { a as InterfereContextValue, i as InterfereContext } from "../provider-C68KiG80.mjs";
1
+ import { a as InterfereContextValue, i as InterfereContext } from "../provider-D42pbUQM.mjs";
2
2
  import { Component, ContextType, ReactNode } from "react";
3
3
  //#region src/internal/capture-boundary.d.ts
4
4
  interface CaptureBoundaryProps {
@@ -1,4 +1,4 @@
1
- import { s as Kernel } from "../provider-C68KiG80.mjs";
1
+ import { s as Kernel } from "../provider-D42pbUQM.mjs";
2
2
  import { ErrorMechanism } from "@interfere/types/sdk/plugins/payload/errors";
3
3
  //#region src/internal/capture.d.ts
4
4
  /**
@@ -1,9 +1,3 @@
1
1
  //#region src/internal/hydration.d.ts
2
- /**
3
- * True when an error is a React hydration mismatch — detected by the stable
4
- * `react.dev/errors/{418,423,425}` codes (production) or React's hydration
5
- * message wording (development). String-matches React internals, so it tracks
6
- * React's phrasing; the numeric error codes are the durable anchor.
7
- */
8
2
  export declare function isHydrationError(error: unknown): boolean;
9
3
  //#endregion
@@ -1,4 +1,4 @@
1
- import { s as Kernel } from "../provider-C68KiG80.mjs";
1
+ import { s as Kernel } from "../provider-D42pbUQM.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,5 +1,5 @@
1
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";
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-D42pbUQM.mjs";
3
+ import { i as HttpStatusCodeRange, n as CaptureFailedRequestsOption, r as CaptureFailedRequestsOptions } from "../instrumentations-CpTaahVx.mjs";
4
4
  import { t as isEnabledByEnvironment } from "../environment-_LKcAXKG.mjs";
5
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{t as isEnabledByEnvironment}from"../environment-CoEXhF1a.mjs";import{i as readReleaseSlugFromGlobals,n as buildSdkStack,r as createKernel,t as Kernel}from"../kernel-CwyJyyNf.mjs";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-CQ_zaX1p.mjs";export{Kernel,buildSdkStack,createKernel,isEnabledByEnvironment,readReleaseSlugFromGlobals};
@@ -1 +1 @@
1
- import{a as isIngestHalted,i as createTraceExporter,n as createLogExporter,o as resetIngestHalt,r as createMetricExporter,t as INGEST_IGNORE_RE}from"../../exporter-3w57pctH.mjs";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-BPldbwPH.mjs";export{INGEST_IGNORE_RE,createLogExporter,createMetricExporter,createTraceExporter,isIngestHalted,resetIngestHalt};
@@ -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-BuccMAMj.mjs";
1
+ import { a as InstrumentationsInput, i as HttpStatusCodeRange, n as CaptureFailedRequestsOption, o as registerBundledInstrumentations, r as CaptureFailedRequestsOptions, t as BundledInstrumentations } from "../../instrumentations-CpTaahVx.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-VZtcX6ZS.mjs";
4
+ import { n as OtelProviderInput, r as buildOtelProvider, t as OtelProviderHandle } from "../../provider-cUByhzgv.mjs";
5
5
  import { n as captureWebVitals } from "../../web-vitals-x8y70B5x.mjs";
6
- import "../../index-DBsXraeJ.mjs";
6
+ import "../../index-BQDRTFUY.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{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-DlD5S0wG.mjs";import{t as captureWebVitals}from"../../web-vitals-CxXDUgpl.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-BPAkt1DP.mjs";import{t as captureWebVitals}from"../../web-vitals-CxXDUgpl.mjs";export{PAGE_SCOPE_MAX_AGE_MS,buildOtelProvider,captureWebVitals,createPageScopeRotator,installNavigationScope,readPropagationFromDocument,registerBundledInstrumentations,seedPageScope};
@@ -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-BuccMAMj.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-CpTaahVx.mjs";
2
2
  export { BundledInstrumentations, CaptureFailedRequestsOption, CaptureFailedRequestsOptions, HttpStatusCodeRange, InstrumentationsInput, registerBundledInstrumentations, testOnlyApplyFetchSpanAttrs, testOnlyApplyXhrSpanAttrs, testOnlyClassifyNetworkError, testOnlyCreateFailureGate, testOnlyResolveFailureRanges };
@@ -1,2 +1,2 @@
1
- import { n as OtelProviderInput, r as buildOtelProvider, t as OtelProviderHandle } from "../../provider-VZtcX6ZS.mjs";
1
+ import { n as OtelProviderInput, r as buildOtelProvider, t as OtelProviderHandle } from "../../provider-cUByhzgv.mjs";
2
2
  export { OtelProviderHandle, OtelProviderInput, buildOtelProvider };
@@ -1 +1 @@
1
- import{t as buildOtelProvider}from"../../provider-DlD5S0wG.mjs";export{buildOtelProvider};
1
+ import{t as buildOtelProvider}from"../../provider-BPAkt1DP.mjs";export{buildOtelProvider};
@@ -1,2 +1,2 @@
1
- import { y as PluginRuntime } from "../../provider-C68KiG80.mjs";
1
+ import { y as PluginRuntime } from "../../provider-D42pbUQM.mjs";
2
2
  export { PluginRuntime };
@@ -1,2 +1,2 @@
1
- import { a as InterfereContextValue, i as InterfereContext, o as NULL_CONTEXT_VALUE } from "../provider-C68KiG80.mjs";
1
+ import { a as InterfereContextValue, i as InterfereContext, o as NULL_CONTEXT_VALUE } from "../provider-D42pbUQM.mjs";
2
2
  export { InterfereContext, InterfereContextValue, NULL_CONTEXT_VALUE };
@@ -1 +1 @@
1
- import{n as SDK_NAME,r as SDK_VERSION,t as PRODUCER_VERSION}from"../version-B5O6bg5e.mjs";export{PRODUCER_VERSION,SDK_NAME,SDK_VERSION};
1
+ import{n as SDK_NAME,r as SDK_VERSION,t as PRODUCER_VERSION}from"../version-Bankk_vC.mjs";export{PRODUCER_VERSION,SDK_NAME,SDK_VERSION};
@@ -1,4 +1,4 @@
1
- import { f as KernelOptions, s as Kernel } from "../provider-C68KiG80.mjs";
1
+ import { f as KernelOptions, s as Kernel } from "../provider-D42pbUQM.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{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-CwyJyyNf.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};
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-CQ_zaX1p.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};
@@ -1 +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-B5O6bg5e.mjs";import{t as INGEST_IGNORE_RE}from"./exporter-3w57pctH.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};
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-Bankk_vC.mjs";import{t as INGEST_IGNORE_RE}from"./exporter-BPldbwPH.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};
@@ -1,4 +1,4 @@
1
- import { w as Plugin } from "../provider-C68KiG80.mjs";
1
+ import { w as Plugin } from "../provider-D42pbUQM.mjs";
2
2
  //#region src/plugins/device.d.ts
3
3
  declare const devicePlugin: Plugin;
4
4
  //#endregion
@@ -1,4 +1,4 @@
1
- import { w as Plugin } from "../provider-C68KiG80.mjs";
1
+ import { w as Plugin } from "../provider-D42pbUQM.mjs";
2
2
  //#region src/plugins/errors.d.ts
3
3
  declare const errorsPlugin: Plugin;
4
4
  //#endregion
@@ -1,2 +1,2 @@
1
- import { C as resolveFeatures, S as loadPlugin, b as LOADERS, x as PluginOverrides } from "../../provider-C68KiG80.mjs";
1
+ import { C as resolveFeatures, S as loadPlugin, b as LOADERS, x as PluginOverrides } from "../../provider-D42pbUQM.mjs";
2
2
  export { LOADERS, PluginOverrides, loadPlugin, resolveFeatures };
@@ -1,2 +1,2 @@
1
- import { D as PluginContext, E as PluginConfigState, O as PluginTeardownReason, T as PluginCleanup, w as Plugin } from "../../provider-C68KiG80.mjs";
1
+ import { D as PluginContext, E as PluginConfigState, O as PluginTeardownReason, T as PluginCleanup, w as Plugin } from "../../provider-D42pbUQM.mjs";
2
2
  export { Plugin, PluginCleanup, PluginConfigState, PluginContext, PluginTeardownReason };
@@ -1,4 +1,4 @@
1
- import { w as Plugin } from "../provider-C68KiG80.mjs";
1
+ import { w as Plugin } from "../provider-D42pbUQM.mjs";
2
2
  //#region src/plugins/logs.d.ts
3
3
  /**
4
4
  * Subscribes to the central console patch so string-only console calls
@@ -1,4 +1,4 @@
1
- import { w as Plugin } from "../provider-C68KiG80.mjs";
1
+ import { w as Plugin } from "../provider-D42pbUQM.mjs";
2
2
  //#region src/plugins/page-events.d.ts
3
3
  declare const pageEventsPlugin: Plugin;
4
4
  //#endregion
@@ -1,4 +1,4 @@
1
- import { w as Plugin } from "../provider-C68KiG80.mjs";
1
+ import { w as Plugin } from "../provider-D42pbUQM.mjs";
2
2
  //#region src/plugins/rage-clicks.d.ts
3
3
  declare const rageClicksPlugin: Plugin;
4
4
  //#endregion
@@ -1,4 +1,4 @@
1
- import { D as PluginContext } from "../../provider-C68KiG80.mjs";
1
+ import { D as PluginContext } from "../../provider-D42pbUQM.mjs";
2
2
  import { n as resolveTargets } from "../../config-CBqqY1AV.mjs";
3
3
  import { n as ReplayChunkPayload } from "../../chunking-Dvs3f50A.mjs";
4
4
  import { t as Compressor } from "../../compressor-host-BAz6860r.mjs";
@@ -1,4 +1,4 @@
1
- import { w as Plugin } from "../../provider-C68KiG80.mjs";
1
+ import { w as Plugin } from "../../provider-D42pbUQM.mjs";
2
2
  //#region src/plugins/replay/index.d.ts
3
3
  declare const replayPlugin: Plugin;
4
4
  //#endregion
@@ -1 +1 @@
1
- import{n as getStringGlobal}from"./global-DYq1Z4_H.mjs";import{n as SDK_NAME,r as SDK_VERSION}from"./version-B5O6bg5e.mjs";import{i as createTraceExporter,n as createLogExporter,r as createMetricExporter}from"./exporter-3w57pctH.mjs";import{t as PageScopeContextManager}from"./page-scope-context-manager-DhArvVJ_.mjs";import{context,propagation}from"@opentelemetry/api";import{omitUndefined}from"@interfere/helpers/omit-undefined";import{ENVIRONMENT_GLOBAL}from"@interfere/types/sdk/injected-globals";import{createUrlRedactionSpanProcessor,resolveUrlRedaction}from"@interfere/types/sdk/url-redaction";import{CompositePropagator,W3CBaggagePropagator,W3CTraceContextPropagator}from"@opentelemetry/core";import{defaultServiceName,detectResources,resourceFromAttributes}from"@opentelemetry/resources";import{MeterProvider,PeriodicExportingMetricReader}from"@opentelemetry/sdk-metrics";import{WebTracerProvider}from"@opentelemetry/sdk-trace-web";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{createSessionLogRecordProcessor,createSessionSpanProcessor}from"@opentelemetry/web-common";const ATTR_DEVICE_ID=`device.id`,BROWSER_BATCH_OPTIONS={exportTimeoutMillis:7e4,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=[createUrlRedactionSpanProcessor(input.urlRedaction??resolveUrlRedaction()),createSessionSpanProcessor({getSessionId}),createDeviceSpanProcessor({getDeviceId}),createDeviceInfoSpanProcessor({attributes:deviceInfoAttributes,isEnabled:isDeviceInfoEnabled}),...input.additionalSpanProcessors??[],new BatchSpanProcessor(traceExporter,BROWSER_BATCH_OPTIONS)],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:75e3,exportTimeoutMillis:7e4,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({timeoutMillis:75e3}),metricReader.forceFlush({timeoutMillis:75e3}),loggerProvider.forceFlush({timeoutMillis:75e3})])},loggerProvider,meterProvider,metricReader,shutdown:async()=>{isShutdown=!0,await Promise.allSettled([tracerProvider.shutdown(),meterProvider.shutdown(),loggerProvider.shutdown()])},tracerProvider}}export{buildOtelProvider as t};
1
+ import{n as getStringGlobal}from"./global-DYq1Z4_H.mjs";import{n as SDK_NAME,r as SDK_VERSION}from"./version-Bankk_vC.mjs";import{i as createTraceExporter,n as createLogExporter,r as createMetricExporter}from"./exporter-BPldbwPH.mjs";import{t as PageScopeContextManager}from"./page-scope-context-manager-DhArvVJ_.mjs";import{context,propagation}from"@opentelemetry/api";import{omitUndefined}from"@interfere/helpers/omit-undefined";import{ENVIRONMENT_GLOBAL}from"@interfere/types/sdk/injected-globals";import{createUrlRedactionSpanProcessor,resolveUrlRedaction}from"@interfere/types/sdk/url-redaction";import{CompositePropagator,W3CBaggagePropagator,W3CTraceContextPropagator}from"@opentelemetry/core";import{defaultServiceName,detectResources,resourceFromAttributes}from"@opentelemetry/resources";import{MeterProvider,PeriodicExportingMetricReader}from"@opentelemetry/sdk-metrics";import{WebTracerProvider}from"@opentelemetry/sdk-trace-web";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{createSessionLogRecordProcessor,createSessionSpanProcessor}from"@opentelemetry/web-common";const ATTR_DEVICE_ID=`device.id`,BROWSER_BATCH_OPTIONS={exportTimeoutMillis:7e4,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=[createUrlRedactionSpanProcessor(input.urlRedaction??resolveUrlRedaction()),createSessionSpanProcessor({getSessionId}),createDeviceSpanProcessor({getDeviceId}),createDeviceInfoSpanProcessor({attributes:deviceInfoAttributes,isEnabled:isDeviceInfoEnabled}),...input.additionalSpanProcessors??[],new BatchSpanProcessor(traceExporter,BROWSER_BATCH_OPTIONS)],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:75e3,exportTimeoutMillis:7e4,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({timeoutMillis:75e3}),metricReader.forceFlush({timeoutMillis:75e3}),loggerProvider.forceFlush({timeoutMillis:75e3})])},loggerProvider,meterProvider,metricReader,shutdown:async()=>{isShutdown=!0,await Promise.allSettled([tracerProvider.shutdown(),meterProvider.shutdown(),loggerProvider.shutdown()])},tracerProvider}}export{buildOtelProvider as t};
@@ -3,9 +3,9 @@ import { i as PrivacyPolicy, r as PrivacyOptions } from "./privacy-CPKosXDP.mjs"
3
3
  import { a as ReplayOption, i as ReplayConfig } from "./config-Dyc09HCZ.mjs";
4
4
  import { n as PageEventsOption } from "./page-events-config-CiJvdAaJ.mjs";
5
5
  import { t as SessionTracker } from "./api-CMPV9rgU.mjs";
6
- import { n as CaptureFailedRequestsOption, t as BundledInstrumentations } from "./instrumentations-BuccMAMj.mjs";
7
- import { t as OtelProviderHandle } from "./provider-VZtcX6ZS.mjs";
8
- import "./index-DBsXraeJ.mjs";
6
+ import { n as CaptureFailedRequestsOption, t as BundledInstrumentations } from "./instrumentations-CpTaahVx.mjs";
7
+ import { t as OtelProviderHandle } from "./provider-cUByhzgv.mjs";
8
+ import "./index-BQDRTFUY.mjs";
9
9
  import { NonErrorException } from "@interfere/types/sdk/errors";
10
10
  import { Tracer } from "@opentelemetry/api";
11
11
  import { PropsWithChildren } from "react";
@@ -210,20 +210,9 @@ interface TracingOptions {
210
210
  */
211
211
  webVitals?: boolean;
212
212
  }
213
- /**
214
- * Framework wrappers (`@interfere/next`, `@interfere/vite`) pass extra
215
- * fields through `createKernel` that customers never set themselves.
216
- * Kept off the customer-facing `KernelOptions` to make the public surface
217
- * clean.
218
- *
219
- * @internal
220
- */
221
213
  interface KernelInternalOptions extends KernelOptions {
222
- /** @internal */
223
214
  _internalAdditionalLogRecordProcessors?: LogRecordProcessor[];
224
- /** @internal */
225
215
  _internalAdditionalMetricReaders?: MetricReader[];
226
- /** @internal */
227
216
  _internalAdditionalSpanProcessors?: SpanProcessor[];
228
217
  /** Wrapper SDK versions (e.g. `@interfere/next@10.0.0`). */
229
218
  _wrapperVersions?: string[];
@@ -306,11 +295,6 @@ declare class Kernel implements PluginContext {
306
295
  private unsubscribePageHidden;
307
296
  private readonly tracker;
308
297
  constructor(tracker: SessionTracker, privacy?: PrivacyOptions);
309
- /**
310
- * Bound by `createKernel` immediately after construction.
311
- *
312
- * @internal
313
- */
314
298
  attachRuntime(runtime: PluginRuntime): void;
315
299
  private requireRuntime;
316
300
  /** PluginContext shim: plugins expect a non-null string. */
@@ -369,15 +353,6 @@ declare class Kernel implements PluginContext {
369
353
  * surface the resolution either way.
370
354
  */
371
355
  flush(): Promise<void>;
372
- /**
373
- * Wired by `createKernel` after the OTel module has been
374
- * lazy-loaded. Held on the kernel so `flush()` and `dispose()` can fan
375
- * out to the providers. The tracer/meter providers stay private —
376
- * customers don't get raw OTel access; the public surface is the
377
- * `span()` / `capture()` helpers in `api.ts`.
378
- *
379
- * @internal
380
- */
381
356
  attachOtel(handle: OtelProviderHandle, dispose: () => void, controls?: Pick<BundledInstrumentations, "setPageEventsEnabled">): void;
382
357
  syncProviderConfig(config: {
383
358
  consent?: ConsentInput | undefined;
@@ -444,41 +419,15 @@ declare const InterfereContext: import("react").Context<InterfereContextValue |
444
419
  //#endregion
445
420
  //#region src/provider.d.ts
446
421
  interface InterfereProviderProps extends PropsWithChildren {
447
- /**
448
- * Current permission for analytics and replay. Use true or false
449
- * for both categories, or booleans per category; omitted categories are allowed. Omit (or pass
450
- * `undefined`) to preserve consent supplied to `init()`. Without initial
451
- * consent, omitting this prop leaves every category allowed.
452
- */
422
+ /** Sets analytics/replay consent; undefined preserves init() consent, and omitted categories are allowed. */
453
423
  consent?: ConsentInput | undefined;
454
424
  /** Reports render errors and rethrows to the host boundary. Defaults to true. */
455
425
  captureRenderErrors?: boolean;
456
426
  /** @deprecated Use captureRenderErrors, which takes precedence when both are set. */
457
427
  errorBoundary?: boolean;
458
- /**
459
- * The active kernel from `init()`. Pass `null` (or omit on the server)
460
- * when the SDK isn't initialized — useful during SSR/SSG where `init()`
461
- * runs client-side only. The provider mounts with null-safe accessors
462
- * and switches to the real kernel once it's available.
463
- */
428
+ /** Active kernel returned by init(); pass null before initialization or during server rendering. */
464
429
  kernel: Kernel | null;
465
- /**
466
- * Per-plugin overrides, merged over the manifest defaults. Generic plugins
467
- * are booleans (e.g. `{ rageClick: false }`). `pageEvents` also accepts
468
- * `{ interactions: false }`, which keeps navigation, document-load and
469
- * resource timing while dropping click and submit spans. `replay`
470
- * additionally accepts a config object — `{ replay: { maskAllInputs: true } }`
471
- * enables replay with that masking config; `{ replay: false }` disables it.
472
- * Privacy classes are always applied, regardless of config:
473
- * `interfere-block` elements are dropped and replay as a same-size
474
- * placeholder, `interfere-mask` masks the text of an element and all its
475
- * children, and `interfere-ignore` stops an element's input events from
476
- * being recorded. `input[type="password"]` is masked by default; use
477
- * `maskInputOptions`/`maskAllInputs` to mask other input values. Use
478
- * `init()`'s `privacy` option for selectors that also govern click, submit
479
- * and rage-click capture. `init()` no longer accepts plugin config; this is
480
- * the only place it lives.
481
- */
430
+ /** Per-plugin overrides merged over defaults; replay accepts masking options, while privacy classes always apply. */
482
431
  plugins?: PluginOverrides | undefined;
483
432
  }
484
433
  declare function InterfereProvider({ kernel, children, consent, plugins, captureRenderErrors, errorBoundary }: InterfereProviderProps): import("react").JSX.Element;
@@ -9,11 +9,8 @@ import { LogRecordProcessor, LoggerProvider } from "@opentelemetry/sdk-logs";
9
9
  import { SpanProcessor } from "@opentelemetry/sdk-trace-base";
10
10
  //#region src/internal/otel/provider.d.ts
11
11
  interface OtelProviderInput {
12
- /** @internal */
13
12
  additionalLogRecordProcessors?: LogRecordProcessor[];
14
- /** @internal */
15
13
  additionalMetricReaders?: MetricReader[];
16
- /** @internal */
17
14
  additionalSpanProcessors?: SpanProcessor[];
18
15
  /**
19
16
  * Auth + content headers for OTLP exports. Sourced from the kernel's
@@ -41,7 +38,6 @@ interface OtelProviderInput {
41
38
  * `SessionTracker` has bootstrapped.
42
39
  */
43
40
  getSessionId: () => SessionId | null;
44
- /** @internal Session getter with the current propagation consent applied. */
45
41
  getPropagationSessionId?: () => SessionId | null;
46
42
  /**
47
43
  * Consent gate for the browser-detector attributes (`browser.*`,
@@ -1,4 +1,4 @@
1
1
  import { a as ReplayOption, i as ReplayConfig } from "./config-Dyc09HCZ.mjs";
2
- import { a as InterfereContextValue, i as InterfereContext, n as useInterfere, r as useSession, t as InterfereProvider, x as PluginOverrides } from "./provider-C68KiG80.mjs";
2
+ import { a as InterfereContextValue, i as InterfereContext, n as useInterfere, r as useSession, t as InterfereProvider, x as PluginOverrides } from "./provider-D42pbUQM.mjs";
3
3
  import { n as PageEventsOption, t as PageEventsConfig } from "./page-events-config-CiJvdAaJ.mjs";
4
4
  export { InterfereContext, type InterfereContextValue, InterfereProvider, type PageEventsConfig, type PageEventsOption, type PluginOverrides, type ReplayConfig, type ReplayOption, useInterfere, useSession };
@@ -1,12 +1,6 @@
1
- import { s as Kernel } from "./provider-C68KiG80.mjs";
1
+ import { s as Kernel } from "./provider-D42pbUQM.mjs";
2
2
  //#region src/react-error-handler.d.ts
3
- /**
4
- * Matches the shape React 19 passes to `onCaughtError`, `onUncaughtError`,
5
- * and `onRecoverableError` on `createRoot()` / `hydrateRoot()`.
6
- *
7
- * We intentionally keep this permissive — React has iterated on the exact
8
- * fields of `ErrorInfo` across 19.x minors and we only need `componentStack`.
9
- */
3
+ /** React root error-handler metadata; only componentStack is consumed. */
10
4
  interface ReactRootErrorInfo {
11
5
  componentStack?: string | null | undefined;
12
6
  }
@@ -1,6 +1,6 @@
1
1
  import { t as SessionTracker } from "../api-CMPV9rgU.mjs";
2
2
  import { InterfereClient } from "@interfere/javascript";
3
- //#region ../../../../node_modules/.bun/vitest@5.0.5+68042dbef16394d8/node_modules/vitest/optional-runtime-types.d.ts
3
+ //#region ../../../../node_modules/.bun/vitest@5.0.5+0658583d3f365267/node_modules/vitest/optional-runtime-types.d.ts
4
4
  /* oxlint-disable typescript/ban-ts-comment */
5
5
  interface Disposable {
6
6
  // @ts-ignore -- Symbol.dispose might not be in user types
@@ -726,7 +726,7 @@ type TimestampProviderName = (string & {}) | TimestampFns;
726
726
  */
727
727
  type TimestampValue = bigint | number;
728
728
  //#endregion
729
- //#region ../../../../node_modules/.bun/vitest@5.0.5+68042dbef16394d8/node_modules/vitest/dist/chunks/config.d.QBNYCgFU.d.ts
729
+ //#region ../../../../node_modules/.bun/vitest@5.0.5+0658583d3f365267/node_modules/vitest/dist/chunks/config.d.QBNYCgFU.d.ts
730
730
  /**
731
731
  * Copyright (c) Meta Platforms, Inc. and affiliates.
732
732
  *
@@ -2989,7 +2989,7 @@ interface TestArtifactRegistry {}
2989
2989
  */
2990
2990
  type TestArtifact = BrowserTraceArtifact | FailureScreenshotArtifact | TestAnnotationArtifact | VisualRegressionArtifact | TestArtifactRegistry[keyof TestArtifactRegistry];
2991
2991
  //#endregion
2992
- //#region ../../../../node_modules/.bun/vitest@5.0.5+68042dbef16394d8/node_modules/vitest/dist/chunks/task-utils.d.PFh2BV6Q.d.ts
2992
+ //#region ../../../../node_modules/.bun/vitest@5.0.5+0658583d3f365267/node_modules/vitest/dist/chunks/task-utils.d.PFh2BV6Q.d.ts
2993
2993
  interface SnapshotMatcher<R extends void | Promise<void>, T = unknown> {
2994
2994
  <U extends { [P in keyof T]: any; }>(snapshot: Partial<U>, hint?: string): R;
2995
2995
  (hint?: string): R;
@@ -1,8 +1,3 @@
1
1
  //#region src/util/stringify.d.ts
2
- /**
3
- * `JSON.stringify` with a `String(value)` fallback for circular refs and
4
- * non-serialisable values (BigInt, …). Strings pass through unchanged so
5
- * single-arg log calls don't get re-quoted.
6
- */
7
2
  export declare function safeStringify(value: unknown): string;
8
3
  //#endregion
@@ -1 +1 @@
1
- var name=`@interfere/react`,version=`12.1.1`;const SDK_NAME=name,SDK_VERSION=version,PRODUCER_VERSION=`${SDK_NAME}@${SDK_VERSION}`;export{SDK_NAME as n,SDK_VERSION as r,PRODUCER_VERSION as t};
1
+ var name=`@interfere/react`,version=`12.1.2`;const SDK_NAME=name,SDK_VERSION=version,PRODUCER_VERSION=`${SDK_NAME}@${SDK_VERSION}`;export{SDK_NAME as n,SDK_VERSION as r,PRODUCER_VERSION as t};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@interfere/react",
3
- "version": "12.1.1",
3
+ "version": "12.1.2",
4
4
  "description": "Client-side React SDK for Interfere. Error tracking, session replay, and analytics.",
5
5
  "keywords": [
6
6
  "error-tracking",
@@ -10,9 +10,7 @@
10
10
  "typescript"
11
11
  ],
12
12
  "homepage": "https://interfere.com",
13
- "bugs": {
14
- "url": "mailto:support@interfere.com"
15
- },
13
+ "bugs": "mailto:support@interfere.com",
16
14
  "license": "MIT",
17
15
  "author": "Interfere <support@interfere.com> (https://interfere.com)",
18
16
  "repository": {
@@ -21,7 +19,9 @@
21
19
  "directory": "src/packages/public/react"
22
20
  },
23
21
  "files": [
24
- "dist"
22
+ "dist",
23
+ "LICENSE",
24
+ "THIRD_PARTY_NOTICES.md"
25
25
  ],
26
26
  "type": "module",
27
27
  "sideEffects": false,
@@ -87,64 +87,64 @@
87
87
  },
88
88
  "scripts": {
89
89
  "build": "tsdown",
90
- "test": "vitest run --config ../../../../vitest.config.ts",
90
+ "test": "node ../../private/vitest-config/src/cli.ts run --config ../../../../vitest.config.ts",
91
91
  "test:artifact": "bun run build && node --test test/recorder-artifact.test.mts",
92
92
  "typecheck": "bun check"
93
93
  },
94
94
  "dependencies": {
95
- "@fingerprintjs/fingerprintjs": "^5.2.0",
95
+ "@fingerprintjs/fingerprintjs": "5.2.0",
96
96
  "@interfere/constants": "^9.2.0",
97
97
  "@interfere/helpers": "^9.2.1",
98
98
  "@interfere/javascript": "^0.2.1",
99
99
  "@interfere/types": "^10.3.0",
100
- "@opentelemetry/api": "^1.9.1",
101
- "@opentelemetry/api-logs": "^0.222.0",
102
- "@opentelemetry/context-zone": "^2.11.0",
103
- "@opentelemetry/core": "^2.11.0",
104
- "@opentelemetry/instrumentation": "^0.222.0",
105
- "@opentelemetry/instrumentation-browser-navigation": "^0.15.0",
106
- "@opentelemetry/instrumentation-document-load": "^0.67.0",
107
- "@opentelemetry/instrumentation-fetch": "^0.222.0",
108
- "@opentelemetry/instrumentation-long-task": "^0.66.0",
109
- "@opentelemetry/instrumentation-user-interaction": "^0.66.0",
110
- "@opentelemetry/instrumentation-xml-http-request": "^0.222.0",
111
- "@opentelemetry/opentelemetry-browser-detector": "^0.222.0",
112
- "@opentelemetry/otlp-transformer": "^0.222.0",
113
- "@opentelemetry/resources": "^2.11.0",
114
- "@opentelemetry/sdk-logs": "^0.222.0",
115
- "@opentelemetry/sdk-metrics": "^2.11.0",
116
- "@opentelemetry/sdk-trace-base": "^2.11.0",
117
- "@opentelemetry/sdk-trace-web": "^2.11.0",
118
- "@opentelemetry/web-common": "^0.222.0",
100
+ "@opentelemetry/api": "1.9.1",
101
+ "@opentelemetry/api-logs": "0.222.0",
102
+ "@opentelemetry/context-zone": "2.11.0",
103
+ "@opentelemetry/core": "2.11.0",
104
+ "@opentelemetry/instrumentation": "0.222.0",
105
+ "@opentelemetry/instrumentation-browser-navigation": "0.15.0",
106
+ "@opentelemetry/instrumentation-document-load": "0.67.0",
107
+ "@opentelemetry/instrumentation-fetch": "0.222.0",
108
+ "@opentelemetry/instrumentation-long-task": "0.66.0",
109
+ "@opentelemetry/instrumentation-user-interaction": "0.66.0",
110
+ "@opentelemetry/instrumentation-xml-http-request": "0.222.0",
111
+ "@opentelemetry/opentelemetry-browser-detector": "0.222.0",
112
+ "@opentelemetry/otlp-transformer": "0.222.0",
113
+ "@opentelemetry/resources": "2.11.0",
114
+ "@opentelemetry/sdk-logs": "0.222.0",
115
+ "@opentelemetry/sdk-metrics": "2.11.0",
116
+ "@opentelemetry/sdk-trace-base": "2.11.0",
117
+ "@opentelemetry/sdk-trace-web": "2.11.0",
118
+ "@opentelemetry/web-common": "0.222.0",
119
119
  "@rrweb/types": "2.1.1",
120
- "@ua-parser-js/pro-enterprise": "^2.0.6",
120
+ "@ua-parser-js/pro-enterprise": "2.0.10",
121
121
  "rrweb": "2.1.1",
122
- "uuid": "^14.0.2",
123
- "web-vitals": "^6.2.1",
124
- "workbox-background-sync": "^7.4.0",
125
- "zod": "^4.5.4"
122
+ "uuid": "14.0.2",
123
+ "web-vitals": "6.2.1",
124
+ "workbox-background-sync": "7.4.1",
125
+ "zod": "4.6.6"
126
126
  },
127
127
  "devDependencies": {
128
- "@babel/core": "^7.29.7",
128
+ "@babel/core": "7.29.7",
129
129
  "@interfere/typescript-config": "^9.0.2",
130
130
  "@interfere/vitest-config": "0.0.0",
131
- "@rolldown/plugin-babel": "^0.2.3",
132
- "@types/babel__core": "^7.20.5",
133
- "@types/node": "^26.4.1",
131
+ "@rolldown/plugin-babel": "0.2.3",
132
+ "@types/babel__core": "7.20.5",
133
+ "@types/node": "26.4.1",
134
134
  "@types/react": "19.2.18",
135
135
  "@types/react-dom": "19.2.7",
136
- "@vitejs/plugin-react": "^6.1.1",
136
+ "@vitejs/plugin-react": "6.1.1",
137
137
  "@vitest/browser": "5.0.5",
138
138
  "@vitest/browser-playwright": "5.0.5",
139
139
  "@vitest/coverage-v8": "5.0.5",
140
140
  "babel-plugin-react-compiler": "1.0.0",
141
- "fflate": "^0.8.3",
142
- "msw": "^2.14.6",
143
- "playwright": "^1.63.0",
141
+ "fflate": "0.8.3",
142
+ "msw": "2.15.0",
143
+ "playwright": "1.63.0",
144
144
  "react": "19.3.0",
145
145
  "react-dom": "19.3.0",
146
- "tsdown": "^0.23.0",
147
- "typescript": "^7.0.2",
146
+ "tsdown": "0.23.0",
147
+ "typescript": "7.0.2",
148
148
  "vitest": "5.0.5",
149
149
  "vitest-browser-react": "2.3.0"
150
150
  },
@@ -1,4 +0,0 @@
1
- import "./instrumentations-BuccMAMj.mjs";
2
- import "./navigation-CkiV6lJY.mjs";
3
- import "./provider-VZtcX6ZS.mjs";
4
- import "./web-vitals-x8y70B5x.mjs";