@interfere/react 12.1.3 → 12.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{activity-D18VXGTn.mjs → activity-BYnL3bX-.mjs} +1 -1
- package/dist/{api-DXmjUMZE.mjs → api-BUYnj5MA.mjs} +1 -1
- package/dist/{chunking-Dvs3f50A.d.mts → chunking-OfmdRxfq.d.mts} +1 -1
- package/dist/{compressor-host-BAz6860r.d.mts → compressor-host-D3At2PKg.d.mts} +1 -1
- package/dist/{config-q16LFWj0.d.mts → config-BTWtCcDP.d.mts} +1 -1
- package/dist/{config-DEOvGbf0.mjs → config-VOyDjqS7.mjs} +1 -1
- package/dist/delivery-_q1bkaIt.mjs +1 -0
- package/dist/{environment-_LKcAXKG.d.mts → environment-CtCFKD2N.d.mts} +1 -1
- package/dist/error-boundary.d.mts +1 -1
- package/dist/{errors-BDmCWb5z.mjs → errors-BfUmjgWO.mjs} +1 -1
- package/dist/exception-span-B74fhBQb.mjs +1 -0
- package/dist/exception-span-zN1tvBdh.d.mts +46 -0
- package/dist/exporter-D6Ld-TFZ.mjs +1 -0
- package/dist/index-BZ_yQUGY.d.mts +4 -0
- package/dist/{instrumentations-CpTaahVx.d.mts → instrumentations-D656I08h.d.mts} +1 -1
- package/dist/internal/activity/activity.mjs +1 -1
- package/dist/internal/{browser-context.d.mts → browser-context/browser-context.d.mts} +1 -1
- package/dist/internal/browser-context/browser-context.mjs +1 -0
- package/dist/internal/{capture-boundary.d.mts → capture/capture-boundary.d.mts} +2 -2
- package/dist/internal/capture/capture-boundary.mjs +1 -0
- package/dist/internal/{capture.d.mts → capture/capture.d.mts} +2 -2
- package/dist/internal/capture/capture.mjs +1 -0
- package/dist/internal/capture/exception-span.d.mts +2 -0
- package/dist/internal/capture/exception-span.mjs +1 -0
- package/dist/internal/{config.d.mts → config/config.d.mts} +1 -1
- package/dist/internal/config/config.mjs +1 -0
- package/dist/internal/{consent.d.mts → consent/consent.d.mts} +1 -1
- package/dist/internal/consent/consent.mjs +1 -0
- package/dist/internal/{console-patch.d.mts → console-patch/console-patch.d.mts} +1 -1
- package/dist/internal/console-patch/console-patch.mjs +1 -0
- package/dist/internal/{device-metadata.d.mts → device-metadata/device-metadata.d.mts} +1 -1
- package/dist/internal/device-metadata/device-metadata.mjs +1 -0
- package/dist/internal/environment/environment.d.mts +2 -0
- package/dist/internal/environment/environment.mjs +1 -0
- package/dist/internal/{event-capabilities.d.mts → event-capabilities/event-capabilities.d.mts} +1 -1
- package/dist/internal/event-capabilities/event-capabilities.mjs +1 -0
- package/dist/internal/{hydration.d.mts → hydration/hydration.d.mts} +1 -1
- package/dist/internal/hydration/hydration.mjs +1 -0
- package/dist/internal/kernel-registry.d.mts +1 -1
- package/dist/internal/kernel.d.mts +5 -4
- package/dist/internal/kernel.mjs +1 -1
- package/dist/internal/otel/exporter.mjs +1 -1
- package/dist/internal/otel/index.d.mts +2 -2
- package/dist/internal/otel/index.mjs +1 -1
- package/dist/internal/otel/{instrumentations.d.mts → instrumentations/instrumentations.d.mts} +1 -1
- package/dist/internal/otel/instrumentations/instrumentations.mjs +1 -0
- package/dist/internal/otel/provider.mjs +1 -1
- package/dist/internal/page-lifecycle/keepalive-budget.d.mts +6 -0
- package/dist/internal/page-lifecycle/keepalive-budget.mjs +1 -0
- package/dist/internal/page-lifecycle/page-lifecycle.d.mts +2 -0
- package/dist/internal/page-lifecycle/page-lifecycle.mjs +1 -1
- package/dist/internal/plugins/plugin-runtime.d.mts +1 -1
- package/dist/internal/plugins/plugin-runtime.mjs +1 -1
- package/dist/internal/react-context.d.mts +1 -1
- package/dist/internal/{server-digest.d.mts → server-digest/server-digest.d.mts} +1 -1
- package/dist/internal/server-digest/server-digest.mjs +1 -0
- package/dist/internal/sw-queue.mjs +1 -1
- package/dist/internal/version.mjs +1 -1
- package/dist/internal/wrapper-singleton.d.mts +1 -1
- package/dist/internal/wrapper-singleton.mjs +1 -1
- package/dist/keepalive-budget-DeafGnVZ.mjs +1 -0
- package/dist/kernel-D52QMtA9.mjs +1 -0
- package/dist/{loader-BGwWwN2n.mjs → loader-DIaWtHND.mjs} +1 -1
- package/dist/page-lifecycle-DTWqGlz2.mjs +1 -0
- package/dist/{plugin-runtime-CnFVGbJw.mjs → plugin-runtime-B1oFO16q.mjs} +1 -1
- package/dist/plugins/device.d.mts +1 -1
- package/dist/plugins/errors.d.mts +1 -1
- package/dist/plugins/errors.mjs +1 -1
- package/dist/plugins/lib/loader.d.mts +1 -1
- package/dist/plugins/lib/loader.mjs +1 -1
- package/dist/plugins/lib/types.d.mts +1 -1
- package/dist/plugins/logs.d.mts +1 -1
- package/dist/plugins/logs.mjs +1 -1
- package/dist/plugins/page-events.d.mts +1 -1
- package/dist/plugins/rage-clicks.d.mts +1 -1
- package/dist/plugins/replay/{buffer.d.mts → chunking/buffer.d.mts} +2 -2
- package/dist/plugins/replay/chunking/buffer.mjs +1 -0
- package/dist/plugins/replay/{chunking.d.mts → chunking/chunking.d.mts} +1 -1
- package/dist/plugins/replay/chunking/chunking.mjs +1 -0
- package/dist/plugins/replay/compression/compressor-host.d.mts +2 -0
- package/dist/plugins/replay/compression/compressor-host.mjs +1 -0
- package/dist/plugins/replay/compression/unload-gzip.d.mts +4 -0
- package/dist/plugins/replay/compression/unload-gzip.mjs +1 -0
- package/dist/plugins/replay/index.d.mts +1 -1
- package/dist/plugins/replay/index.mjs +1 -1
- package/dist/plugins/replay/{recorder.d.mts → recorder/recorder.d.mts} +2 -2
- package/dist/plugins/replay/recorder/recorder.mjs +1 -0
- package/dist/plugins/replay/{redact-urls.d.mts → recorder/redact-urls.d.mts} +1 -1
- package/dist/plugins/replay/recorder/redact-urls.mjs +1 -0
- package/dist/plugins/replay/{sequence.d.mts → sequence/sequence.d.mts} +1 -1
- package/dist/plugins/replay/sequence/sequence.mjs +1 -0
- package/dist/plugins/replay/upload/delivery.d.mts +22 -0
- package/dist/plugins/replay/upload/delivery.mjs +1 -0
- package/dist/plugins/replay/upload/upload.d.mts +7 -0
- package/dist/plugins/replay/upload/upload.mjs +1 -0
- package/dist/{provider-BaTLPKUE.mjs → provider-BMoWBbsK.mjs} +1 -1
- package/dist/{provider-D42pbUQM.d.mts → provider-DIp7vkKd.d.mts} +21 -47
- package/dist/provider.d.mts +1 -1
- package/dist/react-error-handler.d.mts +1 -1
- package/dist/session-retry-C2Uh7eZ6.mjs +1 -0
- package/dist/tracking/api.mjs +1 -1
- package/dist/tracking/registration.fixture.mjs +2 -2
- package/dist/tracking/session-retry.mjs +1 -1
- package/dist/unload-gzip-WX9FyWPs.mjs +1 -0
- package/dist/upload-BIh8Q5UQ.mjs +1 -0
- package/dist/{version-bsLJPQam.mjs → version-CSFECZRw.mjs} +1 -1
- package/package.json +7 -7
- package/dist/delivery-DehIJWRh.mjs +0 -1
- package/dist/exporter-CoS_3BGr.mjs +0 -1
- package/dist/index-BQDRTFUY.d.mts +0 -4
- package/dist/internal/browser-context.mjs +0 -1
- package/dist/internal/capture-boundary.mjs +0 -1
- package/dist/internal/capture.mjs +0 -1
- package/dist/internal/config.mjs +0 -1
- package/dist/internal/consent.mjs +0 -1
- package/dist/internal/console-patch.mjs +0 -1
- package/dist/internal/device-metadata.mjs +0 -1
- package/dist/internal/environment.d.mts +0 -2
- package/dist/internal/environment.mjs +0 -1
- package/dist/internal/event-capabilities.mjs +0 -1
- package/dist/internal/hydration.mjs +0 -1
- package/dist/internal/otel/instrumentations.mjs +0 -1
- package/dist/internal/server-digest.mjs +0 -1
- package/dist/kernel-CTgUOP_1.mjs +0 -1
- package/dist/page-lifecycle-BhSFqjlK.mjs +0 -1
- package/dist/plugins/replay/buffer.mjs +0 -1
- package/dist/plugins/replay/chunking.mjs +0 -1
- package/dist/plugins/replay/compressor-host.d.mts +0 -2
- package/dist/plugins/replay/compressor-host.mjs +0 -1
- package/dist/plugins/replay/delivery.d.mts +0 -20
- package/dist/plugins/replay/delivery.mjs +0 -1
- package/dist/plugins/replay/recorder.mjs +0 -1
- package/dist/plugins/replay/redact-urls.mjs +0 -1
- package/dist/plugins/replay/sequence.mjs +0 -1
- package/dist/plugins/replay/upload.d.mts +0 -4
- package/dist/plugins/replay/upload.mjs +0 -1
- package/dist/session-retry-DJHvfDaO.mjs +0 -1
- package/dist/upload-BPaD3YcA.mjs +0 -1
package/dist/plugins/errors.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as errorsPlugin}from"../errors-
|
|
1
|
+
import{t as errorsPlugin}from"../errors-BfUmjgWO.mjs";export{errorsPlugin as default};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { S as resolveFeatures, b as PluginOverrides, x as loadPlugin, y as LOADERS } from "../../provider-DIp7vkKd.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-DIaWtHND.mjs";export{LOADERS,loadPlugin,resolveFeatures};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { C as Plugin, D as PluginTeardownReason, E as PluginContext, T as PluginConfigState, w as PluginCleanup } from "../../provider-DIp7vkKd.mjs";
|
|
2
2
|
export { Plugin, PluginCleanup, PluginConfigState, PluginContext, PluginTeardownReason };
|
package/dist/plugins/logs.d.mts
CHANGED
package/dist/plugins/logs.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as activeKernel}from"../kernel-registry-6f-3VCIy.mjs";import{
|
|
1
|
+
import{t as activeKernel}from"../kernel-registry-6f-3VCIy.mjs";import{t as safeStringify}from"../stringify-DvuHsAT4.mjs";import{n as onConsoleCall}from"../console-patch-WNKoLE7U.mjs";import{SeverityNumber}from"@opentelemetry/api-logs";const LEVEL_TO_SEVERITY={debug:{number:SeverityNumber.DEBUG,text:`DEBUG`},error:{number:SeverityNumber.ERROR,text:`ERROR`},info:{number:SeverityNumber.INFO,text:`INFO`},log:{number:SeverityNumber.INFO,text:`INFO`},warn:{number:SeverityNumber.WARN,text:`WARN`}},logsPlugin={name:`logs`,setup(){return onConsoleCall((level,args)=>{if(args.some(a=>a instanceof Error))return;let kernel=activeKernel();if(!kernel)return;let sev=LEVEL_TO_SEVERITY[level];kernel.recordLog({attributes:{"console.level":level},body:args.length===1?safeStringify(args[0]):args.map(element=>safeStringify(element)).join(` `),severityNumber:sev.number,severityText:sev.text})})}};export{logsPlugin as default};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { t as BufferedReplayEvent } from "
|
|
1
|
+
import { t as BufferedReplayEvent } from "../../../chunking-OfmdRxfq.mjs";
|
|
2
2
|
import { eventWithTime } from "@rrweb/types";
|
|
3
|
-
//#region src/plugins/replay/buffer.d.ts
|
|
3
|
+
//#region src/plugins/replay/chunking/buffer.d.ts
|
|
4
4
|
export interface ReplayBuffer {
|
|
5
5
|
drain: () => BufferedReplayEvent[];
|
|
6
6
|
push: (event: eventWithTime) => void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as createReplayBuffer}from"../../../buffer-BRn_kSm-.mjs";export{createReplayBuffer};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as splitReplayEvents, i as classifyReplayEvent, n as ReplayChunkPayload, o as toReplayChunkPayload, r as SplitReplayEventsResult, s as utf8ByteLength, t as BufferedReplayEvent } from "
|
|
1
|
+
import { a as splitReplayEvents, i as classifyReplayEvent, n as ReplayChunkPayload, o as toReplayChunkPayload, r as SplitReplayEventsResult, s as utf8ByteLength, t as BufferedReplayEvent } from "../../../chunking-OfmdRxfq.mjs";
|
|
2
2
|
export { BufferedReplayEvent, ReplayChunkPayload, SplitReplayEventsResult, classifyReplayEvent, splitReplayEvents, toReplayChunkPayload, utf8ByteLength };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{i as utf8ByteLength,n as splitReplayEvents,r as toReplayChunkPayload,t as classifyReplayEvent}from"../../../chunking-qZffPbyY.mjs";export{classifyReplayEvent,splitReplayEvents,toReplayChunkPayload,utf8ByteLength};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as createCompressor}from"../../../compressor-host-CrKngamF.mjs";export{createCompressor};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
//#region src/plugins/replay/compression/unload-gzip.d.ts
|
|
2
|
+
/** Gzips an unload body synchronously so it can fit the keepalive budget. Returns null when the body is too large to compress during unload or compression fails. */
|
|
3
|
+
export declare function gzipForUnload(bytes: Uint8Array<ArrayBuffer>): Uint8Array<ArrayBuffer> | null;
|
|
4
|
+
//#endregion
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as gzipForUnload}from"../../../unload-gzip-WX9FyWPs.mjs";export{gzipForUnload};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as createLogger}from"../../log-D6Ht--tv.mjs";import{r as
|
|
1
|
+
import{t as createLogger}from"../../log-D6Ht--tv.mjs";import{n as onPageShown,r as onPageUnloading,t as onPageHidden}from"../../page-lifecycle-DTWqGlz2.mjs";import{r as resolveTargets}from"../../config-VOyDjqS7.mjs";import{i as toRecordOptions}from"../../config-DapTbKhs.mjs";import{n as splitReplayEvents,r as toReplayChunkPayload}from"../../chunking-qZffPbyY.mjs";import{t as createReplayBuffer}from"../../buffer-BRn_kSm-.mjs";import{t as createCompressor}from"../../compressor-host-CrKngamF.mjs";import{n as deliverChunk,t as REPLAY_TRACER_NAME}from"../../delivery-_q1bkaIt.mjs";import{t as startReplayRecorder}from"../../recorder-CM6Ae_0S.mjs";import{t as redactReplayEvent}from"../../redact-urls-CwFod9d4.mjs";import{t as createSegmentSequence}from"../../sequence-B4dYChb0.mjs";import{omitUndefined}from"@interfere/helpers/omit-undefined";import{EventType}from"@rrweb/types";const log=createLogger(`replay`);function isBrowserApiRejection(error){return Object.prototype.toString.call(error)===`[object DOMException]`}const replayPlugin={name:`replay`,setup(ctx){let targets=resolveTargets(),recorder=null,flushTimer=null,unsubscribeConfig=null,unsubscribeHidden=null,unsubscribeShown=null,unsubscribeUnloading=null,unsubscribePause=null,unsubscribeResume=null,isPaused=!1,startup=new AbortController,compressor=createCompressor(),windowId=ctx.getWindowId(),sequence=createSegmentSequence(windowId),consecutiveFailures=0,recorderFaults=0,halted=!1;function halt(reason,detail){halted||(halted=!0,ctx.getTracer(REPLAY_TRACER_NAME).startSpan(`replay.halt`,{attributes:omitUndefined({"replay.halt.reason":reason,"replay.halt.detail":detail,"replay.halt.recorder_faults":recorderFaults})}).end(),startup.abort(),clearFlushTimer(),recorder?.stop(),recorder=null)}function clearFlushTimer(){flushTimer&&=(clearInterval(flushTimer),null)}function armFlushTimer(){clearFlushTimer(),flushTimer=setInterval(()=>{clearFlushTimer(),flushTimer=setInterval(flush,1e4),flush()},2e3)}function handleResult(result){if(result===`ok`){consecutiveFailures=0;return}if(result===`fatal`){log.warn(`replay halted: upload rejected`),halt(`upload-rejected`);return}consecutiveFailures+=1,consecutiveFailures>=3&&(log.warn(`replay halted after %d consecutive upload failures`,consecutiveFailures),halt(`upload-failed`))}function handleRecorderFault(error){if(isBrowserApiRejection(error)){log.debug(`recorder passed through a browser API rejection: %s`,error instanceof Error?error.name:`DOMException`);return}recorderFaults+=1,!(recorderFaults>10)&&(log.warn(`recorder fault: %s`,error instanceof Error?error.constructor.name:`UnknownError`),recorderFaults===10&&(log.warn(`replay halted after %d recorder faults`,10),flush(),halt(`recorder-faults`,error instanceof Error?error.constructor.name:`UnknownError`)))}let buffer=createReplayBuffer({onSoftLimit:flush,softLimitBytes:4194304});function flush(opts){if(halted||ctx.getPluginConfigState(`replay`)!==`enabled`)return;let drained=buffer.drain();if(drained.length===0)return;let{chunks,droppedEventBytes}=splitReplayEvents(drained);for(let bytes of droppedEventBytes)log.warn(`dropping replay event of ~%d bytes: too large to upload`,bytes);for(let group of chunks)sendChunk(toReplayChunkPayload(group),opts?.unload??!1)}async function sendChunk(payload,unload){try{handleResult(await deliverChunk({target:targets.ingest,chunk:{segmentId:sequence.take(),windowId},compressor,ctx,payload,unload}))}catch(error){log.warn(`replay chunk dropped: %s`,error instanceof Error?error.constructor.name:`UnknownError`),handleResult(`retryable`)}}let pauseRecording=unload=>{isPaused||(isPaused=!0,recorder?.stop(),flush(unload?{unload:!0}:void 0))},resumeRecording=()=>{isPaused&&(isPaused=!1,recorder?.start(),armFlushTimer())},recordOptions=toRecordOptions(ctx.getReplayConfig(),ctx.privacyPolicy);return(async()=>{if(recorder=await startReplayRecorder({onEvent:(event,isCheckout)=>{startup.signal.aborted||(isCheckout&&event.type===EventType.Meta&&flush(),redactReplayEvent(event,ctx.redactUrl),buffer.push(event))},onFault:handleRecorderFault,recordOptions,signal:startup.signal}),startup.signal.aborted){recorder?.stop(),recorder=null;return}recorder&&(unsubscribeConfig=ctx.subscribePluginConfigState(`replay`,state=>{state===`enabled`&&flush()}),armFlushTimer(),unsubscribeHidden=onPageHidden(()=>{pauseRecording(!0)}),unsubscribeUnloading=onPageUnloading(()=>{flush({unload:!0})}),unsubscribeShown=onPageShown(resumeRecording),unsubscribePause=ctx.onSessionPause(()=>{pauseRecording(!1)}),unsubscribeResume=ctx.onSessionResume(resumeRecording),log.debug(`recording started`))})().catch(error=>{let detail=error instanceof Error?error.constructor.name:`UnknownError`;log.warn(`replay initialization failed: %s`,detail),halt(`init-failed`,detail)}),reason=>{reason===`consent-revoked`?(buffer.drain(),log.debug(`replay buffer discarded: consent revoked`)):flush(),startup.abort(),recorder?.stop(),clearFlushTimer(),unsubscribeConfig?.(),unsubscribeHidden?.(),unsubscribeShown?.(),unsubscribeUnloading?.(),unsubscribePause?.(),unsubscribeResume?.(),compressor.dispose()}}};export{replayPlugin as default};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { o as ReplayRecordOptions } from "
|
|
1
|
+
import { o as ReplayRecordOptions } from "../../../config-Dyc09HCZ.mjs";
|
|
2
2
|
import { eventWithTime } from "@rrweb/types";
|
|
3
|
-
//#region src/plugins/replay/recorder.d.ts
|
|
3
|
+
//#region src/plugins/replay/recorder/recorder.d.ts
|
|
4
4
|
export interface ReplayRecorder {
|
|
5
5
|
start: () => boolean;
|
|
6
6
|
stop: () => void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as startReplayRecorder}from"../../../recorder-CM6Ae_0S.mjs";export{startReplayRecorder};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { eventWithTime } from "@rrweb/types";
|
|
2
|
-
//#region src/plugins/replay/redact-urls.d.ts
|
|
2
|
+
//#region src/plugins/replay/recorder/redact-urls.d.ts
|
|
3
3
|
type RedactUrl = (url: string) => string;
|
|
4
4
|
/** Rewrites URLs that rrweb records in page metadata and DOM attributes before the event leaves the browser. */
|
|
5
5
|
export declare function redactReplayEvent(event: eventWithTime, redactUrl: RedactUrl): void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as redactReplayEvent}from"../../../redact-urls-CwFod9d4.mjs";export{redactReplayEvent};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as createSegmentSequence}from"../../../sequence-B4dYChb0.mjs";export{createSegmentSequence};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { E as PluginContext } from "../../../provider-DIp7vkKd.mjs";
|
|
2
|
+
import { r as resolveTargets } from "../../../config-BTWtCcDP.mjs";
|
|
3
|
+
import { n as ReplayChunkPayload } from "../../../chunking-OfmdRxfq.mjs";
|
|
4
|
+
import { t as Compressor } from "../../../compressor-host-D3At2PKg.mjs";
|
|
5
|
+
//#region src/plugins/replay/upload/delivery.d.ts
|
|
6
|
+
export declare const REPLAY_TRACER_NAME = "@interfere/react/replay";
|
|
7
|
+
export type DeliverResult = "ok" | "retryable" | "fatal";
|
|
8
|
+
export interface ReplayChunkRef {
|
|
9
|
+
segmentId: number;
|
|
10
|
+
windowId: string;
|
|
11
|
+
}
|
|
12
|
+
export interface DeliverInput {
|
|
13
|
+
target: ReturnType<typeof resolveTargets>["ingest"];
|
|
14
|
+
chunk: ReplayChunkRef;
|
|
15
|
+
compressor: Compressor;
|
|
16
|
+
ctx: PluginContext;
|
|
17
|
+
payload: ReplayChunkPayload;
|
|
18
|
+
/** 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
|
+
unload: boolean;
|
|
20
|
+
}
|
|
21
|
+
export declare function deliverChunk({ ctx, chunk, target, compressor, payload, unload }: DeliverInput): Promise<"fatal" | "ok" | "retryable">;
|
|
22
|
+
//#endregion
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{n as deliverChunk,t as REPLAY_TRACER_NAME}from"../../../delivery-_q1bkaIt.mjs";export{REPLAY_TRACER_NAME,deliverChunk};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { r as resolveTargets } from "../../../config-BTWtCcDP.mjs";
|
|
2
|
+
//#region src/plugins/replay/upload/upload.d.ts
|
|
3
|
+
export interface UploadReplayChunkOptions {
|
|
4
|
+
keepalive: boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare function uploadReplayChunk(target: ReturnType<typeof resolveTargets>["ingest"], sessionId: string, body: Uint8Array<ArrayBuffer>, headers: Record<string, string>, options?: UploadReplayChunkOptions): Promise<Response>;
|
|
7
|
+
//#endregion
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as uploadReplayChunk}from"../../../upload-BIh8Q5UQ.mjs";export{uploadReplayChunk};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as getStringGlobal}from"./global-DYq1Z4_H.mjs";import{n as SDK_NAME,r as SDK_VERSION}from"./version-
|
|
1
|
+
import{n as getStringGlobal}from"./global-DYq1Z4_H.mjs";import{n as SDK_NAME,r as SDK_VERSION}from"./version-CSFECZRw.mjs";import{i as createTraceExporter,n as createLogExporter,r as createMetricExporter}from"./exporter-D6Ld-TFZ.mjs";import{t as PageScopeContextManager}from"./page-scope-context-manager-DhArvVJ_.mjs";import{context,propagation}from"@opentelemetry/api";import{omitUndefined}from"@interfere/helpers/omit-undefined";import{ENVIRONMENT_GLOBAL}from"@interfere/types/sdk/injected-globals";import{createUrlRedactionSpanProcessor,resolveUrlRedaction}from"@interfere/types/sdk/url-redaction";import{CompositePropagator,W3CBaggagePropagator,W3CTraceContextPropagator}from"@opentelemetry/core";import{defaultServiceName,detectResources,resourceFromAttributes}from"@opentelemetry/resources";import{MeterProvider,PeriodicExportingMetricReader}from"@opentelemetry/sdk-metrics";import{WebTracerProvider}from"@opentelemetry/sdk-trace-web";import{resolveEnvironment}from"@interfere/types/sdk/runtime";import{browserDetector}from"@opentelemetry/opentelemetry-browser-detector";import{BatchLogRecordProcessor,LoggerProvider}from"@opentelemetry/sdk-logs";import{BatchSpanProcessor}from"@opentelemetry/sdk-trace-base";import{createSessionLogRecordProcessor,createSessionSpanProcessor}from"@opentelemetry/web-common";const ATTR_DEVICE_ID=`device.id`,BROWSER_BATCH_OPTIONS={exportTimeoutMillis:7e4,maxExportBatchSize:10,maxQueueSize:2048,scheduledDelayMillis:2e3};function createSessionBaggagePropagator(getSessionId){let propagator=new W3CBaggagePropagator;return{fields:()=>propagator.fields(),extract:(ctx,carrier,getter)=>propagator.extract(ctx,carrier,getter),inject:(ctx,carrier,setter)=>{let sessionId=getSessionId(),baggage=propagation.getBaggage(ctx)??propagation.createBaggage(),updated=sessionId?baggage.setEntry(`session.id`,{value:sessionId}):baggage.removeEntry(`session.id`);propagator.inject(propagation.setBaggage(ctx,updated),carrier,setter)}}}function createDeviceSpanProcessor(opts){return{forceFlush:async()=>Promise.resolve(),onEnd(){},onStart(span){let id=opts.getDeviceId();id&&span.setAttribute(ATTR_DEVICE_ID,id)},shutdown:async()=>Promise.resolve()}}function createDeviceLogRecordProcessor(opts){return{forceFlush:async()=>Promise.resolve(),onEmit(logRecord){let id=opts.getDeviceId();id&&logRecord.setAttribute(ATTR_DEVICE_ID,id)},shutdown:async()=>Promise.resolve()}}function stampGatedAttributes(target,opts){if(opts.isEnabled())for(let[key,value]of Object.entries(opts.attributes))value!==void 0&&target.setAttribute(key,value)}function createDeviceInfoSpanProcessor(opts){return{forceFlush:async()=>Promise.resolve(),onEnd(){},onStart:span=>{stampGatedAttributes(span,opts)},shutdown:async()=>Promise.resolve()}}function createDeviceInfoLogRecordProcessor(opts){return{forceFlush:async()=>Promise.resolve(),onEmit:logRecord=>{stampGatedAttributes(logRecord,opts)},shutdown:async()=>Promise.resolve()}}function buildOtelProvider(input){let environment=resolveEnvironment({explicit:getStringGlobal(ENVIRONMENT_GLOBAL),env:typeof process>`u`?{}:{INTERFERE_ENVIRONMENT:process.env.INTERFERE_ENVIRONMENT,NODE_ENV:process.env.NODE_ENV,VERCEL_ENV:process.env.VERCEL_ENV}}),resource=resourceFromAttributes(omitUndefined({"service.name":input.serviceName||defaultServiceName(),"service.namespace":input.serviceNamespace,"deployment.environment.name":environment,"telemetry.sdk.language":`webjs`,"interfere.sdk.name":SDK_NAME,"interfere.sdk.version":SDK_VERSION,"interfere.sdk.stack":input.sdkStack.join(`, `),"release.slug":input.releaseSlug||void 0})),deviceInfoAttributes=detectResources({detectors:[browserDetector]}).attributes,isDeviceInfoEnabled=input.isDeviceInfoEnabled??(()=>!1),traceExporter=createTraceExporter({clientOptions:input.clientOptions}),{getSessionId}=input,{getDeviceId}=input,spanProcessors=[createUrlRedactionSpanProcessor(input.urlRedaction??resolveUrlRedaction()),createSessionSpanProcessor({getSessionId}),createDeviceSpanProcessor({getDeviceId}),createDeviceInfoSpanProcessor({attributes:deviceInfoAttributes,isEnabled:isDeviceInfoEnabled}),...input.additionalSpanProcessors??[],new BatchSpanProcessor(traceExporter,BROWSER_BATCH_OPTIONS)],tracerProvider=new WebTracerProvider({resource,spanProcessors}),contextManager=new PageScopeContextManager;contextManager.enable(),context.setGlobalContextManager(contextManager)||contextManager.disable();let isShutdown=!1,getPropagationSessionId=input.getPropagationSessionId??getSessionId;propagation.fields().length===0&&propagation.setGlobalPropagator(new CompositePropagator({propagators:[new W3CTraceContextPropagator,createSessionBaggagePropagator(()=>isShutdown?null:getPropagationSessionId())]}));let metricExporter=createMetricExporter({clientOptions:input.clientOptions},{attributes:deviceInfoAttributes,isEnabled:isDeviceInfoEnabled}),metricReader=new PeriodicExportingMetricReader({exportIntervalMillis:75e3,exportTimeoutMillis:7e4,exporter:metricExporter}),meterProvider=new MeterProvider({readers:[metricReader,...input.additionalMetricReaders??[]],resource}),logExporter=createLogExporter({clientOptions:input.clientOptions}),loggerProvider=new LoggerProvider({processors:[createSessionLogRecordProcessor({getSessionId}),createDeviceLogRecordProcessor({getDeviceId}),createDeviceInfoLogRecordProcessor({attributes:deviceInfoAttributes,isEnabled:isDeviceInfoEnabled}),new BatchLogRecordProcessor({exporter:logExporter,...BROWSER_BATCH_OPTIONS}),...input.additionalLogRecordProcessors??[]],resource});return{contextManager,flush:async()=>{await Promise.allSettled([tracerProvider.forceFlush({timeoutMillis:75e3}),metricReader.forceFlush({timeoutMillis:75e3}),loggerProvider.forceFlush({timeoutMillis:75e3})])},loggerProvider,meterProvider,metricReader,shutdown:async()=>{isShutdown=!0,await Promise.allSettled([tracerProvider.shutdown(),meterProvider.shutdown(),loggerProvider.shutdown()])},tracerProvider}}export{buildOtelProvider as t};
|
|
@@ -3,22 +3,21 @@ 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
5
|
import { t as SessionTracker } from "./api-CMPV9rgU.mjs";
|
|
6
|
-
import { n as CaptureFailedRequestsOption, t as BundledInstrumentations } from "./instrumentations-
|
|
6
|
+
import { n as CaptureFailedRequestsOption, t as BundledInstrumentations } from "./instrumentations-D656I08h.mjs";
|
|
7
7
|
import { t as OtelProviderHandle } from "./provider-cUByhzgv.mjs";
|
|
8
|
-
import "./index-
|
|
8
|
+
import "./index-BZ_yQUGY.mjs";
|
|
9
|
+
import { t as RecordExceptionOpts } from "./exception-span-zN1tvBdh.mjs";
|
|
9
10
|
import { NonErrorException } from "@interfere/types/sdk/errors";
|
|
10
11
|
import { Tracer } from "@opentelemetry/api";
|
|
11
12
|
import { PropsWithChildren } from "react";
|
|
12
|
-
import { ConsentInput, ConsentState, PluginKey } from "@interfere/types/sdk/plugins/manifest";
|
|
13
13
|
import { RemotePluginConfig } from "@interfere/types/sdk/remote-config";
|
|
14
14
|
import { UrlRedactionPolicy } from "@interfere/types/sdk/url-redaction";
|
|
15
15
|
import { SessionId } from "@interfere/types/data/session";
|
|
16
16
|
import { MetricReader } from "@opentelemetry/sdk-metrics";
|
|
17
|
+
import { ConsentInput, ConsentState, PluginKey } from "@interfere/types/sdk/plugins/manifest";
|
|
17
18
|
import { LogRecordProcessor, LoggerProvider } from "@opentelemetry/sdk-logs";
|
|
18
19
|
import { SpanProcessor } from "@opentelemetry/sdk-trace-base";
|
|
19
|
-
import { IngestedFrame } from "@interfere/types/data/frame";
|
|
20
20
|
import { IdentifyParams } from "@interfere/types/sdk/identify";
|
|
21
|
-
import { ErrorMechanism } from "@interfere/types/sdk/plugins/payload/errors";
|
|
22
21
|
//#region src/plugins/lib/types.d.ts
|
|
23
22
|
type PluginTeardownReason = "consent-revoked" | "disabled" | "dispose";
|
|
24
23
|
type PluginCleanup = (reason?: PluginTeardownReason) => void;
|
|
@@ -126,11 +125,11 @@ interface KernelOptions {
|
|
|
126
125
|
/** Override `globalThis.fetch` for tests / non-browser hosts. */
|
|
127
126
|
fetch?: typeof globalThis.fetch;
|
|
128
127
|
/**
|
|
129
|
-
* Override the OTel `service.name` resource attribute. Defaults to
|
|
130
|
-
*
|
|
131
|
-
*
|
|
132
|
-
* `"
|
|
133
|
-
* cleanly by surface.
|
|
128
|
+
* Override the OTel `service.name` resource attribute. Defaults to the
|
|
129
|
+
* name the build stamped into the page (the Vite plugin derives it from
|
|
130
|
+
* the package name), then to `"unknown_service"`. Customers running
|
|
131
|
+
* multiple frontends in one monitoring backend (e.g. `"website"` vs
|
|
132
|
+
* `"app"`) set this so spans/metrics/logs slice cleanly by surface.
|
|
134
133
|
*/
|
|
135
134
|
serviceName?: string;
|
|
136
135
|
/** Optional application namespace for grouping related services. */
|
|
@@ -235,37 +234,6 @@ interface KernelSession {
|
|
|
235
234
|
getId: () => SessionId | null;
|
|
236
235
|
getWindowId: () => string | null;
|
|
237
236
|
}
|
|
238
|
-
interface RecordExceptionOpts {
|
|
239
|
-
/**
|
|
240
|
-
* Frames always appended to the first exception's stack. Used by
|
|
241
|
-
* `<ErrorBoundary>` to inject React's component-stack frames as
|
|
242
|
-
* supplementary context — these add on top of the real JS frames, they
|
|
243
|
-
* don't replace them.
|
|
244
|
-
*/
|
|
245
|
-
readonly appendFrames?: readonly IngestedFrame[];
|
|
246
|
-
/**
|
|
247
|
-
* `error.digest` from React when an RSC server-side throw is
|
|
248
|
-
* sanitised and rebuilt as a synthetic Error on the client. The only
|
|
249
|
-
* identifier that pairs the redacted client capture with the
|
|
250
|
-
* unredacted server capture — enrichment mixes this into the
|
|
251
|
-
* fingerprint so both events group as one problem.
|
|
252
|
-
*/
|
|
253
|
-
readonly errorDigest?: string;
|
|
254
|
-
/**
|
|
255
|
-
* Frames adopted only when the first exception's parsed stack is empty.
|
|
256
|
-
* Used by the `window.onerror` handler when the browser hands us
|
|
257
|
-
* source/line/col but the `Error` itself has a degenerate stack — never
|
|
258
|
-
* glued on top of a real stack.
|
|
259
|
-
*/
|
|
260
|
-
readonly fallbackFrames?: readonly IngestedFrame[];
|
|
261
|
-
readonly mechanism: ErrorMechanism;
|
|
262
|
-
/**
|
|
263
|
-
* A distinct error sub-classification layered on top of the mechanism —
|
|
264
|
-
* currently `"hydration"` for React hydration mismatches. Lets Interfere
|
|
265
|
-
* triage by kind without re-parsing the message.
|
|
266
|
-
*/
|
|
267
|
-
readonly subtype?: string;
|
|
268
|
-
}
|
|
269
237
|
/**
|
|
270
238
|
* The replacement for the old `Client` god-object. Pure construction graph
|
|
271
239
|
* via `createKernel`; no module-level mutable state, no global lookups.
|
|
@@ -293,6 +261,7 @@ declare class Kernel implements PluginContext {
|
|
|
293
261
|
private otelControls;
|
|
294
262
|
private deviceInfoCaptureEnabled;
|
|
295
263
|
private unsubscribePageHidden;
|
|
264
|
+
private unsubscribePageUnloading;
|
|
296
265
|
private readonly tracker;
|
|
297
266
|
constructor(tracker: SessionTracker, privacy?: PrivacyOptions);
|
|
298
267
|
attachRuntime(runtime: PluginRuntime): void;
|
|
@@ -318,11 +287,16 @@ declare class Kernel implements PluginContext {
|
|
|
318
287
|
* `window.onerror` / `console.error` / `unhandledrejection`, the
|
|
319
288
|
* React error boundary) just call this — they don't pre-filter.
|
|
320
289
|
*
|
|
321
|
-
*
|
|
322
|
-
* customer-owned `span()` block would otherwise
|
|
323
|
-
* span even when the customer caught the error
|
|
324
|
-
* customer's `span()` helper sets status itself when
|
|
325
|
-
* throw.
|
|
290
|
+
* Marks the span as failed only for unhandled captures. A handled
|
|
291
|
+
* console.error inside a customer-owned `span()` block would otherwise
|
|
292
|
+
* taint the customer's span even when the customer caught the error
|
|
293
|
+
* explicitly. The customer's `span()` helper sets status itself when
|
|
294
|
+
* it observes a throw.
|
|
295
|
+
*
|
|
296
|
+
* Without an active span the kernel opens one named after the throw
|
|
297
|
+
* site (the top in-app stack frame) to carry the event, marked with
|
|
298
|
+
* `interfere.capture.kind` so consumers can recognise it by attribute
|
|
299
|
+
* rather than by name.
|
|
326
300
|
*
|
|
327
301
|
* `appendFrames` are always appended (component-stack supplements);
|
|
328
302
|
* `fallbackFrames` are only adopted when the parsed stack is empty
|
|
@@ -434,4 +408,4 @@ declare function InterfereProvider({ kernel, children, consent, plugins, capture
|
|
|
434
408
|
declare function useInterfere(): InterfereContextValue;
|
|
435
409
|
declare function useSession(): string | null;
|
|
436
410
|
//#endregion
|
|
437
|
-
export {
|
|
411
|
+
export { Plugin as C, PluginTeardownReason as D, PluginContext as E, resolveFeatures as S, PluginConfigState as T, readReleaseSlugFromGlobals as _, InterfereContextValue as a, PluginOverrides as b, KernelConsent as c, KernelInternalOptions as d, KernelOptions as f, createKernel as g, buildSdkStack as h, InterfereContext as i, KernelDevice as l, TracingOptions as m, useInterfere as n, NULL_CONTEXT_VALUE as o, KernelSession as p, useSession as r, Kernel as s, InterfereProvider as t, KernelIdentity as u, PluginRuntime as v, PluginCleanup as w, loadPlugin as x, LOADERS as y };
|
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, i as InterfereContext, n as useInterfere, r as useSession, t as InterfereProvider
|
|
2
|
+
import { a as InterfereContextValue, b as PluginOverrides, i as InterfereContext, n as useInterfere, r as useSession, t as InterfereProvider } from "./provider-DIp7vkKd.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{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};
|
package/dist/tracking/api.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as SessionTracker}from"../api-
|
|
1
|
+
import{t as SessionTracker}from"../api-BUYnj5MA.mjs";export{SessionTracker};
|
|
@@ -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-BUYnj5MA.mjs";import{InterfereClient}from"@interfere/javascript";var __commonJSMin=(cb,mod)=>()=>(mod||(cb((mod={exports:{}}).exports,mod),cb=null),mod.exports),POSITIONALS_EXP$1=/(%?)(%([sdijo]))/g;function serializePositional$1(positional,flag){switch(flag){case`s`:return positional;case`d`:case`i`:return Number(positional);case`j`:return JSON.stringify(positional);case`o`:{if(typeof positional==`string`)return positional;let json=JSON.stringify(positional);return json===`{}`||json===`[]`||/^\[object .+?\]$/.test(json)?positional:json}}}function format$3(message,...positionals){if(positionals.length===0)return message;let positionalIndex=0,formattedMessage=message.replace(POSITIONALS_EXP$1,(match,isEscaped,_,flag)=>{let positional=positionals[positionalIndex],value=serializePositional$1(positional,flag);return isEscaped?match:(positionalIndex++,value)});return positionalIndex<positionals.length&&(formattedMessage+=` ${positionals.slice(positionalIndex).join(` `)}`),formattedMessage=formattedMessage.replace(/%{2,2}/g,`%`),formattedMessage}var STACK_FRAMES_TO_IGNORE$1=2;function cleanErrorStack$1(error){if(!error.stack)return;let nextStack=error.stack.split(`
|
|
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(`
|
|
@@ -252,4 +252,4 @@ It's recommended you update your worker script by running this command:
|
|
|
252
252
|
\u2022 npx msw init <PUBLIC_DIR>
|
|
253
253
|
|
|
254
254
|
You can also automate this process and make the worker script update automatically upon the library installations. Read more: https://mswjs.io/docs/cli/init.`),integrityCheckPromise.resolve()}),integrityCheckPromise}async#printStartMessage(){if(this.workerPromise.state===`rejected`)return;invariant(this.#clientPromise!=null,`[ServiceWorkerSource] Failed to print a start message: client confirmation not received`);let client=await this.#clientPromise,[worker,registration]=await this.workerPromise;console.groupCollapsed(`%c${devUtils.formatMessage(`Mocking enabled.`)}`,`color:orangered;font-weight:bold;`),console.log(`%cDocumentation: %chttps://mswjs.io/docs`,`font-weight:bold`,`font-weight:normal`),console.log(`Found an issue? https://github.com/mswjs/msw/issues`),console.log(`Worker script URL:`,worker.scriptURL),console.log(`Worker scope:`,registration.scope),client&&console.log(`Client ID: %s (%s)`,client.id,client.frameType),console.groupEnd()}#printStopMessage(){console.log(`%c${devUtils.formatMessage(`Mocking disabled.`)}`,`color:orangered;font-weight:bold;`)}},ServiceWorkerHttpNetworkFrame=class extends HttpNetworkFrame{#event;constructor(options){super({request:options.request}),this.#event=options.event}passthrough(){this.#event.postMessage(`PASSTHROUGH`)}respondWith(response){response&&this.#respondWith(response)}errorWith(reason){if(reason instanceof Response)return this.respondWith(reason);devUtils.warn(`Uncaught exception in the request handler for "%s %s". This exception has been gracefully handled as a 500 response, however, it's strongly recommended to resolve this error, as it indicates a mistake in your code. If you wish to mock an error response, please see this guide: https://mswjs.io/docs/http/mocking-responses/error-responses`,this.data.request.method,this.data.request.url);let error2=reason instanceof Error?reason:Error(reason?.toString()||`Request failure`);this.respondWith(HttpResponse.json({name:error2.name,message:error2.message,stack:error2.stack},{status:500,statusText:`Request Handler Error`}))}async#respondWith(response){let responseBody,transfer,responseInit=toResponseInit(response);supportsReadableStreamTransfer()?(responseBody=response.body,transfer=response.body==null?void 0:[response.body]):responseBody=response.body==null?null:await response.clone().arrayBuffer(),this.#event.postMessage(`MOCK_RESPONSE`,{...responseInit,body:responseBody},transfer)}},until2=async promise=>{try{return{error:null,data:await promise().catch(error2=>{throw error2})}}catch(error2){return{error:error2,data:null}}};function isObject2(value,loose=!1){return loose?Object.prototype.toString.call(value).startsWith(`[object `):Object.prototype.toString.call(value)===`[object Object]`}function isPropertyAccessible(obj,key){try{return obj[key],!0}catch{return!1}}function createServerErrorResponse(body){return new Response(JSON.stringify(body instanceof Error?{name:body.name,message:body.message,stack:body.stack}:body),{status:500,statusText:`Unhandled Exception`,headers:{"Content-Type":`application/json`}})}function isResponseError(response){return response!=null&&response instanceof Response&&isPropertyAccessible(response,`type`)&&response.type===`error`}function isResponseLike(value){return isObject2(value,!0)&&isPropertyAccessible(value,`status`)&&isPropertyAccessible(value,`statusText`)&&isPropertyAccessible(value,`bodyUsed`)}function isNodeLikeError(error2){return error2==null||!(error2 instanceof Error)?!1:`code`in error2&&`errno`in error2}async function handleRequest(options){let handleResponse=async response=>response instanceof Error?(await options.controller.errorWith(response),!0):isResponseError(response)||isResponseLike(response)?(await options.controller.respondWith(response),!0):isObject2(response)?(await options.controller.errorWith(response),!0):!1,handleResponseError=async error2=>{if(error2 instanceof InterceptorError)throw result.error;return isNodeLikeError(error2)?(await options.controller.errorWith(error2),!0):error2 instanceof Response&&await handleResponse(error2)},requestAbortPromise=new DeferredPromise,onAbort=()=>{requestAbortPromise.reject(options.request.signal?.reason)};if(options.request.signal){if(options.request.signal.aborted){await options.controller.errorWith(options.request.signal.reason);return}options.request.signal.addEventListener(`abort`,onAbort,{once:!0})}let result=await until2(async()=>{let requestListenersPromise=emitAsync(options.emitter,`request`,{requestId:options.requestId,request:options.request,controller:options.controller});await Promise.race([requestAbortPromise,requestListenersPromise,options.controller.handled])});if(options.request.signal?.removeEventListener(`abort`,onAbort),requestAbortPromise.state===`rejected`){await options.controller.errorWith(requestAbortPromise.rejectionReason);return}if(result.error){if(await handleResponseError(result.error))return;if(options.emitter.listenerCount(`unhandledException`)>0){let unhandledExceptionController=new RequestController(options.request,{passthrough(){},async respondWith(response){await handleResponse(response)},async errorWith(reason){await options.controller.errorWith(reason)}});if(await emitAsync(options.emitter,`unhandledException`,{error:result.error,request:options.request,requestId:options.requestId,controller:unhandledExceptionController}),unhandledExceptionController.readyState!==RequestController.PENDING)return}await options.controller.respondWith(createServerErrorResponse(result.error));return}return options.controller.readyState===RequestController.PENDING?await options.controller.passthrough():options.controller.handled}function createNetworkError(cause){return Object.assign(TypeError(`Failed to fetch`),{cause})}var REQUEST_BODY_HEADERS=[`content-encoding`,`content-language`,`content-location`,`content-type`,`content-length`],kRedirectCount=Symbol(`kRedirectCount`);async function followFetchRedirect(request,response){if(response.status!==303&&request.body!=null)return Promise.reject(createNetworkError());let requestUrl=new URL(request.url),locationUrl;try{locationUrl=new URL(response.headers.get(`location`),request.url)}catch(error2){return Promise.reject(createNetworkError(error2))}if(locationUrl.protocol!==`http:`&&locationUrl.protocol!==`https:`)return Promise.reject(createNetworkError(`URL scheme must be a HTTP(S) scheme`));if(Reflect.get(request,kRedirectCount)>20)return Promise.reject(createNetworkError(`redirect count exceeded`));if(Object.defineProperty(request,kRedirectCount,{value:(Reflect.get(request,kRedirectCount)||0)+1}),request.mode===`cors`&&(locationUrl.username||locationUrl.password)&&!sameOrigin(requestUrl,locationUrl))return Promise.reject(createNetworkError(`cross origin not allowed for request mode "cors"`));let requestInit={};([301,302].includes(response.status)&&request.method===`POST`||response.status===303&&![`HEAD`,`GET`].includes(request.method))&&(requestInit.method=`GET`,requestInit.body=null,REQUEST_BODY_HEADERS.forEach(headerName=>{request.headers.delete(headerName)})),sameOrigin(requestUrl,locationUrl)||(request.headers.delete(`authorization`),request.headers.delete(`proxy-authorization`),request.headers.delete(`cookie`),request.headers.delete(`host`)),requestInit.headers=request.headers;let finalResponse=await fetch(new Request(locationUrl,requestInit));return Object.defineProperty(finalResponse,"redirected",{value:!0,configurable:!0}),finalResponse}function sameOrigin(left,right){return left.origin===right.origin&&left.origin===`null`||left.protocol===right.protocol&&left.hostname===right.hostname&&left.port===right.port}var BrotliDecompressionStream=class extends TransformStream{constructor(){console.warn(`[Interceptors]: Brotli decompression of response streams is not supported in the browser`),super({transform(chunk,controller){controller.enqueue(chunk)}})}},PipelineStream=class extends TransformStream{constructor(transformStreams,...strategies){super({},...strategies);let readable=[super.readable,...transformStreams].reduce((readable$1,transform)=>readable$1.pipeThrough(transform));Object.defineProperty(this,"readable",{get(){return readable}})}};function parseContentEncoding(contentEncoding){return contentEncoding.toLowerCase().split(`,`).map(coding=>coding.trim())}function createDecompressionStream(contentEncoding){if(contentEncoding===``)return null;let codings=parseContentEncoding(contentEncoding);return codings.length===0?null:new PipelineStream(codings.reduceRight((transformers,coding)=>coding===`gzip`||coding===`x-gzip`?transformers.concat(new DecompressionStream(`gzip`)):coding===`deflate`?transformers.concat(new DecompressionStream(`deflate`)):coding===`br`?transformers.concat(new BrotliDecompressionStream):(transformers.length=0,transformers),[]))}function decompressResponse(response){if(response.body===null)return null;let decompressionStream=createDecompressionStream(response.headers.get(`content-encoding`)||``);return decompressionStream?(response.body.pipeTo(decompressionStream.writable),decompressionStream.readable):null}var FetchInterceptor=class FetchInterceptor2 extends Interceptor{static{this.symbol=Symbol.for(`fetch-interceptor`)}constructor(){super(FetchInterceptor2.symbol)}checkEnvironment(){return hasConfigurableGlobal(`fetch`)}async setup(){let logger=this.logger.extend(`setup`),pureFetch=globalThis.fetch,fetchProxy=async(input,init)=>{let requestId=createRequestId(),request=new FetchRequest(typeof input==`string`&&typeof location<`u`&&!canParseUrl(input)?new URL(input,location.href):input,init);input instanceof Request&&setRawRequest(request,input);let responsePromise=new DeferredPromise,controller=new RequestController(request,{passthrough:async()=>{this.logger.info(`request has not been handled, passthrough...`);let requestCloneForResponseEvent=request.clone(),{error:responseError,data:originalResponse}=await until2(()=>pureFetch(request));if(responseError)return responsePromise.reject(responseError);if(this.logger.info(`original fetch performed`,originalResponse),this.emitter.listenerCount(`response`)>0){this.logger.info(`emitting the "response" event...`);let responseClone=FetchResponse.clone(originalResponse);await emitAsync(this.emitter,`response`,{response:responseClone,isMockedResponse:!1,request:requestCloneForResponseEvent,requestId})}responsePromise.resolve(originalResponse)},respondWith:async rawResponse=>{if(isResponseError(rawResponse)){this.logger.info(`request has errored!`,{response:rawResponse}),responsePromise.reject(createNetworkError(rawResponse));return}this.logger.info(`received mocked response!`,{rawResponse});let response=new FetchResponse(decompressResponse(rawResponse)||rawResponse.body,{url:request.url,status:rawResponse.status,statusText:rawResponse.statusText,headers:rawResponse.headers});if(FetchResponse.isRedirectResponse(response.status)){if(request.redirect===`error`){responsePromise.reject(createNetworkError(`unexpected redirect`));return}if(request.redirect===`follow`){followFetchRedirect(request,response).then(response$1=>{responsePromise.resolve(response$1)},reason=>{responsePromise.reject(reason)});return}}this.emitter.listenerCount(`response`)>0&&(this.logger.info(`emitting the "response" event...`),await emitAsync(this.emitter,`response`,{response:FetchResponse.clone(response),isMockedResponse:!0,request,requestId})),responsePromise.resolve(response)},errorWith:reason=>{this.logger.info(`request has been aborted!`,{reason}),responsePromise.reject(reason)}});return this.logger.info(`[%s] %s`,request.method,request.url),this.logger.info(`awaiting for the mocked response...`),this.logger.info(`emitting the "request" event for %s listener(s)...`,this.emitter.listenerCount(`request`)),await handleRequest({request,requestId,emitter:this.emitter,controller}),responsePromise};logger.info(`patching global fetch...`),this.subscriptions.push(patchesRegistry.applyPatch(globalThis,`fetch`,()=>fetchProxy)),logger.info(`global fetch patched!`,globalThis.fetch.name)}};function concatArrayBuffer(left,right){let result=new Uint8Array(left.byteLength+right.byteLength);return result.set(left,0),result.set(right,left.byteLength),result}var EventPolyfill=class{constructor(type,options){this.NONE=0,this.CAPTURING_PHASE=1,this.AT_TARGET=2,this.BUBBLING_PHASE=3,this.type=``,this.srcElement=null,this.currentTarget=null,this.eventPhase=0,this.isTrusted=!0,this.composed=!1,this.cancelable=!0,this.defaultPrevented=!1,this.bubbles=!0,this.lengthComputable=!0,this.loaded=0,this.total=0,this.cancelBubble=!1,this.returnValue=!0,this.type=type,this.target=options?.target||null,this.currentTarget=options?.currentTarget||null,this.timeStamp=Date.now()}composedPath(){return[]}initEvent(type,bubbles,cancelable){this.type=type,this.bubbles=!!bubbles,this.cancelable=!!cancelable}preventDefault(){this.defaultPrevented=!0}stopPropagation(){}stopImmediatePropagation(){}},ProgressEventPolyfill=class extends EventPolyfill{constructor(type,init){super(type),this.lengthComputable=init?.lengthComputable||!1,this.composed=init?.composed||!1,this.loaded=init?.loaded||0,this.total=init?.total||0}},SUPPORTS_PROGRESS_EVENT=typeof ProgressEvent<`u`;function createEvent(target,type,init){let progressEvents=[`error`,`progress`,`loadstart`,`loadend`,`load`,`timeout`,`abort`],ProgressEventClass=SUPPORTS_PROGRESS_EVENT?ProgressEvent:ProgressEventPolyfill;return progressEvents.includes(type)?new ProgressEventClass(type,{lengthComputable:!0,loaded:init?.loaded||0,total:init?.total||0}):new EventPolyfill(type,{target,currentTarget:target})}function findPropertySource(target,propertyName){if(!(propertyName in target))return null;if(Object.prototype.hasOwnProperty.call(target,propertyName))return target;let prototype=Reflect.getPrototypeOf(target);return prototype?findPropertySource(prototype,propertyName):null}function createProxy(target,options){return new Proxy(target,optionsToProxyHandler(options))}function optionsToProxyHandler(options){let{constructorCall,methodCall,getProperty,setProperty}=options,handler={};return constructorCall!==void 0&&(handler.construct=function(target,args,newTarget){let next=Reflect.construct.bind(null,target,args,newTarget);return constructorCall.call(newTarget,args,next)}),handler.set=function(target,propertyName,nextValue){let next=()=>{let propertySource=findPropertySource(target,propertyName)||target,ownDescriptors=Reflect.getOwnPropertyDescriptor(propertySource,propertyName);return ownDescriptors?.set===void 0?Reflect.defineProperty(propertySource,propertyName,{writable:!0,enumerable:!0,configurable:!0,value:nextValue}):(ownDescriptors.set.apply(target,[nextValue]),!0)};return setProperty===void 0?next():setProperty.call(target,[propertyName,nextValue],next)},handler.get=function(target,propertyName,receiver){let next=()=>target[propertyName],value=getProperty===void 0?next():getProperty.call(target,[propertyName,receiver],next);return typeof value==`function`?(...args)=>{let next$1=value.bind(target,...args);return methodCall===void 0?next$1():methodCall.call(target,[propertyName,args],next$1)}:value},handler}function isDomParserSupportedType(type){return[`application/xhtml+xml`,`application/xml`,`image/svg+xml`,`text/html`,`text/xml`].some(supportedType=>type.startsWith(supportedType))}function parseJson(data){try{return JSON.parse(data)}catch{return null}}function createResponse(request,body){return new FetchResponse(FetchResponse.isResponseWithBody(request.status)?body:null,{url:request.responseURL,status:request.status,statusText:request.statusText,headers:createHeadersFromXMLHttpRequestHeaders(request.getAllResponseHeaders())})}function createHeadersFromXMLHttpRequestHeaders(headersString){let headers=new Headers,lines=headersString.split(/[\r\n]+/);for(let line of lines){if(line.trim()===``)continue;let[name,...parts]=line.split(`: `),value=parts.join(`: `);headers.append(name,value)}return headers}async function getBodyByteLength(input){let explicitContentLength=input.headers.get(`content-length`);return explicitContentLength!=null&&explicitContentLength!==``?Number(explicitContentLength):(await input.arrayBuffer()).byteLength}var kIsRequestHandled=Symbol(`kIsRequestHandled`),IS_NODE2=isNodeProcess(),kFetchRequest=Symbol(`kFetchRequest`),XMLHttpRequestController=class{constructor(initialRequest,logger){this.initialRequest=initialRequest,this.logger=logger,this.method=`GET`,this.url=null,this[kIsRequestHandled]=!1,this.events=new Map,this.uploadEvents=new Map,this.requestId=createRequestId(),this.requestHeaders=new Headers,this.responseBuffer=new Uint8Array,this.request=createProxy(initialRequest,{setProperty:([propertyName,nextValue],invoke)=>{switch(propertyName){case`ontimeout`:{let eventName=propertyName.slice(2);return this.request.addEventListener(eventName,nextValue),invoke()}default:return invoke()}},methodCall:([methodName,args],invoke)=>{switch(methodName){case`open`:{let[method,url]=args;return url===void 0?(this.method=`GET`,this.url=toAbsoluteUrl(method)):(this.method=method,this.url=toAbsoluteUrl(url)),this.logger=this.logger.extend(`${this.method} ${this.url.href}`),this.logger.info(`open`,this.method,this.url.href),invoke()}case`addEventListener`:{let[eventName,listener]=args;return this.registerEvent(eventName,listener),this.logger.info(`addEventListener`,eventName,listener),invoke()}case`setRequestHeader`:{let[name,value]=args;return this.requestHeaders.set(name,value),this.logger.info(`setRequestHeader`,name,value),invoke()}case`send`:{let[body]=args;this.request.addEventListener(`load`,()=>{if(this.onResponse!==void 0){let fetchResponse=createResponse(this.request,this.request.response);this.onResponse.call(this,{response:fetchResponse,isMockedResponse:this[kIsRequestHandled],request:fetchRequest,requestId:this.requestId})}});let requestBody=typeof body==`string`?encodeBuffer(body):body,fetchRequest=this.toFetchApiRequest(requestBody);this[kFetchRequest]=fetchRequest.clone(),queueMicrotask(()=>{(this.onRequest?.call(this,{request:fetchRequest,requestId:this.requestId})||Promise.resolve()).finally(()=>{if(!this[kIsRequestHandled])return this.logger.info(`request callback settled but request has not been handled (readystate %d), performing as-is...`,this.request.readyState),IS_NODE2&&this.request.setRequestHeader(INTERNAL_REQUEST_ID_HEADER_NAME,this.requestId),invoke()})});break}default:return invoke()}}}),define(this.request,`upload`,createProxy(this.request.upload,{setProperty:([propertyName,nextValue],invoke)=>{switch(propertyName){case`onloadstart`:case`onprogress`:case`onaboart`:case`onerror`:case`onload`:case`ontimeout`:case`onloadend`:{let eventName=propertyName.slice(2);this.registerUploadEvent(eventName,nextValue)}}return invoke()},methodCall:([methodName,args],invoke)=>{if(methodName===`addEventListener`){let[eventName,listener]=args;return this.registerUploadEvent(eventName,listener),this.logger.info(`upload.addEventListener`,eventName,listener),invoke()}}}))}registerEvent(eventName,listener){let nextEvents=(this.events.get(eventName)||[]).concat(listener);this.events.set(eventName,nextEvents),this.logger.info(`registered event "%s"`,eventName,listener)}registerUploadEvent(eventName,listener){let nextEvents=(this.uploadEvents.get(eventName)||[]).concat(listener);this.uploadEvents.set(eventName,nextEvents),this.logger.info(`registered upload event "%s"`,eventName,listener)}async respondWith(response){if(this[kIsRequestHandled]=!0,this[kFetchRequest]){let totalRequestBodyLength=await getBodyByteLength(this[kFetchRequest]);this.trigger(`loadstart`,this.request.upload,{loaded:0,total:totalRequestBodyLength}),this.trigger(`progress`,this.request.upload,{loaded:totalRequestBodyLength,total:totalRequestBodyLength}),this.trigger(`load`,this.request.upload,{loaded:totalRequestBodyLength,total:totalRequestBodyLength}),this.trigger(`loadend`,this.request.upload,{loaded:totalRequestBodyLength,total:totalRequestBodyLength})}this.logger.info(`responding with a mocked response: %d %s`,response.status,response.statusText),define(this.request,`status`,response.status),define(this.request,`statusText`,response.statusText),define(this.request,`responseURL`,this.url.href),this.request.getResponseHeader=new Proxy(this.request.getResponseHeader,{apply:(_,__,args)=>{if(this.logger.info(`getResponseHeader`,args[0]),this.request.readyState<this.request.HEADERS_RECEIVED)return this.logger.info(`headers not received yet, returning null`),null;let headerValue=response.headers.get(args[0]);return this.logger.info(`resolved response header "%s" to`,args[0],headerValue),headerValue}}),this.request.getAllResponseHeaders=new Proxy(this.request.getAllResponseHeaders,{apply:()=>{if(this.logger.info(`getAllResponseHeaders`),this.request.readyState<this.request.HEADERS_RECEIVED)return this.logger.info(`headers not received yet, returning empty string`),``;let allHeaders=Array.from(response.headers.entries()).map(([headerName,headerValue])=>`${headerName}: ${headerValue}`).join(`\r
|
|
255
|
-
`);return this.logger.info(`resolved all response headers to`,allHeaders),allHeaders}}),Object.defineProperties(this.request,{response:{enumerable:!0,configurable:!1,get:()=>this.response},responseText:{enumerable:!0,configurable:!1,get:()=>this.responseText},responseXML:{enumerable:!0,configurable:!1,get:()=>this.responseXML}});let totalResponseBodyLength=await getBodyByteLength(response.clone());this.logger.info(`calculated response body length`,totalResponseBodyLength),this.trigger(`loadstart`,this.request,{loaded:0,total:totalResponseBodyLength}),this.setReadyState(this.request.HEADERS_RECEIVED),this.setReadyState(this.request.LOADING);let finalizeResponse=()=>{this.logger.info(`finalizing the mocked response...`),this.setReadyState(this.request.DONE),this.trigger(`load`,this.request,{loaded:this.responseBuffer.byteLength,total:totalResponseBodyLength}),this.trigger(`loadend`,this.request,{loaded:this.responseBuffer.byteLength,total:totalResponseBodyLength})};if(response.body){this.logger.info(`mocked response has body, streaming...`);let reader=response.body.getReader(),readNextResponseBodyChunk=async()=>{let{value,done}=await reader.read();if(done){this.logger.info(`response body stream done!`),finalizeResponse();return}value&&(this.logger.info(`read response body chunk:`,value),this.responseBuffer=concatArrayBuffer(this.responseBuffer,value),this.trigger(`progress`,this.request,{loaded:this.responseBuffer.byteLength,total:totalResponseBodyLength})),readNextResponseBodyChunk()};readNextResponseBodyChunk()}else finalizeResponse()}responseBufferToText(){return decodeBuffer(this.responseBuffer)}get response(){if(this.logger.info(`getResponse (responseType: %s)`,this.request.responseType),this.request.readyState!==this.request.DONE)return null;switch(this.request.responseType){case`json`:{let responseJson=parseJson(this.responseBufferToText());return this.logger.info(`resolved response JSON`,responseJson),responseJson}case`arraybuffer`:{let arrayBuffer=toArrayBuffer(this.responseBuffer);return this.logger.info(`resolved response ArrayBuffer`,arrayBuffer),arrayBuffer}case`blob`:{let mimeType=this.request.getResponseHeader(`Content-Type`)||`text/plain`,responseBlob=new Blob([this.responseBufferToText()],{type:mimeType});return this.logger.info(`resolved response Blob (mime type: %s)`,responseBlob,mimeType),responseBlob}default:{let responseText=this.responseBufferToText();return this.logger.info(`resolving "%s" response type as text`,this.request.responseType,responseText),responseText}}}get responseText(){if(invariant(this.request.responseType===``||this.request.responseType===`text`,`InvalidStateError: The object is in invalid state.`),this.request.readyState!==this.request.LOADING&&this.request.readyState!==this.request.DONE)return``;let responseText=this.responseBufferToText();return this.logger.info(`getResponseText: "%s"`,responseText),responseText}get responseXML(){if(invariant(this.request.responseType===``||this.request.responseType===`document`,`InvalidStateError: The object is in invalid state.`),this.request.readyState!==this.request.DONE)return null;let contentType=this.request.getResponseHeader(`Content-Type`)||``;return typeof DOMParser>`u`?(console.warn(`Cannot retrieve XMLHttpRequest response body as XML: DOMParser is not defined. You are likely using an environment that is not browser or does not polyfill browser globals correctly.`),null):isDomParserSupportedType(contentType)?new DOMParser().parseFromString(this.responseBufferToText(),contentType):null}errorWith(error2){this[kIsRequestHandled]=!0,this.logger.info(`responding with an error`),this.setReadyState(this.request.DONE),this.trigger(`error`,this.request),this.trigger(`loadend`,this.request)}setReadyState(nextReadyState){if(this.logger.info(`setReadyState: %d -> %d`,this.request.readyState,nextReadyState),this.request.readyState===nextReadyState){this.logger.info(`ready state identical, skipping transition...`);return}define(this.request,`readyState`,nextReadyState),this.logger.info(`set readyState to: %d`,nextReadyState),nextReadyState!==this.request.UNSENT&&(this.logger.info(`triggering "readystatechange" event...`),this.trigger(`readystatechange`,this.request))}trigger(eventName,target,options){let callback=target[`on${eventName}`],event=createEvent(target,eventName,options);this.logger.info(`trigger "%s"`,eventName,options||``),typeof callback==`function`&&(this.logger.info(`found a direct "%s" callback, calling...`,eventName),callback.call(target,event));let events=target instanceof XMLHttpRequestUpload?this.uploadEvents:this.events;for(let[registeredEventName,listeners]of events)registeredEventName===eventName&&(this.logger.info(`found %d listener(s) for "%s" event, calling...`,listeners.length,eventName),listeners.forEach(listener=>listener.call(target,event)))}toFetchApiRequest(body){this.logger.info(`converting request to a Fetch API Request...`);let resolvedBody=body instanceof Document?body.documentElement.innerText:body,fetchRequest=new FetchRequest(this.url.href,{method:this.method,headers:this.requestHeaders,credentials:this.request.withCredentials?`include`:`same-origin`,body:[`GET`,`HEAD`].includes(this.method.toUpperCase())?null:resolvedBody});return define(fetchRequest,`headers`,createProxy(fetchRequest.headers,{methodCall:([methodName,args],invoke)=>{switch(methodName){case`append`:case`set`:{let[headerName,headerValue]=args;this.request.setRequestHeader(headerName,headerValue);break}case`delete`:{let[headerName]=args;console.warn(`XMLHttpRequest: Cannot remove a "${headerName}" header from the Fetch API representation of the "${fetchRequest.method} ${fetchRequest.url}" request. XMLHttpRequest headers cannot be removed.`);break}}return invoke()}})),setRawRequest(fetchRequest,this.request),this.logger.info(`converted request to a Fetch API Request!`,fetchRequest),fetchRequest}};function toAbsoluteUrl(url){return typeof location>`u`?new URL(url):new URL(url.toString(),location.href)}function define(target,property,value){Reflect.defineProperty(target,property,{writable:!0,enumerable:!0,value})}function createXMLHttpRequestProxy({emitter,logger}){return new Proxy(globalThis.XMLHttpRequest,{construct(target,args,newTarget){logger.info(`constructed new XMLHttpRequest`);let originalRequest=Reflect.construct(target,args,newTarget),prototypeDescriptors=Object.getOwnPropertyDescriptors(target.prototype);for(let propertyName in prototypeDescriptors)Reflect.defineProperty(originalRequest,propertyName,prototypeDescriptors[propertyName]);let xhrRequestController=new XMLHttpRequestController(originalRequest,logger);return xhrRequestController.onRequest=async function({request,requestId}){let controller=new RequestController(request,{passthrough:()=>{this.logger.info(`no mocked response received, performing request as-is...`)},respondWith:async response=>{if(isResponseError(response)){this.errorWith(TypeError(`Network error`));return}await this.respondWith(response)},errorWith:reason=>{this.logger.info(`request errored!`,{error:reason}),reason instanceof Error&&this.errorWith(reason)}});this.logger.info(`awaiting mocked response...`),this.logger.info(`emitting the "request" event for %s listener(s)...`,emitter.listenerCount(`request`)),await handleRequest({request,requestId,controller,emitter})},xhrRequestController.onResponse=async function({response,isMockedResponse,request,requestId}){this.logger.info(`emitting the "response" event for %s listener(s)...`,emitter.listenerCount(`response`)),emitter.emit(`response`,{response,isMockedResponse,request,requestId})},xhrRequestController.request}})}var XMLHttpRequestInterceptor=class XMLHttpRequestInterceptor2 extends Interceptor{static{this.symbol=Symbol.for(`xhr-interceptor`)}constructor(){super(XMLHttpRequestInterceptor2.symbol)}checkEnvironment(){return hasConfigurableGlobal(`XMLHttpRequest`)}setup(){let logger=this.logger.extend(`setup`);logger.info(`patching global XMLHttpRequest...`),this.subscriptions.push(patchesRegistry.applyPatch(globalThis,`XMLHttpRequest`,()=>createXMLHttpRequestProxy({emitter:this.emitter,logger:this.logger}))),logger.info(`global XMLHttpRequest patched!`,globalThis.XMLHttpRequest.name)}},FallbackHttpSource=class extends InterceptorSource{constructor(options){super({interceptors:[new XMLHttpRequestInterceptor,new FetchInterceptor]}),this.options=options}options;enable(){super.enable(),this.options.quiet||this.#printStartMessage()}disable(){super.disable(),this.options.quiet||this.#printStopMessage()}#printStartMessage(){console.groupCollapsed(`%c${devUtils.formatMessage(`Mocking enabled (fallback mode).`)}`,`color:orangered;font-weight:bold;`),console.log(`%cDocumentation: %chttps://mswjs.io/docs`,`font-weight:bold`,`font-weight:normal`),console.log(`Found an issue? https://github.com/mswjs/msw/issues`),console.groupEnd()}#printStopMessage(){console.log(`%c${devUtils.formatMessage(`Mocking disabled.`)}`,`color:orangered;font-weight:bold;`)}},DEFAULT_WORKER_URL=`/mockServiceWorker.js`;function setupWorker(...handlers){invariant(!isNodeProcess(),devUtils.formatMessage("Failed to execute `setupWorker` in a non-browser environment"));let network=defineNetwork({sources:[],handlers});return{async start(options){if(options?.waitUntilReady!=null&&devUtils.warn(`The "waitUntilReady" option has been deprecated. Please remove it from this "worker.start()" call. Follow the recommended Browser integration (https://mswjs.io/docs/integrations/browser) to eliminate any race conditions between the Service Worker registration and any requests made by your application on initial render.`),network.readyState===NetworkReadyState.ENABLED){devUtils.warn(`Found a redundant "worker.start()" call. Note that starting the worker while mocking is already enabled will have no effect. Consider removing this "worker.start()" call.`);return}let httpSource=supportsServiceWorker()?await ServiceWorkerSource.from({serviceWorker:{url:options?.serviceWorker?.url?.toString()||DEFAULT_WORKER_URL,options:options?.serviceWorker?.options},findWorker:options?.findWorker,quiet:options?.quiet}):new FallbackHttpSource({quiet:options?.quiet});if(network.configure({sources:[httpSource,new InterceptorSource({interceptors:[new WebSocketInterceptor]})],onUnhandledFrame:fromLegacyOnUnhandledRequest(()=>options?.onUnhandledRequest||`warn`),context:{quiet:options?.quiet}}),await network.enable(),httpSource instanceof ServiceWorkerSource){let[,registration]=await httpSource.workerPromise;return registration}},stop(){if(network.readyState===NetworkReadyState.DISABLED){devUtils.warn(`Found a redundant "worker.stop()" call. Notice that stopping the worker after it has already been stopped has no effect. Consider removing this "worker.stop()" call.`);return}network.disable(),window.postMessage({type:`msw/worker:stop`})},events:network.events,use:network.use.bind(network),resetHandlers:network.resetHandlers.bind(network),restoreHandlers:network.restoreHandlers.bind(network),listHandlers:network.listHandlers.bind(network)}}const baseline=[http.get(`https://cloudflare.com/cdn-cgi/trace`,()=>new HttpResponse(`loc=`)),http.get(`https://m1.openfpcdn.io/fingerprintjs/:version/npm-monitoring`,()=>new HttpResponse(null,{status:204}))],worker=setupWorker(...baseline),unhandled=[];await worker.start({onUnhandledRequest:request=>{new URL(request.url).origin!==location.origin&&unhandled.push(`${request.method} ${request.url}`)},quiet:!0}),afterEach(()=>{worker.resetHandlers(...baseline);let requests=unhandled.splice(0);if(requests.length>0)throw Error(`Unhandled requests: ${requests.join(`, `)}`)});const sessionEndpoint=`https://registration.invalid/v3/session`;async function registration(){let device=new DeviceManager;device.init(),await device.whenFingerprintReady(),vi.useFakeTimers({toFake:[`Date`,`setTimeout`,`clearTimeout`]});let requests=[],client=new InterfereClient({baseUrl:`https://registration.invalid`,publicKeyHeader:{apiKey:`test`}}),prototype=Object.getPrototypeOf(client.sessions),registrations=vi.spyOn(prototype,`createSession`);worker.use(http.post(sessionEndpoint,()=>HttpResponse.json({ok:!0})));function recordRequest({request}){request.url===`https://registration.invalid/v3/session`&&requests.push(request.clone())}worker.events.on(`request:start`,recordRequest);let tracker=new SessionTracker({device,target:{baseUrl:`https://registration.invalid`,publicKeyHeader:{apiKey:`test`}}});async function settle(){await vi.advanceTimersByTimeAsync(0),await Promise.allSettled(registrations.mock.results.flatMap(result=>result.type===`return`?[result.value]:[]))}async function arrived(count){let deadline=performance.now()+1e4;await new Promise((resolve,reject)=>{function inspect(){if(requests.length>=count){resolve();return}if(performance.now()>deadline){reject(Error(`Expected ${count} registration requests, received ${requests.length}`));return}requestAnimationFrame(inspect)}inspect()})}return onTestFinished(()=>{tracker.dispose(),tracker.discardDeviceIdentity(),worker.events.removeListener(`request:start`,recordRequest);for(let key of[`interfere:session_id`,`interfere:last_activity`,`interfere:session_started`])localStorage.removeItem(key);vi.useRealTimers()}),{arrived,registrations,requests,settle,tracker}}export{registration,sessionEndpoint};
|
|
255
|
+
`);return this.logger.info(`resolved all response headers to`,allHeaders),allHeaders}}),Object.defineProperties(this.request,{response:{enumerable:!0,configurable:!1,get:()=>this.response},responseText:{enumerable:!0,configurable:!1,get:()=>this.responseText},responseXML:{enumerable:!0,configurable:!1,get:()=>this.responseXML}});let totalResponseBodyLength=await getBodyByteLength(response.clone());this.logger.info(`calculated response body length`,totalResponseBodyLength),this.trigger(`loadstart`,this.request,{loaded:0,total:totalResponseBodyLength}),this.setReadyState(this.request.HEADERS_RECEIVED),this.setReadyState(this.request.LOADING);let finalizeResponse=()=>{this.logger.info(`finalizing the mocked response...`),this.setReadyState(this.request.DONE),this.trigger(`load`,this.request,{loaded:this.responseBuffer.byteLength,total:totalResponseBodyLength}),this.trigger(`loadend`,this.request,{loaded:this.responseBuffer.byteLength,total:totalResponseBodyLength})};if(response.body){this.logger.info(`mocked response has body, streaming...`);let reader=response.body.getReader(),readNextResponseBodyChunk=async()=>{let{value,done}=await reader.read();if(done){this.logger.info(`response body stream done!`),finalizeResponse();return}value&&(this.logger.info(`read response body chunk:`,value),this.responseBuffer=concatArrayBuffer(this.responseBuffer,value),this.trigger(`progress`,this.request,{loaded:this.responseBuffer.byteLength,total:totalResponseBodyLength})),readNextResponseBodyChunk()};readNextResponseBodyChunk()}else finalizeResponse()}responseBufferToText(){return decodeBuffer(this.responseBuffer)}get response(){if(this.logger.info(`getResponse (responseType: %s)`,this.request.responseType),this.request.readyState!==this.request.DONE)return null;switch(this.request.responseType){case`json`:{let responseJson=parseJson(this.responseBufferToText());return this.logger.info(`resolved response JSON`,responseJson),responseJson}case`arraybuffer`:{let arrayBuffer=toArrayBuffer(this.responseBuffer);return this.logger.info(`resolved response ArrayBuffer`,arrayBuffer),arrayBuffer}case`blob`:{let mimeType=this.request.getResponseHeader(`Content-Type`)||`text/plain`,responseBlob=new Blob([this.responseBufferToText()],{type:mimeType});return this.logger.info(`resolved response Blob (mime type: %s)`,responseBlob,mimeType),responseBlob}default:{let responseText=this.responseBufferToText();return this.logger.info(`resolving "%s" response type as text`,this.request.responseType,responseText),responseText}}}get responseText(){if(invariant(this.request.responseType===``||this.request.responseType===`text`,`InvalidStateError: The object is in invalid state.`),this.request.readyState!==this.request.LOADING&&this.request.readyState!==this.request.DONE)return``;let responseText=this.responseBufferToText();return this.logger.info(`getResponseText: "%s"`,responseText),responseText}get responseXML(){if(invariant(this.request.responseType===``||this.request.responseType===`document`,`InvalidStateError: The object is in invalid state.`),this.request.readyState!==this.request.DONE)return null;let contentType=this.request.getResponseHeader(`Content-Type`)||``;return typeof DOMParser>`u`?(console.warn(`Cannot retrieve XMLHttpRequest response body as XML: DOMParser is not defined. You are likely using an environment that is not browser or does not polyfill browser globals correctly.`),null):isDomParserSupportedType(contentType)?new DOMParser().parseFromString(this.responseBufferToText(),contentType):null}errorWith(error2){this[kIsRequestHandled]=!0,this.logger.info(`responding with an error`),this.setReadyState(this.request.DONE),this.trigger(`error`,this.request),this.trigger(`loadend`,this.request)}setReadyState(nextReadyState){if(this.logger.info(`setReadyState: %d -> %d`,this.request.readyState,nextReadyState),this.request.readyState===nextReadyState){this.logger.info(`ready state identical, skipping transition...`);return}define(this.request,`readyState`,nextReadyState),this.logger.info(`set readyState to: %d`,nextReadyState),nextReadyState!==this.request.UNSENT&&(this.logger.info(`triggering "readystatechange" event...`),this.trigger(`readystatechange`,this.request))}trigger(eventName,target,options){let callback=target[`on${eventName}`],event=createEvent(target,eventName,options);this.logger.info(`trigger "%s"`,eventName,options||``),typeof callback==`function`&&(this.logger.info(`found a direct "%s" callback, calling...`,eventName),callback.call(target,event));let events=target instanceof XMLHttpRequestUpload?this.uploadEvents:this.events;for(let[registeredEventName,listeners]of events)registeredEventName===eventName&&(this.logger.info(`found %d listener(s) for "%s" event, calling...`,listeners.length,eventName),listeners.forEach(listener=>listener.call(target,event)))}toFetchApiRequest(body){this.logger.info(`converting request to a Fetch API Request...`);let resolvedBody=body instanceof Document?body.documentElement.innerText:body,fetchRequest=new FetchRequest(this.url.href,{method:this.method,headers:this.requestHeaders,credentials:this.request.withCredentials?`include`:`same-origin`,body:[`GET`,`HEAD`].includes(this.method.toUpperCase())?null:resolvedBody});return define(fetchRequest,`headers`,createProxy(fetchRequest.headers,{methodCall:([methodName,args],invoke)=>{switch(methodName){case`append`:case`set`:{let[headerName,headerValue]=args;this.request.setRequestHeader(headerName,headerValue);break}case`delete`:{let[headerName]=args;console.warn(`XMLHttpRequest: Cannot remove a "${headerName}" header from the Fetch API representation of the "${fetchRequest.method} ${fetchRequest.url}" request. XMLHttpRequest headers cannot be removed.`);break}}return invoke()}})),setRawRequest(fetchRequest,this.request),this.logger.info(`converted request to a Fetch API Request!`,fetchRequest),fetchRequest}};function toAbsoluteUrl(url){return typeof location>`u`?new URL(url):new URL(url.toString(),location.href)}function define(target,property,value){Reflect.defineProperty(target,property,{writable:!0,enumerable:!0,value})}function createXMLHttpRequestProxy({emitter,logger}){return new Proxy(globalThis.XMLHttpRequest,{construct(target,args,newTarget){logger.info(`constructed new XMLHttpRequest`);let originalRequest=Reflect.construct(target,args,newTarget),prototypeDescriptors=Object.getOwnPropertyDescriptors(target.prototype);for(let propertyName in prototypeDescriptors)Reflect.defineProperty(originalRequest,propertyName,prototypeDescriptors[propertyName]);let xhrRequestController=new XMLHttpRequestController(originalRequest,logger);return xhrRequestController.onRequest=async function({request,requestId}){let controller=new RequestController(request,{passthrough:()=>{this.logger.info(`no mocked response received, performing request as-is...`)},respondWith:async response=>{if(isResponseError(response)){this.errorWith(TypeError(`Network error`));return}await this.respondWith(response)},errorWith:reason=>{this.logger.info(`request errored!`,{error:reason}),reason instanceof Error&&this.errorWith(reason)}});this.logger.info(`awaiting mocked response...`),this.logger.info(`emitting the "request" event for %s listener(s)...`,emitter.listenerCount(`request`)),await handleRequest({request,requestId,controller,emitter})},xhrRequestController.onResponse=async function({response,isMockedResponse,request,requestId}){this.logger.info(`emitting the "response" event for %s listener(s)...`,emitter.listenerCount(`response`)),emitter.emit(`response`,{response,isMockedResponse,request,requestId})},xhrRequestController.request}})}var XMLHttpRequestInterceptor=class XMLHttpRequestInterceptor2 extends Interceptor{static{this.symbol=Symbol.for(`xhr-interceptor`)}constructor(){super(XMLHttpRequestInterceptor2.symbol)}checkEnvironment(){return hasConfigurableGlobal(`XMLHttpRequest`)}setup(){let logger=this.logger.extend(`setup`);logger.info(`patching global XMLHttpRequest...`),this.subscriptions.push(patchesRegistry.applyPatch(globalThis,`XMLHttpRequest`,()=>createXMLHttpRequestProxy({emitter:this.emitter,logger:this.logger}))),logger.info(`global XMLHttpRequest patched!`,globalThis.XMLHttpRequest.name)}},FallbackHttpSource=class extends InterceptorSource{constructor(options){super({interceptors:[new XMLHttpRequestInterceptor,new FetchInterceptor]}),this.options=options}options;enable(){super.enable(),this.options.quiet||this.#printStartMessage()}disable(){super.disable(),this.options.quiet||this.#printStopMessage()}#printStartMessage(){console.groupCollapsed(`%c${devUtils.formatMessage(`Mocking enabled (fallback mode).`)}`,`color:orangered;font-weight:bold;`),console.log(`%cDocumentation: %chttps://mswjs.io/docs`,`font-weight:bold`,`font-weight:normal`),console.log(`Found an issue? https://github.com/mswjs/msw/issues`),console.groupEnd()}#printStopMessage(){console.log(`%c${devUtils.formatMessage(`Mocking disabled.`)}`,`color:orangered;font-weight:bold;`)}},DEFAULT_WORKER_URL=`/mockServiceWorker.js`;function setupWorker(...handlers){invariant(!isNodeProcess(),devUtils.formatMessage("Failed to execute `setupWorker` in a non-browser environment"));let network=defineNetwork({sources:[],handlers});return{async start(options){if(options?.waitUntilReady!=null&&devUtils.warn(`The "waitUntilReady" option has been deprecated. Please remove it from this "worker.start()" call. Follow the recommended Browser integration (https://mswjs.io/docs/integrations/browser) to eliminate any race conditions between the Service Worker registration and any requests made by your application on initial render.`),network.readyState===NetworkReadyState.ENABLED){devUtils.warn(`Found a redundant "worker.start()" call. Note that starting the worker while mocking is already enabled will have no effect. Consider removing this "worker.start()" call.`);return}let httpSource=supportsServiceWorker()?await ServiceWorkerSource.from({serviceWorker:{url:options?.serviceWorker?.url?.toString()||DEFAULT_WORKER_URL,options:options?.serviceWorker?.options},findWorker:options?.findWorker,quiet:options?.quiet}):new FallbackHttpSource({quiet:options?.quiet});if(network.configure({sources:[httpSource,new InterceptorSource({interceptors:[new WebSocketInterceptor]})],onUnhandledFrame:fromLegacyOnUnhandledRequest(()=>options?.onUnhandledRequest||`warn`),context:{quiet:options?.quiet}}),await network.enable(),httpSource instanceof ServiceWorkerSource){let[,registration]=await httpSource.workerPromise;return registration}},stop(){if(network.readyState===NetworkReadyState.DISABLED){devUtils.warn(`Found a redundant "worker.stop()" call. Notice that stopping the worker after it has already been stopped has no effect. Consider removing this "worker.stop()" call.`);return}network.disable(),window.postMessage({type:`msw/worker:stop`})},events:network.events,use:network.use.bind(network),resetHandlers:network.resetHandlers.bind(network),restoreHandlers:network.restoreHandlers.bind(network),listHandlers:network.listHandlers.bind(network)}}const baseline=[http.get(`https://cloudflare.com/cdn-cgi/trace`,()=>new HttpResponse(`loc=`)),http.get(`https://m1.openfpcdn.io/fingerprintjs/:version/npm-monitoring`,()=>new HttpResponse(null,{status:204}))],worker=setupWorker(...baseline),unhandled=[],inflight=new Set,originalFetch=globalThis.fetch;async function forget(response){await Promise.allSettled([response]),inflight.delete(response)}globalThis.fetch=async(input,init)=>{let response=originalFetch(input,init);return inflight.add(response),forget(response),response};async function settleInflightFetches(){inflight.size!==0&&(await Promise.allSettled(inflight),await settleInflightFetches())}await worker.start({onUnhandledRequest:request=>{new URL(request.url).origin!==location.origin&&unhandled.push(`${request.method} ${request.url}`)},quiet:!0}),afterEach(async()=>{await settleInflightFetches(),worker.resetHandlers(...baseline);let requests=unhandled.splice(0);if(requests.length>0)throw Error(`Unhandled requests: ${requests.join(`, `)}`)});const sessionEndpoint=`https://registration.invalid/v3/session`;async function registration(){let device=new DeviceManager;device.init(),await device.whenFingerprintReady(),vi.useFakeTimers({toFake:[`Date`,`setTimeout`,`clearTimeout`]});let requests=[],client=new InterfereClient({baseUrl:`https://registration.invalid`,publicKeyHeader:{apiKey:`test`}}),prototype=Object.getPrototypeOf(client.sessions),registrations=vi.spyOn(prototype,`createSession`);worker.use(http.post(sessionEndpoint,()=>HttpResponse.json({ok:!0})));function recordRequest({request}){request.url===`https://registration.invalid/v3/session`&&requests.push(request.clone())}worker.events.on(`request:start`,recordRequest);let tracker=new SessionTracker({device,target:{baseUrl:`https://registration.invalid`,publicKeyHeader:{apiKey:`test`}}});async function settle(){await vi.advanceTimersByTimeAsync(0),await Promise.allSettled(registrations.mock.results.flatMap(result=>result.type===`return`?[result.value]:[]))}async function arrived(count){let deadline=performance.now()+1e4;await new Promise((resolve,reject)=>{function inspect(){if(requests.length>=count){resolve();return}if(performance.now()>deadline){reject(Error(`Expected ${count} registration requests, received ${requests.length}`));return}requestAnimationFrame(inspect)}inspect()})}return onTestFinished(()=>{tracker.dispose(),tracker.discardDeviceIdentity(),worker.events.removeListener(`request:start`,recordRequest);for(let key of[`interfere:session_id`,`interfere:last_activity`,`interfere:session_started`])localStorage.removeItem(key);vi.useRealTimers()}),{arrived,registrations,requests,settle,tracker}}export{registration,sessionEndpoint};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as SessionRetry}from"../session-retry-
|
|
1
|
+
import{t as SessionRetry}from"../session-retry-C2Uh7eZ6.mjs";export{SessionRetry};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as createLogger}from"./log-D6Ht--tv.mjs";import{gzipSync}from"fflate";const log=createLogger(`replay/compressor`);function gzipForUnload(bytes){if(bytes.byteLength>2097152)return null;try{return new Uint8Array(gzipSync(bytes))}catch(error){return log.warn(`synchronous gzip failed for the unload chunk: %o`,error),null}}export{gzipForUnload as t};
|
|
@@ -0,0 +1 @@
|
|
|
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};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var name=`@interfere/react`,version=`12.
|
|
1
|
+
var name=`@interfere/react`,version=`12.2.0`;const SDK_NAME=name,SDK_VERSION=version,PRODUCER_VERSION=`${SDK_NAME}@${SDK_VERSION}`;export{SDK_NAME as n,SDK_VERSION as r,PRODUCER_VERSION as t};
|