@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.
- package/README.md +4 -4
- package/dist/activity-BfYxFVcK.d.mts +36 -0
- package/dist/api-wpS4xoMY.d.mts +70 -0
- package/dist/api.d.mts +8 -7
- package/dist/api.mjs +1 -1
- package/dist/config-Rm-ct4K1.d.mts +12 -0
- package/dist/device-vFtWy12y.d.mts +35 -0
- package/dist/error-boundary.d.mts +7 -7
- package/dist/error-boundary.mjs +1 -1
- package/dist/exporter-logs-CeGwMiMo.d.mts +51 -0
- package/dist/geo-PDfIZY4L.d.mts +16 -0
- package/dist/index-CatPKbtv.d.mts +4 -0
- package/dist/instrumentations-Bgm2EazU.d.mts +91 -0
- package/dist/internal/activity.d.mts +1 -35
- package/dist/internal/activity.mjs +1 -1
- package/dist/internal/browser-context.d.mts +44 -4
- package/dist/internal/browser-context.mjs +1 -1
- package/dist/internal/capture-boundary.d.mts +6 -5
- package/dist/internal/capture-boundary.mjs +1 -1
- package/dist/internal/capture.d.mts +3 -4
- package/dist/internal/capture.mjs +1 -1
- package/dist/internal/config.d.mts +26 -27
- package/dist/internal/config.mjs +1 -1
- package/dist/internal/consent.d.mts +16 -8
- package/dist/internal/console-patch.d.mts +6 -7
- package/dist/internal/console-patch.mjs +1 -1
- package/dist/internal/dom/actionable.d.mts +5 -7
- package/dist/internal/dom/actionable.mjs +1 -1
- package/dist/internal/hydration.d.mts +2 -3
- package/dist/internal/kernel-registry.d.mts +5 -6
- package/dist/internal/kernel.d.mts +2 -292
- package/dist/internal/kernel.mjs +1 -1
- package/dist/internal/otel/exporter-logs.d.mts +1 -12
- package/dist/internal/otel/exporter-logs.mjs +1 -1
- package/dist/internal/otel/exporter-metrics.d.mts +2 -14
- package/dist/internal/otel/exporter-metrics.mjs +1 -1
- package/dist/internal/otel/exporter.d.mts +2 -29
- package/dist/internal/otel/exporter.mjs +1 -1
- package/dist/internal/otel/http-span-route.d.mts +4 -0
- package/dist/internal/otel/http-span-route.mjs +1 -0
- package/dist/internal/otel/index.d.mts +7 -5
- package/dist/internal/otel/index.mjs +1 -1
- package/dist/internal/otel/initial-navigation.d.mts +3 -4
- package/dist/internal/otel/initial-navigation.mjs +1 -1
- package/dist/internal/otel/instrumentations.d.mts +2 -89
- package/dist/internal/otel/instrumentations.mjs +1 -1
- package/dist/internal/otel/navigation.d.mts +2 -0
- package/dist/internal/otel/navigation.mjs +1 -0
- package/dist/internal/otel/normalize-path.d.mts +9 -0
- package/dist/internal/otel/normalize-path.mjs +1 -0
- package/dist/internal/otel/page-scope-context-manager.d.mts +2 -31
- package/dist/internal/otel/page-scope-context-manager.mjs +1 -1
- package/dist/internal/otel/propagation.d.mts +1 -19
- package/dist/internal/otel/propagation.mjs +1 -1
- package/dist/internal/otel/provider.d.mts +1 -86
- package/dist/internal/otel/provider.mjs +1 -1
- package/dist/internal/otel/url-attrs.d.mts +7 -0
- package/dist/internal/otel/url-attrs.mjs +1 -0
- package/dist/internal/otel/web-vitals.d.mts +1 -33
- package/dist/internal/otel/web-vitals.mjs +1 -1
- package/dist/internal/page-lifecycle.d.mts +4 -5
- package/dist/internal/page-lifecycle.mjs +1 -1
- package/dist/internal/plugin-runtime.d.mts +1 -38
- package/dist/internal/plugin-runtime.mjs +1 -1
- package/dist/internal/react-context.d.mts +1 -43
- package/dist/internal/react-context.mjs +1 -1
- package/dist/internal/server-digest.d.mts +4 -3
- package/dist/internal/server-digest.mjs +1 -1
- package/dist/internal/sw-queue.d.mts +4 -5
- package/dist/internal/sw-queue.mjs +1 -1
- package/dist/internal/third-party-hosts.d.mts +2 -3
- package/dist/internal/third-party-hosts.mjs +1 -1
- package/dist/internal/version.d.mts +4 -5
- package/dist/internal/version.mjs +1 -1
- package/dist/internal/wrapper-singleton.d.mts +5 -6
- package/dist/internal/wrapper-singleton.mjs +1 -1
- package/dist/navigation-CkiV6lJY.d.mts +54 -0
- package/dist/page-scope-context-manager-r92ZMJok.d.mts +17 -0
- package/dist/plugins/device.d.mts +5 -0
- package/dist/plugins/device.mjs +1 -0
- package/dist/plugins/errors.d.mts +1 -1
- package/dist/plugins/errors.mjs +1 -1
- package/dist/plugins/lib/loader.d.mts +2 -11
- package/dist/plugins/lib/loader.mjs +1 -1
- package/dist/plugins/lib/types.d.mts +2 -24
- package/dist/plugins/logs.d.mts +1 -1
- package/dist/plugins/logs.mjs +1 -1
- package/dist/plugins/page-events.d.mts +5 -0
- package/dist/plugins/page-events.mjs +1 -0
- package/dist/plugins/rage-clicks.d.mts +1 -1
- package/dist/plugins/rage-clicks.mjs +1 -1
- package/dist/plugins/replay/buffer.d.mts +9 -6
- package/dist/plugins/replay/buffer.mjs +1 -1
- package/dist/plugins/replay/chunking.d.mts +18 -9
- package/dist/plugins/replay/chunking.mjs +1 -1
- package/dist/plugins/replay/compressor-host.d.mts +3 -4
- package/dist/plugins/replay/compressor-host.mjs +1 -1
- package/dist/plugins/replay/config.d.mts +1 -11
- package/dist/plugins/replay/config.mjs +1 -1
- package/dist/plugins/replay/delivery.d.mts +8 -9
- package/dist/plugins/replay/delivery.mjs +1 -1
- package/dist/plugins/replay/index.d.mts +1 -1
- package/dist/plugins/replay/index.mjs +1 -1
- package/dist/plugins/replay/recorder.d.mts +12 -6
- package/dist/plugins/replay/recorder.mjs +1 -1
- package/dist/plugins/replay/sequence.d.mts +5 -4
- package/dist/plugins/replay/sequence.mjs +1 -1
- package/dist/plugins/replay/upload.d.mts +4 -0
- package/dist/plugins/replay/upload.mjs +1 -0
- package/dist/propagation-CssinKCy.d.mts +26 -0
- package/dist/provider-50LbJ4Tl.d.mts +466 -0
- package/dist/provider-Cp6noibq.d.mts +101 -0
- package/dist/provider.d.mts +2 -58
- package/dist/provider.mjs +1 -1
- package/dist/react-error-handler.d.mts +9 -11
- package/dist/react-error-handler.mjs +1 -1
- package/dist/rrweb-CE6GKCEq.mjs +150 -0
- package/dist/tracking/api.d.mts +1 -54
- package/dist/tracking/api.mjs +1 -1
- package/dist/tracking/device.d.mts +1 -32
- package/dist/tracking/device.mjs +1 -1
- package/dist/tracking/geo.d.mts +1 -13
- package/dist/tracking/geo.mjs +1 -1
- package/dist/tracking/session.d.mts +6 -7
- package/dist/tracking/session.mjs +1 -1
- package/dist/util/bot.d.mts +2 -3
- package/dist/util/bot.mjs +1 -1
- package/dist/util/global.d.mts +4 -10
- package/dist/util/global.mjs +1 -1
- package/dist/util/log.d.mts +11 -7
- package/dist/util/log.mjs +1 -1
- package/dist/util/stringify.d.mts +2 -3
- package/dist/version-BniHrwLD.mjs +1 -0
- package/dist/web-vitals-x8y70B5x.d.mts +34 -0
- package/package.json +67 -48
- package/dist/package.mjs +0 -1
package/dist/internal/config.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{getGlobal,setGlobal}from"../util/global.mjs";import{
|
|
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):
|
|
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):
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
|
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
|
|
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
|
|
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 "
|
|
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 {
|
|
2
|
-
import {
|
|
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 };
|
package/dist/internal/kernel.mjs
CHANGED
|
@@ -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 {
|
|
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 {
|
|
2
|
-
|
|
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(
|
|
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 {
|
|
2
|
-
|
|
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{
|
|
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 {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
|
|
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({
|
|
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};
|