@interfere/react 12.3.0 → 12.3.4
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-Duhfgvxt.d.mts → activity-CShcwAW_.d.mts} +14 -4
- package/dist/activity-oYlZ5aa1.mjs +1 -0
- package/dist/{api-CMPV9rgU.d.mts → api-DSUjs8zG.d.mts} +4 -2
- package/dist/api-DvHT4Dyw.mjs +1 -0
- package/dist/click-span-gate-6dNMhjc7.mjs +1 -0
- package/dist/delivery-D9hzPDs9.mjs +1 -0
- package/dist/error-boundary.d.mts +1 -1
- package/dist/{errors-BfUmjgWO.mjs → errors-B8XYW4Q7.mjs} +1 -1
- package/dist/export-filter-Cixywxpu.mjs +1 -0
- package/dist/exporter-De0h9YP5.mjs +1 -0
- package/dist/index-DpkTHU1a.d.mts +4 -0
- package/dist/ingest-backoff-B1OeEV3h.mjs +1 -0
- package/dist/instrumentations-NN81kslu.mjs +1 -0
- package/dist/{instrumentations-D656I08h.d.mts → instrumentations-S-BCpguB.d.mts} +8 -9
- package/dist/internal/activity/activity.d.mts +2 -2
- package/dist/internal/activity/activity.mjs +1 -1
- package/dist/internal/capture/capture-boundary.d.mts +1 -1
- package/dist/internal/capture/capture.d.mts +1 -1
- package/dist/internal/clock/sent-at.d.mts +5 -0
- package/dist/internal/clock/sent-at.mjs +1 -0
- package/dist/internal/ingest-backoff/ingest-backoff.d.mts +12 -0
- package/dist/internal/ingest-backoff/ingest-backoff.mjs +1 -0
- package/dist/internal/kernel-registry.d.mts +1 -1
- package/dist/internal/kernel.d.mts +2 -2
- package/dist/internal/kernel.mjs +1 -1
- package/dist/internal/otel/export-filter.d.mts +12 -0
- package/dist/internal/otel/export-filter.mjs +1 -0
- 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/click-span-gate.d.mts +8 -0
- package/dist/internal/otel/instrumentations/click-span-gate.mjs +1 -0
- package/dist/internal/otel/instrumentations/instrumentations.d.mts +2 -2
- package/dist/internal/otel/instrumentations/instrumentations.mjs +1 -1
- package/dist/internal/otel/instrumentations/network-failure.d.mts +2 -0
- package/dist/internal/otel/instrumentations/network-failure.mjs +1 -0
- package/dist/internal/otel/provider.mjs +1 -1
- 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/third-party-hosts.d.mts +5 -5
- package/dist/internal/third-party-hosts.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/kernel-BVG-7Zau.mjs +1 -0
- package/dist/{loader-DIaWtHND.mjs → loader-CZ-5Z5A5.mjs} +1 -1
- package/dist/network-failure-DFMPEnXx.d.mts +19 -0
- package/dist/network-failure-GVLV_sUF.mjs +1 -0
- package/dist/{page-lifecycle-DTWqGlz2.mjs → page-lifecycle-rJEJNdKj.mjs} +1 -1
- package/dist/{plugin-runtime-B1oFO16q.mjs → plugin-runtime-DSj0FM1Q.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/page-events.d.mts +1 -1
- package/dist/plugins/rage-clicks.d.mts +1 -1
- package/dist/plugins/replay/index.d.mts +1 -1
- package/dist/plugins/replay/index.mjs +1 -1
- package/dist/plugins/replay/recorder/recorder.d.mts +1 -0
- package/dist/plugins/replay/recorder/recorder.mjs +1 -1
- package/dist/plugins/replay/upload/delivery.d.mts +5 -2
- package/dist/plugins/replay/upload/delivery.mjs +1 -1
- package/dist/plugins/replay/upload/upload.mjs +1 -1
- package/dist/provider-CElaujE6.mjs +1 -0
- package/dist/{provider-DIp7vkKd.d.mts → provider-D4QjZp3L.d.mts} +8 -6
- package/dist/provider.d.mts +1 -1
- package/dist/react-error-handler.d.mts +1 -1
- package/dist/recorder-C36qxD3q.mjs +1 -0
- package/dist/sent-at-CEM8UV3W.mjs +1 -0
- package/dist/session-retry-TrzzihIM.mjs +1 -0
- package/dist/third-party-hosts-CYOuLL_s.mjs +1 -0
- package/dist/tracking/api.d.mts +1 -1
- package/dist/tracking/api.mjs +1 -1
- package/dist/tracking/registration.fixture.d.mts +1 -1
- package/dist/tracking/registration.fixture.mjs +1 -1
- package/dist/tracking/session-retry.mjs +1 -1
- package/dist/upload-D55WVf_o.mjs +1 -0
- package/dist/{version-CU2o2z22.mjs → version-DusHm2Q4.mjs} +1 -1
- package/package.json +4 -3
- package/dist/activity-BYnL3bX-.mjs +0 -1
- package/dist/api-BUYnj5MA.mjs +0 -1
- package/dist/delivery-BXEtTvnO.mjs +0 -1
- package/dist/exporter-CcNtHR8L.mjs +0 -1
- package/dist/index-BZ_yQUGY.d.mts +0 -4
- package/dist/instrumentations-CY8NcP_M.mjs +0 -1
- package/dist/kernel-B0Q_aRde.mjs +0 -1
- package/dist/provider-DYb87tIb.mjs +0 -1
- package/dist/recorder-CM6Ae_0S.mjs +0 -1
- package/dist/session-retry-C2Uh7eZ6.mjs +0 -1
- package/dist/third-party-hosts-BoJNL3xG.mjs +0 -1
- package/dist/upload-BIh8Q5UQ.mjs +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as createLogger}from"./log-D6Ht--tv.mjs";import{t as devicePlugin}from"./device-6T3DYkLD.mjs";import{t as errorsPlugin}from"./errors-
|
|
1
|
+
import{t as createLogger}from"./log-D6Ht--tv.mjs";import{t as devicePlugin}from"./device-6T3DYkLD.mjs";import{t as errorsPlugin}from"./errors-B8XYW4Q7.mjs";import{n as loadPlugin,r as resolveFeatures}from"./loader-CZ-5Z5A5.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};
|
package/dist/plugins/errors.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as errorsPlugin}from"../errors-
|
|
1
|
+
import{t as errorsPlugin}from"../errors-B8XYW4Q7.mjs";export{errorsPlugin as default};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { S as resolveFeatures, b as PluginOverrides, x as loadPlugin, y as LOADERS } from "../../provider-
|
|
1
|
+
import { S as resolveFeatures, b as PluginOverrides, x as loadPlugin, y as LOADERS } from "../../provider-D4QjZp3L.mjs";
|
|
2
2
|
export { LOADERS, PluginOverrides, loadPlugin, resolveFeatures };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as loadPlugin,r as resolveFeatures,t as LOADERS}from"../../loader-
|
|
1
|
+
import{n as loadPlugin,r as resolveFeatures,t as LOADERS}from"../../loader-CZ-5Z5A5.mjs";export{LOADERS,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-
|
|
1
|
+
import { C as Plugin, D as PluginTeardownReason, E as PluginContext, T as PluginConfigState, w as PluginCleanup } from "../../provider-D4QjZp3L.mjs";
|
|
2
2
|
export { Plugin, PluginCleanup, PluginConfigState, PluginContext, PluginTeardownReason };
|
package/dist/plugins/logs.d.mts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as createLogger}from"../../log-D6Ht--tv.mjs";import{
|
|
1
|
+
import{t as createLogger}from"../../log-D6Ht--tv.mjs";import{i as onPageUnloading}from"../../page-lifecycle-rJEJNdKj.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-D9hzPDs9.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-
|
|
1
|
+
import{t as startReplayRecorder}from"../../../recorder-C36qxD3q.mjs";export{startReplayRecorder};
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { E as PluginContext } from "../../../provider-
|
|
1
|
+
import { E as PluginContext } from "../../../provider-D4QjZp3L.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
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" | "skipped">;
|
|
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-
|
|
1
|
+
import{n as deliverChunk,t as REPLAY_TRACER_NAME}from"../../../delivery-D9hzPDs9.mjs";export{REPLAY_TRACER_NAME,deliverChunk};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as uploadReplayChunk}from"../../../upload-
|
|
1
|
+
import{t as uploadReplayChunk}from"../../../upload-D55WVf_o.mjs";export{uploadReplayChunk};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{n as getStringGlobal}from"./global-DYq1Z4_H.mjs";import{n as SDK_NAME,r as SDK_VERSION}from"./version-DusHm2Q4.mjs";import{i as createTraceExporter,n as createLogExporter,r as createMetricExporter}from"./exporter-De0h9YP5.mjs";import{t as createExportFilterProcessor}from"./export-filter-Cixywxpu.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:200,maxQueueSize:2048,scheduledDelayMillis:5e3};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??[],createExportFilterProcessor(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,11 +1,11 @@
|
|
|
1
|
-
import { c as SessionResumeReason } from "./activity-
|
|
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-
|
|
6
|
-
import { n as CaptureFailedRequestsOption, t as BundledInstrumentations } from "./instrumentations-
|
|
5
|
+
import { t as SessionTracker } from "./api-DSUjs8zG.mjs";
|
|
6
|
+
import { n as CaptureFailedRequestsOption, t as BundledInstrumentations } from "./instrumentations-S-BCpguB.mjs";
|
|
7
7
|
import { t as OtelProviderHandle } from "./provider-cUByhzgv.mjs";
|
|
8
|
-
import "./index-
|
|
8
|
+
import "./index-DpkTHU1a.mjs";
|
|
9
9
|
import { t as RecordExceptionOpts } from "./exception-span-zN1tvBdh.mjs";
|
|
10
10
|
import { NonErrorException } from "@interfere/types/sdk/errors";
|
|
11
11
|
import { Tracer } from "@opentelemetry/api";
|
|
@@ -29,7 +29,8 @@ interface PluginContext {
|
|
|
29
29
|
getSessionId: () => string;
|
|
30
30
|
getTracer: (name: string) => Tracer;
|
|
31
31
|
getWindowId: () => string;
|
|
32
|
-
|
|
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;
|
package/dist/provider.d.mts
CHANGED
|
@@ -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-
|
|
2
|
+
import { a as InterfereContextValue, b as PluginOverrides, i as InterfereContext, n as useInterfere, r as useSession, t as InterfereProvider } from "./provider-D4QjZp3L.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 };
|
|
@@ -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};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const SENT_AT_HEADER=`x-interfere-sent-at`;function stampSentAt(headers){return headers.set(SENT_AT_HEADER,String(Date.now())),headers}export{stampSentAt as n,SENT_AT_HEADER as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as IngestBackoffError}from"./ingest-backoff-B1OeEV3h.mjs";import{isRetryableStatus}from"@interfere/helpers/retry-request";const RETRY_DELAYS_MS=[5e3,15e3];var SessionRetry=class{timer=null;attempts=0;cancel(){this.timer!==null&&(clearTimeout(this.timer),this.timer=null)}reset(){this.cancel(),this.attempts=0}schedule(error,retry){let status=error.statusCode,transient=!(error.cause instanceof TypeError||error.cause instanceof IngestBackoffError)&&(status===void 0||isRetryableStatus(status)),delay=RETRY_DELAYS_MS[this.attempts];transient&&delay!==void 0&&this.timer===null&&(this.attempts+=1,this.timer=setTimeout(()=>{this.timer=null,retry()},delay))}};export{SessionRetry as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const VENDOR_HOSTS=`analytics.google.com,google-analytics.com,googleadservices.com,googlesyndication.com,googletagmanager.com,googleapis.com,doubleclick.net,facebook.com,facebook.net,fbcdn.net,px.ads.linkedin.com,snap.licdn.com,analytics.tiktok.com,ads-twitter.com,analytics.twitter.com,bat.bing.com,clarity.ms,alb.reddit.com,pixel-config.reddit.com,ct.pinterest.com,q.quora.com,pixels.spotify.com,sentry.io,posthog.com,intercom.io,intercomcdn.com,bam.nr-data.net,bugsnag.com,rollbar.com,logrocket.io,logrocket.com,lr-ingest.io,lr-ingest.com,fullstory.com,amplitude.com,segment.io,segment.com,hotjar.com,hotjar.io,mixpanel.com,heapanalytics.com,pendo.io,hs-analytics.net,track.hubspot.com,hockeystack.com,vector.co,conversion.ai,featurebase.app,events.launchdarkly.com,events.mapbox.com,litix.io,cloudflareinsights.com,vitals.vercel-insights.com,plausible.io,usefathom.com`.split(`,`);function escapeRegExp(value){return value.replaceAll(/[.*+?^${}()|[\]\\]/gu,String.raw`\$&`)}function hostPattern(host){return new RegExp(String.raw`\/\/(?:[^/?#@]*@)?(?:[^/?#.]+\.)*${escapeRegExp(host)}(?::\d+)?(?:[/?#]|$)`,`iu`)}const THIRD_PARTY_IGNORE=[...VENDOR_HOSTS.map(host=>hostPattern(host)),/(?:^|\/\/)clerk\./u,/\.clerk\./u,/\/\/(?:[^/?#]+\.)?browser-intake-[\w.-]*datadoghq\.(?:com|eu)(?:[:/?#]|$)/iu,/\/\/(?:[^/?#]+\.)?browser-intake-[\w.-]*ddog-gov\.com(?:[:/?#]|$)/iu,/\/\/(?:www\.)?google\.[a-z.]+\/(?:rmkt|pagead|ccm|ads)\//iu,/\/_vercel\/(?:insights|speed-insights)\//u,/\/\.well-known\/vercel\//u,/\/[\da-f]{16}\/(?:view|vitals|event|script\.js)(?:[?#]|$)/u,/\/i\/v0\/e\/?(?:[?#]|$)/u,/\/(?:decide|flags)\/?\?v=/u,/\/__nextjs_/u];export{THIRD_PARTY_IGNORE as t};
|
package/dist/tracking/api.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as SessionTrackerOptions, t as SessionTracker } from "../api-
|
|
1
|
+
import { n as SessionTrackerOptions, t as SessionTracker } from "../api-DSUjs8zG.mjs";
|
|
2
2
|
export { SessionTracker, SessionTrackerOptions };
|
package/dist/tracking/api.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as SessionTracker}from"../api-
|
|
1
|
+
import{t as SessionTracker}from"../api-DvHT4Dyw.mjs";export{SessionTracker};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as SessionTracker } from "../api-
|
|
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-
|
|
1
|
+
import{t as DeviceManager}from"../device-DRK7hhLi.mjs";import{t as SessionTracker}from"../api-DvHT4Dyw.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&¬SpecialChar();)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
|
-
import{t as SessionRetry}from"../session-retry-
|
|
1
|
+
import{t as SessionRetry}from"../session-retry-TrzzihIM.mjs";export{SessionRetry};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{n as stampSentAt}from"./sent-at-CEM8UV3W.mjs";async function uploadReplayChunk(target,sessionId,body,headers,options){let requestHeaders=new Headers(target.headers);target.publicKeyHeader&&requestHeaders.set(`x-interfere-public-key`,target.publicKeyHeader.apiKey);for(let[name,value]of Object.entries(headers))requestHeaders.set(name,value);return requestHeaders.set(`content-type`,`application/octet-stream`),stampSentAt(requestHeaders),fetch(new URL(`/v3/replay/upload/${encodeURIComponent(sessionId)}`,target.baseUrl),{method:`POST`,credentials:`omit`,headers:requestHeaders,body:new Blob([body]),keepalive:options?.keepalive??!1,signal:AbortSignal.timeout(target.timeoutInSeconds*1e3)})}export{uploadReplayChunk as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var name=`@interfere/react`,version=`12.3.
|
|
1
|
+
var name=`@interfere/react`,version=`12.3.4`;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.3.
|
|
3
|
+
"version": "12.3.4",
|
|
4
4
|
"description": "Client-side React SDK for Interfere. Error tracking, session replay, and analytics.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"error-tracking",
|
|
@@ -87,6 +87,7 @@
|
|
|
87
87
|
},
|
|
88
88
|
"scripts": {
|
|
89
89
|
"build": "tsdown",
|
|
90
|
+
"lint:oxlint": "cd ../../../.. && GOMAXPROCS=2 oxlint --max-warnings=0 --report-unused-disable-directives-severity=error --no-error-on-unmatched-pattern --threads=2 src/packages/public/react",
|
|
90
91
|
"test": "node ../../private/vitest-config/src/cli.ts run --config ../../../../vitest.config.ts",
|
|
91
92
|
"test:artifact": "bun run build && node --test --test-timeout=30000 test/recorder-artifact.test.mts",
|
|
92
93
|
"typecheck": "bun check"
|
|
@@ -95,8 +96,8 @@
|
|
|
95
96
|
"@fingerprintjs/fingerprintjs": "5.2.0",
|
|
96
97
|
"@interfere/constants": "^9.3.0",
|
|
97
98
|
"@interfere/helpers": "^9.3.0",
|
|
98
|
-
"@interfere/javascript": "^0.3.
|
|
99
|
-
"@interfere/types": "^10.5.
|
|
99
|
+
"@interfere/javascript": "^0.3.1",
|
|
100
|
+
"@interfere/types": "^10.5.1",
|
|
100
101
|
"@opentelemetry/api": "1.9.1",
|
|
101
102
|
"@opentelemetry/api-logs": "0.222.0",
|
|
102
103
|
"@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};
|
package/dist/api-BUYnj5MA.mjs
DELETED
|
@@ -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&¤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 +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,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,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.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-CU2o2z22.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};
|
|
@@ -1 +0,0 @@
|
|
|
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};
|
package/dist/kernel-B0Q_aRde.mjs
DELETED
|
@@ -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-CU2o2z22.mjs";import{t as INGEST_IGNORE_RE}from"./exporter-CcNtHR8L.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{n as getStringGlobal}from"./global-DYq1Z4_H.mjs";import{n as SDK_NAME,r as SDK_VERSION}from"./version-CU2o2z22.mjs";import{i as createTraceExporter,n as createLogExporter,r as createMetricExporter}from"./exporter-CcNtHR8L.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 +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};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{isRetryableStatus}from"@interfere/helpers/retry-request";const RETRY_DELAYS_MS=[5e3,15e3];var SessionRetry=class{timer=null;attempts=0;cancel(){this.timer!==null&&(clearTimeout(this.timer),this.timer=null)}reset(){this.cancel(),this.attempts=0}schedule(error,retry){let status=error.statusCode,transient=status===void 0||isRetryableStatus(status),delay=RETRY_DELAYS_MS[this.attempts];transient&&delay!==void 0&&this.timer===null&&(this.attempts+=1,this.timer=setTimeout(()=>{this.timer=null,retry()},delay))}};export{SessionRetry as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
const THIRD_PARTY_IGNORE=[/(?:^|\/\/)clerk\./u,/\.clerk\./u,/\.sentry\./u,/\.intercom\./u,/\.posthog\./u,/\.googletagmanager\.com/u,/\.google-analytics\.com/u,/\.googleapis\.com/u,/\.doubleclick\.net/u,/\.facebook\.com/u,/\.fbcdn\.net/u,/\.analytics\.google\.com/u,/px\.ads\.linkedin\.com/u,/\/__nextjs_/u];export{THIRD_PARTY_IGNORE as t};
|
package/dist/upload-BIh8Q5UQ.mjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
async function uploadReplayChunk(target,sessionId,body,headers,options){let requestHeaders=new Headers(target.headers);target.publicKeyHeader&&requestHeaders.set(`x-interfere-public-key`,target.publicKeyHeader.apiKey);for(let[name,value]of Object.entries(headers))requestHeaders.set(name,value);return requestHeaders.set(`content-type`,`application/octet-stream`),fetch(new URL(`/v3/replay/upload/${encodeURIComponent(sessionId)}`,target.baseUrl),{method:`POST`,credentials:`omit`,headers:requestHeaders,body:new Blob([body]),keepalive:options?.keepalive??!1,signal:AbortSignal.timeout(target.timeoutInSeconds*1e3)})}export{uploadReplayChunk as t};
|