@interfere/react 12.2.0 → 12.3.1

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 (62) hide show
  1. package/dist/{activity-Duhfgvxt.d.mts → activity-CShcwAW_.d.mts} +14 -4
  2. package/dist/activity-D13ZVan9.mjs +1 -0
  3. package/dist/api-D922KFvx.mjs +1 -0
  4. package/dist/{api-CMPV9rgU.d.mts → api-DSUjs8zG.d.mts} +4 -2
  5. package/dist/delivery-DDe-2SLc.mjs +1 -0
  6. package/dist/error-boundary.d.mts +1 -1
  7. package/dist/{exception-span-B74fhBQb.mjs → exception-span-BfP73aqG.mjs} +1 -1
  8. package/dist/exporter-CJo_iRgv.mjs +1 -0
  9. package/dist/{exporter-logs-CeGwMiMo.d.mts → exporter-logs-DMr5-1Yi.d.mts} +1 -1
  10. package/dist/{instrumentations-CY8NcP_M.mjs → instrumentations-CdmvdXrJ.mjs} +1 -1
  11. package/dist/internal/activity/activity.d.mts +2 -2
  12. package/dist/internal/activity/activity.mjs +1 -1
  13. package/dist/internal/capture/capture-boundary.d.mts +1 -1
  14. package/dist/internal/capture/capture.d.mts +1 -1
  15. package/dist/internal/capture/exception-span.mjs +1 -1
  16. package/dist/internal/kernel-registry.d.mts +1 -1
  17. package/dist/internal/kernel.d.mts +1 -1
  18. package/dist/internal/kernel.mjs +1 -1
  19. package/dist/internal/otel/exporter-logs.d.mts +1 -1
  20. package/dist/internal/otel/exporter-metrics.d.mts +1 -1
  21. package/dist/internal/otel/exporter.d.mts +1 -1
  22. package/dist/internal/otel/exporter.mjs +1 -1
  23. package/dist/internal/otel/index.mjs +1 -1
  24. package/dist/internal/otel/instrumentations/instrumentations.mjs +1 -1
  25. package/dist/internal/otel/provider.mjs +1 -1
  26. package/dist/internal/plugins/plugin-runtime.d.mts +1 -1
  27. package/dist/internal/react-context.d.mts +1 -1
  28. package/dist/internal/version.mjs +1 -1
  29. package/dist/internal/wrapper-singleton.d.mts +1 -1
  30. package/dist/internal/wrapper-singleton.mjs +1 -1
  31. package/dist/kernel-OzI-YQDt.mjs +1 -0
  32. package/dist/plugins/device.d.mts +1 -1
  33. package/dist/plugins/errors.d.mts +1 -1
  34. package/dist/plugins/lib/loader.d.mts +1 -1
  35. package/dist/plugins/lib/types.d.mts +1 -1
  36. package/dist/plugins/logs.d.mts +1 -1
  37. package/dist/plugins/logs.mjs +1 -1
  38. package/dist/plugins/page-events.d.mts +1 -1
  39. package/dist/plugins/rage-clicks.d.mts +1 -1
  40. package/dist/plugins/replay/index.d.mts +1 -1
  41. package/dist/plugins/replay/index.mjs +1 -1
  42. package/dist/plugins/replay/recorder/recorder.d.mts +1 -0
  43. package/dist/plugins/replay/recorder/recorder.mjs +1 -1
  44. package/dist/plugins/replay/upload/delivery.d.mts +6 -3
  45. package/dist/plugins/replay/upload/delivery.mjs +1 -1
  46. package/dist/{provider-BMoWBbsK.mjs → provider-CDJwsZLm.mjs} +1 -1
  47. package/dist/{provider-DIp7vkKd.d.mts → provider-CrzoxIxC.d.mts} +6 -4
  48. package/dist/provider.d.mts +1 -1
  49. package/dist/react-error-handler.d.mts +1 -1
  50. package/dist/recorder-C36qxD3q.mjs +1 -0
  51. package/dist/tracking/api.d.mts +1 -1
  52. package/dist/tracking/api.mjs +1 -1
  53. package/dist/tracking/registration.fixture.d.mts +1 -1
  54. package/dist/tracking/registration.fixture.mjs +1 -1
  55. package/dist/{version-CSFECZRw.mjs → version-D1R2jz3K.mjs} +1 -1
  56. package/package.json +3 -3
  57. package/dist/activity-BYnL3bX-.mjs +0 -1
  58. package/dist/api-BUYnj5MA.mjs +0 -1
  59. package/dist/delivery-_q1bkaIt.mjs +0 -1
  60. package/dist/exporter-D6Ld-TFZ.mjs +0 -1
  61. package/dist/kernel-D52QMtA9.mjs +0 -1
  62. package/dist/recorder-CM6Ae_0S.mjs +0 -1
@@ -1,9 +1,10 @@
1
1
  //#region src/internal/activity/activity.d.ts
2
+ /** Input-idle time after which the session pauses (replay stops recording); the session id is kept. */
2
3
  declare const IDLE_AFTER_MS: number;
4
+ /** Input gap after which the next input rotates to a new session id. */
3
5
  declare const EXPIRE_AFTER_MS: number;
4
6
  declare const MAX_AGE_MS: number;
5
7
  declare const CHECK_INTERVAL_MS: number;
6
- declare const KEEPALIVE_THROTTLE_MS = 1000;
7
8
  interface ActivitySession {
8
9
  markActivity: () => void;
9
10
  reset: () => void;
@@ -11,26 +12,35 @@ interface ActivitySession {
11
12
  startedAt: () => number;
12
13
  }
13
14
  type SessionResumeReason = "idle" | "rotated";
15
+ type SessionPauseReason = "hidden" | "idle";
14
16
  type Handler<A> = (arg: A) => void;
15
17
  declare class ActivityMonitor {
16
18
  private session;
17
- private paused;
19
+ private pausedFor;
20
+ private lastPausedExceptionMs;
18
21
  private lastActivityMs;
19
22
  private keepaliveUntilMs;
20
23
  private checkTimer;
21
24
  private unsubscribeShown;
25
+ private unsubscribeHidden;
22
26
  private readonly pauseHandlers;
23
27
  private readonly resumeHandlers;
24
- onPause(handler: Handler<void>): () => void;
28
+ private readonly pausedExceptionHandlers;
29
+ onPause(handler: Handler<SessionPauseReason>): () => void;
30
+ onExceptionWhilePaused(handler: Handler<SessionPauseReason>): () => void;
31
+ /** Reports a recorded exception; fires `exceptionWhilePaused` when the session is paused, at most once per five minutes per pause. */
32
+ noteException(): void;
25
33
  onResume(handler: Handler<SessionResumeReason>): () => void;
26
34
  start(session: ActivitySession): void;
27
35
  stop(): void;
28
36
  private idleMs;
29
37
  private isOverMaxAge;
38
+ private pause;
39
+ private readonly onHidden;
30
40
  private readonly poll;
31
41
  private readonly onInput;
32
42
  private resume;
33
43
  private touch;
34
44
  }
35
45
  //#endregion
36
- export { IDLE_AFTER_MS as a, SessionResumeReason as c, EXPIRE_AFTER_MS as i, ActivitySession as n, KEEPALIVE_THROTTLE_MS as o, CHECK_INTERVAL_MS as r, MAX_AGE_MS as s, ActivityMonitor as t };
46
+ export { IDLE_AFTER_MS as a, SessionResumeReason as c, EXPIRE_AFTER_MS as i, ActivitySession as n, MAX_AGE_MS as o, CHECK_INTERVAL_MS as r, SessionPauseReason as s, ActivityMonitor as t };
@@ -0,0 +1 @@
1
+ import{t as createLogger}from"./log-D6Ht--tv.mjs";import{n as onPageShown,t as onPageHidden}from"./page-lifecycle-DTWqGlz2.mjs";const log=createLogger(`activity`),IDLE_AFTER_MS=3e5,EXPIRE_AFTER_MS=9e5,MAX_AGE_MS=864e5,CHECK_INTERVAL_MS=3e4,ACTIVITY_EVENTS=[`pointerdown`,`keydown`,`scroll`,`touchstart`,`mousemove`];function monotonicNow(){return typeof performance>`u`?Date.now():performance.now()}function subscribe(set,handler){return set.add(handler),(()=>{set.delete(handler)})}function fire(handlers,arg){for(let handler of handlers)try{handler(arg)}catch(error){log.warn(`activity handler threw: %s`,error instanceof Error?error.constructor.name:`UnknownError`)}}var ActivityMonitor=class{session=null;pausedFor=null;lastPausedExceptionMs=null;lastActivityMs=0;keepaliveUntilMs=0;checkTimer=null;unsubscribeShown=null;unsubscribeHidden=null;pauseHandlers=new Set;resumeHandlers=new Set;pausedExceptionHandlers=new Set;onPause(handler){return subscribe(this.pauseHandlers,handler)}onExceptionWhilePaused(handler){return subscribe(this.pausedExceptionHandlers,handler)}noteException(){if(this.pausedFor===null)return;let now=monotonicNow();this.lastPausedExceptionMs!==null&&now-this.lastPausedExceptionMs<3e5||(this.lastPausedExceptionMs=now,fire(this.pausedExceptionHandlers,this.pausedFor))}onResume(handler){return subscribe(this.resumeHandlers,handler)}start(session){if(this.checkTimer===null&&typeof globalThis.addEventListener==`function`){this.session=session,this.pausedFor=null,this.lastPausedExceptionMs=null,this.lastActivityMs=monotonicNow(),this.keepaliveUntilMs=0;for(let type of ACTIVITY_EVENTS)globalThis.addEventListener(type,this.onInput,{capture:!0,passive:!0});this.unsubscribeShown=onPageShown(this.onInput),this.unsubscribeHidden=onPageHidden(this.onHidden),this.checkTimer=setInterval(this.poll,CHECK_INTERVAL_MS)}}stop(){if(this.checkTimer!==null){clearInterval(this.checkTimer),this.checkTimer=null;for(let type of ACTIVITY_EVENTS)globalThis.removeEventListener(type,this.onInput,!0);this.unsubscribeShown?.(),this.unsubscribeHidden?.(),this.unsubscribeShown=null,this.unsubscribeHidden=null,this.session=null,this.pausedFor=null,this.lastPausedExceptionMs=null,this.lastActivityMs=0,this.keepaliveUntilMs=0}}idleMs(){return monotonicNow()-this.lastActivityMs}isOverMaxAge(){let startedAt=this.session?.startedAt()??0;return startedAt>0&&Date.now()-startedAt>=864e5}pause(reason){this.pausedFor===null&&(this.pausedFor=reason,this.lastPausedExceptionMs=null,log.debug(`session paused: %s`,reason),fire(this.pauseHandlers,reason))}onHidden=()=>{this.pause(`hidden`)};poll=()=>{this.pausedFor===null&&(this.isOverMaxAge()||this.idleMs()>=3e5)&&this.pause(`idle`)};onInput=()=>{let now=monotonicNow();if(this.isOverMaxAge()||now-this.lastActivityMs>=9e5){this.resume(now,`rotated`);return}if(this.pausedFor!==null){this.resume(now,`idle`);return}now<this.keepaliveUntilMs||(this.touch(now),this.session?.markActivity())};resume(now,reason){reason===`rotated`&&(log.debug(`resume after expiry → new session`),this.session?.reset()),this.pausedFor=null,this.lastPausedExceptionMs=null,this.touch(now),this.session?.markActivity(),fire(this.resumeHandlers,reason)}touch(now){this.lastActivityMs=now,this.keepaliveUntilMs=now+1e3}};export{MAX_AGE_MS as a,IDLE_AFTER_MS as i,CHECK_INTERVAL_MS as n,EXPIRE_AFTER_MS as r,ActivityMonitor as t};
@@ -0,0 +1 @@
1
+ import{t as createLogger}from"./log-D6Ht--tv.mjs";import{t as ActivityMonitor}from"./activity-D13ZVan9.mjs";import{t as DeviceManager}from"./device-DRK7hhLi.mjs";import{t as GeoDetector}from"./geo-D2wa9bGs.mjs";import{t as SessionManager}from"./session-C30CtCVv.mjs";import{t as SessionRetry}from"./session-retry-C2Uh7eZ6.mjs";import{omitUndefined}from"@interfere/helpers/omit-undefined";import{InterfereClient,InterfereError}from"@interfere/javascript";const log=createLogger(`tracking`);function syncKey(sessionId,deviceId,fpHash){return`${sessionId}|${deviceId??``}|${fpHash??``}`}var SessionTracker=class{client;device;geo;mgr=null;activity=new ActivityMonitor;currentIdentity=null;identifiedSessionId=null;lastSyncedKey=null;inflightSyncKey=null;syncAttemptMs=0;generation=0;syncRetry=new SessionRetry;syncRetryKey=null;identityStarted=!1;constructor(opts){this.client=new InterfereClient({...opts.target,maxRetries:0,timeoutInSeconds:10,fetch:Object.assign(async(input,init)=>(opts.fetcher??globalThis.fetch)(input,{...init,credentials:`omit`,keepalive:!0}),opts.fetcher??globalThis.fetch)}),this.device=opts.device??new DeviceManager,this.geo=opts.geo??new GeoDetector}start(){this.mgr=new SessionManager(id=>{this.onRotate(id)}),this.activity.start({markActivity:()=>{this.markActivity()},reset:()=>{this.rotateSession()},startedAt:()=>this.getSessionStartedAt()})}startDeviceIdentity(){this.identityStarted||(this.invalidateSync(),this.identityStarted=!0,this.device.init(),this.geo.detect(),this.backfillIdentity())}discardDeviceIdentity(){this.invalidateSync(),this.identityStarted=!1,this.device.clear(),this.geo.clear()}async backfillIdentity(){let gen=this.generation;if(await Promise.resolve(),gen!==this.generation||!this.identityStarted)return;let initialSessionId=this.mgr?.getSessionId()??null,initialFpHash=this.device.getFpHash();initialSessionId&&await this.syncSession(initialSessionId,this.device.getDeviceId(),initialFpHash);let fpHash=await this.device.whenFingerprintReady(),sessionId=this.mgr?.getSessionId()??null;gen===this.generation&&this.identityStarted&&sessionId&&fpHash!==initialFpHash&&this.syncSession(sessionId,this.device.getDeviceId(),fpHash)}onSessionPause(handler){return this.activity.onPause(handler)}onSessionExceptionWhilePaused(handler){return this.activity.onExceptionWhilePaused(handler)}noteException(){this.activity.noteException()}onSessionResume(handler){return this.activity.onResume(handler)}sessionId(){let id=this.mgr?.getSessionId()??null;return id&&this.ensureSynced(id),id}windowId(){return this.mgr?.getWindowId()??null}markActivity(){this.mgr?.markActivity()}getSessionStartedAt(){return this.mgr?.getSessionStartedAt()??0}getDeviceId(){return this.device.getDeviceId()}getFpHash(){return this.device.getFpHash()}getIdentity(){return this.currentIdentity}async identify(params){if(!this.mgr)return;let sessionId=this.mgr.getSessionId();if(this.identifiedSessionId===sessionId){log.debug(`skipped, already identified for session %s`,sessionId);return}this.currentIdentity=params,this.identifiedSessionId=sessionId;let gen=this.generation,[fpHash,country]=await Promise.all([this.device.whenFingerprintReady(),this.geo.detect()]),deviceId=this.device.getDeviceId();if(gen!==this.generation){this.identifiedSessionId=null;return}log.info(`POST session %s → identify`,sessionId),this.postIdentify(sessionId,omitUndefined({deviceId,fpHash,sessionId,...params,country:country||void 0}))}async postIdentify(sessionId,body){try{await this.client.sessions.identifySession(body)}catch{this.identifiedSessionId=null,log.warn(`identify failed for session %s`,sessionId)}}clearIdentity(){this.currentIdentity=null,this.identifiedSessionId=null}reset(){this.invalidateSync(),this.clearIdentity(),this.identityStarted&&this.device.reset(),this.mgr?.reset()}rotateSession(){this.mgr?.reset()}dispose(){this.activity.stop(),this.invalidateSync(),this.clearIdentity(),this.mgr=null}invalidateSync(){this.generation+=1,this.syncRetry.reset(),this.syncRetryKey=null,this.lastSyncedKey=null,this.inflightSyncKey=null,this.syncAttemptMs=0}currentSyncKey(){let sessionId=this.mgr?.sessionId;return sessionId?syncKey(sessionId,this.device.getDeviceId(),this.device.getFpHash()):null}ensureSynced(sessionId){let deviceId=this.device.getDeviceId(),fpHash=this.device.getFpHash(),key=syncKey(sessionId,deviceId,fpHash);this.lastSyncedKey!==key&&this.inflightSyncKey!==key&&(Date.now()-this.syncAttemptMs<5e3||this.syncSession(sessionId,deviceId,fpHash))}async syncSession(sessionId,deviceId,fpHash){let key=syncKey(sessionId,deviceId,fpHash);if(this.lastSyncedKey===key||this.inflightSyncKey===key)return;this.syncRetryKey!==key&&(this.syncRetry.reset(),this.syncRetryKey=key),this.syncRetry.cancel();let{generation}=this;this.inflightSyncKey=key,this.syncAttemptMs=Date.now();try{await this.client.sessions.createSession({sessionId,deviceId,fpHash}),generation===this.generation&&key===this.currentSyncKey()&&(this.lastSyncedKey=key,this.syncRetry.reset())}catch(error){log.warn(`session sync failed`),error instanceof InterfereError&&generation===this.generation&&key===this.currentSyncKey()&&this.syncRetry.schedule(error,()=>{let current=this.mgr?.sessionId;generation===this.generation&&current&&this.ensureSynced(current)})}finally{generation===this.generation&&this.inflightSyncKey===key&&(this.inflightSyncKey=null)}}async onRotate(sessionId){this.syncAttemptMs=Date.now();let gen=this.generation;try{await Promise.resolve();let fpHash=this.device.getFpHash(),deviceId=this.device.getDeviceId();if(gen!==this.generation)return;log.debug(`POST session %s (device=%s fp=%s)`,sessionId,deviceId??`pending`,fpHash??`none`),this.syncSession(sessionId,deviceId,fpHash)}catch{}}};export{SessionTracker as t};
@@ -1,4 +1,4 @@
1
- import { c as SessionResumeReason } from "./activity-Duhfgvxt.mjs";
1
+ import { c as SessionResumeReason, s as SessionPauseReason } from "./activity-CShcwAW_.mjs";
2
2
  import { t as DeviceManager } from "./device-vFtWy12y.mjs";
3
3
  import { t as GeoDetector } from "./geo-PDfIZY4L.mjs";
4
4
  import { InterfereClient } from "@interfere/javascript";
@@ -30,7 +30,9 @@ declare class SessionTracker {
30
30
  startDeviceIdentity(): void;
31
31
  discardDeviceIdentity(): void;
32
32
  private backfillIdentity;
33
- onSessionPause(handler: () => void): () => void;
33
+ onSessionPause(handler: (reason: SessionPauseReason) => void): () => void;
34
+ onSessionExceptionWhilePaused(handler: (reason: SessionPauseReason) => void): () => void;
35
+ noteException(): void;
34
36
  onSessionResume(handler: (reason: SessionResumeReason) => void): () => void;
35
37
  sessionId(): (string & import("zod").$brand<"SessionId">) | null;
36
38
  windowId(): string | null;
@@ -0,0 +1 @@
1
+ import{t as createLogger}from"./log-D6Ht--tv.mjs";import{t as reserveKeepaliveBody}from"./keepalive-budget-DeafGnVZ.mjs";import{t as gzipForUnload}from"./unload-gzip-WX9FyWPs.mjs";import{t as uploadReplayChunk}from"./upload-BIh8Q5UQ.mjs";import{omitUndefined}from"@interfere/helpers/omit-undefined";const log=createLogger(`replay`),REPLAY_TRACER_NAME=`@interfere/react/replay`,textEncoder=new TextEncoder,FATAL_STATUSES=new Set([401,403,413]);function classifyRejection(status){return status===409?`skipped`:FATAL_STATUSES.has(status)?`fatal`:`retryable`}async function prepareBody(compressor,rawBytes){if(!compressor.gzip)return{body:rawBytes,encoding:null,release:null};try{return{body:await compressor.gzip(rawBytes),encoding:`gzip`,release:null}}catch(error){return log.warn(`gzip failed for chunk; sending uncompressed: %o`,error),{body:rawBytes,encoding:null,release:null}}}function prepareUnloadBody(rawBytes){let rawRelease=reserveKeepaliveBody(rawBytes.byteLength);if(rawRelease)return{body:rawBytes,encoding:null,release:rawRelease};let compressed=gzipForUnload(rawBytes);return compressed?{body:compressed,encoding:`gzip`,release:reserveKeepaliveBody(compressed.byteLength)}:{body:rawBytes,encoding:null,release:null}}function encodeReplayMeta(chunk,payload){return btoa(JSON.stringify({activityCount:payload.activityCount,eventCount:payload.eventCount,firstTs:payload.firstTs,hasFullSnapshot:payload.hasFullSnapshot,lastTs:payload.lastTs,segmentId:chunk.segmentId,windowId:chunk.windowId}))}async function deliverChunk({ctx,chunk,target,compressor,payload,trigger,unload}){let sessionId=ctx.getSessionId();if(!sessionId)return`ok`;let rawBytes=textEncoder.encode(payload.bodyJson),uncompressedBytes=rawBytes.byteLength,prepared=unload?prepareUnloadBody(rawBytes):await prepareBody(compressor,rawBytes),headers={"x-replay-meta":encodeReplayMeta(chunk,payload)};prepared.encoding===`gzip`&&(headers[`content-encoding`]=`gzip`);let keepalive=prepared.release!==null,response;try{let upload=await uploadReplayChunk(target,sessionId,prepared.body,headers,{keepalive});if(!upload.ok)return await upload.body?.cancel(),classifyRejection(upload.status);response=await upload.json()}catch(error){return log.warn(`replay chunk upload failed: %o`,error),`retryable`}finally{prepared.release?.()}let objectKey=typeof response==`object`&&response&&`objectKey`in response&&typeof response.objectKey==`string`?response.objectKey:null,attributes=omitUndefined({"replay.chunk.size_bytes":uncompressedBytes,"replay.chunk.event_count":payload.eventCount,"replay.chunk.uri":objectKey||void 0,"replay.chunk.compressed_bytes":prepared.encoding===`gzip`?prepared.body.byteLength:void 0,"replay.chunk.first_event_ts":payload.firstTs??void 0,"replay.chunk.last_event_ts":payload.lastTs??void 0,"replay.chunk.trigger":trigger,"replay.chunk.unload":unload||void 0,"replay.chunk.keepalive":unload?keepalive:void 0});return ctx.getTracer(REPLAY_TRACER_NAME).startSpan(`replay.chunk`,{attributes}).end(),`ok`}export{deliverChunk as n,REPLAY_TRACER_NAME as t};
@@ -1,4 +1,4 @@
1
- import { a as InterfereContextValue, i as InterfereContext } from "./provider-DIp7vkKd.mjs";
1
+ import { a as InterfereContextValue, i as InterfereContext } from "./provider-CrzoxIxC.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 getGlobal}from"./global-DYq1Z4_H.mjs";import{t as safeStringify}from"./stringify-DvuHsAT4.mjs";import{isNonErrorException,toExceptions}from"@interfere/types/sdk/errors";import{SpanStatusCode}from"@opentelemetry/api";import{exceptionSpanName}from"@interfere/types/sdk/throw-site";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}function recordExceptionOnSpan(span,value,attrs,handled){span.addEvent(`exception`,attrs),handled||span.setStatus({code:SpanStatusCode.ERROR,message:isNonErrorException(value)?value.value:value.message})}function startExceptionSpan(tracer,value){return tracer.startSpan(exceptionSpanName(value),{attributes:{"interfere.capture.kind":`exception`}})}export{recordExceptionOnSpan as n,startExceptionSpan as r,buildExceptionEventAttrs as t};
1
+ import{t as safeStringify}from"./stringify-DvuHsAT4.mjs";import{t as getGlobal}from"./global-DYq1Z4_H.mjs";import{isNonErrorException,toExceptions}from"@interfere/types/sdk/errors";import{SpanStatusCode}from"@opentelemetry/api";import{exceptionSpanName}from"@interfere/types/sdk/throw-site";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}function recordExceptionOnSpan(span,value,attrs,handled){span.addEvent(`exception`,attrs),handled||span.setStatus({code:SpanStatusCode.ERROR,message:isNonErrorException(value)?value.value:value.message})}function startExceptionSpan(tracer,value){return tracer.startSpan(exceptionSpanName(value),{attributes:{"interfere.capture.kind":`exception`}})}export{recordExceptionOnSpan as n,startExceptionSpan as r,buildExceptionEventAttrs as t};
@@ -0,0 +1 @@
1
+ import{t as reserveKeepaliveBody}from"./keepalive-budget-DeafGnVZ.mjs";import{t as PRODUCER_VERSION}from"./version-D1R2jz3K.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,AUTH_INVALID_HALT_COOLDOWN_MS=3e5,HALT_MESSAGES={release_not_found:`ingest halted: the ingest endpoint does not recognize this build's release`,public_key_rejected:`ingest paused: the ingest endpoint rejected this page's public key`};let haltReason=null,authHaltExpiresAt=0,consecutiveAuthRejections=0;function resetIngestHalt(){haltReason=null,authHaltExpiresAt=0,consecutiveAuthRejections=0}function currentHaltReason(){return haltReason===`public_key_rejected`&&Date.now()>=authHaltExpiresAt&&(haltReason=null,consecutiveAuthRejections=2),haltReason}function isIngestHalted(){return currentHaltReason()!==null}const textEncoder=new TextEncoder;function detectUnacceptableExport(error){if(currentHaltReason()!==null||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`){haltReason=`release_not_found`,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;haltReason=`public_key_rejected`,authHaltExpiresAt=Date.now()+AUTH_INVALID_HALT_COOLDOWN_MS,console.warn(`[interfere] the ingest endpoint rejected this page's public key ${consecutiveAuthRejections} times in a row — telemetry export is paused for ${AUTH_INVALID_HALT_COOLDOWN_MS/6e4} minutes, then retried once. Check that INTERFERE_PUBLIC_KEY matches an active surface; a deleted surface's key stays rejected until the page is rebuilt with the new key.`)}}}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,release=reserveKeepaliveBody(bytes);try{return await retryTelemetry(async abortSignal=>globalThis.fetch(url,{...init,credentials:`omit`,keepalive:release!==null,signal:abortSignal}),init?.signal)}finally{release?.()}},globalThis.fetch)});return((payload,resultCallback)=>{if(!payload||payload.byteLength===0){resultCallback({code:ExportResultCode.SUCCESS});return}let reason=currentHaltReason();if(reason!==null){resultCallback({code:ExportResultCode.FAILED,error:Error(HALT_MESSAGES[reason])});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};
@@ -25,7 +25,7 @@ type SignalSender = (payload: Uint8Array | undefined, resultCallback: (result: E
25
25
  interface ExporterCommon {
26
26
  clientOptions: InterfereClient.Options;
27
27
  }
28
- /** Test-only reset — the halt is deliberately page-lifetime state. */
28
+ /** Test-only reset of the ingest halt state. */
29
29
  declare function resetIngestHalt(): void;
30
30
  declare function isIngestHalted(): boolean;
31
31
  declare class IngestTraceExporter implements SpanExporter {
@@ -1 +1 @@
1
- import{t as DEFAULT_PRIVACY_POLICY}from"./privacy-CRuL0X8r.mjs";import{t as THIRD_PARTY_IGNORE}from"./third-party-hosts-BoJNL3xG.mjs";import{n as describeActionable,r as isActionable}from"./actionable-DOmVf_ib.mjs";import{i as stampUrlAttrs,n as ATTR_URL_FULL,r as ATTR_URL_PATH}from"./url-attrs-BdcyE2n6.mjs";import{t as stampHttpSpanRoute}from"./http-span-route-t2gig-KI.mjs";import{MECHANISM_TYPE}from"@interfere/types/sdk/errors";import{omitUndefined}from"@interfere/helpers/omit-undefined";import{registerInstrumentations}from"@opentelemetry/instrumentation";import{BrowserNavigationInstrumentation,defaultSanitizeUrl}from"@opentelemetry/instrumentation-browser-navigation";import{DocumentLoadInstrumentation}from"@opentelemetry/instrumentation-document-load";import{FetchInstrumentation}from"@opentelemetry/instrumentation-fetch";import{LongTaskInstrumentation}from"@opentelemetry/instrumentation-long-task";import{UserInteractionInstrumentation}from"@opentelemetry/instrumentation-user-interaction";import{XMLHttpRequestInstrumentation}from"@opentelemetry/instrumentation-xml-http-request";import{getElementXPath}from"@opentelemetry/sdk-trace-web";const DEFAULT_FAILURE_RANGES=[[400,599]];function resolveFailureRanges(opt){if(opt===!1)return null;if(opt===void 0||opt===!0)return DEFAULT_FAILURE_RANGES;let codes=opt.statusCodes;return codes&&codes.length>0?codes:DEFAULT_FAILURE_RANGES}function createFailureGate(){let seen=new Set,windowStart=0,windowCount=0;return(key=>{if(seen.has(key))return!1;let now=Date.now();return now-windowStart>6e4&&(windowStart=now,windowCount=0),windowCount>=20?!1:(seen.size>=100&&seen.clear(),seen.add(key),windowCount+=1,!0)})}function failureKey(method,discriminator,url){let path;try{path=new URL(url).pathname}catch{path=url}return`${method} ${discriminator} ${path}`}function statusMatches(status,ranges){for(let range of ranges)if(typeof range==`number`){if(status===range)return!0}else if(status>=range[0]&&status<=range[1])return!0;return!1}function recordHttpFailure(span,status,method,url,mechanism){span.addEvent(`exception`,{"exception.message":`HTTP ${status} ${method} ${url}`,"exception.type":`HttpResponseError`,"interfere.exception.handled":!1,"interfere.exception.kind":`error`,"interfere.exception.mechanism":mechanism})}function maybeCaptureFetchFailure(span,result,failureRanges,method,url,gate){if(!failureRanges)return;let status=result?.status;typeof status!=`number`||status<=0||!statusMatches(status,failureRanges)||(!gate||gate(failureKey(method,status,url)))&&recordHttpFailure(span,status,method,url,MECHANISM_TYPE.browser.fetchFailedResponse)}const NETWORK_TIMEOUT_RE=/timeout|timed out/iu,NETWORK_ABORT_RE=/abort/iu;function classifyNetworkError(message){return NETWORK_TIMEOUT_RE.test(message)?`timeout`:NETWORK_ABORT_RE.test(message)?`abort`:`network`}function recordNetworkFailure(span,kind,method,url,mechanism){span.addEvent(`exception`,{"exception.message":`Network ${kind} ${method} ${url}`,"exception.type":`NetworkError`,"interfere.exception.handled":!1,"interfere.exception.kind":`error`,"interfere.exception.mechanism":mechanism,"interfere.exception.subtype":kind})}function maybeCaptureNetworkFailure(span,result,failureRanges,method,url,gate){if(!failureRanges)return;let{message}=result;if(typeof message!=`string`||message.length===0)return;let kind=classifyNetworkError(message);(!gate||gate(failureKey(method,kind,url)))&&recordNetworkFailure(span,kind,method,url,MECHANISM_TYPE.browser.fetchNetworkError)}function applyFetchSpanAttrs(span,request,result,failureRanges,isTrackedUrl,resolveRoute,gate){let url=resolveFetchUrl(span,request,result);if(!url)return;let parsed;try{parsed=new URL(url)}catch{return}span.setAttribute(ATTR_URL_PATH,parsed.pathname);let tracked=isTrackedUrl(url),method=resolveFetchMethod(request);tracked&&(stampHttpSpanRoute(span,method,parsed.pathname,resolveRoute),result instanceof Response?maybeCaptureFetchFailure(span,result,failureRanges,method,url,gate):maybeCaptureNetworkFailure(span,result,failureRanges,method,url,gate))}function applyXhrSpanAttrs(span,xhr,failureRanges,isTrackedUrl,gate,resolveRoute){let url=xhr.responseURL||spanUrlFull(span);if(!(url&&isTrackedUrl(url)))return;let parsed;try{parsed=new URL(url)}catch{return}let method=isReadableSpan(span)?String(span.attributes[`http.request.method`]??span.attributes[`http.method`]??`XHR`):`XHR`;if(span.setAttribute(ATTR_URL_PATH,parsed.pathname),stampHttpSpanRoute(span,method,parsed.pathname,resolveRoute),!failureRanges)return;let{status}=xhr;if(typeof status==`number`){if(status===0){(!gate||gate(failureKey(`XHR`,`network`,url)))&&recordNetworkFailure(span,`network`,`XHR`,url,MECHANISM_TYPE.browser.xhrNetworkError);return}statusMatches(status,failureRanges)&&(!gate||gate(failureKey(`XHR`,status,url)))&&recordHttpFailure(span,status,`XHR`,url,MECHANISM_TYPE.browser.xhrFailedResponse)}}function resolveFetchUrl(span,request,result){return responseUrl(result)??requestUrl(request)??spanUrlFull(span)}function isReadableSpan(span){return`attributes`in span}function spanUrlFull(span){if(!isReadableSpan(span))return null;let url=span.attributes[`url.full`]??span.attributes[`http.url`];return typeof url==`string`?url:null}function responseUrl(result){return result instanceof Response&&result.url?result.url:null}function requestUrl(request){return typeof request==`string`?request:readStringProp(request,`url`)??readStringProp(request,`href`)}function resolveFetchMethod(request){return readStringProp(request,`method`)??`GET`}function readStringProp(value,key){if(!(typeof value==`object`&&value&&key in value))return null;let prop=Reflect.get(value,key);return typeof prop==`string`?prop:null}const testOnlyApplyFetchSpanAttrs=applyFetchSpanAttrs,testOnlyApplyXhrSpanAttrs=applyXhrSpanAttrs,testOnlyResolveFailureRanges=resolveFailureRanges,testOnlyCreateFailureGate=createFailureGate,testOnlyClassifyNetworkError=classifyNetworkError,NEVER_MATCH=/^$/u,ESCAPE_RE=/[.*+?^${}()|[\]\\]/gu;function sameOriginPattern(){if(typeof window>`u`)return NEVER_MATCH;let{protocol,host}=globalThis.location;return RegExp(`^${protocol}//${host.replace(ESCAPE_RE,String.raw`\$&`)}`,`u`)}function stampInteractionAttrs(eventType,element,span,policy){let desc=describeActionable(element,policy);span.setAttribute(`ui.event_type`,eventType),span.setAttribute(`ui.target.tag`,desc.tag),desc.privacy&&(span.setAttribute(`ui.target.privacy`,desc.privacy),span.setAttribute(`target_xpath`,getElementXPath(element,!1))),desc.label&&span.setAttribute(`ui.target.label`,desc.label),desc.id&&span.setAttribute(`ui.target.id`,desc.id),desc.name&&span.setAttribute(`ui.target.name`,desc.name),desc.role&&span.setAttribute(`ui.target.role`,desc.role),desc.ariaLabel&&span.setAttribute(`ui.target.aria_label`,desc.ariaLabel),desc.text&&span.setAttribute(`ui.target.text`,desc.text)}const PREFETCH_HEADER_NAMES=[`next-router-prefetch`,`next-router-segment-prefetch`];function isPrefetchRequest(request){let headers;try{headers=typeof Request<`u`&&request instanceof Request?request.headers:new Headers(request.headers)}catch{return!1}return PREFETCH_HEADER_NAMES.some(name=>headers.has(name))||headers.get(`purpose`)===`prefetch`||headers.get(`sec-purpose`)?.includes(`prefetch`)===!0}function escapeRegExp(value){return value.replaceAll(/[.*+?^${}()|[\]\\]/gu,String.raw`\$&`)}function apiHostToMatcher(host){return RegExp(`^https?://${escapeRegExp(host)}(:\\d+)?([/?#]|$)`,`u`)}function registerBundledInstrumentations(input){let{tracerProvider,loggerProvider,ignoreUrls,apiHosts=[],propagateContextUrls=[],privacyPolicy=DEFAULT_PRIVACY_POLICY,isInteractionCaptureEnabled=()=>!0,redactUrl=url=>url}=input,{resolveRoute}=input,origin=sameOriginPattern(),propagateMatchers=[...apiHosts.map(host=>apiHostToMatcher(host)),...propagateContextUrls],fetchIgnore=[...ignoreUrls,...THIRD_PARTY_IGNORE],failureRanges=resolveFailureRanges(input.captureFailedRequests),failureGate=createFailureGate();function isTrackedUrl(url){return origin.test(url)||propagateMatchers.some(re=>re instanceof RegExp?re.test(url):url.includes(re))}let pageEventsEnabled=!1,coreInstrumentations=[new FetchInstrumentation({applyCustomAttributesOnSpan:(span,request,result)=>{applyFetchSpanAttrs(span,request,result,failureRanges,isTrackedUrl,resolveRoute,failureGate)},ignoreUrls:fetchIgnore,measureRequestSize:!0,propagateTraceHeaderCorsUrls:[origin,...propagateMatchers],requestHook:(span,request)=>{isPrefetchRequest(request)&&span.setAttribute(`http.request.prefetch`,!0)}}),new XMLHttpRequestInstrumentation({applyCustomAttributesOnSpan:(span,xhr)=>{applyXhrSpanAttrs(span,xhr,failureRanges,isTrackedUrl,failureGate,resolveRoute)},ignoreUrls:fetchIgnore,propagateTraceHeaderCorsUrls:[origin,...propagateMatchers]}),new LongTaskInstrumentation({observerCallback:(span,info)=>{stampUrlAttrs(span,resolveRoute);let containerType=info.longtaskEntry.attribution[0]?.containerType;containerType&&span.setAttribute(`longtask.container_type`,containerType)}}),new UserInteractionInstrumentation({eventNames:[`click`,`submit`],shouldPreventSpanCreation:(eventType,element,span)=>!(pageEventsEnabled&&isInteractionCaptureEnabled())||eventType===`click`&&!isActionable(element)||(stampInteractionAttrs(eventType,element,span,privacyPolicy),stampUrlAttrs(span,resolveRoute),!1)})],pageEventsInstrumentations=[new DocumentLoadInstrumentation({applyCustomAttributesOnSpan:{resourceFetch:(span,entry)=>{let name=entry?.name;if(typeof name!=`string`)return;let url;try{url=new URL(name)}catch{return}let isCrossOrigin=typeof window<`u`&&url.origin!==globalThis.location.origin;span.updateName(isCrossOrigin?`resource: ${url.host}${url.pathname}`:`resource: ${url.pathname}`),span.setAttribute(ATTR_URL_FULL,name),span.setAttribute(ATTR_URL_PATH,url.pathname),span.setAttribute(`server.address`,url.host)}},enabled:!1}),new BrowserNavigationInstrumentation({enabled:!1,sanitizeUrl:url=>redactUrl(defaultSanitizeUrl(url))})],unregisterCore=registerInstrumentations(omitUndefined({tracerProvider,loggerProvider,instrumentations:coreInstrumentations})),unregisterPageEvents=null,setPageEventsEnabled=enabled=>{if(pageEventsEnabled=enabled,enabled){unregisterPageEvents??=registerInstrumentations(omitUndefined({tracerProvider,loggerProvider,instrumentations:pageEventsInstrumentations}));return}unregisterPageEvents?.(),unregisterPageEvents=null};return{dispose:()=>{setPageEventsEnabled(!1),unregisterCore()},setPageEventsEnabled}}export{testOnlyCreateFailureGate as a,testOnlyClassifyNetworkError as i,testOnlyApplyFetchSpanAttrs as n,testOnlyResolveFailureRanges as o,testOnlyApplyXhrSpanAttrs as r,registerBundledInstrumentations as t};
1
+ import{t as THIRD_PARTY_IGNORE}from"./third-party-hosts-BoJNL3xG.mjs";import{t as DEFAULT_PRIVACY_POLICY}from"./privacy-CRuL0X8r.mjs";import{n as describeActionable,r as isActionable}from"./actionable-DOmVf_ib.mjs";import{i as stampUrlAttrs,n as ATTR_URL_FULL,r as ATTR_URL_PATH}from"./url-attrs-BdcyE2n6.mjs";import{t as stampHttpSpanRoute}from"./http-span-route-t2gig-KI.mjs";import{MECHANISM_TYPE}from"@interfere/types/sdk/errors";import{omitUndefined}from"@interfere/helpers/omit-undefined";import{registerInstrumentations}from"@opentelemetry/instrumentation";import{BrowserNavigationInstrumentation,defaultSanitizeUrl}from"@opentelemetry/instrumentation-browser-navigation";import{DocumentLoadInstrumentation}from"@opentelemetry/instrumentation-document-load";import{FetchInstrumentation}from"@opentelemetry/instrumentation-fetch";import{LongTaskInstrumentation}from"@opentelemetry/instrumentation-long-task";import{UserInteractionInstrumentation}from"@opentelemetry/instrumentation-user-interaction";import{XMLHttpRequestInstrumentation}from"@opentelemetry/instrumentation-xml-http-request";import{getElementXPath}from"@opentelemetry/sdk-trace-web";const DEFAULT_FAILURE_RANGES=[[400,599]];function resolveFailureRanges(opt){if(opt===!1)return null;if(opt===void 0||opt===!0)return DEFAULT_FAILURE_RANGES;let codes=opt.statusCodes;return codes&&codes.length>0?codes:DEFAULT_FAILURE_RANGES}function createFailureGate(){let seen=new Set,windowStart=0,windowCount=0;return(key=>{if(seen.has(key))return!1;let now=Date.now();return now-windowStart>6e4&&(windowStart=now,windowCount=0),windowCount>=20?!1:(seen.size>=100&&seen.clear(),seen.add(key),windowCount+=1,!0)})}function failureKey(method,discriminator,url){let path;try{path=new URL(url).pathname}catch{path=url}return`${method} ${discriminator} ${path}`}function statusMatches(status,ranges){for(let range of ranges)if(typeof range==`number`){if(status===range)return!0}else if(status>=range[0]&&status<=range[1])return!0;return!1}function recordHttpFailure(span,status,method,url,mechanism){span.addEvent(`exception`,{"exception.message":`HTTP ${status} ${method} ${url}`,"exception.type":`HttpResponseError`,"interfere.exception.handled":!1,"interfere.exception.kind":`error`,"interfere.exception.mechanism":mechanism})}function maybeCaptureFetchFailure(span,result,failureRanges,method,url,gate){if(!failureRanges)return;let status=result?.status;typeof status!=`number`||status<=0||!statusMatches(status,failureRanges)||(!gate||gate(failureKey(method,status,url)))&&recordHttpFailure(span,status,method,url,MECHANISM_TYPE.browser.fetchFailedResponse)}const NETWORK_TIMEOUT_RE=/timeout|timed out/iu,NETWORK_ABORT_RE=/abort/iu;function classifyNetworkError(message){return NETWORK_TIMEOUT_RE.test(message)?`timeout`:NETWORK_ABORT_RE.test(message)?`abort`:`network`}function recordNetworkFailure(span,kind,method,url,mechanism){span.addEvent(`exception`,{"exception.message":`Network ${kind} ${method} ${url}`,"exception.type":`NetworkError`,"interfere.exception.handled":!1,"interfere.exception.kind":`error`,"interfere.exception.mechanism":mechanism,"interfere.exception.subtype":kind})}function maybeCaptureNetworkFailure(span,result,failureRanges,method,url,gate){if(!failureRanges)return;let{message}=result;if(typeof message!=`string`||message.length===0)return;let kind=classifyNetworkError(message);(!gate||gate(failureKey(method,kind,url)))&&recordNetworkFailure(span,kind,method,url,MECHANISM_TYPE.browser.fetchNetworkError)}function applyFetchSpanAttrs(span,request,result,failureRanges,isTrackedUrl,resolveRoute,gate){let url=resolveFetchUrl(span,request,result);if(!url)return;let parsed;try{parsed=new URL(url)}catch{return}span.setAttribute(ATTR_URL_PATH,parsed.pathname);let tracked=isTrackedUrl(url),method=resolveFetchMethod(request);tracked&&(stampHttpSpanRoute(span,method,parsed.pathname,resolveRoute),result instanceof Response?maybeCaptureFetchFailure(span,result,failureRanges,method,url,gate):maybeCaptureNetworkFailure(span,result,failureRanges,method,url,gate))}function applyXhrSpanAttrs(span,xhr,failureRanges,isTrackedUrl,gate,resolveRoute){let url=xhr.responseURL||spanUrlFull(span);if(!(url&&isTrackedUrl(url)))return;let parsed;try{parsed=new URL(url)}catch{return}let method=isReadableSpan(span)?String(span.attributes[`http.request.method`]??span.attributes[`http.method`]??`XHR`):`XHR`;if(span.setAttribute(ATTR_URL_PATH,parsed.pathname),stampHttpSpanRoute(span,method,parsed.pathname,resolveRoute),!failureRanges)return;let{status}=xhr;if(typeof status==`number`){if(status===0){(!gate||gate(failureKey(`XHR`,`network`,url)))&&recordNetworkFailure(span,`network`,`XHR`,url,MECHANISM_TYPE.browser.xhrNetworkError);return}statusMatches(status,failureRanges)&&(!gate||gate(failureKey(`XHR`,status,url)))&&recordHttpFailure(span,status,`XHR`,url,MECHANISM_TYPE.browser.xhrFailedResponse)}}function resolveFetchUrl(span,request,result){return responseUrl(result)??requestUrl(request)??spanUrlFull(span)}function isReadableSpan(span){return`attributes`in span}function spanUrlFull(span){if(!isReadableSpan(span))return null;let url=span.attributes[`url.full`]??span.attributes[`http.url`];return typeof url==`string`?url:null}function responseUrl(result){return result instanceof Response&&result.url?result.url:null}function requestUrl(request){return typeof request==`string`?request:readStringProp(request,`url`)??readStringProp(request,`href`)}function resolveFetchMethod(request){return readStringProp(request,`method`)??`GET`}function readStringProp(value,key){if(!(typeof value==`object`&&value&&key in value))return null;let prop=Reflect.get(value,key);return typeof prop==`string`?prop:null}const testOnlyApplyFetchSpanAttrs=applyFetchSpanAttrs,testOnlyApplyXhrSpanAttrs=applyXhrSpanAttrs,testOnlyResolveFailureRanges=resolveFailureRanges,testOnlyCreateFailureGate=createFailureGate,testOnlyClassifyNetworkError=classifyNetworkError,NEVER_MATCH=/^$/u,ESCAPE_RE=/[.*+?^${}()|[\]\\]/gu;function sameOriginPattern(){if(typeof window>`u`)return NEVER_MATCH;let{protocol,host}=globalThis.location;return RegExp(`^${protocol}//${host.replace(ESCAPE_RE,String.raw`\$&`)}`,`u`)}function stampInteractionAttrs(eventType,element,span,policy){let desc=describeActionable(element,policy);span.setAttribute(`ui.event_type`,eventType),span.setAttribute(`ui.target.tag`,desc.tag),desc.privacy&&(span.setAttribute(`ui.target.privacy`,desc.privacy),span.setAttribute(`target_xpath`,getElementXPath(element,!1))),desc.label&&span.setAttribute(`ui.target.label`,desc.label),desc.id&&span.setAttribute(`ui.target.id`,desc.id),desc.name&&span.setAttribute(`ui.target.name`,desc.name),desc.role&&span.setAttribute(`ui.target.role`,desc.role),desc.ariaLabel&&span.setAttribute(`ui.target.aria_label`,desc.ariaLabel),desc.text&&span.setAttribute(`ui.target.text`,desc.text)}const PREFETCH_HEADER_NAMES=[`next-router-prefetch`,`next-router-segment-prefetch`];function isPrefetchRequest(request){let headers;try{headers=typeof Request<`u`&&request instanceof Request?request.headers:new Headers(request.headers)}catch{return!1}return PREFETCH_HEADER_NAMES.some(name=>headers.has(name))||headers.get(`purpose`)===`prefetch`||headers.get(`sec-purpose`)?.includes(`prefetch`)===!0}function escapeRegExp(value){return value.replaceAll(/[.*+?^${}()|[\]\\]/gu,String.raw`\$&`)}function apiHostToMatcher(host){return RegExp(`^https?://${escapeRegExp(host)}(:\\d+)?([/?#]|$)`,`u`)}function registerBundledInstrumentations(input){let{tracerProvider,loggerProvider,ignoreUrls,apiHosts=[],propagateContextUrls=[],privacyPolicy=DEFAULT_PRIVACY_POLICY,isInteractionCaptureEnabled=()=>!0,redactUrl=url=>url}=input,{resolveRoute}=input,origin=sameOriginPattern(),propagateMatchers=[...apiHosts.map(host=>apiHostToMatcher(host)),...propagateContextUrls],fetchIgnore=[...ignoreUrls,...THIRD_PARTY_IGNORE],failureRanges=resolveFailureRanges(input.captureFailedRequests),failureGate=createFailureGate();function isTrackedUrl(url){return origin.test(url)||propagateMatchers.some(re=>re instanceof RegExp?re.test(url):url.includes(re))}let pageEventsEnabled=!1,coreInstrumentations=[new FetchInstrumentation({applyCustomAttributesOnSpan:(span,request,result)=>{applyFetchSpanAttrs(span,request,result,failureRanges,isTrackedUrl,resolveRoute,failureGate)},ignoreUrls:fetchIgnore,measureRequestSize:!0,propagateTraceHeaderCorsUrls:[origin,...propagateMatchers],requestHook:(span,request)=>{isPrefetchRequest(request)&&span.setAttribute(`http.request.prefetch`,!0)}}),new XMLHttpRequestInstrumentation({applyCustomAttributesOnSpan:(span,xhr)=>{applyXhrSpanAttrs(span,xhr,failureRanges,isTrackedUrl,failureGate,resolveRoute)},ignoreUrls:fetchIgnore,propagateTraceHeaderCorsUrls:[origin,...propagateMatchers]}),new LongTaskInstrumentation({observerCallback:(span,info)=>{stampUrlAttrs(span,resolveRoute);let containerType=info.longtaskEntry.attribution[0]?.containerType;containerType&&span.setAttribute(`longtask.container_type`,containerType)}}),new UserInteractionInstrumentation({eventNames:[`click`,`submit`],shouldPreventSpanCreation:(eventType,element,span)=>!(pageEventsEnabled&&isInteractionCaptureEnabled())||eventType===`click`&&!isActionable(element)||(stampInteractionAttrs(eventType,element,span,privacyPolicy),stampUrlAttrs(span,resolveRoute),!1)})],pageEventsInstrumentations=[new DocumentLoadInstrumentation({applyCustomAttributesOnSpan:{resourceFetch:(span,entry)=>{let name=entry?.name;if(typeof name!=`string`)return;let url;try{url=new URL(name)}catch{return}let isCrossOrigin=typeof window<`u`&&url.origin!==globalThis.location.origin;span.updateName(isCrossOrigin?`resource: ${url.host}${url.pathname}`:`resource: ${url.pathname}`),span.setAttribute(ATTR_URL_FULL,name),span.setAttribute(ATTR_URL_PATH,url.pathname),span.setAttribute(`server.address`,url.host)}},enabled:!1}),new BrowserNavigationInstrumentation({enabled:!1,sanitizeUrl:url=>redactUrl(defaultSanitizeUrl(url))})],unregisterCore=registerInstrumentations(omitUndefined({tracerProvider,loggerProvider,instrumentations:coreInstrumentations})),unregisterPageEvents=null,setPageEventsEnabled=enabled=>{if(pageEventsEnabled=enabled,enabled){unregisterPageEvents??=registerInstrumentations(omitUndefined({tracerProvider,loggerProvider,instrumentations:pageEventsInstrumentations}));return}unregisterPageEvents?.(),unregisterPageEvents=null};return{dispose:()=>{setPageEventsEnabled(!1),unregisterCore()},setPageEventsEnabled}}export{testOnlyCreateFailureGate as a,testOnlyClassifyNetworkError as i,testOnlyApplyFetchSpanAttrs as n,testOnlyResolveFailureRanges as o,testOnlyApplyXhrSpanAttrs as r,registerBundledInstrumentations as t};
@@ -1,2 +1,2 @@
1
- import { a as IDLE_AFTER_MS, c as SessionResumeReason, i as EXPIRE_AFTER_MS, n as ActivitySession, o as KEEPALIVE_THROTTLE_MS, r as CHECK_INTERVAL_MS, s as MAX_AGE_MS, t as ActivityMonitor } from "../../activity-Duhfgvxt.mjs";
2
- export { ActivityMonitor, ActivitySession, CHECK_INTERVAL_MS, EXPIRE_AFTER_MS, IDLE_AFTER_MS, KEEPALIVE_THROTTLE_MS, MAX_AGE_MS, SessionResumeReason };
1
+ import { a as IDLE_AFTER_MS, c as SessionResumeReason, i as EXPIRE_AFTER_MS, n as ActivitySession, o as MAX_AGE_MS, r as CHECK_INTERVAL_MS, s as SessionPauseReason, t as ActivityMonitor } from "../../activity-CShcwAW_.mjs";
2
+ export { ActivityMonitor, ActivitySession, CHECK_INTERVAL_MS, EXPIRE_AFTER_MS, IDLE_AFTER_MS, MAX_AGE_MS, SessionPauseReason, SessionResumeReason };
@@ -1 +1 @@
1
- import{a as KEEPALIVE_THROTTLE_MS,i as IDLE_AFTER_MS,n as CHECK_INTERVAL_MS,o as MAX_AGE_MS,r as EXPIRE_AFTER_MS,t as ActivityMonitor}from"../../activity-BYnL3bX-.mjs";export{ActivityMonitor,CHECK_INTERVAL_MS,EXPIRE_AFTER_MS,IDLE_AFTER_MS,KEEPALIVE_THROTTLE_MS,MAX_AGE_MS};
1
+ import{a as MAX_AGE_MS,i as IDLE_AFTER_MS,n as CHECK_INTERVAL_MS,r as EXPIRE_AFTER_MS,t as ActivityMonitor}from"../../activity-D13ZVan9.mjs";export{ActivityMonitor,CHECK_INTERVAL_MS,EXPIRE_AFTER_MS,IDLE_AFTER_MS,MAX_AGE_MS};
@@ -1,4 +1,4 @@
1
- import { a as InterfereContextValue, i as InterfereContext } from "../../provider-DIp7vkKd.mjs";
1
+ import { a as InterfereContextValue, i as InterfereContext } from "../../provider-CrzoxIxC.mjs";
2
2
  import { Component, ContextType, ReactNode } from "react";
3
3
  //#region src/internal/capture/capture-boundary.d.ts
4
4
  interface CaptureBoundaryProps {
@@ -1,4 +1,4 @@
1
- import { s as Kernel } from "../../provider-DIp7vkKd.mjs";
1
+ import { s as Kernel } from "../../provider-CrzoxIxC.mjs";
2
2
  import { ErrorMechanism } from "@interfere/types/sdk/plugins/payload/errors";
3
3
  //#region src/internal/capture/capture.d.ts
4
4
  /**
@@ -1 +1 @@
1
- import{n as recordExceptionOnSpan,r as startExceptionSpan,t as buildExceptionEventAttrs}from"../../exception-span-B74fhBQb.mjs";export{buildExceptionEventAttrs,recordExceptionOnSpan,startExceptionSpan};
1
+ import{n as recordExceptionOnSpan,r as startExceptionSpan,t as buildExceptionEventAttrs}from"../../exception-span-BfP73aqG.mjs";export{buildExceptionEventAttrs,recordExceptionOnSpan,startExceptionSpan};
@@ -1,4 +1,4 @@
1
- import { s as Kernel } from "../provider-DIp7vkKd.mjs";
1
+ import { s as Kernel } from "../provider-CrzoxIxC.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 readReleaseSlugFromGlobals, c as KernelConsent, d as KernelInternalOptions, f as KernelOptions, g as createKernel, h as buildSdkStack, l as KernelDevice, m as TracingOptions, p as KernelSession, s as Kernel, u as KernelIdentity } from "../provider-DIp7vkKd.mjs";
2
+ import { _ as readReleaseSlugFromGlobals, c as KernelConsent, d as KernelInternalOptions, f as KernelOptions, g as createKernel, h as buildSdkStack, l as KernelDevice, m as TracingOptions, p as KernelSession, s as Kernel, u as KernelIdentity } from "../provider-CrzoxIxC.mjs";
3
3
  import { i as HttpStatusCodeRange, n as CaptureFailedRequestsOption, r as CaptureFailedRequestsOptions } from "../instrumentations-D656I08h.mjs";
4
4
  import { t as RecordExceptionOpts } from "../exception-span-zN1tvBdh.mjs";
5
5
  import { t as isEnabledByEnvironment } from "../environment-CtCFKD2N.mjs";
@@ -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-D52QMtA9.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-OzI-YQDt.mjs";export{Kernel,buildSdkStack,createKernel,isEnabledByEnvironment,readReleaseSlugFromGlobals};
@@ -1,2 +1,2 @@
1
- import { t as IngestLogExporter } from "../../exporter-logs-CeGwMiMo.mjs";
1
+ import { t as IngestLogExporter } from "../../exporter-logs-DMr5-1Yi.mjs";
2
2
  export { IngestLogExporter };
@@ -1,2 +1,2 @@
1
- import { l as GatedResourceAttributes, u as IngestMetricExporter } from "../../exporter-logs-CeGwMiMo.mjs";
1
+ import { l as GatedResourceAttributes, u as IngestMetricExporter } from "../../exporter-logs-DMr5-1Yi.mjs";
2
2
  export { GatedResourceAttributes, IngestMetricExporter };
@@ -1,2 +1,2 @@
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";
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-DMr5-1Yi.mjs";
2
2
  export { INGEST_IGNORE_RE, SignalSender, createLogExporter, createMetricExporter, createTraceExporter, isIngestHalted, resetIngestHalt };
@@ -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-D6Ld-TFZ.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-CJo_iRgv.mjs";export{INGEST_IGNORE_RE,createLogExporter,createMetricExporter,createTraceExporter,isIngestHalted,resetIngestHalt};
@@ -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-BMoWBbsK.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-CdmvdXrJ.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-CDJwsZLm.mjs";import{t as captureWebVitals}from"../../web-vitals-CxXDUgpl.mjs";export{PAGE_SCOPE_MAX_AGE_MS,buildOtelProvider,captureWebVitals,createPageScopeRotator,installNavigationScope,readPropagationFromDocument,registerBundledInstrumentations,seedPageScope};
@@ -1 +1 @@
1
- import{a as testOnlyCreateFailureGate,i as testOnlyClassifyNetworkError,n as testOnlyApplyFetchSpanAttrs,o as testOnlyResolveFailureRanges,r as testOnlyApplyXhrSpanAttrs,t as registerBundledInstrumentations}from"../../../instrumentations-CY8NcP_M.mjs";export{registerBundledInstrumentations,testOnlyApplyFetchSpanAttrs,testOnlyApplyXhrSpanAttrs,testOnlyClassifyNetworkError,testOnlyCreateFailureGate,testOnlyResolveFailureRanges};
1
+ import{a as testOnlyCreateFailureGate,i as testOnlyClassifyNetworkError,n as testOnlyApplyFetchSpanAttrs,o as testOnlyResolveFailureRanges,r as testOnlyApplyXhrSpanAttrs,t as registerBundledInstrumentations}from"../../../instrumentations-CdmvdXrJ.mjs";export{registerBundledInstrumentations,testOnlyApplyFetchSpanAttrs,testOnlyApplyXhrSpanAttrs,testOnlyClassifyNetworkError,testOnlyCreateFailureGate,testOnlyResolveFailureRanges};
@@ -1 +1 @@
1
- import{t as buildOtelProvider}from"../../provider-BMoWBbsK.mjs";export{buildOtelProvider};
1
+ import{t as buildOtelProvider}from"../../provider-CDJwsZLm.mjs";export{buildOtelProvider};
@@ -1,2 +1,2 @@
1
- import { v as PluginRuntime } from "../../provider-DIp7vkKd.mjs";
1
+ import { v as PluginRuntime } from "../../provider-CrzoxIxC.mjs";
2
2
  export { PluginRuntime };
@@ -1,2 +1,2 @@
1
- import { a as InterfereContextValue, i as InterfereContext, o as NULL_CONTEXT_VALUE } from "../provider-DIp7vkKd.mjs";
1
+ import { a as InterfereContextValue, i as InterfereContext, o as NULL_CONTEXT_VALUE } from "../provider-CrzoxIxC.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-CSFECZRw.mjs";export{PRODUCER_VERSION,SDK_NAME,SDK_VERSION};
1
+ import{n as SDK_NAME,r as SDK_VERSION,t as PRODUCER_VERSION}from"../version-D1R2jz3K.mjs";export{PRODUCER_VERSION,SDK_NAME,SDK_VERSION};
@@ -1,4 +1,4 @@
1
- import { f as KernelOptions, s as Kernel } from "../provider-DIp7vkKd.mjs";
1
+ import { f as KernelOptions, s as Kernel } from "../provider-CrzoxIxC.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{t as createLogger}from"../log-D6Ht--tv.mjs";import{n as registerKernel,r as unregisterKernel}from"../kernel-registry-6f-3VCIy.mjs";import{n as isForceEnableActive,t as hasPublicKey}from"../config-VOyDjqS7.mjs";import{t as isEnabledByEnvironment}from"../environment-CoEXhF1a.mjs";import{r as createKernel}from"../kernel-D52QMtA9.mjs";import{n as isBotUserAgent}from"../bot-YLSbnCeg.mjs";const log=createLogger(`init`);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:hasPublicKey()?(pending=initKernel({...opts,_wrapperVersions:[input.producerVersion]}),pending):(log.warn(`No public key is configured, so the SDK is disabled. Set INTERFERE_PUBLIC_KEY (VITE_INTERFERE_PUBLIC_KEY for Vite) on builds that should send telemetry.`),null))},subscribeToKernel(listener){return listeners.add(listener),(()=>{listeners.delete(listener)})}}}export{createWrapperSingleton};
1
+ import{t as createLogger}from"../log-D6Ht--tv.mjs";import{n as registerKernel,r as unregisterKernel}from"../kernel-registry-6f-3VCIy.mjs";import{n as isForceEnableActive,t as hasPublicKey}from"../config-VOyDjqS7.mjs";import{t as isEnabledByEnvironment}from"../environment-CoEXhF1a.mjs";import{r as createKernel}from"../kernel-OzI-YQDt.mjs";import{n as isBotUserAgent}from"../bot-YLSbnCeg.mjs";const log=createLogger(`init`);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:hasPublicKey()?(pending=initKernel({...opts,_wrapperVersions:[input.producerVersion]}),pending):(log.warn(`No public key is configured, so the SDK is disabled. Set INTERFERE_PUBLIC_KEY (VITE_INTERFERE_PUBLIC_KEY for Vite) on builds that should send telemetry.`),null))},subscribeToKernel(listener){return listeners.add(listener),(()=>{listeners.delete(listener)})}}}export{createWrapperSingleton};
@@ -0,0 +1 @@
1
+ import{t as createLogger}from"./log-D6Ht--tv.mjs";import{a as resolvePrivacyPolicy}from"./privacy-CRuL0X8r.mjs";import{r as onPageUnloading,t as onPageHidden}from"./page-lifecycle-DTWqGlz2.mjs";import{t as SessionTracker}from"./api-D922KFvx.mjs";import{n as getStringGlobal,t as getGlobal}from"./global-DYq1Z4_H.mjs";import{i as setIngestHost,r as resolveTargets}from"./config-VOyDjqS7.mjs";import{t as PRODUCER_VERSION}from"./version-D1R2jz3K.mjs";import{t as INGEST_IGNORE_RE}from"./exporter-CJo_iRgv.mjs";import{t as recordInitialNavigation}from"./initial-navigation-YeK6UUHX.mjs";import{n as recordExceptionOnSpan,r as startExceptionSpan,t as buildExceptionEventAttrs}from"./exception-span-BfP73aqG.mjs";import{t as PluginRuntime}from"./plugin-runtime-B1oFO16q.mjs";import{isNonErrorException,shouldDropBrowserExtensionNoise,shouldDropUnresolvableStack}from"@interfere/types/sdk/errors";import{trace}from"@opentelemetry/api";import{omitUndefined}from"@interfere/helpers/omit-undefined";import{InterfereClient}from"@interfere/javascript";import{releaseSlugSchema}from"@interfere/types/releases/slug";import{FORCE_ENABLE_GLOBAL,RELEASE_SLUG_GLOBAL,SDK_STACK_GLOBAL}from"@interfere/types/sdk/injected-globals";import{readBakedPlugins,remoteConfigInputSchema}from"@interfere/types/sdk/remote-config";import{SERVICE_NAME_GLOBAL}from"@interfere/types/sdk/service-name";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]}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;unsubscribePageUnloading=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(()=>{})}),this.unsubscribePageUnloading=onPageUnloading(()=>{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)}onSessionExceptionWhilePaused(handler){return this.tracker.onSessionExceptionWhilePaused(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}this.tracker.noteException();let attrs=buildExceptionEventAttrs(value,opts),active=trace.getActiveSpan();if(active?.isRecording()){recordExceptionOnSpan(active,value,attrs,opts.mechanism.handled);return}let tracer=this.otel?.tracerProvider.getTracer(`@interfere/react/exception`);if(!tracer)return;let span=startExceptionSpan(tracer,value);recordExceptionOnSpan(span,value,attrs,opts.mechanism.handled),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.unsubscribePageUnloading?.(),this.unsubscribePageUnloading=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},serviceName=opts.serviceName||getStringGlobal(SERVICE_NAME_GLOBAL);serviceName&&(resolvedTracing.serviceName=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 { C as Plugin } from "../provider-DIp7vkKd.mjs";
1
+ import { C as Plugin } from "../provider-CrzoxIxC.mjs";
2
2
  //#region src/plugins/device.d.ts
3
3
  declare const devicePlugin: Plugin;
4
4
  //#endregion
@@ -1,4 +1,4 @@
1
- import { C as Plugin } from "../provider-DIp7vkKd.mjs";
1
+ import { C as Plugin } from "../provider-CrzoxIxC.mjs";
2
2
  //#region src/plugins/errors.d.ts
3
3
  declare const errorsPlugin: Plugin;
4
4
  //#endregion
@@ -1,2 +1,2 @@
1
- import { S as resolveFeatures, b as PluginOverrides, x as loadPlugin, y as LOADERS } from "../../provider-DIp7vkKd.mjs";
1
+ import { S as resolveFeatures, b as PluginOverrides, x as loadPlugin, y as LOADERS } from "../../provider-CrzoxIxC.mjs";
2
2
  export { LOADERS, PluginOverrides, loadPlugin, resolveFeatures };
@@ -1,2 +1,2 @@
1
- import { C as Plugin, D as PluginTeardownReason, E as PluginContext, T as PluginConfigState, w as PluginCleanup } from "../../provider-DIp7vkKd.mjs";
1
+ import { C as Plugin, D as PluginTeardownReason, E as PluginContext, T as PluginConfigState, w as PluginCleanup } from "../../provider-CrzoxIxC.mjs";
2
2
  export { Plugin, PluginCleanup, PluginConfigState, PluginContext, PluginTeardownReason };
@@ -1,4 +1,4 @@
1
- import { C as Plugin } from "../provider-DIp7vkKd.mjs";
1
+ import { C as Plugin } from "../provider-CrzoxIxC.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 +1 @@
1
- import{t as activeKernel}from"../kernel-registry-6f-3VCIy.mjs";import{t as safeStringify}from"../stringify-DvuHsAT4.mjs";import{n as onConsoleCall}from"../console-patch-WNKoLE7U.mjs";import{SeverityNumber}from"@opentelemetry/api-logs";const LEVEL_TO_SEVERITY={debug:{number:SeverityNumber.DEBUG,text:`DEBUG`},error:{number:SeverityNumber.ERROR,text:`ERROR`},info:{number:SeverityNumber.INFO,text:`INFO`},log:{number:SeverityNumber.INFO,text:`INFO`},warn:{number:SeverityNumber.WARN,text:`WARN`}},logsPlugin={name:`logs`,setup(){return onConsoleCall((level,args)=>{if(args.some(a=>a instanceof Error))return;let kernel=activeKernel();if(!kernel)return;let sev=LEVEL_TO_SEVERITY[level];kernel.recordLog({attributes:{"console.level":level},body:args.length===1?safeStringify(args[0]):args.map(element=>safeStringify(element)).join(` `),severityNumber:sev.number,severityText:sev.text})})}};export{logsPlugin as default};
1
+ import{t as activeKernel}from"../kernel-registry-6f-3VCIy.mjs";import{n as onConsoleCall}from"../console-patch-WNKoLE7U.mjs";import{t as safeStringify}from"../stringify-DvuHsAT4.mjs";import{SeverityNumber}from"@opentelemetry/api-logs";const LEVEL_TO_SEVERITY={debug:{number:SeverityNumber.DEBUG,text:`DEBUG`},error:{number:SeverityNumber.ERROR,text:`ERROR`},info:{number:SeverityNumber.INFO,text:`INFO`},log:{number:SeverityNumber.INFO,text:`INFO`},warn:{number:SeverityNumber.WARN,text:`WARN`}},logsPlugin={name:`logs`,setup(){return onConsoleCall((level,args)=>{if(args.some(a=>a instanceof Error))return;let kernel=activeKernel();if(!kernel)return;let sev=LEVEL_TO_SEVERITY[level];kernel.recordLog({attributes:{"console.level":level},body:args.length===1?safeStringify(args[0]):args.map(element=>safeStringify(element)).join(` `),severityNumber:sev.number,severityText:sev.text})})}};export{logsPlugin as default};
@@ -1,4 +1,4 @@
1
- import { C as Plugin } from "../provider-DIp7vkKd.mjs";
1
+ import { C as Plugin } from "../provider-CrzoxIxC.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 { C as Plugin } from "../provider-DIp7vkKd.mjs";
1
+ import { C as Plugin } from "../provider-CrzoxIxC.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 { C as Plugin } from "../../provider-DIp7vkKd.mjs";
1
+ import { C as Plugin } from "../../provider-CrzoxIxC.mjs";
2
2
  //#region src/plugins/replay/index.d.ts
3
3
  declare const replayPlugin: Plugin;
4
4
  //#endregion
@@ -1 +1 @@
1
- import{t as createLogger}from"../../log-D6Ht--tv.mjs";import{n as onPageShown,r as onPageUnloading,t as onPageHidden}from"../../page-lifecycle-DTWqGlz2.mjs";import{r as resolveTargets}from"../../config-VOyDjqS7.mjs";import{i as toRecordOptions}from"../../config-DapTbKhs.mjs";import{n as splitReplayEvents,r as toReplayChunkPayload}from"../../chunking-qZffPbyY.mjs";import{t as createReplayBuffer}from"../../buffer-BRn_kSm-.mjs";import{t as createCompressor}from"../../compressor-host-CrKngamF.mjs";import{n as deliverChunk,t as REPLAY_TRACER_NAME}from"../../delivery-_q1bkaIt.mjs";import{t as startReplayRecorder}from"../../recorder-CM6Ae_0S.mjs";import{t as redactReplayEvent}from"../../redact-urls-CwFod9d4.mjs";import{t as createSegmentSequence}from"../../sequence-B4dYChb0.mjs";import{omitUndefined}from"@interfere/helpers/omit-undefined";import{EventType}from"@rrweb/types";const log=createLogger(`replay`);function isBrowserApiRejection(error){return Object.prototype.toString.call(error)===`[object DOMException]`}const replayPlugin={name:`replay`,setup(ctx){let targets=resolveTargets(),recorder=null,flushTimer=null,unsubscribeConfig=null,unsubscribeHidden=null,unsubscribeShown=null,unsubscribeUnloading=null,unsubscribePause=null,unsubscribeResume=null,isPaused=!1,startup=new AbortController,compressor=createCompressor(),windowId=ctx.getWindowId(),sequence=createSegmentSequence(windowId),consecutiveFailures=0,recorderFaults=0,halted=!1;function halt(reason,detail){halted||(halted=!0,ctx.getTracer(REPLAY_TRACER_NAME).startSpan(`replay.halt`,{attributes:omitUndefined({"replay.halt.reason":reason,"replay.halt.detail":detail,"replay.halt.recorder_faults":recorderFaults})}).end(),startup.abort(),clearFlushTimer(),recorder?.stop(),recorder=null)}function clearFlushTimer(){flushTimer&&=(clearInterval(flushTimer),null)}function armFlushTimer(){clearFlushTimer(),flushTimer=setInterval(()=>{clearFlushTimer(),flushTimer=setInterval(flush,1e4),flush()},2e3)}function handleResult(result){if(result===`ok`){consecutiveFailures=0;return}if(result===`fatal`){log.warn(`replay halted: upload rejected`),halt(`upload-rejected`);return}consecutiveFailures+=1,consecutiveFailures>=3&&(log.warn(`replay halted after %d consecutive upload failures`,consecutiveFailures),halt(`upload-failed`))}function handleRecorderFault(error){if(isBrowserApiRejection(error)){log.debug(`recorder passed through a browser API rejection: %s`,error instanceof Error?error.name:`DOMException`);return}recorderFaults+=1,!(recorderFaults>10)&&(log.warn(`recorder fault: %s`,error instanceof Error?error.constructor.name:`UnknownError`),recorderFaults===10&&(log.warn(`replay halted after %d recorder faults`,10),flush(),halt(`recorder-faults`,error instanceof Error?error.constructor.name:`UnknownError`)))}let buffer=createReplayBuffer({onSoftLimit:flush,softLimitBytes:4194304});function flush(opts){if(halted||ctx.getPluginConfigState(`replay`)!==`enabled`)return;let drained=buffer.drain();if(drained.length===0)return;let{chunks,droppedEventBytes}=splitReplayEvents(drained);for(let bytes of droppedEventBytes)log.warn(`dropping replay event of ~%d bytes: too large to upload`,bytes);for(let group of chunks)sendChunk(toReplayChunkPayload(group),opts?.unload??!1)}async function sendChunk(payload,unload){try{handleResult(await deliverChunk({target:targets.ingest,chunk:{segmentId:sequence.take(),windowId},compressor,ctx,payload,unload}))}catch(error){log.warn(`replay chunk dropped: %s`,error instanceof Error?error.constructor.name:`UnknownError`),handleResult(`retryable`)}}let pauseRecording=unload=>{isPaused||(isPaused=!0,recorder?.stop(),flush(unload?{unload:!0}:void 0))},resumeRecording=()=>{isPaused&&(isPaused=!1,recorder?.start(),armFlushTimer())},recordOptions=toRecordOptions(ctx.getReplayConfig(),ctx.privacyPolicy);return(async()=>{if(recorder=await startReplayRecorder({onEvent:(event,isCheckout)=>{startup.signal.aborted||(isCheckout&&event.type===EventType.Meta&&flush(),redactReplayEvent(event,ctx.redactUrl),buffer.push(event))},onFault:handleRecorderFault,recordOptions,signal:startup.signal}),startup.signal.aborted){recorder?.stop(),recorder=null;return}recorder&&(unsubscribeConfig=ctx.subscribePluginConfigState(`replay`,state=>{state===`enabled`&&flush()}),armFlushTimer(),unsubscribeHidden=onPageHidden(()=>{pauseRecording(!0)}),unsubscribeUnloading=onPageUnloading(()=>{flush({unload:!0})}),unsubscribeShown=onPageShown(resumeRecording),unsubscribePause=ctx.onSessionPause(()=>{pauseRecording(!1)}),unsubscribeResume=ctx.onSessionResume(resumeRecording),log.debug(`recording started`))})().catch(error=>{let detail=error instanceof Error?error.constructor.name:`UnknownError`;log.warn(`replay initialization failed: %s`,detail),halt(`init-failed`,detail)}),reason=>{reason===`consent-revoked`?(buffer.drain(),log.debug(`replay buffer discarded: consent revoked`)):flush(),startup.abort(),recorder?.stop(),clearFlushTimer(),unsubscribeConfig?.(),unsubscribeHidden?.(),unsubscribeShown?.(),unsubscribeUnloading?.(),unsubscribePause?.(),unsubscribeResume?.(),compressor.dispose()}}};export{replayPlugin as default};
1
+ import{t as createLogger}from"../../log-D6Ht--tv.mjs";import{i as toRecordOptions}from"../../config-DapTbKhs.mjs";import{r as onPageUnloading}from"../../page-lifecycle-DTWqGlz2.mjs";import{r as resolveTargets}from"../../config-VOyDjqS7.mjs";import{n as splitReplayEvents,r as toReplayChunkPayload}from"../../chunking-qZffPbyY.mjs";import{t as createReplayBuffer}from"../../buffer-BRn_kSm-.mjs";import{t as createCompressor}from"../../compressor-host-CrKngamF.mjs";import{n as deliverChunk,t as REPLAY_TRACER_NAME}from"../../delivery-DDe-2SLc.mjs";import{t as startReplayRecorder}from"../../recorder-C36qxD3q.mjs";import{t as redactReplayEvent}from"../../redact-urls-CwFod9d4.mjs";import{t as createSegmentSequence}from"../../sequence-B4dYChb0.mjs";import{omitUndefined}from"@interfere/helpers/omit-undefined";import{EventType}from"@rrweb/types";const log=createLogger(`replay`);function isBrowserApiRejection(error){return Object.prototype.toString.call(error)===`[object DOMException]`}const replayPlugin={name:`replay`,setup(ctx){let targets=resolveTargets(),recorder=null,flushTimer=null,unsubscribeConfig=null,unsubscribeUnloading=null,unsubscribePause=null,unsubscribeResume=null,unsubscribeException=null,isPaused=!1,startup=new AbortController,compressor=createCompressor(),windowId=ctx.getWindowId(),sequence=createSegmentSequence(windowId),consecutiveFailures=0,recorderFaults=0,halted=!1;function halt(reason,detail){halted||(halted=!0,ctx.getTracer(REPLAY_TRACER_NAME).startSpan(`replay.halt`,{attributes:omitUndefined({"replay.halt.reason":reason,"replay.halt.detail":detail,"replay.halt.recorder_faults":recorderFaults})}).end(),startup.abort(),clearFlushTimer(),recorder?.stop(),recorder=null)}function clearFlushTimer(){flushTimer&&=(clearInterval(flushTimer),null)}function armFlushTimer(){clearFlushTimer(),flushTimer=setInterval(()=>{clearFlushTimer(),flushTimer=setInterval(flush,1e4),flush()},2e3)}function handleResult(result){if(result===`ok`){consecutiveFailures=0;return}if(result===`skipped`){log.warn(`replay chunk rejected as a segment conflict; skipping it`),consecutiveFailures=0;return}if(result===`fatal`){log.warn(`replay halted: upload rejected`),halt(`upload-rejected`);return}consecutiveFailures+=1,consecutiveFailures>=3&&(log.warn(`replay halted after %d consecutive upload failures`,consecutiveFailures),halt(`upload-failed`))}function handleRecorderFault(error){if(isBrowserApiRejection(error)){log.debug(`recorder passed through a browser API rejection: %s`,error instanceof Error?error.name:`DOMException`);return}recorderFaults+=1,!(recorderFaults>10)&&(log.warn(`recorder fault: %s`,error instanceof Error?error.constructor.name:`UnknownError`),recorderFaults===10&&(log.warn(`replay halted after %d recorder faults`,10),flush(),halt(`recorder-faults`,error instanceof Error?error.constructor.name:`UnknownError`)))}let buffer=createReplayBuffer({onSoftLimit:flush,softLimitBytes:4194304});function flush(opts){if(halted||ctx.getPluginConfigState(`replay`)!==`enabled`)return;let drained=buffer.drain();if(drained.length===0)return;let{chunks,droppedEventBytes}=splitReplayEvents(drained);for(let bytes of droppedEventBytes)log.warn(`dropping replay event of ~%d bytes: too large to upload`,bytes);for(let group of chunks)sendChunk(toReplayChunkPayload(group),opts?.unload??!1,opts?.trigger)}async function sendChunk(payload,unload,trigger){try{handleResult(await deliverChunk({target:targets.ingest,chunk:{segmentId:sequence.take(),windowId},compressor,ctx,payload,trigger,unload}))}catch(error){log.warn(`replay chunk dropped: %s`,error instanceof Error?error.constructor.name:`UnknownError`),handleResult(`retryable`)}}let pauseRecording=reason=>{isPaused||(isPaused=!0,recorder?.stop(),flush(reason===`hidden`?{unload:!0}:void 0))},snapshotWhilePaused=reason=>{isPaused&&!halted&&recorder?.start()&&(recorder.addCustomEvent(`interfere.paused-exception-snapshot`,{reason}),recorder.stop(),flush({trigger:`exception`}))},resumeRecording=()=>{isPaused&&(isPaused=!1,recorder?.start(),armFlushTimer())},recordOptions=toRecordOptions(ctx.getReplayConfig(),ctx.privacyPolicy);return(async()=>{if(recorder=await startReplayRecorder({onEvent:(event,isCheckout)=>{startup.signal.aborted||(isCheckout&&event.type===EventType.Meta&&flush(),redactReplayEvent(event,ctx.redactUrl),buffer.push(event))},onFault:handleRecorderFault,recordOptions,signal:startup.signal}),startup.signal.aborted){recorder?.stop(),recorder=null;return}recorder&&(unsubscribeConfig=ctx.subscribePluginConfigState(`replay`,state=>{state===`enabled`&&flush()}),armFlushTimer(),unsubscribeUnloading=onPageUnloading(()=>{flush({unload:!0})}),unsubscribePause=ctx.onSessionPause(pauseRecording),unsubscribeResume=ctx.onSessionResume(resumeRecording),unsubscribeException=ctx.onSessionExceptionWhilePaused(snapshotWhilePaused),log.debug(`recording started`))})().catch(error=>{let detail=error instanceof Error?error.constructor.name:`UnknownError`;log.warn(`replay initialization failed: %s`,detail),halt(`init-failed`,detail)}),reason=>{reason===`consent-revoked`?(buffer.drain(),log.debug(`replay buffer discarded: consent revoked`)):flush(),startup.abort(),recorder?.stop(),clearFlushTimer(),unsubscribeConfig?.(),unsubscribeUnloading?.(),unsubscribePause?.(),unsubscribeResume?.(),unsubscribeException?.(),compressor.dispose()}}};export{replayPlugin as default};
@@ -2,6 +2,7 @@ import { o as ReplayRecordOptions } from "../../../config-Dyc09HCZ.mjs";
2
2
  import { eventWithTime } from "@rrweb/types";
3
3
  //#region src/plugins/replay/recorder/recorder.d.ts
4
4
  export interface ReplayRecorder {
5
+ addCustomEvent: (tag: string, payload: Record<string, string>) => void;
5
6
  start: () => boolean;
6
7
  stop: () => void;
7
8
  }
@@ -1 +1 @@
1
- import{t as startReplayRecorder}from"../../../recorder-CM6Ae_0S.mjs";export{startReplayRecorder};
1
+ import{t as startReplayRecorder}from"../../../recorder-C36qxD3q.mjs";export{startReplayRecorder};
@@ -1,10 +1,11 @@
1
- import { E as PluginContext } from "../../../provider-DIp7vkKd.mjs";
1
+ import { E as PluginContext } from "../../../provider-CrzoxIxC.mjs";
2
2
  import { r as resolveTargets } from "../../../config-BTWtCcDP.mjs";
3
3
  import { n as ReplayChunkPayload } from "../../../chunking-OfmdRxfq.mjs";
4
4
  import { t as Compressor } from "../../../compressor-host-D3At2PKg.mjs";
5
5
  //#region src/plugins/replay/upload/delivery.d.ts
6
6
  export declare const REPLAY_TRACER_NAME = "@interfere/react/replay";
7
- export type DeliverResult = "ok" | "retryable" | "fatal";
7
+ export type DeliverResult = "ok" | "skipped" | "retryable" | "fatal";
8
+ export type ChunkTrigger = "exception";
8
9
  export interface ReplayChunkRef {
9
10
  segmentId: number;
10
11
  windowId: string;
@@ -15,8 +16,10 @@ export interface DeliverInput {
15
16
  compressor: Compressor;
16
17
  ctx: PluginContext;
17
18
  payload: ReplayChunkPayload;
19
+ /** Why the chunk was cut outside the regular flush cadence, recorded on the `replay.chunk` span. */
20
+ trigger?: ChunkTrigger | undefined;
18
21
  /** The page is hiding or unloading: compress synchronously and ask the browser to finish the request after the page unloads while the shared keepalive body budget has room. */
19
22
  unload: boolean;
20
23
  }
21
- export declare function deliverChunk({ ctx, chunk, target, compressor, payload, unload }: DeliverInput): Promise<"fatal" | "ok" | "retryable">;
24
+ export declare function deliverChunk({ ctx, chunk, target, compressor, payload, trigger, unload }: DeliverInput): Promise<"fatal" | "ok" | "retryable" | "skipped">;
22
25
  //#endregion
@@ -1 +1 @@
1
- import{n as deliverChunk,t as REPLAY_TRACER_NAME}from"../../../delivery-_q1bkaIt.mjs";export{REPLAY_TRACER_NAME,deliverChunk};
1
+ import{n as deliverChunk,t as REPLAY_TRACER_NAME}from"../../../delivery-DDe-2SLc.mjs";export{REPLAY_TRACER_NAME,deliverChunk};
@@ -1 +1 @@
1
- import{n as getStringGlobal}from"./global-DYq1Z4_H.mjs";import{n as SDK_NAME,r as SDK_VERSION}from"./version-CSFECZRw.mjs";import{i as createTraceExporter,n as createLogExporter,r as createMetricExporter}from"./exporter-D6Ld-TFZ.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-D1R2jz3K.mjs";import{i as createTraceExporter,n as createLogExporter,r as createMetricExporter}from"./exporter-CJo_iRgv.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,8 +1,8 @@
1
- import { c as SessionResumeReason } from "./activity-Duhfgvxt.mjs";
1
+ import { c as SessionResumeReason, s as SessionPauseReason } from "./activity-CShcwAW_.mjs";
2
2
  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
- import { t as SessionTracker } from "./api-CMPV9rgU.mjs";
5
+ import { t as SessionTracker } from "./api-DSUjs8zG.mjs";
6
6
  import { n as CaptureFailedRequestsOption, t as BundledInstrumentations } from "./instrumentations-D656I08h.mjs";
7
7
  import { t as OtelProviderHandle } from "./provider-cUByhzgv.mjs";
8
8
  import "./index-BZ_yQUGY.mjs";
@@ -29,7 +29,8 @@ interface PluginContext {
29
29
  getSessionId: () => string;
30
30
  getTracer: (name: string) => Tracer;
31
31
  getWindowId: () => string;
32
- onSessionPause: (handler: () => void) => () => void;
32
+ onSessionExceptionWhilePaused: (handler: (reason: SessionPauseReason) => void) => () => void;
33
+ onSessionPause: (handler: (reason: SessionPauseReason) => void) => () => void;
33
34
  onSessionResume: (handler: (reason: SessionResumeReason) => void) => () => void;
34
35
  recordException: (value: Error | NonErrorException, opts: RecordExceptionOpts) => void;
35
36
  redactUrl: (url: string) => string;
@@ -269,7 +270,8 @@ declare class Kernel implements PluginContext {
269
270
  /** PluginContext shim: plugins expect a non-null string. */
270
271
  getSessionId(): "" | (string & import("zod").$brand<"SessionId">);
271
272
  getWindowId(): string;
272
- onSessionPause(handler: () => void): () => void;
273
+ onSessionPause(handler: (reason: SessionPauseReason) => void): () => void;
274
+ onSessionExceptionWhilePaused(handler: (reason: SessionPauseReason) => void): () => void;
273
275
  onSessionResume(handler: (reason: SessionResumeReason) => void): () => void;
274
276
  getPluginConfigState(key: PluginKey): "disabled" | "enabled" | "pending";
275
277
  getReplayConfig(): ReplayConfig;
@@ -1,4 +1,4 @@
1
1
  import { a as ReplayOption, i as ReplayConfig } from "./config-Dyc09HCZ.mjs";
2
- import { a as InterfereContextValue, b as PluginOverrides, i as InterfereContext, n as useInterfere, r as useSession, t as InterfereProvider } from "./provider-DIp7vkKd.mjs";
2
+ import { a as InterfereContextValue, b as PluginOverrides, i as InterfereContext, n as useInterfere, r as useSession, t as InterfereProvider } from "./provider-CrzoxIxC.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,4 +1,4 @@
1
- import { s as Kernel } from "./provider-DIp7vkKd.mjs";
1
+ import { s as Kernel } from "./provider-CrzoxIxC.mjs";
2
2
  //#region src/react-error-handler.d.ts
3
3
  /** React root error-handler metadata; only componentStack is consumed. */
4
4
  interface ReactRootErrorInfo {
@@ -0,0 +1 @@
1
+ import{t as createLogger}from"./log-D6Ht--tv.mjs";const log=createLogger(`replay`);async function startReplayRecorder({onEvent,onFault,recordOptions,signal}){let record;try{({record}=await import(`./rrweb-CE6GKCEq.mjs`))}catch{return log.error(`rrweb failed to load, replay disabled`),null}if(signal?.aborted)return null;let stopRecording,recorder={addCustomEvent:(tag,payload)=>{stopRecording&&record.addCustomEvent(tag,payload)},start:()=>(stopRecording??=record({emit:onEvent,recordAfter:`DOMContentLoaded`,inlineStylesheet:!0,slimDOMOptions:`all`,checkoutEveryNms:6e4,sampling:{media:800,mousemove:50,scroll:150},...recordOptions,errorHandler:error=>(onFault(error),!0)}),stopRecording!==void 0),stop:()=>{stopRecording?.(),stopRecording=void 0}};return recorder.start()?recorder:(log.error(`rrweb failed to start, replay disabled`),null)}export{startReplayRecorder as t};
@@ -1,2 +1,2 @@
1
- import { n as SessionTrackerOptions, t as SessionTracker } from "../api-CMPV9rgU.mjs";
1
+ import { n as SessionTrackerOptions, t as SessionTracker } from "../api-DSUjs8zG.mjs";
2
2
  export { SessionTracker, SessionTrackerOptions };
@@ -1 +1 @@
1
- import{t as SessionTracker}from"../api-BUYnj5MA.mjs";export{SessionTracker};
1
+ import{t as SessionTracker}from"../api-D922KFvx.mjs";export{SessionTracker};
@@ -1,4 +1,4 @@
1
- import { t as SessionTracker } from "../api-CMPV9rgU.mjs";
1
+ import { t as SessionTracker } from "../api-DSUjs8zG.mjs";
2
2
  import { InterfereClient } from "@interfere/javascript";
3
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 */
@@ -1,4 +1,4 @@
1
- import{t as DeviceManager}from"../device-DRK7hhLi.mjs";import{t as SessionTracker}from"../api-BUYnj5MA.mjs";import{InterfereClient}from"@interfere/javascript";var __commonJSMin=(cb,mod)=>()=>(mod||(cb((mod={exports:{}}).exports,mod),cb=null),mod.exports),POSITIONALS_EXP$1=/(%?)(%([sdijo]))/g;function serializePositional$1(positional,flag){switch(flag){case`s`:return positional;case`d`:case`i`:return Number(positional);case`j`:return JSON.stringify(positional);case`o`:{if(typeof positional==`string`)return positional;let json=JSON.stringify(positional);return json===`{}`||json===`[]`||/^\[object .+?\]$/.test(json)?positional:json}}}function format$3(message,...positionals){if(positionals.length===0)return message;let positionalIndex=0,formattedMessage=message.replace(POSITIONALS_EXP$1,(match,isEscaped,_,flag)=>{let positional=positionals[positionalIndex],value=serializePositional$1(positional,flag);return isEscaped?match:(positionalIndex++,value)});return positionalIndex<positionals.length&&(formattedMessage+=` ${positionals.slice(positionalIndex).join(` `)}`),formattedMessage=formattedMessage.replace(/%{2,2}/g,`%`),formattedMessage}var STACK_FRAMES_TO_IGNORE$1=2;function cleanErrorStack$1(error){if(!error.stack)return;let nextStack=error.stack.split(`
1
+ import{t as DeviceManager}from"../device-DRK7hhLi.mjs";import{t as SessionTracker}from"../api-D922KFvx.mjs";import{InterfereClient}from"@interfere/javascript";var __commonJSMin=(cb,mod)=>()=>(mod||(cb((mod={exports:{}}).exports,mod),cb=null),mod.exports),POSITIONALS_EXP$1=/(%?)(%([sdijo]))/g;function serializePositional$1(positional,flag){switch(flag){case`s`:return positional;case`d`:case`i`:return Number(positional);case`j`:return JSON.stringify(positional);case`o`:{if(typeof positional==`string`)return positional;let json=JSON.stringify(positional);return json===`{}`||json===`[]`||/^\[object .+?\]$/.test(json)?positional:json}}}function format$3(message,...positionals){if(positionals.length===0)return message;let positionalIndex=0,formattedMessage=message.replace(POSITIONALS_EXP$1,(match,isEscaped,_,flag)=>{let positional=positionals[positionalIndex],value=serializePositional$1(positional,flag);return isEscaped?match:(positionalIndex++,value)});return positionalIndex<positionals.length&&(formattedMessage+=` ${positionals.slice(positionalIndex).join(` `)}`),formattedMessage=formattedMessage.replace(/%{2,2}/g,`%`),formattedMessage}var STACK_FRAMES_TO_IGNORE$1=2;function cleanErrorStack$1(error){if(!error.stack)return;let nextStack=error.stack.split(`
2
2
  `);nextStack.splice(1,STACK_FRAMES_TO_IGNORE$1),error.stack=nextStack.join(`
3
3
  `)}var InvariantError$1=class extends Error{constructor(message,...positionals){super(message),this.message=message,this.name=`Invariant Violation`,this.message=format$3(message,...positionals),cleanErrorStack$1(this)}},invariant$1=(predicate,message,...positionals)=>{if(!predicate)throw new InvariantError$1(message,...positionals)};invariant$1.as=(ErrorConstructor,predicate,message,...positionals)=>{if(!predicate){let formatMessage=positionals.length===0?message:format$3(message,...positionals),error;try{error=Reflect.construct(ErrorConstructor,[formatMessage])}catch{error=ErrorConstructor(formatMessage)}throw error}};function formatMessage(message,...positionals){return`[MSW] ${format$3(message,...positionals)}`}function warn$2(message,...positionals){console.warn(formatMessage(message,...positionals))}function error$2(message,...positionals){console.error(formatMessage(message,...positionals))}const devUtils={formatMessage,warn:warn$2,error:error$2};var InternalError=class extends Error{constructor(message){super(message),this.name=`InternalError`}},LensList$1=class{#list;#lens;constructor(){this.#list=[],this.#lens=new Map}get[Symbol.iterator](){return this.#list[Symbol.iterator].bind(this.#list)}entries(){return this.#lens.entries()}get(key){return this.#lens.get(key)||[]}getAll(){return this.#list.map(([,value])=>value)}append(key,value){this.#list.push([key,value]),this.#openLens(key,list=>list.push(value))}prepend(key,value){this.#list.unshift([key,value]),this.#openLens(key,list=>list.unshift(value))}delete(key,value){if(this.size===0)return!1;let values=this.#lens.get(key);if(!values)return!1;let index=values.indexOf(value);return index!==-1&&(values.splice(index,1),this.#list.splice(this.#list.findIndex(item=>item[0]===key&&item[1]===value),1),!0)}deleteAll(key){this.size!==0&&(this.#list=this.#list.filter(item=>item[0]!==key),this.#lens.delete(key))}get size(){return this.#list.length}clear(){this.size!==0&&(this.#list.length=0,this.#lens.clear())}#openLens(key,setter){setter(this.#lens.get(key)||this.#lens.set(key,[]).get(key))}};const kDefaultPrevented$2=Symbol(`kDefaultPrevented`),kPropagationStopped$1=Symbol(`kPropagationStopped`),kImmediatePropagationStopped$1=Symbol(`kImmediatePropagationStopped`);var TypedEvent$1=class extends MessageEvent{[kDefaultPrevented$2];[kPropagationStopped$1];[kImmediatePropagationStopped$1];constructor(...args){super(args[0],args[1]),this[kDefaultPrevented$2]=!1}get defaultPrevented(){return this[kDefaultPrevented$2]}preventDefault(){super.preventDefault(),this[kDefaultPrevented$2]=!0}stopImmediatePropagation(){super.stopImmediatePropagation(),this[kImmediatePropagationStopped$1]=!0}},Emitter$2=class{#listeners;#listenerOptions;#listenerAbortCleanups;#typelessListeners;#hookListeners;#hookListenerOptions;#hookListenerAbortCleanups;hooks;constructor(){this.#listeners=new LensList$1,this.#listenerOptions=new WeakMap,this.#listenerAbortCleanups=new WeakMap,this.#typelessListeners=new WeakSet,this.#hookListeners=new LensList$1,this.#hookListenerOptions=new WeakMap,this.#hookListenerAbortCleanups=new WeakMap,this.hooks={on:(hook,callback,options)=>{if(!options?.signal?.aborted){if(options?.once){let original=callback,wrapper=((...args)=>(this.#deleteHookListener(hook,wrapper),original(...args)));callback=wrapper}if(this.#hookListeners.append(hook,callback),options&&this.#hookListenerOptions.set(callback,options),options?.signal){let{signal}=options,onAbort=()=>{this.#deleteHookListener(hook,callback)};signal.addEventListener(`abort`,onAbort,{once:!0}),this.#hookListenerAbortCleanups.set(callback,()=>{signal.removeEventListener(`abort`,onAbort)})}}},removeListener:(hook,callback)=>{this.#deleteHookListener(hook,callback)}}}#deleteHookListener(hook,callback){this.#hookListeners.delete(hook,callback);let cleanup=this.#hookListenerAbortCleanups.get(callback);cleanup&&(cleanup(),this.#hookListenerAbortCleanups.delete(callback))}#deleteListener(type,listener){let removed=this.#listeners.delete(type,listener),cleanup=this.#listenerAbortCleanups.get(listener);return cleanup&&(cleanup(),this.#listenerAbortCleanups.delete(listener)),removed}on(type,listener,options){return this.#addListener(type,listener,options),this}once(type,listener,options){return this.on(type,listener,{...options||{},once:!0})}earlyOn(type,listener,options){return this.#addListener(type,listener,options,`prepend`),this}earlyOnce(type,listener,options){return this.earlyOn(type,listener,{...options||{},once:!0})}emit(event){if(this.#listeners.size===0)return!1;let hasListeners=this.listenerCount(event.type)>0,proxiedEvent=this.#proxyEvent(event);for(let listener of this.#matchListeners(event.type)){if(proxiedEvent.event[kPropagationStopped$1]!=null&&proxiedEvent.event[kPropagationStopped$1]!==this)return proxiedEvent.revoke(),!1;if(proxiedEvent.event[kImmediatePropagationStopped$1])break;this.#callListener(proxiedEvent.event,listener)}return proxiedEvent.revoke(),hasListeners}async emitAsPromise(event){if(this.#listeners.size===0)return[];let pendingListeners=[],proxiedEvent=this.#proxyEvent(event);for(let listener of this.#matchListeners(event.type)){if(proxiedEvent.event[kPropagationStopped$1]!=null&&proxiedEvent.event[kPropagationStopped$1]!==this)return proxiedEvent.revoke(),[];if(proxiedEvent.event[kImmediatePropagationStopped$1])break;let returnValue=await Promise.resolve(this.#callListener(proxiedEvent.event,listener));this.#isTypelessListener(listener)||pendingListeners.push(returnValue)}return proxiedEvent.revoke(),Promise.allSettled(pendingListeners).then(results=>results.map(result=>result.status===`fulfilled`?result.value:result.reason))}*emitAsGenerator(event){if(this.#listeners.size===0)return;let proxiedEvent=this.#proxyEvent(event);for(let listener of this.#matchListeners(event.type)){if(proxiedEvent.event[kPropagationStopped$1]!=null&&proxiedEvent.event[kPropagationStopped$1]!==this){proxiedEvent.revoke();return}if(proxiedEvent.event[kImmediatePropagationStopped$1])break;let returnValue=this.#callListener(proxiedEvent.event,listener);this.#isTypelessListener(listener)||(yield returnValue)}proxiedEvent.revoke()}removeListener(type,listener){let options=this.#listenerOptions.get(listener);if(this.#deleteListener(type,listener))for(let hook of this.#hookListeners.get(`removeListener`).slice())hook(type,listener,options)}removeAllListeners(type){if(type==null){for(let[listenerType,listeners$1]of this.#listeners.entries())for(;listeners$1.length>0;)this.removeListener(listenerType,listeners$1[0]);for(let[hookType,hookListener]of[...this.#hookListeners])this.#hookListenerOptions.get(hookListener)?.persist||this.#deleteHookListener(hookType,hookListener);return}let listeners=this.listeners(type);for(;listeners.length>0;)this.removeListener(type,listeners[0])}listeners(type){return type==null?this.#listeners.getAll():this.#listeners.get(type)}listenerCount(type){return type==null?this.#listeners.size:this.listeners(type).length}#addListener(type,listener,options,insertMode=`append`){if(!options?.signal?.aborted){for(let hook of this.#hookListeners.get(`newListener`).slice())hook(type,listener,options);if(type===`*`&&this.#typelessListeners.add(listener),insertMode===`prepend`?this.#listeners.prepend(type,listener):this.#listeners.append(type,listener),options&&(this.#listenerOptions.set(listener,options),options.signal)){let{signal}=options,onAbort=()=>{this.removeListener(type,listener)};signal.addEventListener(`abort`,onAbort,{once:!0}),this.#listenerAbortCleanups.set(listener,()=>{signal.removeEventListener(`abort`,onAbort)})}}}#proxyEvent(event){let{stopPropagation}=event;return event.stopPropagation=()=>{event[kPropagationStopped$1]=this,stopPropagation.call(event)},{event,revoke(){event.stopPropagation=stopPropagation}}}#callListener(event,listener){for(let hook of this.#hookListeners.get(`beforeEmit`).slice())if(hook(event)===!1)return;let returnValue=listener.call(this,event),options=this.#listenerOptions.get(listener);if(options?.once){let type=this.#isTypelessListener(listener)?`*`:event.type;if(this.#deleteListener(type,listener))for(let hook of this.#hookListeners.get(`removeListener`).slice())hook(type,listener,options)}return returnValue}*#matchListeners(type){let snapshot=[];for(let[key,listener]of this.#listeners)(key===`*`||key===type)&&snapshot.push(listener);yield*snapshot}#isTypelessListener(listener){return this.#typelessListeners.has(listener)}},defaultParseOptions={decodeValues:!0,map:!1,silent:!1,split:`auto`};function isForbiddenKey(key){return typeof key!=`string`||key in{}}function createNullObj(){return Object.create(null)}function isNonEmptyString$1(str){return typeof str==`string`&&!!str.trim()}function parseString(setCookieValue,options){var parts=setCookieValue.split(`;`).filter(isNonEmptyString$1),nameValuePairStr=parts.shift();if(!nameValuePairStr)return null;var parsed=parseNameValuePair(nameValuePairStr),name=parsed.name,value=parsed.value;if(options=options?Object.assign({},defaultParseOptions,options):defaultParseOptions,isForbiddenKey(name))return null;try{value=options.decodeValues?decodeURIComponent(value):value}catch(e){console.error(`set-cookie-parser: failed to decode cookie value. Set options.decodeValues=false to disable decoding.`,e)}var cookie=createNullObj();return cookie.name=name,cookie.value=value,parts.forEach(function(part){var sides=part.split(`=`),key=sides.shift().trim().toLowerCase();if(!isForbiddenKey(key)){var value=sides.join(`=`).trim();if(key===`expires`)cookie.expires=new Date(value);else if(key===`max-age`){var n=parseInt(value,10);Number.isNaN(n)||(cookie.maxAge=n)}else key===`secure`?cookie.secure=!0:key===`httponly`?cookie.httpOnly=!0:key===`samesite`?cookie.sameSite=value:key===`partitioned`?cookie.partitioned=!0:key&&(cookie[key]=value)}}),cookie}function parseNameValuePair(nameValuePairStr){var name=``,value=``,nameValueArr=nameValuePairStr.split(`=`);return nameValueArr.length>1?(name=nameValueArr.shift(),value=nameValueArr.join(`=`)):value=nameValuePairStr,{name,value}}function parseSetCookie(input,options){if(options=options?Object.assign({},defaultParseOptions,options):defaultParseOptions,!input)return options.map?createNullObj():[];if(input.headers){if(typeof input.headers.getSetCookie==`function`)input=input.headers.getSetCookie();else if(input.headers[`set-cookie`])input=input.headers[`set-cookie`];else{var sch=input.headers[Object.keys(input.headers).find(function(key){return key.toLowerCase()===`set-cookie`})];!sch&&input.headers.cookie&&!options.silent&&console.warn(`Warning: set-cookie-parser appears to have been called on a request object. It is designed to parse Set-Cookie headers from responses, not Cookie headers from requests. Set the option {silent: true} to suppress this warning.`),input=sch}}var split=options.split,isArray=Array.isArray(input);if(split===`auto`&&(split=!isArray),isArray||(input=[input]),input=input.filter(isNonEmptyString$1),split&&(input=input.map(splitCookiesString).flat()),options.map){var cookies=createNullObj();return input.reduce(function(cookies,str){var cookie=parseString(str,options);return cookie&&!isForbiddenKey(cookie.name)&&(cookies[cookie.name]=cookie),cookies},cookies)}return input.map(function(str){return parseString(str,options)}).filter(Boolean)}function splitCookiesString(cookiesString){if(Array.isArray(cookiesString))return cookiesString;if(typeof cookiesString!=`string`)return[];var cookiesStrings=[],pos=0,start,ch,lastComma,nextStart,cookiesSeparatorFound;function skipWhitespace(){for(;pos<cookiesString.length&&/\s/.test(cookiesString.charAt(pos));)pos+=1;return pos<cookiesString.length}function notSpecialChar(){return ch=cookiesString.charAt(pos),ch!==`=`&&ch!==`;`&&ch!==`,`}for(;pos<cookiesString.length;){for(start=pos,cookiesSeparatorFound=!1;skipWhitespace();)if(ch=cookiesString.charAt(pos),ch===`,`){for(lastComma=pos,pos+=1,skipWhitespace(),nextStart=pos;pos<cookiesString.length&&notSpecialChar();)pos+=1;pos<cookiesString.length&&cookiesString.charAt(pos)===`=`?(cookiesSeparatorFound=!0,pos=nextStart,cookiesStrings.push(cookiesString.substring(start,lastComma)),start=pos):pos=lastComma+1}else pos+=1;(!cookiesSeparatorFound||pos>=cookiesString.length)&&cookiesStrings.push(cookiesString.substring(start,cookiesString.length))}return cookiesStrings}parseSetCookie.parseSetCookie=parseSetCookie,parseSetCookie.parse=parseSetCookie,parseSetCookie.parseString=parseString,parseSetCookie.splitCookiesString=splitCookiesString;const HEADERS_INVALID_CHARACTERS=/[^a-z0-9\-#$%&'*+.^_`|~]/i;function normalizeHeaderName(name){if(HEADERS_INVALID_CHARACTERS.test(name)||name.trim()===``)throw TypeError(`Invalid character in header field name`);return name.trim().toLowerCase()}const charCodesToRemove=[`
4
4
  `,`\r`,` `,` `],HEADER_VALUE_REMOVE_REGEXP=RegExp(`(^[${charCodesToRemove.join(``)}]|$[${charCodesToRemove.join(``)}])`,`g`);function normalizeHeaderValue(value){return value.replace(HEADER_VALUE_REMOVE_REGEXP,``)}function isValidHeaderName(value){if(typeof value!=`string`||value.length===0)return!1;for(let i=0;i<value.length;i++){let character=value.charCodeAt(i);if(character>127||!isToken(character))return!1}return!0}function isToken(value){return![127,32,`(`,`)`,`<`,`>`,`@`,`,`,`;`,`:`,`\\`,`"`,`/`,`[`,`]`,`?`,`=`,`{`,`}`].includes(value)}function isValidHeaderValue(value){if(typeof value!=`string`||value.trim()!==value)return!1;for(let i=0;i<value.length;i++){let character=value.charCodeAt(i);if(character===0||character===10||character===13)return!1}return!0}let _Symbol$toStringTag;const NORMALIZED_HEADERS=Symbol(`normalizedHeaders`),RAW_HEADER_NAMES=Symbol(`rawHeaderNames`);var Headers$1=class Headers{constructor(init){this[NORMALIZED_HEADERS]={},this[RAW_HEADER_NAMES]=new Map,this[_Symbol$toStringTag]=`Headers`,[`Headers`,`HeadersPolyfill`].includes(init?.constructor?.name)||init instanceof Headers||globalThis.Headers!==void 0&&init instanceof globalThis.Headers?init.forEach((value,name)=>{this.append(name,value)},this):Array.isArray(init)?init.forEach(([name,value])=>{this.append(name,Array.isArray(value)?value.join(`, `):value)}):init&&Object.getOwnPropertyNames(init).forEach(name=>{let value=init[name];this.append(name,Array.isArray(value)?value.join(`, `):value)})}[(_Symbol$toStringTag=Symbol.toStringTag,Symbol.iterator)](){return this.entries()}*keys(){for(let[name]of this.entries())yield name}*values(){for(let[,value]of this.entries())yield value}*entries(){let sortedKeys=Object.keys(this[NORMALIZED_HEADERS]).sort((a,b)=>a.localeCompare(b));for(let name of sortedKeys)if(name===`set-cookie`)for(let value of this.getSetCookie())yield[name,value];else yield[name,this.get(name)]}has(name){if(!isValidHeaderName(name))throw TypeError(`Invalid header name "${name}"`);return this[NORMALIZED_HEADERS].hasOwnProperty(normalizeHeaderName(name))}get(name){if(!isValidHeaderName(name))throw TypeError(`Invalid header name "${name}"`);return this[NORMALIZED_HEADERS][normalizeHeaderName(name)]??null}set(name,value){if(!isValidHeaderName(name)||!isValidHeaderValue(value))return;let normalizedName=normalizeHeaderName(name),normalizedValue=normalizeHeaderValue(value);this[NORMALIZED_HEADERS][normalizedName]=normalizeHeaderValue(normalizedValue),this[RAW_HEADER_NAMES].set(normalizedName,name)}append(name,value){if(!isValidHeaderName(name)||!isValidHeaderValue(value))return;let normalizedName=normalizeHeaderName(name),normalizedValue=normalizeHeaderValue(value),resolvedValue=this.has(normalizedName)?`${this.get(normalizedName)}, ${normalizedValue}`:normalizedValue;this.set(name,resolvedValue)}delete(name){if(!isValidHeaderName(name)||!this.has(name))return;let normalizedName=normalizeHeaderName(name);delete this[NORMALIZED_HEADERS][normalizedName],this[RAW_HEADER_NAMES].delete(normalizedName)}forEach(callback,thisArg){for(let[name,value]of this.entries())callback.call(thisArg,value,name,this)}getSetCookie(){let setCookieHeader=this.get(`set-cookie`);return setCookieHeader===null?[]:setCookieHeader===``?[``]:splitCookiesString(setCookieHeader)}};const SOURCE_FRAME=/[/\\]msw[/\\]src[/\\](.+)/,BUILD_FRAME=/(node_modules)?[/\\]lib[/\\](core|browser|node|native|iife)[/\\]|^[^/\\]*$/;function getCallFrame(error){let stack=error.stack;if(!stack)return;let declarationFrame=stack.split(`
@@ -1 +1 @@
1
- var name=`@interfere/react`,version=`12.2.0`;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.3.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};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@interfere/react",
3
- "version": "12.2.0",
3
+ "version": "12.3.1",
4
4
  "description": "Client-side React SDK for Interfere. Error tracking, session replay, and analytics.",
5
5
  "keywords": [
6
6
  "error-tracking",
@@ -95,8 +95,8 @@
95
95
  "@fingerprintjs/fingerprintjs": "5.2.0",
96
96
  "@interfere/constants": "^9.3.0",
97
97
  "@interfere/helpers": "^9.3.0",
98
- "@interfere/javascript": "^0.3.0",
99
- "@interfere/types": "^10.4.0",
98
+ "@interfere/javascript": "^0.3.1",
99
+ "@interfere/types": "^10.5.1",
100
100
  "@opentelemetry/api": "1.9.1",
101
101
  "@opentelemetry/api-logs": "0.222.0",
102
102
  "@opentelemetry/context-zone": "2.11.0",
@@ -1 +0,0 @@
1
- import{t as createLogger}from"./log-D6Ht--tv.mjs";import{n as onPageShown}from"./page-lifecycle-DTWqGlz2.mjs";const log=createLogger(`activity`),IDLE_AFTER_MS=3e5,EXPIRE_AFTER_MS=9e5,MAX_AGE_MS=864e5,CHECK_INTERVAL_MS=3e4,KEEPALIVE_THROTTLE_MS=1e3,ACTIVITY_EVENTS=[`pointerdown`,`keydown`,`scroll`,`touchstart`,`mousemove`];function monotonicNow(){return typeof performance>`u`?Date.now():performance.now()}function subscribe(set,handler){return set.add(handler),(()=>{set.delete(handler)})}function fire(handlers,arg){for(let handler of handlers)try{handler(arg)}catch(error){log.warn(`activity handler threw: %s`,error instanceof Error?error.constructor.name:`UnknownError`)}}var ActivityMonitor=class{session=null;paused=!1;lastActivityMs=0;keepaliveUntilMs=0;checkTimer=null;unsubscribeShown=null;pauseHandlers=new Set;resumeHandlers=new Set;onPause(handler){return subscribe(this.pauseHandlers,handler)}onResume(handler){return subscribe(this.resumeHandlers,handler)}start(session){if(this.checkTimer===null&&typeof globalThis.addEventListener==`function`){this.session=session,this.paused=!1,this.lastActivityMs=monotonicNow(),this.keepaliveUntilMs=0;for(let type of ACTIVITY_EVENTS)globalThis.addEventListener(type,this.onInput,{capture:!0,passive:!0});this.unsubscribeShown=onPageShown(this.onInput),this.checkTimer=setInterval(this.poll,CHECK_INTERVAL_MS)}}stop(){if(this.checkTimer!==null){clearInterval(this.checkTimer),this.checkTimer=null;for(let type of ACTIVITY_EVENTS)globalThis.removeEventListener(type,this.onInput,!0);this.unsubscribeShown?.(),this.unsubscribeShown=null,this.session=null,this.paused=!1,this.lastActivityMs=0,this.keepaliveUntilMs=0}}idleMs(){return monotonicNow()-this.lastActivityMs}isOverMaxAge(){let startedAt=this.session?.startedAt()??0;return startedAt>0&&Date.now()-startedAt>=864e5}poll=()=>{this.paused||(this.isOverMaxAge()||this.idleMs()>=3e5)&&(this.paused=!0,log.debug(`session paused`),fire(this.pauseHandlers,void 0))};onInput=()=>{let now=monotonicNow();if(this.isOverMaxAge()||now-this.lastActivityMs>=9e5){this.resume(now,`rotated`);return}if(this.paused){this.resume(now,`idle`);return}now<this.keepaliveUntilMs||(this.touch(now),this.session?.markActivity())};resume(now,reason){reason===`rotated`&&(log.debug(`resume after expiry → new session`),this.session?.reset()),this.paused=!1,this.touch(now),this.session?.markActivity(),fire(this.resumeHandlers,reason)}touch(now){this.lastActivityMs=now,this.keepaliveUntilMs=now+KEEPALIVE_THROTTLE_MS}};export{KEEPALIVE_THROTTLE_MS as a,IDLE_AFTER_MS as i,CHECK_INTERVAL_MS as n,MAX_AGE_MS as o,EXPIRE_AFTER_MS as r,ActivityMonitor as t};
@@ -1 +0,0 @@
1
- import{t as createLogger}from"./log-D6Ht--tv.mjs";import{t as ActivityMonitor}from"./activity-BYnL3bX-.mjs";import{t as DeviceManager}from"./device-DRK7hhLi.mjs";import{t as GeoDetector}from"./geo-D2wa9bGs.mjs";import{t as SessionManager}from"./session-C30CtCVv.mjs";import{t as SessionRetry}from"./session-retry-C2Uh7eZ6.mjs";import{omitUndefined}from"@interfere/helpers/omit-undefined";import{InterfereClient,InterfereError}from"@interfere/javascript";const log=createLogger(`tracking`);function syncKey(sessionId,deviceId,fpHash){return`${sessionId}|${deviceId??``}|${fpHash??``}`}var SessionTracker=class{client;device;geo;mgr=null;activity=new ActivityMonitor;currentIdentity=null;identifiedSessionId=null;lastSyncedKey=null;inflightSyncKey=null;syncAttemptMs=0;generation=0;syncRetry=new SessionRetry;syncRetryKey=null;identityStarted=!1;constructor(opts){this.client=new InterfereClient({...opts.target,maxRetries:0,timeoutInSeconds:10,fetch:Object.assign(async(input,init)=>(opts.fetcher??globalThis.fetch)(input,{...init,credentials:`omit`,keepalive:!0}),opts.fetcher??globalThis.fetch)}),this.device=opts.device??new DeviceManager,this.geo=opts.geo??new GeoDetector}start(){this.mgr=new SessionManager(id=>{this.onRotate(id)}),this.activity.start({markActivity:()=>{this.markActivity()},reset:()=>{this.rotateSession()},startedAt:()=>this.getSessionStartedAt()})}startDeviceIdentity(){this.identityStarted||(this.invalidateSync(),this.identityStarted=!0,this.device.init(),this.geo.detect(),this.backfillIdentity())}discardDeviceIdentity(){this.invalidateSync(),this.identityStarted=!1,this.device.clear(),this.geo.clear()}async backfillIdentity(){let gen=this.generation;if(await Promise.resolve(),gen!==this.generation||!this.identityStarted)return;let initialSessionId=this.mgr?.getSessionId()??null,initialFpHash=this.device.getFpHash();initialSessionId&&await this.syncSession(initialSessionId,this.device.getDeviceId(),initialFpHash);let fpHash=await this.device.whenFingerprintReady(),sessionId=this.mgr?.getSessionId()??null;gen===this.generation&&this.identityStarted&&sessionId&&fpHash!==initialFpHash&&this.syncSession(sessionId,this.device.getDeviceId(),fpHash)}onSessionPause(handler){return this.activity.onPause(handler)}onSessionResume(handler){return this.activity.onResume(handler)}sessionId(){let id=this.mgr?.getSessionId()??null;return id&&this.ensureSynced(id),id}windowId(){return this.mgr?.getWindowId()??null}markActivity(){this.mgr?.markActivity()}getSessionStartedAt(){return this.mgr?.getSessionStartedAt()??0}getDeviceId(){return this.device.getDeviceId()}getFpHash(){return this.device.getFpHash()}getIdentity(){return this.currentIdentity}async identify(params){if(!this.mgr)return;let sessionId=this.mgr.getSessionId();if(this.identifiedSessionId===sessionId){log.debug(`skipped, already identified for session %s`,sessionId);return}this.currentIdentity=params,this.identifiedSessionId=sessionId;let gen=this.generation,[fpHash,country]=await Promise.all([this.device.whenFingerprintReady(),this.geo.detect()]),deviceId=this.device.getDeviceId();if(gen!==this.generation){this.identifiedSessionId=null;return}log.info(`POST session %s → identify`,sessionId),this.postIdentify(sessionId,omitUndefined({deviceId,fpHash,sessionId,...params,country:country||void 0}))}async postIdentify(sessionId,body){try{await this.client.sessions.identifySession(body)}catch{this.identifiedSessionId=null,log.warn(`identify failed for session %s`,sessionId)}}clearIdentity(){this.currentIdentity=null,this.identifiedSessionId=null}reset(){this.invalidateSync(),this.clearIdentity(),this.identityStarted&&this.device.reset(),this.mgr?.reset()}rotateSession(){this.mgr?.reset()}dispose(){this.activity.stop(),this.invalidateSync(),this.clearIdentity(),this.mgr=null}invalidateSync(){this.generation+=1,this.syncRetry.reset(),this.syncRetryKey=null,this.lastSyncedKey=null,this.inflightSyncKey=null,this.syncAttemptMs=0}currentSyncKey(){let sessionId=this.mgr?.sessionId;return sessionId?syncKey(sessionId,this.device.getDeviceId(),this.device.getFpHash()):null}ensureSynced(sessionId){let deviceId=this.device.getDeviceId(),fpHash=this.device.getFpHash(),key=syncKey(sessionId,deviceId,fpHash);this.lastSyncedKey!==key&&this.inflightSyncKey!==key&&(Date.now()-this.syncAttemptMs<5e3||this.syncSession(sessionId,deviceId,fpHash))}async syncSession(sessionId,deviceId,fpHash){let key=syncKey(sessionId,deviceId,fpHash);if(this.lastSyncedKey===key||this.inflightSyncKey===key)return;this.syncRetryKey!==key&&(this.syncRetry.reset(),this.syncRetryKey=key),this.syncRetry.cancel();let{generation}=this;this.inflightSyncKey=key,this.syncAttemptMs=Date.now();try{await this.client.sessions.createSession({sessionId,deviceId,fpHash}),generation===this.generation&&key===this.currentSyncKey()&&(this.lastSyncedKey=key,this.syncRetry.reset())}catch(error){log.warn(`session sync failed`),error instanceof InterfereError&&generation===this.generation&&key===this.currentSyncKey()&&this.syncRetry.schedule(error,()=>{let current=this.mgr?.sessionId;generation===this.generation&&current&&this.ensureSynced(current)})}finally{generation===this.generation&&this.inflightSyncKey===key&&(this.inflightSyncKey=null)}}async onRotate(sessionId){this.syncAttemptMs=Date.now();let gen=this.generation;try{await Promise.resolve();let fpHash=this.device.getFpHash(),deviceId=this.device.getDeviceId();if(gen!==this.generation)return;log.debug(`POST session %s (device=%s fp=%s)`,sessionId,deviceId??`pending`,fpHash??`none`),this.syncSession(sessionId,deviceId,fpHash)}catch{}}};export{SessionTracker as t};
@@ -1 +0,0 @@
1
- import{t as createLogger}from"./log-D6Ht--tv.mjs";import{t as reserveKeepaliveBody}from"./keepalive-budget-DeafGnVZ.mjs";import{t as gzipForUnload}from"./unload-gzip-WX9FyWPs.mjs";import{t as uploadReplayChunk}from"./upload-BIh8Q5UQ.mjs";import{omitUndefined}from"@interfere/helpers/omit-undefined";const log=createLogger(`replay`),REPLAY_TRACER_NAME=`@interfere/react/replay`,textEncoder=new TextEncoder;async function prepareBody(compressor,rawBytes){if(!compressor.gzip)return{body:rawBytes,encoding:null,release:null};try{return{body:await compressor.gzip(rawBytes),encoding:`gzip`,release:null}}catch(error){return log.warn(`gzip failed for chunk; sending uncompressed: %o`,error),{body:rawBytes,encoding:null,release:null}}}function prepareUnloadBody(rawBytes){let rawRelease=reserveKeepaliveBody(rawBytes.byteLength);if(rawRelease)return{body:rawBytes,encoding:null,release:rawRelease};let compressed=gzipForUnload(rawBytes);return compressed?{body:compressed,encoding:`gzip`,release:reserveKeepaliveBody(compressed.byteLength)}:{body:rawBytes,encoding:null,release:null}}function encodeReplayMeta(chunk,payload){return btoa(JSON.stringify({activityCount:payload.activityCount,eventCount:payload.eventCount,firstTs:payload.firstTs,hasFullSnapshot:payload.hasFullSnapshot,lastTs:payload.lastTs,segmentId:chunk.segmentId,windowId:chunk.windowId}))}async function deliverChunk({ctx,chunk,target,compressor,payload,unload}){let sessionId=ctx.getSessionId();if(!sessionId)return`ok`;let rawBytes=textEncoder.encode(payload.bodyJson),uncompressedBytes=rawBytes.byteLength,prepared=unload?prepareUnloadBody(rawBytes):await prepareBody(compressor,rawBytes),headers={"x-replay-meta":encodeReplayMeta(chunk,payload)};prepared.encoding===`gzip`&&(headers[`content-encoding`]=`gzip`);let keepalive=prepared.release!==null,response;try{let upload=await uploadReplayChunk(target,sessionId,prepared.body,headers,{keepalive});if(!upload.ok)return await upload.body?.cancel(),upload.status>=400&&upload.status<500?`fatal`:`retryable`;response=await upload.json()}catch(error){return log.warn(`replay chunk upload failed: %o`,error),`retryable`}finally{prepared.release?.()}let objectKey=typeof response==`object`&&response&&`objectKey`in response&&typeof response.objectKey==`string`?response.objectKey:null,attributes=omitUndefined({"replay.chunk.size_bytes":uncompressedBytes,"replay.chunk.event_count":payload.eventCount,"replay.chunk.uri":objectKey||void 0,"replay.chunk.compressed_bytes":prepared.encoding===`gzip`?prepared.body.byteLength:void 0,"replay.chunk.first_event_ts":payload.firstTs??void 0,"replay.chunk.last_event_ts":payload.lastTs??void 0,"replay.chunk.unload":unload||void 0,"replay.chunk.keepalive":unload?keepalive:void 0});return ctx.getTracer(REPLAY_TRACER_NAME).startSpan(`replay.chunk`,{attributes}).end(),`ok`}export{deliverChunk as n,REPLAY_TRACER_NAME as t};
@@ -1 +0,0 @@
1
- import{t as reserveKeepaliveBody}from"./keepalive-budget-DeafGnVZ.mjs";import{t as PRODUCER_VERSION}from"./version-CSFECZRw.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;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,release=reserveKeepaliveBody(bytes);try{return await retryTelemetry(async abortSignal=>globalThis.fetch(url,{...init,credentials:`omit`,keepalive:release!==null,signal:abortSignal}),init?.signal)}finally{release?.()}},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 +0,0 @@
1
- import{t as createLogger}from"./log-D6Ht--tv.mjs";import{r as onPageUnloading,t as onPageHidden}from"./page-lifecycle-DTWqGlz2.mjs";import{t as SessionTracker}from"./api-BUYnj5MA.mjs";import{n as getStringGlobal,t as getGlobal}from"./global-DYq1Z4_H.mjs";import{i as setIngestHost,r as resolveTargets}from"./config-VOyDjqS7.mjs";import{a as resolvePrivacyPolicy}from"./privacy-CRuL0X8r.mjs";import{t as PRODUCER_VERSION}from"./version-CSFECZRw.mjs";import{t as INGEST_IGNORE_RE}from"./exporter-D6Ld-TFZ.mjs";import{t as recordInitialNavigation}from"./initial-navigation-YeK6UUHX.mjs";import{n as recordExceptionOnSpan,r as startExceptionSpan,t as buildExceptionEventAttrs}from"./exception-span-B74fhBQb.mjs";import{t as PluginRuntime}from"./plugin-runtime-B1oFO16q.mjs";import{isNonErrorException,shouldDropBrowserExtensionNoise,shouldDropUnresolvableStack}from"@interfere/types/sdk/errors";import{trace}from"@opentelemetry/api";import{omitUndefined}from"@interfere/helpers/omit-undefined";import{InterfereClient}from"@interfere/javascript";import{releaseSlugSchema}from"@interfere/types/releases/slug";import{FORCE_ENABLE_GLOBAL,RELEASE_SLUG_GLOBAL,SDK_STACK_GLOBAL}from"@interfere/types/sdk/injected-globals";import{readBakedPlugins,remoteConfigInputSchema}from"@interfere/types/sdk/remote-config";import{SERVICE_NAME_GLOBAL}from"@interfere/types/sdk/service-name";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]}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;unsubscribePageUnloading=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(()=>{})}),this.unsubscribePageUnloading=onPageUnloading(()=>{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()){recordExceptionOnSpan(active,value,attrs,opts.mechanism.handled);return}let tracer=this.otel?.tracerProvider.getTracer(`@interfere/react/exception`);if(!tracer)return;let span=startExceptionSpan(tracer,value);recordExceptionOnSpan(span,value,attrs,opts.mechanism.handled),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.unsubscribePageUnloading?.(),this.unsubscribePageUnloading=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},serviceName=opts.serviceName||getStringGlobal(SERVICE_NAME_GLOBAL);serviceName&&(resolvedTracing.serviceName=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 +0,0 @@
1
- import{t as createLogger}from"./log-D6Ht--tv.mjs";const log=createLogger(`replay`);async function startReplayRecorder({onEvent,onFault,recordOptions,signal}){let record;try{({record}=await import(`./rrweb-CE6GKCEq.mjs`))}catch{return log.error(`rrweb failed to load, replay disabled`),null}if(signal?.aborted)return null;let stopRecording,recorder={start:()=>(stopRecording??=record({emit:onEvent,recordAfter:`DOMContentLoaded`,inlineStylesheet:!0,slimDOMOptions:`all`,checkoutEveryNms:6e4,sampling:{media:800,mousemove:50,scroll:150},...recordOptions,errorHandler:error=>(onFault(error),!0)}),stopRecording!==void 0),stop:()=>{stopRecording?.(),stopRecording=void 0}};return recorder.start()?recorder:(log.error(`rrweb failed to start, replay disabled`),null)}export{startReplayRecorder as t};