@interfere/react 12.4.0 → 12.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/README.md +1 -1
  2. package/dist/activity-BXnqBJEN.mjs +1 -0
  3. package/dist/{activity-CShcwAW_.d.mts → activity-CBQdSlah.d.mts} +2 -0
  4. package/dist/api-BEM97FWM.mjs +1 -0
  5. package/dist/{api-BXjfYV5Z.d.mts → api-hCzqicRd.d.mts} +2 -3
  6. package/dist/carryover-BAFBokML.d.mts +20 -0
  7. package/dist/carryover-jGdEwhSK.mjs +1 -0
  8. package/dist/cors-guard-CBFsXK5N.mjs +1 -0
  9. package/dist/delivery-MVXiPjqc.mjs +1 -0
  10. package/dist/delivery-ST8Q6V23.d.mts +29 -0
  11. package/dist/environment-CC7GnqAv.mjs +1 -0
  12. package/dist/environment-CTK2srrC.d.mts +4 -0
  13. package/dist/error-boundary.d.mts +1 -1
  14. package/dist/export-carryover-Y9VbQiAB.mjs +1 -0
  15. package/dist/exporter-DqqNP_gQ.mjs +1 -0
  16. package/dist/{exporter-logs-DMr5-1Yi.d.mts → exporter-SwuW_zLa.d.mts} +15 -12
  17. package/dist/{exporter-logs-BbzSiQJi.mjs → exporter-logs-DSG5ys_2.mjs} +1 -1
  18. package/dist/{exporter-metrics-DZYqUo6_.mjs → exporter-metrics-B5xXu8sz.mjs} +1 -1
  19. package/dist/failed-request-evidence-BYcXgFbX.mjs +1 -0
  20. package/dist/failure-policy-BRdTiUfP.d.mts +21 -0
  21. package/dist/failure-policy-Czdz-YWP.mjs +1 -0
  22. package/dist/index-BplJLwnY.d.mts +4 -0
  23. package/dist/instrumentations-BV6-EClr.mjs +1 -0
  24. package/dist/{instrumentations-S-BCpguB.d.mts → instrumentations-CSV9Xo8t.d.mts} +11 -24
  25. package/dist/internal/activity/activity.d.mts +1 -1
  26. package/dist/internal/activity/activity.mjs +1 -1
  27. package/dist/internal/capture/capture-boundary.d.mts +1 -1
  28. package/dist/internal/capture/capture.d.mts +1 -1
  29. package/dist/internal/environment/environment.d.mts +2 -2
  30. package/dist/internal/environment/environment.mjs +1 -1
  31. package/dist/internal/kernel-registry.d.mts +1 -1
  32. package/dist/internal/kernel.d.mts +3 -3
  33. package/dist/internal/kernel.mjs +1 -1
  34. package/dist/internal/otel/export-carryover.d.mts +12 -0
  35. package/dist/internal/otel/export-carryover.mjs +1 -0
  36. package/dist/internal/otel/exporter-logs.d.mts +1 -1
  37. package/dist/internal/otel/exporter-logs.mjs +1 -1
  38. package/dist/internal/otel/exporter-metrics.d.mts +1 -1
  39. package/dist/internal/otel/exporter-metrics.mjs +1 -1
  40. package/dist/internal/otel/exporter.d.mts +1 -1
  41. package/dist/internal/otel/exporter.mjs +1 -1
  42. package/dist/internal/otel/index.d.mts +4 -3
  43. package/dist/internal/otel/index.mjs +1 -1
  44. package/dist/internal/otel/instrumentations/cors-guard.d.mts +26 -0
  45. package/dist/internal/otel/instrumentations/cors-guard.mjs +1 -0
  46. package/dist/internal/otel/instrumentations/failed-request-evidence.d.mts +12 -0
  47. package/dist/internal/otel/instrumentations/failed-request-evidence.mjs +1 -0
  48. package/dist/internal/otel/instrumentations/failure-policy.d.mts +2 -0
  49. package/dist/internal/otel/instrumentations/failure-policy.mjs +1 -0
  50. package/dist/internal/otel/instrumentations/instrumentations.d.mts +3 -2
  51. package/dist/internal/otel/instrumentations/instrumentations.mjs +1 -1
  52. package/dist/internal/otel/instrumentations/propagation-targets.d.mts +7 -0
  53. package/dist/internal/otel/instrumentations/propagation-targets.mjs +1 -0
  54. package/dist/internal/otel/instrumentations/request-callsite.d.mts +6 -0
  55. package/dist/internal/otel/instrumentations/request-callsite.mjs +1 -0
  56. package/dist/internal/otel/keepalive-chunks.d.mts +2 -2
  57. package/dist/internal/otel/keepalive-chunks.mjs +1 -1
  58. package/dist/internal/otel/provider.d.mts +1 -1
  59. package/dist/internal/otel/provider.mjs +1 -1
  60. package/dist/internal/plugins/plugin-runtime.d.mts +1 -1
  61. package/dist/internal/react-context.d.mts +1 -1
  62. package/dist/internal/sw-queue.mjs +1 -1
  63. package/dist/internal/version.mjs +1 -1
  64. package/dist/internal/wrapper-singleton.d.mts +1 -1
  65. package/dist/internal/wrapper-singleton.mjs +1 -1
  66. package/dist/keepalive-chunks-Cb8TUzqR.mjs +1 -0
  67. package/dist/kernel-B2aSrvOQ.mjs +1 -0
  68. package/dist/{msw-C0yLYJU2.mjs → msw-CedHiv_x.mjs} +2 -2
  69. package/dist/plugins/device.d.mts +1 -1
  70. package/dist/plugins/errors.d.mts +1 -1
  71. package/dist/plugins/lib/loader.d.mts +1 -1
  72. package/dist/plugins/lib/types.d.mts +1 -1
  73. package/dist/plugins/logs.d.mts +1 -1
  74. package/dist/plugins/page-events.d.mts +1 -1
  75. package/dist/plugins/rage-clicks.d.mts +1 -1
  76. package/dist/plugins/replay/index.d.mts +1 -1
  77. package/dist/plugins/replay/index.mjs +1 -1
  78. package/dist/plugins/replay/upload/carryover.d.mts +2 -0
  79. package/dist/plugins/replay/upload/carryover.mjs +1 -0
  80. package/dist/plugins/replay/upload/delivery.d.mts +2 -25
  81. package/dist/plugins/replay/upload/delivery.mjs +1 -1
  82. package/dist/plugins/replay/upload/retry-queue.d.mts +15 -0
  83. package/dist/plugins/replay/upload/retry-queue.mjs +1 -0
  84. package/dist/plugins/replay/upload/upload.d.mts +1 -0
  85. package/dist/plugins/replay/upload/upload.mjs +1 -1
  86. package/dist/propagation-targets-CfPOwH4t.mjs +1 -0
  87. package/dist/{provider-BMMGZWyS.d.mts → provider-D3MUu4Pe.d.mts} +11 -8
  88. package/dist/{provider-Dy0mVCx5.d.mts → provider-DVei_D8K.d.mts} +1 -0
  89. package/dist/{provider-DwCQ_vj0.mjs → provider-ToSOe7C4.mjs} +1 -1
  90. package/dist/provider.d.mts +1 -1
  91. package/dist/react-error-handler.d.mts +1 -1
  92. package/dist/request-callsite-DAf7lGBK.mjs +3 -0
  93. package/dist/retry-queue-CUNYO4gZ.mjs +1 -0
  94. package/dist/session-BkvyVdtV.mjs +1 -0
  95. package/dist/tracking/api.d.mts +1 -1
  96. package/dist/tracking/api.mjs +1 -1
  97. package/dist/tracking/lifecycle.fixture.d.mts +1 -1
  98. package/dist/tracking/lifecycle.fixture.mjs +1 -1
  99. package/dist/tracking/registration.fixture.d.mts +1 -1
  100. package/dist/tracking/registration.fixture.mjs +1 -1
  101. package/dist/tracking/session.d.mts +1 -0
  102. package/dist/tracking/session.mjs +1 -1
  103. package/dist/{upload-D55WVf_o.mjs → upload-B9hdPLYo.mjs} +1 -1
  104. package/dist/{version-CtEAnX65.mjs → version-D3OKw6oO.mjs} +1 -1
  105. package/package.json +6 -5
  106. package/dist/activity-oYlZ5aa1.mjs +0 -1
  107. package/dist/api-C8aG7li1.mjs +0 -1
  108. package/dist/delivery-D7hULClu.mjs +0 -1
  109. package/dist/environment-CoEXhF1a.mjs +0 -1
  110. package/dist/environment-CtCFKD2N.d.mts +0 -9
  111. package/dist/exporter-CCgTznZ0.mjs +0 -1
  112. package/dist/index-CPrYhbZR.d.mts +0 -4
  113. package/dist/instrumentations-NN81kslu.mjs +0 -1
  114. package/dist/keepalive-chunks-BZv3PhHT.mjs +0 -1
  115. package/dist/kernel-zu11DwyQ.mjs +0 -1
  116. package/dist/session-C30CtCVv.mjs +0 -1
@@ -1,2 +1,3 @@
1
- import { a as InstrumentationsInput, c as testOnlyApplyXhrSpanAttrs, i as HttpStatusCodeRange, l as testOnlyCreateFailureGate, n as CaptureFailedRequestsOption, o as registerBundledInstrumentations, r as CaptureFailedRequestsOptions, s as testOnlyApplyFetchSpanAttrs, t as BundledInstrumentations, u as testOnlyResolveFailureRanges } from "../../../instrumentations-S-BCpguB.mjs";
2
- export { BundledInstrumentations, CaptureFailedRequestsOption, CaptureFailedRequestsOptions, HttpStatusCodeRange, InstrumentationsInput, registerBundledInstrumentations, testOnlyApplyFetchSpanAttrs, testOnlyApplyXhrSpanAttrs, testOnlyCreateFailureGate, testOnlyResolveFailureRanges };
1
+ import { i as resolveFailureRanges, n as CaptureFailedRequestsOptions, r as HttpStatusCodeRange, t as CaptureFailedRequestsOption } from "../../../failure-policy-BRdTiUfP.mjs";
2
+ import { a as testOnlyApplyXhrSpanAttrs, i as testOnlyApplyFetchSpanAttrs, n as InstrumentationsInput, o as testOnlyCreateFailureGate, r as registerBundledInstrumentations, t as BundledInstrumentations } from "../../../instrumentations-CSV9Xo8t.mjs";
3
+ export { BundledInstrumentations, type CaptureFailedRequestsOption, type CaptureFailedRequestsOptions, type HttpStatusCodeRange, InstrumentationsInput, registerBundledInstrumentations, testOnlyApplyFetchSpanAttrs, testOnlyApplyXhrSpanAttrs, testOnlyCreateFailureGate, resolveFailureRanges as testOnlyResolveFailureRanges };
@@ -1 +1 @@
1
- import{a as testOnlyResolveFailureRanges,i as testOnlyCreateFailureGate,n as testOnlyApplyFetchSpanAttrs,r as testOnlyApplyXhrSpanAttrs,t as registerBundledInstrumentations}from"../../../instrumentations-NN81kslu.mjs";export{registerBundledInstrumentations,testOnlyApplyFetchSpanAttrs,testOnlyApplyXhrSpanAttrs,testOnlyCreateFailureGate,testOnlyResolveFailureRanges};
1
+ import{t as resolveFailureRanges}from"../../../failure-policy-Czdz-YWP.mjs";import{i as testOnlyCreateFailureGate,n as testOnlyApplyFetchSpanAttrs,r as testOnlyApplyXhrSpanAttrs,t as registerBundledInstrumentations}from"../../../instrumentations-BV6-EClr.mjs";export{registerBundledInstrumentations,testOnlyApplyFetchSpanAttrs,testOnlyApplyXhrSpanAttrs,testOnlyCreateFailureGate,resolveFailureRanges as testOnlyResolveFailureRanges};
@@ -0,0 +1,7 @@
1
+ //#region src/internal/otel/instrumentations/propagation-targets.d.ts
2
+ export declare function registrableDomain(host: string): string | null;
3
+ export declare function originMatcher(origin: string): RegExp;
4
+ export declare function hostMatcher(host: string): RegExp;
5
+ export declare function sameSiteMatcher(pageHostname: string): RegExp | null;
6
+ export declare function knownBackendMatchers(hosts: readonly string[]): RegExp[];
7
+ //#endregion
@@ -0,0 +1 @@
1
+ import{a as sameSiteMatcher,i as registrableDomain,n as knownBackendMatchers,r as originMatcher,t as hostMatcher}from"../../../propagation-targets-CfPOwH4t.mjs";export{hostMatcher,knownBackendMatchers,originMatcher,registrableDomain,sameSiteMatcher};
@@ -0,0 +1,6 @@
1
+ import { Attributes, Span } from "@opentelemetry/api";
2
+ //#region src/internal/otel/instrumentations/request-callsite.d.ts
3
+ export declare function recordHttpFailure(span: Span, status: number, method: string, url: string, mechanism: string, attributes?: Attributes): void;
4
+ /** Retains a lazy call site and header presence for a failed request. */
5
+ export declare function captureRequestEvidence(span: Span, headers: HeadersInit | undefined, redactUrl: (url: string) => string): void;
6
+ //#endregion
@@ -0,0 +1 @@
1
+ import{n as recordHttpFailure,t as captureRequestEvidence}from"../../../request-callsite-DAf7lGBK.mjs";export{captureRequestEvidence,recordHttpFailure};
@@ -1,6 +1,6 @@
1
- import { r as SignalSender } from "../../exporter-logs-DMr5-1Yi.mjs";
1
+ import { n as SignalSender } from "../../exporter-SwuW_zLa.mjs";
2
2
  import { ExportResult } from "@opentelemetry/core";
3
3
  //#region src/internal/otel/keepalive-chunks.d.ts
4
- /** Sends `items` as one request, or as keepalive-sized requests while the page is hidden, and reports one result: the first failure, else success. */
4
+ /** Splits exports below the ingest body cap, using smaller requests while hidden, and reports one aggregate result. */
5
5
  export declare function sendInKeepaliveChunks<T>(items: T[], serialize: (items: T[]) => Uint8Array | undefined, send: SignalSender, resultCallback: (result: ExportResult) => void): void;
6
6
  //#endregion
@@ -1 +1 @@
1
- import{t as sendInKeepaliveChunks}from"../../keepalive-chunks-BZv3PhHT.mjs";export{sendInKeepaliveChunks};
1
+ import{t as sendInKeepaliveChunks}from"../../keepalive-chunks-Cb8TUzqR.mjs";export{sendInKeepaliveChunks};
@@ -1,2 +1,2 @@
1
- import { n as OtelProviderInput, r as buildOtelProvider, t as OtelProviderHandle } from "../../provider-Dy0mVCx5.mjs";
1
+ import { n as OtelProviderInput, r as buildOtelProvider, t as OtelProviderHandle } from "../../provider-DVei_D8K.mjs";
2
2
  export { OtelProviderHandle, OtelProviderInput, buildOtelProvider };
@@ -1 +1 @@
1
- import{t as buildOtelProvider}from"../../provider-DwCQ_vj0.mjs";export{buildOtelProvider};
1
+ import{t as buildOtelProvider}from"../../provider-ToSOe7C4.mjs";export{buildOtelProvider};
@@ -1,2 +1,2 @@
1
- import { v as PluginRuntime } from "../../provider-BMMGZWyS.mjs";
1
+ import { v as PluginRuntime } from "../../provider-D3MUu4Pe.mjs";
2
2
  export { PluginRuntime };
@@ -1,2 +1,2 @@
1
- import { a as InterfereContextValue, i as InterfereContext, o as NULL_CONTEXT_VALUE } from "../provider-BMMGZWyS.mjs";
1
+ import { a as InterfereContextValue, i as InterfereContext, o as NULL_CONTEXT_VALUE } from "../provider-D3MUu4Pe.mjs";
2
2
  export { InterfereContext, InterfereContextValue, NULL_CONTEXT_VALUE };
@@ -1 +1 @@
1
- import{i as ingestQueueQuerySchema,n as answerIngestQueueQuery}from"../sw-queue-protocol-DnTSOWxy.mjs";import{isRetryableStatus}from"@interfere/helpers/retry-request";import{Queue}from"workbox-background-sync";const SYNTHETIC_QUEUED_RESPONSE={status:202,statusText:`Queued`};async function postToClients(message){let clients=await self.clients.matchAll({includeUncontrolled:!1});for(let client of clients)client.postMessage(message)}async function totalQueueBytes(queue){let entries=await queue.getAll(),total=0;for(let entry of entries){let meta=entry.metadata;meta&&`bytes`in meta&&typeof meta.bytes==`number`&&(total+=meta.bytes)}return total}async function pruneOldest(queue,neededBytes){let total=await totalQueueBytes(queue);for(;total+neededBytes>10485760;){let dropped=await queue.shiftRequest();if(!dropped)break;let meta=dropped.metadata;meta&&`bytes`in meta&&typeof meta.bytes==`number`&&(total-=meta.bytes),await postToClients({reason:`queue_size_cap`,type:`interfere.sw.dropped`,url:dropped.request.url})}}async function enqueue(queue,request){let cloned=request.clone(),bytes=(await cloned.clone().arrayBuffer()).byteLength;await pruneOldest(queue,bytes),await queue.pushRequest({metadata:{bytes},request:cloned}),await postToClients({type:`interfere.sw.queued`,url:request.url})}function installIngestQueue(options={}){let matches=options.match??(url=>url.pathname.startsWith(`/api/interfere/`)),replayInFlight,replay=async q=>{replayInFlight??=(async()=>{try{let entry=await q.shiftRequest();for(;entry;){try{let res=await self.fetch(entry.request.clone());if(!res.ok&&isRetryableStatus(res.status))throw Error(`retry status ${res.status}`);await postToClients({type:`interfere.sw.replayed`,url:entry.request.url})}catch(error){throw await q.unshiftRequest(entry),error}entry=await q.shiftRequest()}}finally{replayInFlight=void 0}})(),await replayInFlight},queue=new Queue(options.queueName??`interfere-ingest`,{maxRetentionTime:1440,onSync:async({queue:q})=>{await replay(q)}});self.addEventListener(`activate`,event=>{event.waitUntil(replay(queue).catch(()=>{}))}),self.addEventListener(`message`,event=>{let[port]=event.ports,query=ingestQueueQuerySchema.safeParse(event.data);port&&query.success&&answerIngestQueueQuery(query.data,port,matches)}),self.addEventListener(`fetch`,event=>{let{request}=event;if(request.method!==`POST`)return;let url;try{url=new URL(request.url)}catch{return}matches(url,request)&&event.respondWith((async()=>{try{let res=await self.fetch(request.clone());return res.ok?res:isRetryableStatus(res.status)?(await enqueue(queue,request),new Response(null,SYNTHETIC_QUEUED_RESPONSE)):res}catch{return await enqueue(queue,request),new Response(null,SYNTHETIC_QUEUED_RESPONSE)}})())})}export{installIngestQueue};
1
+ import{i as ingestQueueQuerySchema,n as answerIngestQueueQuery}from"../sw-queue-protocol-DnTSOWxy.mjs";import{isRetryableStatus}from"@interfere/helpers/retry-request";import{Queue}from"workbox-background-sync";const MAX_QUEUE_BYTES=10485760,SYNTHETIC_QUEUED_RESPONSE={status:202,statusText:`Queued`};async function postToClients(message){let clients=await self.clients.matchAll({includeUncontrolled:!1});for(let client of clients)client.postMessage(message)}async function totalQueueBytes(queue){let entries=await queue.getAll(),total=0;for(let entry of entries){let meta=entry.metadata;meta&&`bytes`in meta&&typeof meta.bytes==`number`&&(total+=meta.bytes)}return total}async function pruneOldest(queue,neededBytes){let total=await totalQueueBytes(queue);for(;total+neededBytes>MAX_QUEUE_BYTES;){let dropped=await queue.shiftRequest();if(!dropped)break;let meta=dropped.metadata;meta&&`bytes`in meta&&typeof meta.bytes==`number`&&(total-=meta.bytes),await postToClients({reason:`queue_size_cap`,type:`interfere.sw.dropped`,url:dropped.request.url})}}async function enqueue(queue,request){let cloned=request.clone(),bytes=(await cloned.clone().arrayBuffer()).byteLength;return bytes>MAX_QUEUE_BYTES?(await postToClients({type:`interfere.sw.dropped`,url:request.url,reason:`payload_too_large`}),!1):(await pruneOldest(queue,bytes),await queue.pushRequest({metadata:{bytes},request:cloned}),await postToClients({type:`interfere.sw.queued`,url:request.url}),!0)}function installIngestQueue(options={}){let matches=options.match??(url=>url.pathname.startsWith(`/api/interfere/`)),replayInFlight,replay=async q=>{replayInFlight??=(async()=>{try{let entry=await q.shiftRequest();for(;entry;){try{let res=await self.fetch(entry.request.clone());if(!res.ok&&isRetryableStatus(res.status))throw Error(`retry status ${res.status}`);await postToClients({type:`interfere.sw.replayed`,url:entry.request.url})}catch(error){throw await q.unshiftRequest(entry),error}entry=await q.shiftRequest()}}finally{replayInFlight=void 0}})(),await replayInFlight},queue=new Queue(options.queueName??`interfere-ingest`,{maxRetentionTime:1440,onSync:async({queue:q})=>{await replay(q)}});self.addEventListener(`activate`,event=>{event.waitUntil(replay(queue).catch(()=>{}))}),self.addEventListener(`message`,event=>{let[port]=event.ports,query=ingestQueueQuerySchema.safeParse(event.data);port&&query.success&&answerIngestQueueQuery(query.data,port,matches)}),self.addEventListener(`fetch`,event=>{let{request}=event;if(request.method!==`POST`)return;let url;try{url=new URL(request.url)}catch{return}matches(url,request)&&event.respondWith((async()=>{try{let res=await self.fetch(request.clone());return res.ok?res:isRetryableStatus(res.status)&&await enqueue(queue,request)?new Response(null,SYNTHETIC_QUEUED_RESPONSE):res}catch{return await enqueue(queue,request)?new Response(null,SYNTHETIC_QUEUED_RESPONSE):new Response(null,{status:503,statusText:`Queue capacity exceeded`})}})())})}export{installIngestQueue};
@@ -1 +1 @@
1
- import{n as SDK_NAME,r as SDK_VERSION,t as PRODUCER_VERSION}from"../version-CtEAnX65.mjs";export{PRODUCER_VERSION,SDK_NAME,SDK_VERSION};
1
+ import{n as SDK_NAME,r as SDK_VERSION,t as PRODUCER_VERSION}from"../version-D3OKw6oO.mjs";export{PRODUCER_VERSION,SDK_NAME,SDK_VERSION};
@@ -1,4 +1,4 @@
1
- import { f as KernelOptions, s as Kernel } from "../provider-BMMGZWyS.mjs";
1
+ import { f as KernelOptions, s as Kernel } from "../provider-D3MUu4Pe.mjs";
2
2
  import { ConsentInput, ConsentState } from "@interfere/types/sdk/plugins/manifest";
3
3
  import { IdentifyParams } from "@interfere/types/sdk/identify";
4
4
  //#region src/internal/wrapper-singleton.d.ts
@@ -1 +1 @@
1
- import{t as createLogger}from"../log-D6Ht--tv.mjs";import{n as registerKernel,r as unregisterKernel}from"../kernel-registry-6f-3VCIy.mjs";import{n as isForceEnableActive,t as hasPublicKey}from"../config-VOyDjqS7.mjs";import{t as isEnabledByEnvironment}from"../environment-CoEXhF1a.mjs";import{r as createKernel}from"../kernel-zu11DwyQ.mjs";import{t as primeReactDomKeys}from"../react-dom-keys-BIJuLkQR.mjs";import{n as isBotUserAgent}from"../bot-YLSbnCeg.mjs";const log=createLogger(`init`);function createWrapperSingleton(input){let kernel=null,pending=null,queuedConsent=null,queuedIdentity=null,listeners=new Set;function emit(){for(let listener of listeners)listener()}async function initKernel(internalOpts){try{let k=await createKernel({opts:internalOpts});return kernel=k,registerKernel(k),queuedConsent&&=(k.consent.set(queuedConsent.value),null),queuedIdentity&&=(k.identity.set(queuedIdentity),null),emit(),k}finally{pending=null}}return{async close(){if(!kernel)return;let previous=kernel;await previous.dispose(),kernel=null,unregisterKernel(previous),emit()},consent:{get:()=>kernel?.consent.get()??null,set:value=>{kernel?kernel.consent.set(value):queuedConsent={value}}},getKernel(){if(!kernel)throw Error(`Interfere SDK not initialized. Call init() from your ${input.initEntryName} entrypoint.`);return kernel},getKernelOrNull(){return kernel},identity:{clear:()=>{queuedIdentity=null,kernel?.identity.clear()},get:()=>kernel?.identity.get()??queuedIdentity,set:async params=>{if(kernel)return kernel.identity.set(params);queuedIdentity=params}},async init(opts={}){if(kernel)return kernel;if(pending)return pending;if(!(opts.enabled??isEnabledByEnvironment())||!isForceEnableActive()&&isBotUserAgent())return null;if(!hasPublicKey())return log.warn(`No public key is configured, so the SDK is disabled. Set INTERFERE_PUBLIC_KEY (VITE_INTERFERE_PUBLIC_KEY for Vite) on builds that should send telemetry.`),null;let internalOpts={...opts,_wrapperVersions:[input.producerVersion]};return primeReactDomKeys(),pending=initKernel(internalOpts),pending},subscribeToKernel(listener){return listeners.add(listener),(()=>{listeners.delete(listener)})}}}export{createWrapperSingleton};
1
+ import{t as createLogger}from"../log-D6Ht--tv.mjs";import{n as registerKernel,r as unregisterKernel}from"../kernel-registry-6f-3VCIy.mjs";import{n as isForceEnableActive,t as hasPublicKey}from"../config-VOyDjqS7.mjs";import{t as isEnabledByEnvironment}from"../environment-CC7GnqAv.mjs";import{r as createKernel}from"../kernel-B2aSrvOQ.mjs";import{t as primeReactDomKeys}from"../react-dom-keys-BIJuLkQR.mjs";import{n as isBotUserAgent}from"../bot-YLSbnCeg.mjs";const log=createLogger(`init`);function createWrapperSingleton(input){let kernel=null,pending=null,queuedConsent=null,queuedIdentity=null,listeners=new Set;function emit(){for(let listener of listeners)listener()}async function initKernel(internalOpts){try{let k=await createKernel({opts:internalOpts});return kernel=k,registerKernel(k),queuedConsent&&=(k.consent.set(queuedConsent.value),null),queuedIdentity&&=(k.identity.set(queuedIdentity),null),emit(),k}finally{pending=null}}return{async close(){if(!kernel)return;let previous=kernel;await previous.dispose(),kernel=null,unregisterKernel(previous),emit()},consent:{get:()=>kernel?.consent.get()??null,set:value=>{kernel?kernel.consent.set(value):queuedConsent={value}}},getKernel(){if(!kernel)throw Error(`Interfere SDK not initialized. Call init() from your ${input.initEntryName} entrypoint.`);return kernel},getKernelOrNull(){return kernel},identity:{clear:()=>{queuedIdentity=null,kernel?.identity.clear()},get:()=>kernel?.identity.get()??queuedIdentity,set:async params=>{if(kernel)return kernel.identity.set(params);queuedIdentity=params}},async init(opts={}){if(kernel)return kernel;if(pending)return pending;if(!(opts.enabled??isEnabledByEnvironment())||!isForceEnableActive()&&isBotUserAgent())return null;if(!hasPublicKey())return log.warn(`No public key is configured, so the SDK is disabled. Set INTERFERE_PUBLIC_KEY (VITE_INTERFERE_PUBLIC_KEY for Vite) on builds that should send telemetry.`),null;let internalOpts={...opts,_wrapperVersions:[input.producerVersion]};return primeReactDomKeys(),pending=initKernel(internalOpts),pending},subscribeToKernel(listener){return listeners.add(listener),(()=>{listeners.delete(listener)})}}}export{createWrapperSingleton};
@@ -0,0 +1 @@
1
+ import{t as isPageHidden}from"./page-lifecycle-rJEJNdKj.mjs";import{ExportResultCode}from"@opentelemetry/core";const REQUEST_MAX_BYTES=4194304;function splitPayloads(items,serialize,maxBytes){let chunks=[],pending=[items];for(let next=pending.pop();next;next=pending.pop()){let payload=serialize(next);if(next.length<=1||(payload?.byteLength??0)<=maxBytes){chunks.push(payload);continue}let middle=Math.ceil(next.length/2);pending.push(next.slice(middle),next.slice(0,middle))}return chunks}function sendInKeepaliveChunks(items,serialize,send,resultCallback){let chunks=splitPayloads(items,serialize,isPageHidden()?16e3:REQUEST_MAX_BYTES),pending=chunks.length,failure,settle=result=>{result.code!==ExportResultCode.SUCCESS&&(failure??=result),--pending,pending===0&&resultCallback(failure??{code:ExportResultCode.SUCCESS})};for(let payload of chunks)(payload?.byteLength??0)>REQUEST_MAX_BYTES?settle({code:ExportResultCode.FAILED,error:Error(`A telemetry record exceeds the export body limit`)}):send(payload,settle)}export{sendInKeepaliveChunks as t};
@@ -0,0 +1 @@
1
+ import{t as createLogger}from"./log-D6Ht--tv.mjs";import{i as onPageUnloading,n as onPageHidden}from"./page-lifecycle-rJEJNdKj.mjs";import{t as clearExportCarryover}from"./export-carryover-Y9VbQiAB.mjs";import{t as SessionTracker}from"./api-BEM97FWM.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-D3OKw6oO.mjs";import{t as INGEST_IGNORE_RE}from"./exporter-DqqNP_gQ.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-DgB1_Xc5.mjs";import{isNonErrorException,shouldDropBrowserExtensionNoise,shouldDropUnresolvableStack}from"@interfere/types/sdk/errors";import{trace}from"@opentelemetry/api";import{omitUndefined}from"@interfere/helpers/omit-undefined";import{readBakedBackendHosts}from"@interfere/types/sdk/remote-config/backend-hosts";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),runtime.getConsent()?.analytics===!1?clearExportCarryover():runtime.getConsent()?.replay===!1&&clearExportCarryover(`replay:`)}},this.identity={clear:()=>{clearExportCarryover(),this.tracker.reset()},get:()=>this.tracker.getIdentity(),set:async params=>this.tracker.identify(params)},this.device={getDeviceId:()=>this.tracker.getDeviceId(),getFpHash:()=>this.tracker.getFpHash()},this.session={getId:()=>this.tracker.sessionId(),getWindowId:()=>this.tracker.windowId()},this.unsubscribePageHidden=onPageHidden(()=>{this.flush().catch(()=>{})}),this.unsubscribePageUnloading=onPageUnloading(()=>{this.flush().catch(()=>{})})}attachRuntime(runtime){this.runtime=runtime}requireRuntime(){if(!this.runtime)throw Error(`Kernel runtime not attached. createKernel must call attachRuntime before any consent/dispose path runs.`);return this.runtime}getSessionId(){return this.tracker.sessionId()??``}getWindowId(){return this.tracker.windowId()??``}onSessionPause(handler){return this.tracker.onSessionPause(handler)}onSessionExceptionWhilePaused(handler){return this.tracker.onSessionExceptionWhilePaused(handler)}noteException(){this.tracker.noteException()}onSessionResume(handler){return this.tracker.onSessionResume(handler)}getPluginConfigState(key){return this.requireRuntime().getPluginConfigState(key)}getReplayConfig(){return this.requireRuntime().getReplayConfig()}isInteractionCaptureEnabled(){return this.requireRuntime().isInteractionCaptureEnabled()}subscribePluginConfigState(key,listener){return this.requireRuntime().subscribePluginConfigState(key,listener)}getTracer(name){return this.otel?.tracerProvider.getTracer(name)??trace.getTracer(name)}startPageEventsCapture(){let{otelControls:controls,otel}=this;return!controls||!otel?null:(controls.setPageEventsEnabled(!0),this.recordInitialNavigation(otel.loggerProvider),(()=>{controls.setPageEventsEnabled(!1)}))}startDeviceInfoCapture(){return this.tracker.startDeviceIdentity(),this.deviceInfoCaptureEnabled=!0,(reason=>{this.deviceInfoCaptureEnabled=!1,reason===`consent-revoked`&&this.tracker.discardDeviceIdentity()})}isDeviceInfoCaptureEnabled(){return this.deviceInfoCaptureEnabled}recordException(value,opts){if(!isNonErrorException(value)){if(this.seen.has(value))return;this.seen.add(value)}if(!isNonErrorException(value)){let stacks=[],current=value;for(let depth=0;current&&depth<5;depth+=1)current.stack&&stacks.push(current.stack),current=current.cause instanceof Error?current.cause:void 0;if(shouldDropBrowserExtensionNoise(stacks)||shouldDropUnresolvableStack(stacks))return}this.tracker.noteException();let attrs=buildExceptionEventAttrs(value,opts),active=trace.getActiveSpan();if(active?.isRecording()){recordExceptionOnSpan(active,value,attrs,opts.mechanism.handled);return}let tracer=this.otel?.tracerProvider.getTracer(`@interfere/react/exception`);if(!tracer)return;let span=startExceptionSpan(tracer,value);recordExceptionOnSpan(span,value,attrs,opts.mechanism.handled),span.end()}recordLog(input){this.otel&&this.otel.loggerProvider.getLogger(`@interfere/react`).emit(omitUndefined({body:input.body,severityNumber:input.severityNumber,severityText:input.severityText,attributes:input.attributes}))}recordInitialNavigation(loggerProvider){recordInitialNavigation({getSessionId:()=>this.session.getId(),getWindowId:()=>this.session.getWindowId(),loggerProvider,redactUrl:this.redactUrl,seen:this.initialNavigationSeen})}async flush(){this.otel&&await this.otel.flush()}attachOtel(handle,dispose,controls){this.otel=handle,this.otelDispose=dispose,this.otelControls=controls??null}syncProviderConfig(config){this.requireRuntime().applyProviderConfig(config.plugins,config.consent),this.requireRuntime().getConsent()?.analytics===!1?clearExportCarryover():this.requireRuntime().getConsent()?.replay===!1&&clearExportCarryover(`replay:`)}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),{plugins:remotePlugins,backendHosts}=await resolveRemoteConfig(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),backendHosts&&(resolvedTracing.backendHosts=backendHosts),await wireOtel(kernel,targets,opts._wrapperVersions,resolvedTracing)}return remotePlugins?runtime.applyRemoteConfig(remotePlugins):runtime.applyRemoteConfigDefaults(),kernel}async function resolveRemoteConfig(opts,fetcher){let baked=readBakedPlugins();if(baked)return{plugins:baked,backendHosts:readBakedBackendHosts()};let remoteConfig=await fetchRemoteConfig(resolveTargets(opts.apiHost).config,fetcher);return remoteConfig?.ingestUrl&&setIngestHost(remoteConfig.ingestUrl),{plugins:remoteConfig?.plugins??null,backendHosts:remoteConfig?.backendHosts}}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,canPersistExports:()=>kernel.consent.get()?.analytics!==!1,getDeviceId:()=>kernel.device.getDeviceId(),getSessionId:()=>kernel.session.getId(),getPropagationSessionId:()=>kernel.consent.get()?.analytics===!1?null:kernel.session.getId(),isDeviceInfoEnabled:()=>kernel.isDeviceInfoCaptureEnabled(),onExceptionSpan:()=>{kernel.noteException()},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,...tracing.ignoreUrls??[]],apiHosts:tracing.apiHosts,backendHosts:tracing.backendHosts,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};