@interfere/react 12.1.4 → 12.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{activity-D18VXGTn.mjs → activity-BYnL3bX-.mjs} +1 -1
- package/dist/{api-DXmjUMZE.mjs → api-BUYnj5MA.mjs} +1 -1
- package/dist/{chunking-Dvs3f50A.d.mts → chunking-OfmdRxfq.d.mts} +1 -1
- package/dist/{compressor-host-BAz6860r.d.mts → compressor-host-D3At2PKg.d.mts} +1 -1
- package/dist/{config-q16LFWj0.d.mts → config-BTWtCcDP.d.mts} +1 -1
- package/dist/{config-DEOvGbf0.mjs → config-VOyDjqS7.mjs} +1 -1
- package/dist/delivery-_q1bkaIt.mjs +1 -0
- package/dist/{environment-_LKcAXKG.d.mts → environment-CtCFKD2N.d.mts} +1 -1
- package/dist/error-boundary.d.mts +1 -1
- package/dist/{errors-BDmCWb5z.mjs → errors-BfUmjgWO.mjs} +1 -1
- package/dist/exception-span-B74fhBQb.mjs +1 -0
- package/dist/exception-span-zN1tvBdh.d.mts +46 -0
- package/dist/exporter-D6Ld-TFZ.mjs +1 -0
- package/dist/index-BZ_yQUGY.d.mts +4 -0
- package/dist/{instrumentations-CpTaahVx.d.mts → instrumentations-D656I08h.d.mts} +1 -1
- package/dist/internal/activity/activity.mjs +1 -1
- package/dist/internal/{browser-context.d.mts → browser-context/browser-context.d.mts} +1 -1
- package/dist/internal/browser-context/browser-context.mjs +1 -0
- package/dist/internal/{capture-boundary.d.mts → capture/capture-boundary.d.mts} +2 -2
- package/dist/internal/capture/capture-boundary.mjs +1 -0
- package/dist/internal/{capture.d.mts → capture/capture.d.mts} +2 -2
- package/dist/internal/capture/capture.mjs +1 -0
- package/dist/internal/capture/exception-span.d.mts +2 -0
- package/dist/internal/capture/exception-span.mjs +1 -0
- package/dist/internal/{config.d.mts → config/config.d.mts} +1 -1
- package/dist/internal/config/config.mjs +1 -0
- package/dist/internal/{consent.d.mts → consent/consent.d.mts} +1 -1
- package/dist/internal/consent/consent.mjs +1 -0
- package/dist/internal/{console-patch.d.mts → console-patch/console-patch.d.mts} +1 -1
- package/dist/internal/console-patch/console-patch.mjs +1 -0
- package/dist/internal/{device-metadata.d.mts → device-metadata/device-metadata.d.mts} +1 -1
- package/dist/internal/device-metadata/device-metadata.mjs +1 -0
- package/dist/internal/environment/environment.d.mts +2 -0
- package/dist/internal/environment/environment.mjs +1 -0
- package/dist/internal/{event-capabilities.d.mts → event-capabilities/event-capabilities.d.mts} +1 -1
- package/dist/internal/event-capabilities/event-capabilities.mjs +1 -0
- package/dist/internal/{hydration.d.mts → hydration/hydration.d.mts} +1 -1
- package/dist/internal/hydration/hydration.mjs +1 -0
- package/dist/internal/kernel-registry.d.mts +1 -1
- package/dist/internal/kernel.d.mts +5 -4
- package/dist/internal/kernel.mjs +1 -1
- package/dist/internal/otel/exporter.mjs +1 -1
- package/dist/internal/otel/index.d.mts +2 -2
- package/dist/internal/otel/index.mjs +1 -1
- package/dist/internal/otel/{instrumentations.d.mts → instrumentations/instrumentations.d.mts} +1 -1
- package/dist/internal/otel/instrumentations/instrumentations.mjs +1 -0
- package/dist/internal/otel/provider.mjs +1 -1
- package/dist/internal/page-lifecycle/keepalive-budget.d.mts +6 -0
- package/dist/internal/page-lifecycle/keepalive-budget.mjs +1 -0
- package/dist/internal/page-lifecycle/page-lifecycle.d.mts +2 -0
- package/dist/internal/page-lifecycle/page-lifecycle.mjs +1 -1
- package/dist/internal/plugins/plugin-runtime.d.mts +1 -1
- package/dist/internal/plugins/plugin-runtime.mjs +1 -1
- package/dist/internal/react-context.d.mts +1 -1
- package/dist/internal/{server-digest.d.mts → server-digest/server-digest.d.mts} +1 -1
- package/dist/internal/server-digest/server-digest.mjs +1 -0
- package/dist/internal/sw-queue.mjs +1 -1
- package/dist/internal/version.mjs +1 -1
- package/dist/internal/wrapper-singleton.d.mts +1 -1
- package/dist/internal/wrapper-singleton.mjs +1 -1
- package/dist/keepalive-budget-DeafGnVZ.mjs +1 -0
- package/dist/kernel-D52QMtA9.mjs +1 -0
- package/dist/{loader-BGwWwN2n.mjs → loader-DIaWtHND.mjs} +1 -1
- package/dist/page-lifecycle-DTWqGlz2.mjs +1 -0
- package/dist/{plugin-runtime-CnFVGbJw.mjs → plugin-runtime-B1oFO16q.mjs} +1 -1
- package/dist/plugins/device.d.mts +1 -1
- package/dist/plugins/errors.d.mts +1 -1
- package/dist/plugins/errors.mjs +1 -1
- package/dist/plugins/lib/loader.d.mts +1 -1
- package/dist/plugins/lib/loader.mjs +1 -1
- package/dist/plugins/lib/types.d.mts +1 -1
- package/dist/plugins/logs.d.mts +1 -1
- package/dist/plugins/logs.mjs +1 -1
- package/dist/plugins/page-events.d.mts +1 -1
- package/dist/plugins/rage-clicks.d.mts +1 -1
- package/dist/plugins/replay/{buffer.d.mts → chunking/buffer.d.mts} +2 -2
- package/dist/plugins/replay/chunking/buffer.mjs +1 -0
- package/dist/plugins/replay/{chunking.d.mts → chunking/chunking.d.mts} +1 -1
- package/dist/plugins/replay/chunking/chunking.mjs +1 -0
- package/dist/plugins/replay/compression/compressor-host.d.mts +2 -0
- package/dist/plugins/replay/compression/compressor-host.mjs +1 -0
- package/dist/plugins/replay/compression/unload-gzip.d.mts +4 -0
- package/dist/plugins/replay/compression/unload-gzip.mjs +1 -0
- package/dist/plugins/replay/index.d.mts +1 -1
- package/dist/plugins/replay/index.mjs +1 -1
- package/dist/plugins/replay/{recorder.d.mts → recorder/recorder.d.mts} +2 -2
- package/dist/plugins/replay/recorder/recorder.mjs +1 -0
- package/dist/plugins/replay/{redact-urls.d.mts → recorder/redact-urls.d.mts} +1 -1
- package/dist/plugins/replay/recorder/redact-urls.mjs +1 -0
- package/dist/plugins/replay/{sequence.d.mts → sequence/sequence.d.mts} +1 -1
- package/dist/plugins/replay/sequence/sequence.mjs +1 -0
- package/dist/plugins/replay/upload/delivery.d.mts +22 -0
- package/dist/plugins/replay/upload/delivery.mjs +1 -0
- package/dist/plugins/replay/upload/upload.d.mts +7 -0
- package/dist/plugins/replay/upload/upload.mjs +1 -0
- package/dist/{provider-Bf-3zWmH.mjs → provider-BMoWBbsK.mjs} +1 -1
- package/dist/{provider-D42pbUQM.d.mts → provider-DIp7vkKd.d.mts} +21 -47
- package/dist/provider.d.mts +1 -1
- package/dist/react-error-handler.d.mts +1 -1
- package/dist/session-retry-C2Uh7eZ6.mjs +1 -0
- package/dist/tracking/api.mjs +1 -1
- package/dist/tracking/registration.fixture.mjs +2 -2
- package/dist/tracking/session-retry.mjs +1 -1
- package/dist/unload-gzip-WX9FyWPs.mjs +1 -0
- package/dist/upload-BIh8Q5UQ.mjs +1 -0
- package/dist/{version-C0rHKBtn.mjs → version-CSFECZRw.mjs} +1 -1
- package/package.json +5 -5
- package/dist/delivery-DehIJWRh.mjs +0 -1
- package/dist/exporter-Dk_xXSBC.mjs +0 -1
- package/dist/index-BQDRTFUY.d.mts +0 -4
- package/dist/internal/browser-context.mjs +0 -1
- package/dist/internal/capture-boundary.mjs +0 -1
- package/dist/internal/capture.mjs +0 -1
- package/dist/internal/config.mjs +0 -1
- package/dist/internal/consent.mjs +0 -1
- package/dist/internal/console-patch.mjs +0 -1
- package/dist/internal/device-metadata.mjs +0 -1
- package/dist/internal/environment.d.mts +0 -2
- package/dist/internal/environment.mjs +0 -1
- package/dist/internal/event-capabilities.mjs +0 -1
- package/dist/internal/hydration.mjs +0 -1
- package/dist/internal/otel/instrumentations.mjs +0 -1
- package/dist/internal/server-digest.mjs +0 -1
- package/dist/kernel-B5l5-P1k.mjs +0 -1
- package/dist/page-lifecycle-BhSFqjlK.mjs +0 -1
- package/dist/plugins/replay/buffer.mjs +0 -1
- package/dist/plugins/replay/chunking.mjs +0 -1
- package/dist/plugins/replay/compressor-host.d.mts +0 -2
- package/dist/plugins/replay/compressor-host.mjs +0 -1
- package/dist/plugins/replay/delivery.d.mts +0 -20
- package/dist/plugins/replay/delivery.mjs +0 -1
- package/dist/plugins/replay/recorder.mjs +0 -1
- package/dist/plugins/replay/redact-urls.mjs +0 -1
- package/dist/plugins/replay/sequence.mjs +0 -1
- package/dist/plugins/replay/upload.d.mts +0 -4
- package/dist/plugins/replay/upload.mjs +0 -1
- package/dist/session-retry-DJHvfDaO.mjs +0 -1
- package/dist/upload-BPaD3YcA.mjs +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as createLogger}from"./log-D6Ht--tv.mjs";import{n as onPageShown}from"./page-lifecycle-
|
|
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 +1 @@
|
|
|
1
|
-
import{t as createLogger}from"./log-D6Ht--tv.mjs";import{t as ActivityMonitor}from"./activity-
|
|
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&¤t&&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
|
-
//#region src/plugins/replay/compressor-host.d.ts
|
|
1
|
+
//#region src/plugins/replay/compression/compressor-host.d.ts
|
|
2
2
|
/** `gzip` is `null` when compression is unavailable — callers must POST the chunk uncompressed. */
|
|
3
3
|
interface Compressor {
|
|
4
4
|
readonly dispose: () => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as getStringGlobal,r as setGlobal,t as getGlobal}from"./global-DYq1Z4_H.mjs";import{
|
|
1
|
+
import{n as getStringGlobal,r as setGlobal,t as getGlobal}from"./global-DYq1Z4_H.mjs";import{API_URL_GLOBAL,FORCE_ENABLE_GLOBAL,INGEST_URL_GLOBAL,PUBLIC_KEY_GLOBAL}from"@interfere/types/sdk/injected-globals";import{API_URL}from"@interfere/constants/api";function resolvePublicKey(){let injected=getStringGlobal(PUBLIC_KEY_GLOBAL);if(injected)return injected;if(typeof process<`u`)return process.env.INTERFERE_PUBLIC_KEY??void 0}function hasPublicKey(){return!!resolvePublicKey()}function isForceEnableActive(){return!!getGlobal(FORCE_ENABLE_GLOBAL)}function resolveApiHost(explicit){return explicit??getStringGlobal(API_URL_GLOBAL)}function resolveIngestHost(explicit){return explicit??getStringGlobal(INGEST_URL_GLOBAL)}function setIngestHost(host){setGlobal(INGEST_URL_GLOBAL,host)}function normalizeOrigin(host){try{return new URL(host).origin}catch{return API_URL}}function resolveTargets(apiHost,ingestHost){let publicKey=resolvePublicKey(),headers={};isForceEnableActive()&&(headers[`x-interfere-force-enable`]=`1`);let configHost=resolveApiHost(apiHost),configBaseUrl=configHost?normalizeOrigin(configHost):API_URL,resolvedIngestHost=resolveIngestHost(ingestHost),ingestBaseUrl=resolvedIngestHost?normalizeOrigin(resolvedIngestHost):configBaseUrl,options={headers,publicKeyHeader:publicKey?{apiKey:publicKey}:void 0,timeoutInSeconds:10,maxRetries:0};return{config:{...options,baseUrl:configBaseUrl},ingest:{...options,baseUrl:ingestBaseUrl}}}export{setIngestHost as i,isForceEnableActive as n,resolveTargets as r,hasPublicKey as t};
|
|
@@ -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;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,4 +1,4 @@
|
|
|
1
|
-
import { a as InterfereContextValue, i as InterfereContext } from "./provider-
|
|
1
|
+
import { a as InterfereContextValue, i as InterfereContext } from "./provider-DIp7vkKd.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 hasServerDigest}from"./server-digest-CzGdvjW1.mjs";import{
|
|
1
|
+
import{t as hasServerDigest}from"./server-digest-CzGdvjW1.mjs";import{t as hasEventListenerPair}from"./event-capabilities-Dd0Hoaq2.mjs";import{n as onConsoleCall}from"./console-patch-WNKoLE7U.mjs";import{t as THIRD_PARTY_IGNORE}from"./third-party-hosts-BoJNL3xG.mjs";import{MECHANISM_TYPE,isNonErrorException,toException}from"@interfere/types/sdk/errors";import{omitUndefined}from"@interfere/helpers/omit-undefined";function capture(ctx,opts){ctx.recordException(opts.error,omitUndefined({mechanism:opts.mechanism,fallbackFrames:opts.fallbackFrame&&!isNonErrorException(opts.error)?[opts.fallbackFrame]:void 0}))}function findErrorArg(args){return args.find(arg=>arg instanceof Error)??null}function resourceError(target){return target instanceof HTMLImageElement||target instanceof HTMLScriptElement?target.src?{tag:target.localName,url:target.src}:null:target instanceof HTMLLinkElement&&target.href?{tag:target.localName,url:target.href}:null}function isIgnoredResourceUrl(url){return THIRD_PARTY_IGNORE.some(pattern=>pattern.test(url))}function createResourceGate(){let seen=new Set,windowStart=0,windowCount=0;return(url=>{if(seen.has(url))return!1;let now=Date.now();return now-windowStart>6e4&&(windowStart=now,windowCount=0),windowCount>=20?!1:(seen.size>=100&&seen.clear(),seen.add(url),windowCount+=1,!0)})}function createRepeatGate(){let counts=new Map,windowStart=0;return(key=>{let now=Date.now();now-windowStart>6e4&&(windowStart=now,counts.clear());let count=counts.get(key)??0;return count>=5?!1:(counts.size>=100&&counts.clear(),counts.set(key,count+1),!0)})}const errorsPlugin={name:`errors`,setup(ctx){let originalOnError=globalThis.onerror,originalStackTraceLimit=Error.stackTraceLimit;Error.stackTraceLimit<50&&(Error.stackTraceLimit=50);let repeatGate=createRepeatGate();globalThis.onerror=(msg,source,line,col,error)=>{if(error instanceof Error&&!hasServerDigest(error)&&repeatGate(`${typeof msg==`string`?msg:msg.type}|${String(source)}|${String(line)}|${String(col)}`)){let fallbackFrame=typeof source==`string`?omitUndefined({file:source,id:`fallback-0`,line:typeof line==`number`?line:void 0,column:typeof col==`number`?col:void 0}):null;capture(ctx,omitUndefined({error,mechanism:{handled:!1,type:MECHANISM_TYPE.browser.onerror},fallbackFrame:fallbackFrame??void 0}))}return typeof originalOnError==`function`&&originalOnError.call(globalThis,msg,source,line,col,error)};let onUnhandledRejection=event=>{hasServerDigest(event.reason)||capture(ctx,{error:toException(event.reason),mechanism:omitUndefined({handled:!1,type:MECHANISM_TYPE.browser.onunhandledrejection,synthetic:event.reason instanceof Error?void 0:!0})})},cspReportsByDisposition={enforce:new Set,report:new Set},onSecurityPolicyViolation=event=>{let seenCspReports=cspReportsByDisposition[event.disposition],key=`${event.violatedDirective}|${event.blockedURI}`;seenCspReports.has(key)||seenCspReports.size>=5||(seenCspReports.add(key),capture(ctx,{error:{kind:`non-error`,serialized:{blockedURI:event.blockedURI,columnNumber:event.columnNumber,disposition:event.disposition,lineNumber:event.lineNumber,sourceFile:event.sourceFile,violatedDirective:event.violatedDirective},type:`SecurityPolicyViolation`,value:event.disposition===`report`?`CSP ${event.violatedDirective} reported ${event.blockedURI||`inline`} (report-only)`:`CSP ${event.violatedDirective} blocked ${event.blockedURI||`inline`}`},mechanism:{handled:event.disposition===`report`,type:MECHANISM_TYPE.browser.securityPolicyViolation}}))},resourceGate=createResourceGate(),onResourceError=event=>{let resource=resourceError(event.target);resource&&!isIgnoredResourceUrl(resource.url)&&resourceGate(resource.url)&&capture(ctx,{error:{kind:`non-error`,serialized:{url:resource.url},type:`ResourceLoadError`,value:`Failed to load ${resource.tag}: ${resource.url}`},mechanism:{handled:!1,type:MECHANISM_TYPE.browser.resourceError}})},supportsEventTarget=hasEventListenerPair(globalThis.addEventListener,globalThis.removeEventListener);supportsEventTarget&&(globalThis.addEventListener(`unhandledrejection`,onUnhandledRejection),globalThis.addEventListener(`securitypolicyviolation`,onSecurityPolicyViolation),globalThis.addEventListener(`error`,onResourceError,!0));let unsubscribeConsole=onConsoleCall((level,args)=>{if(level!==`error`)return;let error=findErrorArg(args);error&&!hasServerDigest(error)&&capture(ctx,{error,mechanism:{handled:!0,type:MECHANISM_TYPE.browser.consoleError}})});return()=>{Error.stackTraceLimit=originalStackTraceLimit,globalThis.onerror=originalOnError,supportsEventTarget&&(globalThis.removeEventListener(`unhandledrejection`,onUnhandledRejection),globalThis.removeEventListener(`securitypolicyviolation`,onSecurityPolicyViolation),globalThis.removeEventListener(`error`,onResourceError,!0)),unsubscribeConsole()}}};export{errorsPlugin as t};
|
|
@@ -0,0 +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};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { NonErrorException } from "@interfere/types/sdk/errors";
|
|
2
|
+
import { Attributes, Span, Tracer } from "@opentelemetry/api";
|
|
3
|
+
import { IngestedFrame } from "@interfere/types/data/frame";
|
|
4
|
+
import { ErrorMechanism } from "@interfere/types/sdk/plugins/payload/errors";
|
|
5
|
+
//#region src/internal/capture/exception-span.d.ts
|
|
6
|
+
interface RecordExceptionOpts {
|
|
7
|
+
/**
|
|
8
|
+
* Frames always appended to the first exception's stack. Used by
|
|
9
|
+
* `<ErrorBoundary>` to inject React's component-stack frames as
|
|
10
|
+
* supplementary context — these add on top of the real JS frames, they
|
|
11
|
+
* don't replace them.
|
|
12
|
+
*/
|
|
13
|
+
readonly appendFrames?: readonly IngestedFrame[];
|
|
14
|
+
/**
|
|
15
|
+
* `error.digest` from React when an RSC server-side throw is
|
|
16
|
+
* sanitised and rebuilt as a synthetic Error on the client. The only
|
|
17
|
+
* identifier that pairs the redacted client capture with the
|
|
18
|
+
* unredacted server capture — enrichment mixes this into the
|
|
19
|
+
* fingerprint so both events group as one problem.
|
|
20
|
+
*/
|
|
21
|
+
readonly errorDigest?: string;
|
|
22
|
+
/**
|
|
23
|
+
* Frames adopted only when the first exception's parsed stack is empty.
|
|
24
|
+
* Used by the `window.onerror` handler when the browser hands us
|
|
25
|
+
* source/line/col but the `Error` itself has a degenerate stack — never
|
|
26
|
+
* glued on top of a real stack.
|
|
27
|
+
*/
|
|
28
|
+
readonly fallbackFrames?: readonly IngestedFrame[];
|
|
29
|
+
readonly mechanism: ErrorMechanism;
|
|
30
|
+
/**
|
|
31
|
+
* A distinct error sub-classification layered on top of the mechanism —
|
|
32
|
+
* currently `"hydration"` for React hydration mismatches. Lets Interfere
|
|
33
|
+
* triage by kind without re-parsing the message.
|
|
34
|
+
*/
|
|
35
|
+
readonly subtype?: string;
|
|
36
|
+
}
|
|
37
|
+
declare function buildExceptionEventAttrs(value: Error | NonErrorException, opts: RecordExceptionOpts): Attributes;
|
|
38
|
+
declare function recordExceptionOnSpan(span: Span, value: Error | NonErrorException, attrs: Attributes, handled: boolean): void;
|
|
39
|
+
/**
|
|
40
|
+
* Opens the span that carries a captured exception when none is active:
|
|
41
|
+
* named after the throw site and tagged `interfere.capture.kind` so
|
|
42
|
+
* consumers recognise it by attribute rather than by name.
|
|
43
|
+
*/
|
|
44
|
+
declare function startExceptionSpan(tracer: Tracer, value: Error | NonErrorException): Span;
|
|
45
|
+
//#endregion
|
|
46
|
+
export { startExceptionSpan as i, buildExceptionEventAttrs as n, recordExceptionOnSpan as r, RecordExceptionOpts as t };
|
|
@@ -0,0 +1 @@
|
|
|
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};
|
|
@@ -3,7 +3,7 @@ import { Span } from "@opentelemetry/api";
|
|
|
3
3
|
import { FetchCustomAttributeFunction } from "@opentelemetry/instrumentation-fetch";
|
|
4
4
|
import { WebTracerProvider } from "@opentelemetry/sdk-trace-web";
|
|
5
5
|
import { LoggerProvider } from "@opentelemetry/sdk-logs";
|
|
6
|
-
//#region src/internal/otel/instrumentations.d.ts
|
|
6
|
+
//#region src/internal/otel/instrumentations/instrumentations.d.ts
|
|
7
7
|
type FetchError = Exclude<Parameters<FetchCustomAttributeFunction>[2], Response>;
|
|
8
8
|
type FetchSpanRequest = Request | RequestInfo | RequestInit | URL;
|
|
9
9
|
/**
|
|
@@ -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-
|
|
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};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as deviceMetadata}from"../../device-metadata-Ffi__vup.mjs";import{UAParser}from"@ua-parser-js/pro-enterprise";import{InApps}from"@ua-parser-js/pro-enterprise/extensions";const HIGH_ENTROPY_HINTS=[`bitness`,`platformVersion`,`fullVersionList`];async function getDeviceMetadata(){if(typeof navigator>`u`)return null;let uaData=navigator.userAgentData,[parsed,hints]=await Promise.all([Promise.resolve(UAParser(navigator.userAgent,InApps).withClientHints()).catch(()=>UAParser(navigator.userAgent,InApps)),uaData?.getHighEntropyValues?uaData.getHighEntropyValues(HIGH_ENTROPY_HINTS).catch(()=>({})):Promise.resolve({})]);return deviceMetadata(parsed,hints,navigator.userAgent)}function getBrowserMetadata(){if([typeof navigator,typeof screen,typeof globalThis].some(x=>x===`undefined`))return null;let{language}=navigator;return{display:{screen:{height:screen.availHeight,orientation:screen.orientation?.type,width:screen.availWidth}},language,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone}}async function collectContext(){return{browser:getBrowserMetadata(),device:await getDeviceMetadata(),runtime:`browser`}}export{collectContext};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { a as InterfereContextValue, i as InterfereContext } from "
|
|
1
|
+
import { a as InterfereContextValue, i as InterfereContext } from "../../provider-DIp7vkKd.mjs";
|
|
2
2
|
import { Component, ContextType, ReactNode } from "react";
|
|
3
|
-
//#region src/internal/capture-boundary.d.ts
|
|
3
|
+
//#region src/internal/capture/capture-boundary.d.ts
|
|
4
4
|
interface CaptureBoundaryProps {
|
|
5
5
|
children: ReactNode;
|
|
6
6
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{t as CaptureBoundary}from"../../capture-boundary-Cz0jO-y5.mjs";export{CaptureBoundary};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { s as Kernel } from "
|
|
1
|
+
import { s as Kernel } from "../../provider-DIp7vkKd.mjs";
|
|
2
2
|
import { ErrorMechanism } from "@interfere/types/sdk/plugins/payload/errors";
|
|
3
|
-
//#region src/internal/capture.d.ts
|
|
3
|
+
//#region src/internal/capture/capture.d.ts
|
|
4
4
|
/**
|
|
5
5
|
* Routes a React error through `kernel.recordException()`, attaching the
|
|
6
6
|
* component stack reported by React as additional frames. Dedup of the
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as captureReactError}from"../../capture-BV2RlsYg.mjs";export{captureReactError};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{n as recordExceptionOnSpan,r as startExceptionSpan,t as buildExceptionEventAttrs}from"../../exception-span-B74fhBQb.mjs";export{buildExceptionEventAttrs,recordExceptionOnSpan,startExceptionSpan};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { i as setIngestHost, n as isForceEnableActive, r as resolveTargets, t as hasPublicKey } from "
|
|
1
|
+
import { i as setIngestHost, n as isForceEnableActive, r as resolveTargets, t as hasPublicKey } from "../../config-BTWtCcDP.mjs";
|
|
2
2
|
export { hasPublicKey, isForceEnableActive, resolveTargets, setIngestHost };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{i as setIngestHost,n as isForceEnableActive,r as resolveTargets,t as hasPublicKey}from"../../config-VOyDjqS7.mjs";export{hasPublicKey,isForceEnableActive,resolveTargets,setIngestHost};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ConsentCategory, ConsentInput, ConsentState, PluginKey } from "@interfere/types/sdk/plugins/manifest";
|
|
2
2
|
import { EventType } from "@interfere/types/sdk/envelope";
|
|
3
|
-
//#region src/internal/consent.d.ts
|
|
3
|
+
//#region src/internal/consent/consent.d.ts
|
|
4
4
|
export declare const DEFAULT_CONSENT: {
|
|
5
5
|
readonly analytics: true;
|
|
6
6
|
readonly replay: true;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as resolveGrantedConsent,i as isConsentAllowed,n as getPluginConsentCategory,o as shouldCaptureEvent,r as hasConsentChanged,t as DEFAULT_CONSENT}from"../../consent-COUmLJLD.mjs";export{DEFAULT_CONSENT,getPluginConsentCategory,hasConsentChanged,isConsentAllowed,resolveGrantedConsent,shouldCaptureEvent};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{n as onConsoleCall,r as resetConsolePatchForTests,t as CONSOLE_LEVELS}from"../../console-patch-WNKoLE7U.mjs";export{CONSOLE_LEVELS,onConsoleCall,resetConsolePatchForTests};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as deviceMetadata}from"../../device-metadata-Ffi__vup.mjs";export{deviceMetadata};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{n as isEnvironmentEnabled,t as isEnabledByEnvironment}from"../../environment-CoEXhF1a.mjs";export{isEnabledByEnvironment,isEnvironmentEnabled};
|
package/dist/internal/{event-capabilities.d.mts → event-capabilities/event-capabilities.d.mts}
RENAMED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
//#region src/internal/event-capabilities.d.ts
|
|
1
|
+
//#region src/internal/event-capabilities/event-capabilities.d.ts
|
|
2
2
|
export declare function hasEventListenerPair(add: typeof globalThis.addEventListener | undefined, remove: typeof globalThis.removeEventListener | undefined): boolean;
|
|
3
3
|
//#endregion
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as hasEventListenerPair}from"../../event-capabilities-Dd0Hoaq2.mjs";export{hasEventListenerPair};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as isHydrationError}from"../../hydration-BIp2cKhz.mjs";export{isHydrationError};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { s as Kernel } from "../provider-
|
|
1
|
+
import { s as Kernel } from "../provider-DIp7vkKd.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,6 @@
|
|
|
1
1
|
import { r as PrivacyOptions } from "../privacy-CPKosXDP.mjs";
|
|
2
|
-
import { _ as
|
|
3
|
-
import { i as HttpStatusCodeRange, n as CaptureFailedRequestsOption, r as CaptureFailedRequestsOptions } from "../instrumentations-
|
|
4
|
-
import { t as
|
|
5
|
-
|
|
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";
|
|
3
|
+
import { i as HttpStatusCodeRange, n as CaptureFailedRequestsOption, r as CaptureFailedRequestsOptions } from "../instrumentations-D656I08h.mjs";
|
|
4
|
+
import { t as RecordExceptionOpts } from "../exception-span-zN1tvBdh.mjs";
|
|
5
|
+
import { t as isEnabledByEnvironment } from "../environment-CtCFKD2N.mjs";
|
|
6
|
+
export { type CaptureFailedRequestsOption, type CaptureFailedRequestsOptions, type HttpStatusCodeRange, Kernel, KernelConsent, KernelDevice, KernelIdentity, KernelInternalOptions, KernelOptions, KernelSession, type PrivacyOptions, type RecordExceptionOpts, TracingOptions, buildSdkStack, createKernel, isEnabledByEnvironment, readReleaseSlugFromGlobals };
|
package/dist/internal/kernel.mjs
CHANGED
|
@@ -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-
|
|
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 +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-
|
|
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,7 +1,7 @@
|
|
|
1
|
-
import { a as InstrumentationsInput, i as HttpStatusCodeRange, n as CaptureFailedRequestsOption, o as registerBundledInstrumentations, r as CaptureFailedRequestsOptions, t as BundledInstrumentations } from "../../instrumentations-
|
|
1
|
+
import { a as InstrumentationsInput, i as HttpStatusCodeRange, n as CaptureFailedRequestsOption, o as registerBundledInstrumentations, r as CaptureFailedRequestsOptions, t as BundledInstrumentations } from "../../instrumentations-D656I08h.mjs";
|
|
2
2
|
import { a as seedPageScope, i as installNavigationScope, n as PAGE_SCOPE_MAX_AGE_MS, r as createPageScopeRotator, t as NavigationScopeInput } from "../../navigation-CkiV6lJY.mjs";
|
|
3
3
|
import { t as readPropagationFromDocument } from "../../propagation-CssinKCy.mjs";
|
|
4
4
|
import { n as OtelProviderInput, r as buildOtelProvider, t as OtelProviderHandle } from "../../provider-cUByhzgv.mjs";
|
|
5
5
|
import { n as captureWebVitals } from "../../web-vitals-x8y70B5x.mjs";
|
|
6
|
-
import "../../index-
|
|
6
|
+
import "../../index-BZ_yQUGY.mjs";
|
|
7
7
|
export { type BundledInstrumentations, type CaptureFailedRequestsOption, type CaptureFailedRequestsOptions, type HttpStatusCodeRange, type InstrumentationsInput, type NavigationScopeInput, type OtelProviderHandle, type OtelProviderInput, PAGE_SCOPE_MAX_AGE_MS, buildOtelProvider, captureWebVitals, createPageScopeRotator, installNavigationScope, readPropagationFromDocument, registerBundledInstrumentations, seedPageScope };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as registerBundledInstrumentations}from"../../instrumentations-CY8NcP_M.mjs";import{i as seedPageScope,n as createPageScopeRotator,r as installNavigationScope,t as PAGE_SCOPE_MAX_AGE_MS}from"../../navigation-DwkvuhFR.mjs";import{t as readPropagationFromDocument}from"../../propagation-DVcqCu_E.mjs";import{t as buildOtelProvider}from"../../provider-
|
|
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};
|
package/dist/internal/otel/{instrumentations.d.mts → instrumentations/instrumentations.d.mts}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as InstrumentationsInput, c as testOnlyApplyXhrSpanAttrs, d as testOnlyResolveFailureRanges, i as HttpStatusCodeRange, l as testOnlyClassifyNetworkError, n as CaptureFailedRequestsOption, o as registerBundledInstrumentations, r as CaptureFailedRequestsOptions, s as testOnlyApplyFetchSpanAttrs, t as BundledInstrumentations, u as testOnlyCreateFailureGate } from "
|
|
1
|
+
import { a as InstrumentationsInput, c as testOnlyApplyXhrSpanAttrs, d as testOnlyResolveFailureRanges, i as HttpStatusCodeRange, l as testOnlyClassifyNetworkError, n as CaptureFailedRequestsOption, o as registerBundledInstrumentations, r as CaptureFailedRequestsOptions, s as testOnlyApplyFetchSpanAttrs, t as BundledInstrumentations, u as testOnlyCreateFailureGate } from "../../../instrumentations-D656I08h.mjs";
|
|
2
2
|
export { BundledInstrumentations, CaptureFailedRequestsOption, CaptureFailedRequestsOptions, HttpStatusCodeRange, InstrumentationsInput, registerBundledInstrumentations, testOnlyApplyFetchSpanAttrs, testOnlyApplyXhrSpanAttrs, testOnlyClassifyNetworkError, testOnlyCreateFailureGate, testOnlyResolveFailureRanges };
|
|
@@ -0,0 +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 +1 @@
|
|
|
1
|
-
import{t as buildOtelProvider}from"../../provider-
|
|
1
|
+
import{t as buildOtelProvider}from"../../provider-BMoWBbsK.mjs";export{buildOtelProvider};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
//#region src/internal/page-lifecycle/keepalive-budget.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Reserves keepalive budget for one request body. Returns the release callback when the body fits, or null when the request must go out without keepalive.
|
|
4
|
+
*/
|
|
5
|
+
export declare function reserveKeepaliveBody(bytes: number): (() => void) | null;
|
|
6
|
+
//#endregion
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as reserveKeepaliveBody}from"../../keepalive-budget-DeafGnVZ.mjs";export{reserveKeepaliveBody};
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
type Handler = () => void;
|
|
3
3
|
export declare function onPageHidden(handler: Handler): () => void;
|
|
4
4
|
export declare function onPageShown(handler: Handler): () => void;
|
|
5
|
+
/** Fires on `beforeunload`, before the browser commits the navigation; the page may still survive, so subscribers flush and keep running. */
|
|
6
|
+
export declare function onPageUnloading(handler: Handler): () => void;
|
|
5
7
|
/** Test hook — drops every handler and unbinds the listeners. */
|
|
6
8
|
export declare function resetPageLifecycleForTests(): void;
|
|
7
9
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as onPageShown,r as
|
|
1
|
+
import{i as resetPageLifecycleForTests,n as onPageShown,r as onPageUnloading,t as onPageHidden}from"../../page-lifecycle-DTWqGlz2.mjs";export{onPageHidden,onPageShown,onPageUnloading,resetPageLifecycleForTests};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { v as PluginRuntime } from "../../provider-DIp7vkKd.mjs";
|
|
2
2
|
export { PluginRuntime };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as PluginRuntime}from"../../plugin-runtime-
|
|
1
|
+
import{t as PluginRuntime}from"../../plugin-runtime-B1oFO16q.mjs";export{PluginRuntime};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as InterfereContextValue, i as InterfereContext, o as NULL_CONTEXT_VALUE } from "../provider-
|
|
1
|
+
import { a as InterfereContextValue, i as InterfereContext, o as NULL_CONTEXT_VALUE } from "../provider-DIp7vkKd.mjs";
|
|
2
2
|
export { InterfereContext, InterfereContextValue, NULL_CONTEXT_VALUE };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as hasServerDigest}from"../../server-digest-CzGdvjW1.mjs";export{hasServerDigest};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Queue}from"workbox-background-sync";const SYNTHETIC_QUEUED_RESPONSE={status:202,statusText:`Queued`};async function postToClients(message){let clients=await self.clients.matchAll({includeUncontrolled:!1});for(let client of clients)client.postMessage(message)}async function totalQueueBytes(queue){let entries=await queue.getAll(),total=0;for(let entry of entries){let meta=entry.metadata;meta&&`bytes`in meta&&typeof meta.bytes==`number`&&(total+=meta.bytes)}return total}async function pruneOldest(queue,neededBytes){let total=await totalQueueBytes(queue);for(;total+neededBytes>10485760;){let dropped=await queue.shiftRequest();if(!dropped)break;let meta=dropped.metadata;meta&&`bytes`in meta&&typeof meta.bytes==`number`&&(total-=meta.bytes),await postToClients({reason:`queue_size_cap`,type:`interfere.sw.dropped`,url:dropped.request.url})}}async function enqueue(queue,request){let cloned=request.clone(),bytes=(await cloned.clone().arrayBuffer()).byteLength;await pruneOldest(queue,bytes),await queue.pushRequest({metadata:{bytes},request:cloned}),await postToClients({type:`interfere.sw.queued`,url:request.url})}function installIngestQueue(options={}){let matches=options.match??(url=>url.pathname.startsWith(`/api/interfere/`)),replayInFlight,replay=async q=>{replayInFlight??=(async()=>{try{let entry=await q.shiftRequest();for(;entry;){try{let res=await self.fetch(entry.request.clone());if(!res.ok&&(res.status
|
|
1
|
+
import{isRetryableStatus}from"@interfere/helpers/retry-request";import{Queue}from"workbox-background-sync";const SYNTHETIC_QUEUED_RESPONSE={status:202,statusText:`Queued`};async function postToClients(message){let clients=await self.clients.matchAll({includeUncontrolled:!1});for(let client of clients)client.postMessage(message)}async function totalQueueBytes(queue){let entries=await queue.getAll(),total=0;for(let entry of entries){let meta=entry.metadata;meta&&`bytes`in meta&&typeof meta.bytes==`number`&&(total+=meta.bytes)}return total}async function pruneOldest(queue,neededBytes){let total=await totalQueueBytes(queue);for(;total+neededBytes>10485760;){let dropped=await queue.shiftRequest();if(!dropped)break;let meta=dropped.metadata;meta&&`bytes`in meta&&typeof meta.bytes==`number`&&(total-=meta.bytes),await postToClients({reason:`queue_size_cap`,type:`interfere.sw.dropped`,url:dropped.request.url})}}async function enqueue(queue,request){let cloned=request.clone(),bytes=(await cloned.clone().arrayBuffer()).byteLength;await pruneOldest(queue,bytes),await queue.pushRequest({metadata:{bytes},request:cloned}),await postToClients({type:`interfere.sw.queued`,url:request.url})}function installIngestQueue(options={}){let matches=options.match??(url=>url.pathname.startsWith(`/api/interfere/`)),replayInFlight,replay=async q=>{replayInFlight??=(async()=>{try{let entry=await q.shiftRequest();for(;entry;){try{let res=await self.fetch(entry.request.clone());if(!res.ok&&isRetryableStatus(res.status))throw Error(`retry status ${res.status}`);await postToClients({type:`interfere.sw.replayed`,url:entry.request.url})}catch(error){throw await q.unshiftRequest(entry),error}entry=await q.shiftRequest()}}finally{replayInFlight=void 0}})(),await replayInFlight},queue=new Queue(options.queueName??`interfere-ingest`,{maxRetentionTime:1440,onSync:async({queue:q})=>{await replay(q)}});self.addEventListener(`activate`,event=>{event.waitUntil(replay(queue).catch(()=>{}))}),self.addEventListener(`fetch`,event=>{let{request}=event;if(request.method!==`POST`)return;let url;try{url=new URL(request.url)}catch{return}matches(url,request)&&event.respondWith((async()=>{try{let res=await self.fetch(request.clone());return res.ok?res:isRetryableStatus(res.status)?(await enqueue(queue,request),new Response(null,SYNTHETIC_QUEUED_RESPONSE)):res}catch{return await enqueue(queue,request),new Response(null,SYNTHETIC_QUEUED_RESPONSE)}})())})}export{installIngestQueue};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as SDK_NAME,r as SDK_VERSION,t as PRODUCER_VERSION}from"../version-
|
|
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,4 +1,4 @@
|
|
|
1
|
-
import { f as KernelOptions, s as Kernel } from "../provider-
|
|
1
|
+
import { f as KernelOptions, s as Kernel } from "../provider-DIp7vkKd.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-
|
|
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};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
let keepaliveBodyBytes=0;function reserveKeepaliveBody(bytes){if(keepaliveBodyBytes+bytes>6e4)return null;keepaliveBodyBytes+=bytes;let released=!1;return(()=>{released||(released=!0,keepaliveBodyBytes-=bytes)})}export{reserveKeepaliveBody as t};
|
|
@@ -0,0 +1 @@
|
|
|
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 +1 @@
|
|
|
1
|
-
import{t as createLogger}from"./log-D6Ht--tv.mjs";import{t as errorsPlugin}from"./errors-
|
|
1
|
+
import{t as createLogger}from"./log-D6Ht--tv.mjs";import{t as errorsPlugin}from"./errors-BfUmjgWO.mjs";import{PLUGIN_MANIFEST}from"@interfere/types/sdk/plugins/manifest";const log=createLogger(`plugins`),LOADERS={device:async()=>import(`./plugins/device.mjs`),errors:()=>errorsPlugin,logs:async()=>import(`./plugins/logs.mjs`),pageEvents:async()=>import(`./plugins/page-events.mjs`),rageClick:async()=>import(`./plugins/rage-clicks.mjs`),replay:async()=>import(`./plugins/replay/index.mjs`)},DEFAULTS=Object.fromEntries(PLUGIN_MANIFEST.map(p=>[p.name,p.defaultEnabled]));function resolveFeatures(overrides){if(!overrides)return{...DEFAULTS};let{pageEvents,replay,...rest}=overrides;return{...DEFAULTS,...rest,pageEvents:pageEvents===void 0?DEFAULTS.pageEvents:pageEvents!==!1,replay:replay===void 0?DEFAULTS.replay:replay!==!1}}function resolvePlugin(mod){return`default`in mod?mod.default:mod}async function loadPlugin(key,context){let loader=LOADERS[key];if(loader===void 0)return null;try{let cleanup=resolvePlugin(await loader()).setup(context);return log.debug(`loaded %s`,key),cleanup??null}catch{return log.error(`failed to load plugin %s`,key),null}}export{loadPlugin as n,resolveFeatures as r,LOADERS as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const hiddenHandlers=new Set,shownHandlers=new Set,unloadingHandlers=new Set;let installed=!1,hidden=!1;function fire(set){for(let handler of set)handler()}function documentHidden(){return globalThis.document?.visibilityState===`hidden`}function fireHidden(){hidden||(hidden=!0,fire(hiddenHandlers))}function fireShown(){hidden&&(hidden=!1,fire(shownHandlers))}function fireUnloading(){fire(unloadingHandlers)}function onVisibilityChange(){if(documentHidden()){fireHidden();return}fireShown()}function onPageShow(){documentHidden()||fireShown()}function install(){installed||typeof globalThis.addEventListener!=`function`||(installed=!0,hidden=documentHidden(),globalThis.addEventListener(`visibilitychange`,onVisibilityChange),globalThis.addEventListener(`pagehide`,fireHidden),globalThis.addEventListener(`pageshow`,onPageShow),globalThis.addEventListener(`beforeunload`,fireUnloading))}function onPageHidden(handler){return install(),hiddenHandlers.add(handler),(()=>{hiddenHandlers.delete(handler)})}function onPageShown(handler){return install(),shownHandlers.add(handler),(()=>{shownHandlers.delete(handler)})}function onPageUnloading(handler){return install(),unloadingHandlers.add(handler),(()=>{unloadingHandlers.delete(handler)})}function resetPageLifecycleForTests(){hiddenHandlers.clear(),shownHandlers.clear(),unloadingHandlers.clear(),installed&&typeof globalThis.removeEventListener==`function`&&(globalThis.removeEventListener(`visibilitychange`,onVisibilityChange),globalThis.removeEventListener(`pagehide`,fireHidden),globalThis.removeEventListener(`pageshow`,onPageShow),globalThis.removeEventListener(`beforeunload`,fireUnloading)),installed=!1,hidden=!1}export{resetPageLifecycleForTests as i,onPageShown as n,onPageUnloading as r,onPageHidden as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as createLogger}from"./log-D6Ht--tv.mjs";import{
|
|
1
|
+
import{t as createLogger}from"./log-D6Ht--tv.mjs";import{t as devicePlugin}from"./device-6T3DYkLD.mjs";import{t as errorsPlugin}from"./errors-BfUmjgWO.mjs";import{n as loadPlugin,r as resolveFeatures}from"./loader-DIaWtHND.mjs";import{a as resolveGrantedConsent,i as isConsentAllowed,n as getPluginConsentCategory,r as hasConsentChanged}from"./consent-COUmLJLD.mjs";import{PLUGIN_MANIFEST}from"@interfere/types/sdk/plugins/manifest";const log=createLogger(`plugin-runtime`);var PluginRuntime=class{activeCleanups=new Map;activations=new Map;features=resolveFeatures();pluginConfigListeners=new Map;remoteConfig={};remoteConfigSettled=!1;consentState=null;configSettled=!1;replayConfig={};pageEventsConfig={};syncVersion=0;disposed=!1;context;hasInitialConsent;constructor(context,consent,remoteConfig={}){this.context=context,this.hasInitialConsent=consent!==void 0,this.consentState=consent===void 0?null:resolveGrantedConsent(consent),this.configSettled=this.hasInitialConsent,this.remoteConfig=remoteConfig}getConsent(){return this.consentState}getReplayConfig(){return this.replayConfig}isInteractionCaptureEnabled(){return this.pageEventsConfig.interactions!==!1}applyProviderConfig(overrides,consent){let pageEvents=overrides?.pageEvents,replay=overrides?.replay;this.features=resolveFeatures(overrides),this.pageEventsConfig=typeof pageEvents==`object`?pageEvents:{},this.replayConfig=typeof replay==`object`?replay:{},consent===void 0?this.hasInitialConsent||(this.consentState=null):this.consentState=resolveGrantedConsent(consent),this.configSettled=!0,this.sync()}setConsent(nextConsent){let nextState=resolveGrantedConsent(nextConsent);(!this.configSettled||hasConsentChanged(this.consentState,nextState))&&(this.consentState=nextState,this.configSettled=!0,this.sync())}resetConsent(){(!this.configSettled||hasConsentChanged(this.consentState,null))&&(this.consentState=null,this.configSettled=!0,this.sync())}applyRemoteConfig(config){this.remoteConfig=config,this.remoteConfigSettled=!0,this.emitPluginConfigState(),this.sync()}applyRemoteConfigDefaults(){this.remoteConfigSettled=!0,this.emitPluginConfigState(),this.sync()}start(){for(let[key,plugin]of[[`errors`,errorsPlugin],[`device`,devicePlugin]])if(this.shouldEnablePlugin(key)){let cleanup=plugin.setup(this.context);cleanup&&this.activeCleanups.set(key,cleanup)}this.sync()}async dispose(){this.disposed=!0,this.syncVersion+=1;for(let key of this.activeCleanups.keys())this.deactivate(key,`dispose`);await Promise.allSettled(this.activations.values())}shouldEnablePlugin(key){let category=getPluginConsentCategory(key);return category!==`necessary`&&!this.configSettled?!1:this.features[key]&&this.remoteConfig[key]!==!1&&isConsentAllowed(category,this.consentState)}getPluginConfigState(key){return this.remoteConfigSettled?this.remoteConfig[key]===!1?`disabled`:`enabled`:`pending`}subscribePluginConfigState(key,listener){let listeners=this.pluginConfigListeners.get(key)??new Set;return listeners.add(listener),this.pluginConfigListeners.set(key,listeners),(()=>{listeners.delete(listener),listeners.size===0&&this.pluginConfigListeners.delete(key)})}emitPluginConfigState(){for(let[key,listeners]of this.pluginConfigListeners){let state=this.getPluginConfigState(key);for(let listener of listeners)listener(state)}}teardownReason(key){let category=getPluginConsentCategory(key);return isConsentAllowed(category,this.consentState)?`disabled`:`consent-revoked`}deactivate(key,reason){let cleanup=this.activeCleanups.get(key);if(cleanup){try{cleanup(reason)}catch{log.warn(`cleanup failed for %s`,key)}this.activeCleanups.delete(key)}}async activate(key){if(this.activeCleanups.has(key)||!this.shouldEnablePlugin(key))return;let version=this.syncVersion,cleanup=await loadPlugin(key,this.context);if(cleanup){if(version!==this.syncVersion||!this.shouldEnablePlugin(key)){cleanup(this.teardownReason(key));return}this.activeCleanups.set(key,cleanup)}}sync(){if(!this.disposed){this.syncVersion+=1;for(let plugin of PLUGIN_MANIFEST){if(this.shouldEnablePlugin(plugin.name)){if(plugin.name===`errors`){if(!this.activeCleanups.has(`errors`)){let cleanup=errorsPlugin.setup(this.context);cleanup&&this.activeCleanups.set(`errors`,cleanup)}continue}let previous=this.activations.get(plugin.name);this.activations.set(plugin.name,(async()=>{await previous;try{await this.activate(plugin.name)}catch{log.warn(`non-critical plugin loading failed`)}})());continue}this.deactivate(plugin.name,this.teardownReason(plugin.name))}}}};export{PluginRuntime as t};
|