Socket
Socket
Sign inDemoInstall

@datadog/browser-rum

Package Overview
Dependencies
4
Maintainers
1
Versions
248
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 4.46.0 to 4.47.0

4

cjs/boot/recorderApi.js

@@ -65,7 +65,7 @@ "use strict";

state = { status: 2 /* RecorderStatus.Starting */ };
(0, browser_core_1.runOnReadyState)('interactive', function () {
(0, browser_core_1.runOnReadyState)(configuration, 'interactive', function () {
if (state.status !== 2 /* RecorderStatus.Starting */) {
return;
}
startDeflateWorkerImpl(function (worker) {
startDeflateWorkerImpl(configuration, function (worker) {
if (state.status !== 2 /* RecorderStatus.Starting */) {

@@ -72,0 +72,0 @@ return;

@@ -13,4 +13,5 @@ "use strict";

};
var replayRequest = httpRequest || (0, browser_core_1.createHttpRequest)(configuration.sessionReplayEndpointBuilder, segmentCollection_1.SEGMENT_BYTES_LIMIT, reportError);
var _a = (0, segmentCollection_1.startSegmentCollection)(lifeCycle, configuration.applicationId, sessionManager, viewContexts, replayRequest, worker), addRecord = _a.addRecord, stopSegmentCollection = _a.stop;
var replayRequest = httpRequest ||
(0, browser_core_1.createHttpRequest)(configuration, configuration.sessionReplayEndpointBuilder, segmentCollection_1.SEGMENT_BYTES_LIMIT, reportError);
var _a = (0, segmentCollection_1.startSegmentCollection)(lifeCycle, configuration, sessionManager, viewContexts, replayRequest, worker), addRecord = _a.addRecord, stopSegmentCollection = _a.stop;
var _b = (0, record_1.record)({

@@ -17,0 +18,0 @@ emit: addRecord,

import type { ListenerHandler } from '@datadog/browser-core';
import type { RumConfiguration } from '@datadog/browser-rum-core';
import type { FocusRecord } from '../../../types';
export type FocusCallback = (data: FocusRecord['data']) => void;
export declare function initFocusObserver(focusCb: FocusCallback): ListenerHandler;
export declare function initFocusObserver(configuration: RumConfiguration, focusCb: FocusCallback): ListenerHandler;

@@ -5,4 +5,4 @@ "use strict";

var browser_core_1 = require("@datadog/browser-core");
function initFocusObserver(focusCb) {
return (0, browser_core_1.addEventListeners)(window, ["focus" /* DOM_EVENT.FOCUS */, "blur" /* DOM_EVENT.BLUR */], function () {
function initFocusObserver(configuration, focusCb) {
return (0, browser_core_1.addEventListeners)(configuration, window, ["focus" /* DOM_EVENT.FOCUS */, "blur" /* DOM_EVENT.BLUR */], function () {
focusCb({ has_focus: document.hasFocus() });

@@ -9,0 +9,0 @@ }).stop;

@@ -1,2 +0,3 @@

import type { DefaultPrivacyLevel, ListenerHandler } from '@datadog/browser-core';
import type { ListenerHandler } from '@datadog/browser-core';
import type { RumConfiguration } from '@datadog/browser-rum-core';
import type { InputState } from '../../../types';

@@ -6,2 +7,2 @@ export type InputCallback = (v: InputState & {

}) => void;
export declare function initInputObserver(cb: InputCallback, defaultPrivacyLevel: DefaultPrivacyLevel, target?: Document | ShadowRoot): ListenerHandler;
export declare function initInputObserver(configuration: RumConfiguration, cb: InputCallback, target?: Document | ShadowRoot): ListenerHandler;

@@ -9,7 +9,8 @@ "use strict";

var serialization_1 = require("../serialization");
function initInputObserver(cb, defaultPrivacyLevel, target) {
function initInputObserver(configuration, cb, target) {
if (target === void 0) { target = document; }
var defaultPrivacyLevel = configuration.defaultPrivacyLevel;
var lastInputStateMap = new WeakMap();
var isShadowRoot = target !== document;
var stopEventListeners = (0, browser_core_1.addEventListeners)(target,
var stopEventListeners = (0, browser_core_1.addEventListeners)(configuration, target,
// The 'input' event bubbles across shadow roots, so we don't have to listen for it on shadow

@@ -74,3 +75,3 @@ // roots since it will be handled by the event listener that we did add to the document. Only

if (type === 'radio' && name && target.checked) {
(0, browser_core_1.forEach)(document.querySelectorAll("input[type=\"radio\"][name=\"".concat(name, "\"]")), function (el) {
(0, browser_core_1.forEach)(document.querySelectorAll("input[type=\"radio\"][name=\"".concat((0, browser_core_1.cssEscape)(name), "\"]")), function (el) {
if (el !== target) {

@@ -77,0 +78,0 @@ // TODO: Consider the privacy implications for various differing input privacy levels

import type { DefaultPrivacyLevel, ListenerHandler } from '@datadog/browser-core';
import type { RumConfiguration } from '@datadog/browser-rum-core';
import type { MediaInteraction } from '../../../types';
export type MediaInteractionCallback = (p: MediaInteraction) => void;
export declare function initMediaInteractionObserver(mediaInteractionCb: MediaInteractionCallback, defaultPrivacyLevel: DefaultPrivacyLevel): ListenerHandler;
export declare function initMediaInteractionObserver(configuration: RumConfiguration, mediaInteractionCb: MediaInteractionCallback, defaultPrivacyLevel: DefaultPrivacyLevel): ListenerHandler;

@@ -10,3 +10,3 @@ "use strict";

var serialization_1 = require("../serialization");
function initMediaInteractionObserver(mediaInteractionCb, defaultPrivacyLevel) {
function initMediaInteractionObserver(configuration, mediaInteractionCb, defaultPrivacyLevel) {
var handler = function (event) {

@@ -24,5 +24,8 @@ var target = (0, eventsUtils_1.getEventTarget)(event);

};
return (0, browser_core_1.addEventListeners)(document, ["play" /* DOM_EVENT.PLAY */, "pause" /* DOM_EVENT.PAUSE */], handler, { capture: true, passive: true }).stop;
return (0, browser_core_1.addEventListeners)(configuration, document, ["play" /* DOM_EVENT.PLAY */, "pause" /* DOM_EVENT.PAUSE */], handler, {
capture: true,
passive: true,
}).stop;
}
exports.initMediaInteractionObserver = initMediaInteractionObserver;
//# sourceMappingURL=mediaInteractionObserver.js.map

@@ -1,5 +0,6 @@

import type { DefaultPrivacyLevel, ListenerHandler } from '@datadog/browser-core';
import type { ListenerHandler } from '@datadog/browser-core';
import type { RumConfiguration } from '@datadog/browser-rum-core';
import type { BrowserIncrementalSnapshotRecord } from '../../../types';
import type { RecordIds } from './recordIds';
export type MouseInteractionCallBack = (record: BrowserIncrementalSnapshotRecord) => void;
export declare function initMouseInteractionObserver(cb: MouseInteractionCallBack, defaultPrivacyLevel: DefaultPrivacyLevel, recordIds: RecordIds): ListenerHandler;
export declare function initMouseInteractionObserver(configuration: RumConfiguration, cb: MouseInteractionCallBack, recordIds: RecordIds): ListenerHandler;

@@ -32,6 +32,7 @@ "use strict";

_a);
function initMouseInteractionObserver(cb, defaultPrivacyLevel, recordIds) {
function initMouseInteractionObserver(configuration, cb, recordIds) {
var handler = function (event) {
var target = (0, eventsUtils_1.getEventTarget)(event);
if ((0, privacy_1.getNodePrivacyLevel)(target, defaultPrivacyLevel) === constants_1.NodePrivacyLevel.HIDDEN || !(0, serialization_1.hasSerializedNode)(target)) {
if ((0, privacy_1.getNodePrivacyLevel)(target, configuration.defaultPrivacyLevel) === constants_1.NodePrivacyLevel.HIDDEN ||
!(0, serialization_1.hasSerializedNode)(target)) {
return;

@@ -55,3 +56,3 @@ }

};
return (0, browser_core_1.addEventListeners)(document, Object.keys(eventTypeToMouseInteraction), handler, {
return (0, browser_core_1.addEventListeners)(configuration, document, Object.keys(eventTypeToMouseInteraction), handler, {
capture: true,

@@ -58,0 +59,0 @@ passive: true,

import type { ListenerHandler } from '@datadog/browser-core';
import type { RumConfiguration } from '@datadog/browser-rum-core';
import type { MousePosition } from '../../../types';
import { IncrementalSource } from '../../../types';
export type MousemoveCallBack = (p: MousePosition[], source: typeof IncrementalSource.MouseMove | typeof IncrementalSource.TouchMove) => void;
export declare function initMoveObserver(cb: MousemoveCallBack): ListenerHandler;
export declare function initMoveObserver(configuration: RumConfiguration, cb: MousemoveCallBack): ListenerHandler;
export declare function tryToComputeCoordinates(event: MouseEvent | TouchEvent): {

@@ -7,0 +8,0 @@ x: number;

@@ -10,3 +10,3 @@ "use strict";

var MOUSE_MOVE_OBSERVER_THRESHOLD = 50;
function initMoveObserver(cb) {
function initMoveObserver(configuration, cb) {
var updatePosition = (0, browser_core_1.throttle)(function (event) {

@@ -30,3 +30,3 @@ var target = (0, eventsUtils_1.getEventTarget)(event);

}).throttled;
return (0, browser_core_1.addEventListeners)(document, ["mousemove" /* DOM_EVENT.MOUSE_MOVE */, "touchmove" /* DOM_EVENT.TOUCH_MOVE */], updatePosition, {
return (0, browser_core_1.addEventListeners)(configuration, document, ["mousemove" /* DOM_EVENT.MOUSE_MOVE */, "touchmove" /* DOM_EVENT.TOUCH_MOVE */], updatePosition, {
capture: true,

@@ -33,0 +33,0 @@ passive: true,

@@ -32,3 +32,3 @@ import type { ListenerHandler } from '@datadog/browser-core';

}
export declare function initObservers(o: ObserverParam): {
export declare function initObservers(configuration: RumConfiguration, o: ObserverParam): {
stop: ListenerHandler;

@@ -35,0 +35,0 @@ flush: ListenerHandler;

@@ -15,14 +15,14 @@ "use strict";

var recordIds_1 = require("./recordIds");
function initObservers(o) {
function initObservers(configuration, o) {
var recordIds = (0, recordIds_1.initRecordIds)();
var mutationHandler = (0, mutationObserver_1.initMutationObserver)(o.mutationCb, o.configuration, o.shadowRootsController, document);
var mousemoveHandler = (0, moveObserver_1.initMoveObserver)(o.mousemoveCb);
var mouseInteractionHandler = (0, mouseInteractionObserver_1.initMouseInteractionObserver)(o.mouseInteractionCb, o.configuration.defaultPrivacyLevel, recordIds);
var scrollHandler = (0, scrollObserver_1.initScrollObserver)(o.scrollCb, o.configuration.defaultPrivacyLevel, o.elementsScrollPositions);
var viewportResizeHandler = (0, viewportResizeObserver_1.initViewportResizeObserver)(o.viewportResizeCb);
var inputHandler = (0, inputObserver_1.initInputObserver)(o.inputCb, o.configuration.defaultPrivacyLevel);
var mediaInteractionHandler = (0, mediaInteractionObserver_1.initMediaInteractionObserver)(o.mediaInteractionCb, o.configuration.defaultPrivacyLevel);
var mousemoveHandler = (0, moveObserver_1.initMoveObserver)(configuration, o.mousemoveCb);
var mouseInteractionHandler = (0, mouseInteractionObserver_1.initMouseInteractionObserver)(configuration, o.mouseInteractionCb, recordIds);
var scrollHandler = (0, scrollObserver_1.initScrollObserver)(configuration, o.scrollCb, o.configuration.defaultPrivacyLevel, o.elementsScrollPositions);
var viewportResizeHandler = (0, viewportResizeObserver_1.initViewportResizeObserver)(configuration, o.viewportResizeCb);
var inputHandler = (0, inputObserver_1.initInputObserver)(configuration, o.inputCb);
var mediaInteractionHandler = (0, mediaInteractionObserver_1.initMediaInteractionObserver)(configuration, o.mediaInteractionCb, o.configuration.defaultPrivacyLevel);
var styleSheetObserver = (0, styleSheetObserver_1.initStyleSheetObserver)(o.styleSheetCb);
var focusHandler = (0, focusObserver_1.initFocusObserver)(o.focusCb);
var visualViewportResizeHandler = (0, viewportResizeObserver_1.initVisualViewportResizeObserver)(o.visualViewportResizeCb);
var focusHandler = (0, focusObserver_1.initFocusObserver)(configuration, o.focusCb);
var visualViewportResizeHandler = (0, viewportResizeObserver_1.initVisualViewportResizeObserver)(configuration, o.visualViewportResizeCb);
var frustrationHandler = (0, frustrationObserver_1.initFrustrationObserver)(o.lifeCycle, o.frustrationCb, recordIds);

@@ -29,0 +29,0 @@ return {

import type { DefaultPrivacyLevel, ListenerHandler } from '@datadog/browser-core';
import type { RumConfiguration } from '@datadog/browser-rum-core';
import type { ElementsScrollPositions } from '../elementsScrollPositions';
import type { ScrollPosition } from '../../../types';
export type ScrollCallback = (p: ScrollPosition) => void;
export declare function initScrollObserver(cb: ScrollCallback, defaultPrivacyLevel: DefaultPrivacyLevel, elementsScrollPositions: ElementsScrollPositions): ListenerHandler;
export declare function initScrollObserver(configuration: RumConfiguration, cb: ScrollCallback, defaultPrivacyLevel: DefaultPrivacyLevel, elementsScrollPositions: ElementsScrollPositions): ListenerHandler;

@@ -11,3 +11,3 @@ "use strict";

var SCROLL_OBSERVER_THRESHOLD = 100;
function initScrollObserver(cb, defaultPrivacyLevel, elementsScrollPositions) {
function initScrollObserver(configuration, cb, defaultPrivacyLevel, elementsScrollPositions) {
var updatePosition = (0, browser_core_1.throttle)(function (event) {

@@ -37,5 +37,6 @@ var target = (0, eventsUtils_1.getEventTarget)(event);

}, SCROLL_OBSERVER_THRESHOLD).throttled;
return (0, browser_core_1.addEventListener)(document, "scroll" /* DOM_EVENT.SCROLL */, updatePosition, { capture: true, passive: true }).stop;
return (0, browser_core_1.addEventListener)(configuration, document, "scroll" /* DOM_EVENT.SCROLL */, updatePosition, { capture: true, passive: true })
.stop;
}
exports.initScrollObserver = initScrollObserver;
//# sourceMappingURL=scrollObserver.js.map
import type { ListenerHandler } from '@datadog/browser-core';
import type { RumConfiguration } from '@datadog/browser-rum-core';
import type { ViewportResizeDimension, VisualViewportRecord } from '../../../types';
export type ViewportResizeCallback = (d: ViewportResizeDimension) => void;
export type VisualViewportResizeCallback = (data: VisualViewportRecord['data']) => void;
export declare function initViewportResizeObserver(cb: ViewportResizeCallback): ListenerHandler;
export declare function initVisualViewportResizeObserver(cb: VisualViewportResizeCallback): ListenerHandler;
export declare function initViewportResizeObserver(configuration: RumConfiguration, cb: ViewportResizeCallback): ListenerHandler;
export declare function initVisualViewportResizeObserver(configuration: RumConfiguration, cb: VisualViewportResizeCallback): ListenerHandler;

@@ -8,7 +8,7 @@ "use strict";

var VISUAL_VIEWPORT_OBSERVER_THRESHOLD = 200;
function initViewportResizeObserver(cb) {
return (0, browser_rum_core_1.initViewportObservable)().subscribe(cb).unsubscribe;
function initViewportResizeObserver(configuration, cb) {
return (0, browser_rum_core_1.initViewportObservable)(configuration).subscribe(cb).unsubscribe;
}
exports.initViewportResizeObserver = initViewportResizeObserver;
function initVisualViewportResizeObserver(cb) {
function initVisualViewportResizeObserver(configuration, cb) {
var visualViewport = window.visualViewport;

@@ -23,3 +23,3 @@ if (!visualViewport) {

}), updateDimension = _a.throttled, cancelThrottle = _a.cancel;
var removeListener = (0, browser_core_1.addEventListeners)(visualViewport, ["resize" /* DOM_EVENT.RESIZE */, "scroll" /* DOM_EVENT.SCROLL */], updateDimension, {
var removeListener = (0, browser_core_1.addEventListeners)(configuration, visualViewport, ["resize" /* DOM_EVENT.RESIZE */, "scroll" /* DOM_EVENT.SCROLL */], updateDimension, {
capture: true,

@@ -26,0 +26,0 @@ passive: true,

@@ -14,3 +14,3 @@ "use strict";

function record(options) {
var emit = options.emit;
var emit = options.emit, configuration = options.configuration;
// runtime checks for user options

@@ -25,3 +25,3 @@ if (!emit) {

var inputCb = function (s) { return emit((0, assembly_1.assembleIncrementalSnapshot)(types_1.IncrementalSource.Input, s)); };
var shadowRootsController = (0, shadowRootsController_1.initShadowRootsController)(options.configuration, { mutationCb: mutationCb, inputCb: inputCb });
var shadowRootsController = (0, shadowRootsController_1.initShadowRootsController)(configuration, { mutationCb: mutationCb, inputCb: inputCb });
var takeFullSnapshot = function (timestamp, serializationContext) {

@@ -53,3 +53,3 @@ if (timestamp === void 0) { timestamp = (0, browser_core_1.timeStampNow)(); }

data: {
node: (0, serialization_1.serializeDocument)(document, options.configuration, serializationContext),
node: (0, serialization_1.serializeDocument)(document, configuration, serializationContext),
initialOffset: {

@@ -72,5 +72,5 @@ left: (0, browser_rum_core_1.getScrollX)(),

takeFullSnapshot();
var _a = (0, observers_1.initObservers)({
var _a = (0, observers_1.initObservers)(configuration, {
lifeCycle: options.lifeCycle,
configuration: options.configuration,
configuration: configuration,
elementsScrollPositions: elementsScrollPositions,

@@ -77,0 +77,0 @@ inputCb: inputCb,

@@ -12,3 +12,3 @@ "use strict";

// the change event no do bubble up across the shadow root, we have to listen on the shadow root
var stopInputObserver = (0, observers_1.initInputObserver)(inputCb, configuration.defaultPrivacyLevel, shadowRoot);
var stopInputObserver = (0, observers_1.initInputObserver)(configuration, inputCb, shadowRoot);
controllerByShadowRoot.set(shadowRoot, {

@@ -15,0 +15,0 @@ flush: flush,

@@ -0,1 +1,2 @@

import type { RumConfiguration } from '@datadog/browser-rum-core';
import type { BrowserRecord, BrowserSegmentMetadata, CreationReason, SegmentContext } from '../../types';

@@ -10,3 +11,3 @@ import type { DeflateWorker } from './startDeflateWorker';

private pendingWriteCount;
constructor(worker: DeflateWorker, context: SegmentContext, creationReason: CreationReason, initialRecord: BrowserRecord, onWrote: (compressedBytesCount: number) => void, onFlushed: (data: Uint8Array, rawBytesCount: number) => void);
constructor(configuration: RumConfiguration, worker: DeflateWorker, context: SegmentContext, creationReason: CreationReason, initialRecord: BrowserRecord, onWrote: (compressedBytesCount: number) => void, onFlushed: (data: Uint8Array, rawBytesCount: number) => void);
addRecord(record: BrowserRecord): void;

@@ -13,0 +14,0 @@ flush(reason: FlushReason): void;

@@ -34,3 +34,3 @@ "use strict";

var Segment = /** @class */ (function () {
function Segment(worker, context, creationReason, initialRecord, onWrote, onFlushed) {
function Segment(configuration, worker, context, creationReason, initialRecord, onWrote, onFlushed) {
var _this = this;

@@ -55,3 +55,3 @@ this.worker = worker;

var compressedData = [];
var removeMessageListener = (0, browser_core_1.addEventListener)(worker, 'message', function (_a) {
var removeMessageListener = (0, browser_core_1.addEventListener)(configuration, worker, 'message', function (_a) {
var data = _a.data;

@@ -58,0 +58,0 @@ if (data.type !== 'wrote') {

import type { HttpRequest } from '@datadog/browser-core';
import type { LifeCycle, ViewContexts, RumSessionManager } from '@datadog/browser-rum-core';
import type { LifeCycle, ViewContexts, RumSessionManager, RumConfiguration } from '@datadog/browser-rum-core';
import type { BrowserRecord, SegmentContext } from '../../types';

@@ -11,7 +11,7 @@ import type { DeflateWorker } from './startDeflateWorker';

export declare let SEGMENT_BYTES_LIMIT: number;
export declare function startSegmentCollection(lifeCycle: LifeCycle, applicationId: string, sessionManager: RumSessionManager, viewContexts: ViewContexts, httpRequest: HttpRequest, worker: DeflateWorker): {
export declare function startSegmentCollection(lifeCycle: LifeCycle, configuration: RumConfiguration, sessionManager: RumSessionManager, viewContexts: ViewContexts, httpRequest: HttpRequest, worker: DeflateWorker): {
addRecord: (record: BrowserRecord) => void;
stop: () => void;
};
export declare function doStartSegmentCollection(lifeCycle: LifeCycle, getSegmentContext: () => SegmentContext | undefined, httpRequest: HttpRequest, worker: DeflateWorker): {
export declare function doStartSegmentCollection(lifeCycle: LifeCycle, configuration: RumConfiguration, getSegmentContext: () => SegmentContext | undefined, httpRequest: HttpRequest, worker: DeflateWorker): {
addRecord: (record: BrowserRecord) => void;

@@ -18,0 +18,0 @@ stop: () => void;

@@ -37,7 +37,7 @@ "use strict";

// indicating why the session has been created.
function startSegmentCollection(lifeCycle, applicationId, sessionManager, viewContexts, httpRequest, worker) {
return doStartSegmentCollection(lifeCycle, function () { return computeSegmentContext(applicationId, sessionManager, viewContexts); }, httpRequest, worker);
function startSegmentCollection(lifeCycle, configuration, sessionManager, viewContexts, httpRequest, worker) {
return doStartSegmentCollection(lifeCycle, configuration, function () { return computeSegmentContext(configuration.applicationId, sessionManager, viewContexts); }, httpRequest, worker);
}
exports.startSegmentCollection = startSegmentCollection;
function doStartSegmentCollection(lifeCycle, getSegmentContext, httpRequest, worker) {
function doStartSegmentCollection(lifeCycle, configuration, getSegmentContext, httpRequest, worker) {
var state = {

@@ -75,3 +75,3 @@ status: 0 /* SegmentCollectionStatus.WaitingForInitialRecord */,

}
var segment = new segment_1.Segment(worker, context, creationReason, initialRecord, function (compressedSegmentBytesCount) {
var segment = new segment_1.Segment(configuration, worker, context, creationReason, initialRecord, function (compressedSegmentBytesCount) {
if (!segment.flushReason && compressedSegmentBytesCount > exports.SEGMENT_BYTES_LIMIT) {

@@ -78,0 +78,0 @@ flushSegment('segment_bytes_limit');

import type { DeflateWorkerAction } from '@datadog/browser-worker';
import type { RumConfiguration } from '@datadog/browser-rum-core';
export declare const INITIALIZATION_TIME_OUT_DELAY: number;
export interface DeflateWorker extends Worker {
postMessage(message: DeflateWorkerAction): void;
}
export declare function createDeflateWorker(): DeflateWorker;
export declare function startDeflateWorker(callback: (worker?: DeflateWorker) => void, createDeflateWorkerImpl?: typeof createDeflateWorker): void;
export declare function createDeflateWorker(configuration: RumConfiguration): DeflateWorker;
export declare function startDeflateWorker(configuration: RumConfiguration, callback: (worker?: DeflateWorker) => void, createDeflateWorkerImpl?: typeof createDeflateWorker): void;
export declare function resetDeflateWorkerState(): void;

@@ -17,2 +19,2 @@ /**

*/
export declare function doStartDeflateWorker(createDeflateWorkerImpl?: typeof createDeflateWorker): DeflateWorker | undefined;
export declare function doStartDeflateWorker(configuration: RumConfiguration, createDeflateWorkerImpl?: typeof createDeflateWorker): DeflateWorker | undefined;
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.doStartDeflateWorker = exports.resetDeflateWorkerState = exports.startDeflateWorker = exports.createDeflateWorker = void 0;
exports.doStartDeflateWorker = exports.resetDeflateWorkerState = exports.startDeflateWorker = exports.createDeflateWorker = exports.INITIALIZATION_TIME_OUT_DELAY = void 0;
var browser_core_1 = require("@datadog/browser-core");
var string_1 = require("@datadog/browser-worker/string");
var workerURL;
function createDeflateWorker() {
exports.INITIALIZATION_TIME_OUT_DELAY = 10 * browser_core_1.ONE_SECOND;
var workerBlobUrl;
function createWorkerBlobUrl() {
// Lazily compute the worker URL to allow importing the SDK in NodeJS
if (!workerURL) {
workerURL = URL.createObjectURL(new Blob([string_1.workerString]));
if (!workerBlobUrl) {
workerBlobUrl = URL.createObjectURL(new Blob([string_1.workerString]));
}
return new Worker(workerURL);
return workerBlobUrl;
}
function createDeflateWorker(configuration) {
return new Worker(configuration.workerUrl || createWorkerBlobUrl());
}
exports.createDeflateWorker = createDeflateWorker;
var state = { status: 0 /* DeflateWorkerStatus.Nil */ };
function startDeflateWorker(callback, createDeflateWorkerImpl) {
function startDeflateWorker(configuration, callback, createDeflateWorkerImpl) {
if (createDeflateWorkerImpl === void 0) { createDeflateWorkerImpl = createDeflateWorker; }

@@ -21,3 +25,3 @@ switch (state.status) {

state = { status: 1 /* DeflateWorkerStatus.Loading */, callbacks: [callback] };
doStartDeflateWorker(createDeflateWorkerImpl);
doStartDeflateWorker(configuration, createDeflateWorkerImpl);
break;

@@ -49,11 +53,13 @@ case 1 /* DeflateWorkerStatus.Loading */:

*/
function doStartDeflateWorker(createDeflateWorkerImpl) {
function doStartDeflateWorker(configuration, createDeflateWorkerImpl) {
if (createDeflateWorkerImpl === void 0) { createDeflateWorkerImpl = createDeflateWorker; }
try {
var worker_1 = createDeflateWorkerImpl();
(0, browser_core_1.addEventListener)(worker_1, 'error', onError);
(0, browser_core_1.addEventListener)(worker_1, 'message', function (_a) {
var worker_1 = createDeflateWorkerImpl(configuration);
(0, browser_core_1.addEventListener)(configuration, worker_1, 'error', function (error) {
onError(configuration, error);
});
(0, browser_core_1.addEventListener)(configuration, worker_1, 'message', function (_a) {
var data = _a.data;
if (data.type === 'errored') {
onError(data.error, data.streamId);
onError(configuration, data.error, data.streamId);
}

@@ -65,9 +71,17 @@ else if (data.type === 'initialized') {

worker_1.postMessage({ action: 'init' });
(0, browser_core_1.setTimeout)(onTimeout, exports.INITIALIZATION_TIME_OUT_DELAY);
return worker_1;
}
catch (error) {
onError(error);
onError(configuration, error);
}
}
exports.doStartDeflateWorker = doStartDeflateWorker;
function onTimeout() {
if (state.status === 1 /* DeflateWorkerStatus.Loading */) {
browser_core_1.display.error('Session Replay recording failed to start: a timeout occurred while initializing the Worker');
state.callbacks.forEach(function (callback) { return callback(); });
state = { status: 2 /* DeflateWorkerStatus.Error */ };
}
}
function onInitialized(worker, version) {

@@ -79,8 +93,14 @@ if (state.status === 1 /* DeflateWorkerStatus.Loading */) {

}
function onError(error, streamId) {
function onError(configuration, error, streamId) {
if (state.status === 1 /* DeflateWorkerStatus.Loading */) {
browser_core_1.display.error('Session Replay recording failed to start: an error occurred while creating the Worker:', error);
if (error instanceof Event || (error instanceof Error && isMessageCspRelated(error.message))) {
browser_core_1.display.error('Please make sure CSP is correctly configured ' +
'https://docs.datadoghq.com/real_user_monitoring/faq/content_security_policy');
var baseMessage = void 0;
if (configuration.workerUrl) {
baseMessage = "Please make sure the Worker URL ".concat(configuration.workerUrl, " is correct and CSP is correctly configured.");
}
else {
baseMessage = 'Please make sure CSP is correctly configured.';
}
browser_core_1.display.error("".concat(baseMessage, " See documentation at https://docs.datadoghq.com/integrations/content_security_policy_logs/#use-csp-with-real-user-monitoring-and-session-replay"));
}

@@ -87,0 +107,0 @@ else {

@@ -62,7 +62,7 @@ import { Observable, canUseEventBridge, noop, runOnReadyState, relativeNow } from '@datadog/browser-core';

state = { status: 2 /* RecorderStatus.Starting */ };
runOnReadyState('interactive', function () {
runOnReadyState(configuration, 'interactive', function () {
if (state.status !== 2 /* RecorderStatus.Starting */) {
return;
}
startDeflateWorkerImpl(function (worker) {
startDeflateWorkerImpl(configuration, function (worker) {
if (state.status !== 2 /* RecorderStatus.Starting */) {

@@ -69,0 +69,0 @@ return;

@@ -10,4 +10,5 @@ import { timeStampNow, createHttpRequest, addTelemetryDebug } from '@datadog/browser-core';

};
var replayRequest = httpRequest || createHttpRequest(configuration.sessionReplayEndpointBuilder, SEGMENT_BYTES_LIMIT, reportError);
var _a = startSegmentCollection(lifeCycle, configuration.applicationId, sessionManager, viewContexts, replayRequest, worker), addRecord = _a.addRecord, stopSegmentCollection = _a.stop;
var replayRequest = httpRequest ||
createHttpRequest(configuration, configuration.sessionReplayEndpointBuilder, SEGMENT_BYTES_LIMIT, reportError);
var _a = startSegmentCollection(lifeCycle, configuration, sessionManager, viewContexts, replayRequest, worker), addRecord = _a.addRecord, stopSegmentCollection = _a.stop;
var _b = record({

@@ -14,0 +15,0 @@ emit: addRecord,

import type { ListenerHandler } from '@datadog/browser-core';
import type { RumConfiguration } from '@datadog/browser-rum-core';
import type { FocusRecord } from '../../../types';
export type FocusCallback = (data: FocusRecord['data']) => void;
export declare function initFocusObserver(focusCb: FocusCallback): ListenerHandler;
export declare function initFocusObserver(configuration: RumConfiguration, focusCb: FocusCallback): ListenerHandler;
import { addEventListeners } from '@datadog/browser-core';
export function initFocusObserver(focusCb) {
return addEventListeners(window, ["focus" /* DOM_EVENT.FOCUS */, "blur" /* DOM_EVENT.BLUR */], function () {
export function initFocusObserver(configuration, focusCb) {
return addEventListeners(configuration, window, ["focus" /* DOM_EVENT.FOCUS */, "blur" /* DOM_EVENT.BLUR */], function () {
focusCb({ has_focus: document.hasFocus() });

@@ -5,0 +5,0 @@ }).stop;

@@ -1,2 +0,3 @@

import type { DefaultPrivacyLevel, ListenerHandler } from '@datadog/browser-core';
import type { ListenerHandler } from '@datadog/browser-core';
import type { RumConfiguration } from '@datadog/browser-rum-core';
import type { InputState } from '../../../types';

@@ -6,2 +7,2 @@ export type InputCallback = (v: InputState & {

}) => void;
export declare function initInputObserver(cb: InputCallback, defaultPrivacyLevel: DefaultPrivacyLevel, target?: Document | ShadowRoot): ListenerHandler;
export declare function initInputObserver(configuration: RumConfiguration, cb: InputCallback, target?: Document | ShadowRoot): ListenerHandler;

@@ -1,2 +0,2 @@

import { instrumentSetter, assign, addEventListeners, forEach, noop } from '@datadog/browser-core';
import { instrumentSetter, assign, addEventListeners, forEach, noop, cssEscape } from '@datadog/browser-core';
import { NodePrivacyLevel } from '../../../constants';

@@ -6,7 +6,8 @@ import { getEventTarget } from '../eventsUtils';

import { getElementInputValue, getSerializedNodeId, hasSerializedNode } from '../serialization';
export function initInputObserver(cb, defaultPrivacyLevel, target) {
export function initInputObserver(configuration, cb, target) {
if (target === void 0) { target = document; }
var defaultPrivacyLevel = configuration.defaultPrivacyLevel;
var lastInputStateMap = new WeakMap();
var isShadowRoot = target !== document;
var stopEventListeners = addEventListeners(target,
var stopEventListeners = addEventListeners(configuration, target,
// The 'input' event bubbles across shadow roots, so we don't have to listen for it on shadow

@@ -71,3 +72,3 @@ // roots since it will be handled by the event listener that we did add to the document. Only

if (type === 'radio' && name && target.checked) {
forEach(document.querySelectorAll("input[type=\"radio\"][name=\"".concat(name, "\"]")), function (el) {
forEach(document.querySelectorAll("input[type=\"radio\"][name=\"".concat(cssEscape(name), "\"]")), function (el) {
if (el !== target) {

@@ -74,0 +75,0 @@ // TODO: Consider the privacy implications for various differing input privacy levels

import type { DefaultPrivacyLevel, ListenerHandler } from '@datadog/browser-core';
import type { RumConfiguration } from '@datadog/browser-rum-core';
import type { MediaInteraction } from '../../../types';
export type MediaInteractionCallback = (p: MediaInteraction) => void;
export declare function initMediaInteractionObserver(mediaInteractionCb: MediaInteractionCallback, defaultPrivacyLevel: DefaultPrivacyLevel): ListenerHandler;
export declare function initMediaInteractionObserver(configuration: RumConfiguration, mediaInteractionCb: MediaInteractionCallback, defaultPrivacyLevel: DefaultPrivacyLevel): ListenerHandler;

@@ -7,3 +7,3 @@ import { addEventListeners } from '@datadog/browser-core';

import { getSerializedNodeId, hasSerializedNode } from '../serialization';
export function initMediaInteractionObserver(mediaInteractionCb, defaultPrivacyLevel) {
export function initMediaInteractionObserver(configuration, mediaInteractionCb, defaultPrivacyLevel) {
var handler = function (event) {

@@ -21,4 +21,7 @@ var target = getEventTarget(event);

};
return addEventListeners(document, ["play" /* DOM_EVENT.PLAY */, "pause" /* DOM_EVENT.PAUSE */], handler, { capture: true, passive: true }).stop;
return addEventListeners(configuration, document, ["play" /* DOM_EVENT.PLAY */, "pause" /* DOM_EVENT.PAUSE */], handler, {
capture: true,
passive: true,
}).stop;
}
//# sourceMappingURL=mediaInteractionObserver.js.map

@@ -1,5 +0,6 @@

import type { DefaultPrivacyLevel, ListenerHandler } from '@datadog/browser-core';
import type { ListenerHandler } from '@datadog/browser-core';
import type { RumConfiguration } from '@datadog/browser-rum-core';
import type { BrowserIncrementalSnapshotRecord } from '../../../types';
import type { RecordIds } from './recordIds';
export type MouseInteractionCallBack = (record: BrowserIncrementalSnapshotRecord) => void;
export declare function initMouseInteractionObserver(cb: MouseInteractionCallBack, defaultPrivacyLevel: DefaultPrivacyLevel, recordIds: RecordIds): ListenerHandler;
export declare function initMouseInteractionObserver(configuration: RumConfiguration, cb: MouseInteractionCallBack, recordIds: RecordIds): ListenerHandler;

@@ -29,6 +29,7 @@ var _a;

_a);
export function initMouseInteractionObserver(cb, defaultPrivacyLevel, recordIds) {
export function initMouseInteractionObserver(configuration, cb, recordIds) {
var handler = function (event) {
var target = getEventTarget(event);
if (getNodePrivacyLevel(target, defaultPrivacyLevel) === NodePrivacyLevel.HIDDEN || !hasSerializedNode(target)) {
if (getNodePrivacyLevel(target, configuration.defaultPrivacyLevel) === NodePrivacyLevel.HIDDEN ||
!hasSerializedNode(target)) {
return;

@@ -52,3 +53,3 @@ }

};
return addEventListeners(document, Object.keys(eventTypeToMouseInteraction), handler, {
return addEventListeners(configuration, document, Object.keys(eventTypeToMouseInteraction), handler, {
capture: true,

@@ -55,0 +56,0 @@ passive: true,

import type { ListenerHandler } from '@datadog/browser-core';
import type { RumConfiguration } from '@datadog/browser-rum-core';
import type { MousePosition } from '../../../types';
import { IncrementalSource } from '../../../types';
export type MousemoveCallBack = (p: MousePosition[], source: typeof IncrementalSource.MouseMove | typeof IncrementalSource.TouchMove) => void;
export declare function initMoveObserver(cb: MousemoveCallBack): ListenerHandler;
export declare function initMoveObserver(configuration: RumConfiguration, cb: MousemoveCallBack): ListenerHandler;
export declare function tryToComputeCoordinates(event: MouseEvent | TouchEvent): {

@@ -7,0 +8,0 @@ x: number;

@@ -7,3 +7,3 @@ import { addEventListeners, addTelemetryDebug, throttle } from '@datadog/browser-core';

var MOUSE_MOVE_OBSERVER_THRESHOLD = 50;
export function initMoveObserver(cb) {
export function initMoveObserver(configuration, cb) {
var updatePosition = throttle(function (event) {

@@ -27,3 +27,3 @@ var target = getEventTarget(event);

}).throttled;
return addEventListeners(document, ["mousemove" /* DOM_EVENT.MOUSE_MOVE */, "touchmove" /* DOM_EVENT.TOUCH_MOVE */], updatePosition, {
return addEventListeners(configuration, document, ["mousemove" /* DOM_EVENT.MOUSE_MOVE */, "touchmove" /* DOM_EVENT.TOUCH_MOVE */], updatePosition, {
capture: true,

@@ -30,0 +30,0 @@ passive: true,

@@ -32,3 +32,3 @@ import type { ListenerHandler } from '@datadog/browser-core';

}
export declare function initObservers(o: ObserverParam): {
export declare function initObservers(configuration: RumConfiguration, o: ObserverParam): {
stop: ListenerHandler;

@@ -35,0 +35,0 @@ flush: ListenerHandler;

@@ -12,14 +12,14 @@ import { initMoveObserver } from './moveObserver';

import { initRecordIds } from './recordIds';
export function initObservers(o) {
export function initObservers(configuration, o) {
var recordIds = initRecordIds();
var mutationHandler = initMutationObserver(o.mutationCb, o.configuration, o.shadowRootsController, document);
var mousemoveHandler = initMoveObserver(o.mousemoveCb);
var mouseInteractionHandler = initMouseInteractionObserver(o.mouseInteractionCb, o.configuration.defaultPrivacyLevel, recordIds);
var scrollHandler = initScrollObserver(o.scrollCb, o.configuration.defaultPrivacyLevel, o.elementsScrollPositions);
var viewportResizeHandler = initViewportResizeObserver(o.viewportResizeCb);
var inputHandler = initInputObserver(o.inputCb, o.configuration.defaultPrivacyLevel);
var mediaInteractionHandler = initMediaInteractionObserver(o.mediaInteractionCb, o.configuration.defaultPrivacyLevel);
var mousemoveHandler = initMoveObserver(configuration, o.mousemoveCb);
var mouseInteractionHandler = initMouseInteractionObserver(configuration, o.mouseInteractionCb, recordIds);
var scrollHandler = initScrollObserver(configuration, o.scrollCb, o.configuration.defaultPrivacyLevel, o.elementsScrollPositions);
var viewportResizeHandler = initViewportResizeObserver(configuration, o.viewportResizeCb);
var inputHandler = initInputObserver(configuration, o.inputCb);
var mediaInteractionHandler = initMediaInteractionObserver(configuration, o.mediaInteractionCb, o.configuration.defaultPrivacyLevel);
var styleSheetObserver = initStyleSheetObserver(o.styleSheetCb);
var focusHandler = initFocusObserver(o.focusCb);
var visualViewportResizeHandler = initVisualViewportResizeObserver(o.visualViewportResizeCb);
var focusHandler = initFocusObserver(configuration, o.focusCb);
var visualViewportResizeHandler = initVisualViewportResizeObserver(configuration, o.visualViewportResizeCb);
var frustrationHandler = initFrustrationObserver(o.lifeCycle, o.frustrationCb, recordIds);

@@ -26,0 +26,0 @@ return {

import type { DefaultPrivacyLevel, ListenerHandler } from '@datadog/browser-core';
import type { RumConfiguration } from '@datadog/browser-rum-core';
import type { ElementsScrollPositions } from '../elementsScrollPositions';
import type { ScrollPosition } from '../../../types';
export type ScrollCallback = (p: ScrollPosition) => void;
export declare function initScrollObserver(cb: ScrollCallback, defaultPrivacyLevel: DefaultPrivacyLevel, elementsScrollPositions: ElementsScrollPositions): ListenerHandler;
export declare function initScrollObserver(configuration: RumConfiguration, cb: ScrollCallback, defaultPrivacyLevel: DefaultPrivacyLevel, elementsScrollPositions: ElementsScrollPositions): ListenerHandler;

@@ -8,3 +8,3 @@ import { throttle, addEventListener } from '@datadog/browser-core';

var SCROLL_OBSERVER_THRESHOLD = 100;
export function initScrollObserver(cb, defaultPrivacyLevel, elementsScrollPositions) {
export function initScrollObserver(configuration, cb, defaultPrivacyLevel, elementsScrollPositions) {
var updatePosition = throttle(function (event) {

@@ -34,4 +34,5 @@ var target = getEventTarget(event);

}, SCROLL_OBSERVER_THRESHOLD).throttled;
return addEventListener(document, "scroll" /* DOM_EVENT.SCROLL */, updatePosition, { capture: true, passive: true }).stop;
return addEventListener(configuration, document, "scroll" /* DOM_EVENT.SCROLL */, updatePosition, { capture: true, passive: true })
.stop;
}
//# sourceMappingURL=scrollObserver.js.map
import type { ListenerHandler } from '@datadog/browser-core';
import type { RumConfiguration } from '@datadog/browser-rum-core';
import type { ViewportResizeDimension, VisualViewportRecord } from '../../../types';
export type ViewportResizeCallback = (d: ViewportResizeDimension) => void;
export type VisualViewportResizeCallback = (data: VisualViewportRecord['data']) => void;
export declare function initViewportResizeObserver(cb: ViewportResizeCallback): ListenerHandler;
export declare function initVisualViewportResizeObserver(cb: VisualViewportResizeCallback): ListenerHandler;
export declare function initViewportResizeObserver(configuration: RumConfiguration, cb: ViewportResizeCallback): ListenerHandler;
export declare function initVisualViewportResizeObserver(configuration: RumConfiguration, cb: VisualViewportResizeCallback): ListenerHandler;

@@ -5,6 +5,6 @@ import { throttle, addEventListeners, noop } from '@datadog/browser-core';

var VISUAL_VIEWPORT_OBSERVER_THRESHOLD = 200;
export function initViewportResizeObserver(cb) {
return initViewportObservable().subscribe(cb).unsubscribe;
export function initViewportResizeObserver(configuration, cb) {
return initViewportObservable(configuration).subscribe(cb).unsubscribe;
}
export function initVisualViewportResizeObserver(cb) {
export function initVisualViewportResizeObserver(configuration, cb) {
var visualViewport = window.visualViewport;

@@ -19,3 +19,3 @@ if (!visualViewport) {

}), updateDimension = _a.throttled, cancelThrottle = _a.cancel;
var removeListener = addEventListeners(visualViewport, ["resize" /* DOM_EVENT.RESIZE */, "scroll" /* DOM_EVENT.SCROLL */], updateDimension, {
var removeListener = addEventListeners(configuration, visualViewport, ["resize" /* DOM_EVENT.RESIZE */, "scroll" /* DOM_EVENT.SCROLL */], updateDimension, {
capture: true,

@@ -22,0 +22,0 @@ passive: true,

@@ -11,3 +11,3 @@ import { timeStampNow } from '@datadog/browser-core';

export function record(options) {
var emit = options.emit;
var emit = options.emit, configuration = options.configuration;
// runtime checks for user options

@@ -22,3 +22,3 @@ if (!emit) {

var inputCb = function (s) { return emit(assembleIncrementalSnapshot(IncrementalSource.Input, s)); };
var shadowRootsController = initShadowRootsController(options.configuration, { mutationCb: mutationCb, inputCb: inputCb });
var shadowRootsController = initShadowRootsController(configuration, { mutationCb: mutationCb, inputCb: inputCb });
var takeFullSnapshot = function (timestamp, serializationContext) {

@@ -50,3 +50,3 @@ if (timestamp === void 0) { timestamp = timeStampNow(); }

data: {
node: serializeDocument(document, options.configuration, serializationContext),
node: serializeDocument(document, configuration, serializationContext),
initialOffset: {

@@ -69,5 +69,5 @@ left: getScrollX(),

takeFullSnapshot();
var _a = initObservers({
var _a = initObservers(configuration, {
lifeCycle: options.lifeCycle,
configuration: options.configuration,
configuration: configuration,
elementsScrollPositions: elementsScrollPositions,

@@ -74,0 +74,0 @@ inputCb: inputCb,

@@ -9,3 +9,3 @@ import { initInputObserver, initMutationObserver } from './observers';

// the change event no do bubble up across the shadow root, we have to listen on the shadow root
var stopInputObserver = initInputObserver(inputCb, configuration.defaultPrivacyLevel, shadowRoot);
var stopInputObserver = initInputObserver(configuration, inputCb, shadowRoot);
controllerByShadowRoot.set(shadowRoot, {

@@ -12,0 +12,0 @@ flush: flush,

@@ -0,1 +1,2 @@

import type { RumConfiguration } from '@datadog/browser-rum-core';
import type { BrowserRecord, BrowserSegmentMetadata, CreationReason, SegmentContext } from '../../types';

@@ -10,3 +11,3 @@ import type { DeflateWorker } from './startDeflateWorker';

private pendingWriteCount;
constructor(worker: DeflateWorker, context: SegmentContext, creationReason: CreationReason, initialRecord: BrowserRecord, onWrote: (compressedBytesCount: number) => void, onFlushed: (data: Uint8Array, rawBytesCount: number) => void);
constructor(configuration: RumConfiguration, worker: DeflateWorker, context: SegmentContext, creationReason: CreationReason, initialRecord: BrowserRecord, onWrote: (compressedBytesCount: number) => void, onFlushed: (data: Uint8Array, rawBytesCount: number) => void);
addRecord(record: BrowserRecord): void;

@@ -13,0 +14,0 @@ flush(reason: FlushReason): void;

@@ -8,3 +8,3 @@ import { addTelemetryDebug, assign, sendToExtension, addEventListener, concatBuffers } from '@datadog/browser-core';

var Segment = /** @class */ (function () {
function Segment(worker, context, creationReason, initialRecord, onWrote, onFlushed) {
function Segment(configuration, worker, context, creationReason, initialRecord, onWrote, onFlushed) {
var _this = this;

@@ -29,3 +29,3 @@ this.worker = worker;

var compressedData = [];
var removeMessageListener = addEventListener(worker, 'message', function (_a) {
var removeMessageListener = addEventListener(configuration, worker, 'message', function (_a) {
var data = _a.data;

@@ -32,0 +32,0 @@ if (data.type !== 'wrote') {

import type { HttpRequest } from '@datadog/browser-core';
import type { LifeCycle, ViewContexts, RumSessionManager } from '@datadog/browser-rum-core';
import type { LifeCycle, ViewContexts, RumSessionManager, RumConfiguration } from '@datadog/browser-rum-core';
import type { BrowserRecord, SegmentContext } from '../../types';

@@ -11,7 +11,7 @@ import type { DeflateWorker } from './startDeflateWorker';

export declare let SEGMENT_BYTES_LIMIT: number;
export declare function startSegmentCollection(lifeCycle: LifeCycle, applicationId: string, sessionManager: RumSessionManager, viewContexts: ViewContexts, httpRequest: HttpRequest, worker: DeflateWorker): {
export declare function startSegmentCollection(lifeCycle: LifeCycle, configuration: RumConfiguration, sessionManager: RumSessionManager, viewContexts: ViewContexts, httpRequest: HttpRequest, worker: DeflateWorker): {
addRecord: (record: BrowserRecord) => void;
stop: () => void;
};
export declare function doStartSegmentCollection(lifeCycle: LifeCycle, getSegmentContext: () => SegmentContext | undefined, httpRequest: HttpRequest, worker: DeflateWorker): {
export declare function doStartSegmentCollection(lifeCycle: LifeCycle, configuration: RumConfiguration, getSegmentContext: () => SegmentContext | undefined, httpRequest: HttpRequest, worker: DeflateWorker): {
addRecord: (record: BrowserRecord) => void;

@@ -18,0 +18,0 @@ stop: () => void;

@@ -34,6 +34,6 @@ import { isPageExitReason, ONE_SECOND, clearTimeout, setTimeout } from '@datadog/browser-core';

// indicating why the session has been created.
export function startSegmentCollection(lifeCycle, applicationId, sessionManager, viewContexts, httpRequest, worker) {
return doStartSegmentCollection(lifeCycle, function () { return computeSegmentContext(applicationId, sessionManager, viewContexts); }, httpRequest, worker);
export function startSegmentCollection(lifeCycle, configuration, sessionManager, viewContexts, httpRequest, worker) {
return doStartSegmentCollection(lifeCycle, configuration, function () { return computeSegmentContext(configuration.applicationId, sessionManager, viewContexts); }, httpRequest, worker);
}
export function doStartSegmentCollection(lifeCycle, getSegmentContext, httpRequest, worker) {
export function doStartSegmentCollection(lifeCycle, configuration, getSegmentContext, httpRequest, worker) {
var state = {

@@ -71,3 +71,3 @@ status: 0 /* SegmentCollectionStatus.WaitingForInitialRecord */,

}
var segment = new Segment(worker, context, creationReason, initialRecord, function (compressedSegmentBytesCount) {
var segment = new Segment(configuration, worker, context, creationReason, initialRecord, function (compressedSegmentBytesCount) {
if (!segment.flushReason && compressedSegmentBytesCount > SEGMENT_BYTES_LIMIT) {

@@ -74,0 +74,0 @@ flushSegment('segment_bytes_limit');

import type { DeflateWorkerAction } from '@datadog/browser-worker';
import type { RumConfiguration } from '@datadog/browser-rum-core';
export declare const INITIALIZATION_TIME_OUT_DELAY: number;
export interface DeflateWorker extends Worker {
postMessage(message: DeflateWorkerAction): void;
}
export declare function createDeflateWorker(): DeflateWorker;
export declare function startDeflateWorker(callback: (worker?: DeflateWorker) => void, createDeflateWorkerImpl?: typeof createDeflateWorker): void;
export declare function createDeflateWorker(configuration: RumConfiguration): DeflateWorker;
export declare function startDeflateWorker(configuration: RumConfiguration, callback: (worker?: DeflateWorker) => void, createDeflateWorkerImpl?: typeof createDeflateWorker): void;
export declare function resetDeflateWorkerState(): void;

@@ -17,2 +19,2 @@ /**

*/
export declare function doStartDeflateWorker(createDeflateWorkerImpl?: typeof createDeflateWorker): DeflateWorker | undefined;
export declare function doStartDeflateWorker(configuration: RumConfiguration, createDeflateWorkerImpl?: typeof createDeflateWorker): DeflateWorker | undefined;

@@ -1,13 +0,17 @@

import { addTelemetryError, display, includes, addEventListener } from '@datadog/browser-core';
import { addTelemetryError, display, includes, addEventListener, setTimeout, ONE_SECOND } from '@datadog/browser-core';
import { workerString } from '@datadog/browser-worker/string';
var workerURL;
export function createDeflateWorker() {
export var INITIALIZATION_TIME_OUT_DELAY = 10 * ONE_SECOND;
var workerBlobUrl;
function createWorkerBlobUrl() {
// Lazily compute the worker URL to allow importing the SDK in NodeJS
if (!workerURL) {
workerURL = URL.createObjectURL(new Blob([workerString]));
if (!workerBlobUrl) {
workerBlobUrl = URL.createObjectURL(new Blob([workerString]));
}
return new Worker(workerURL);
return workerBlobUrl;
}
export function createDeflateWorker(configuration) {
return new Worker(configuration.workerUrl || createWorkerBlobUrl());
}
var state = { status: 0 /* DeflateWorkerStatus.Nil */ };
export function startDeflateWorker(callback, createDeflateWorkerImpl) {
export function startDeflateWorker(configuration, callback, createDeflateWorkerImpl) {
if (createDeflateWorkerImpl === void 0) { createDeflateWorkerImpl = createDeflateWorker; }

@@ -17,3 +21,3 @@ switch (state.status) {

state = { status: 1 /* DeflateWorkerStatus.Loading */, callbacks: [callback] };
doStartDeflateWorker(createDeflateWorkerImpl);
doStartDeflateWorker(configuration, createDeflateWorkerImpl);
break;

@@ -43,11 +47,13 @@ case 1 /* DeflateWorkerStatus.Loading */:

*/
export function doStartDeflateWorker(createDeflateWorkerImpl) {
export function doStartDeflateWorker(configuration, createDeflateWorkerImpl) {
if (createDeflateWorkerImpl === void 0) { createDeflateWorkerImpl = createDeflateWorker; }
try {
var worker_1 = createDeflateWorkerImpl();
addEventListener(worker_1, 'error', onError);
addEventListener(worker_1, 'message', function (_a) {
var worker_1 = createDeflateWorkerImpl(configuration);
addEventListener(configuration, worker_1, 'error', function (error) {
onError(configuration, error);
});
addEventListener(configuration, worker_1, 'message', function (_a) {
var data = _a.data;
if (data.type === 'errored') {
onError(data.error, data.streamId);
onError(configuration, data.error, data.streamId);
}

@@ -59,8 +65,16 @@ else if (data.type === 'initialized') {

worker_1.postMessage({ action: 'init' });
setTimeout(onTimeout, INITIALIZATION_TIME_OUT_DELAY);
return worker_1;
}
catch (error) {
onError(error);
onError(configuration, error);
}
}
function onTimeout() {
if (state.status === 1 /* DeflateWorkerStatus.Loading */) {
display.error('Session Replay recording failed to start: a timeout occurred while initializing the Worker');
state.callbacks.forEach(function (callback) { return callback(); });
state = { status: 2 /* DeflateWorkerStatus.Error */ };
}
}
function onInitialized(worker, version) {

@@ -72,8 +86,14 @@ if (state.status === 1 /* DeflateWorkerStatus.Loading */) {

}
function onError(error, streamId) {
function onError(configuration, error, streamId) {
if (state.status === 1 /* DeflateWorkerStatus.Loading */) {
display.error('Session Replay recording failed to start: an error occurred while creating the Worker:', error);
if (error instanceof Event || (error instanceof Error && isMessageCspRelated(error.message))) {
display.error('Please make sure CSP is correctly configured ' +
'https://docs.datadoghq.com/real_user_monitoring/faq/content_security_policy');
var baseMessage = void 0;
if (configuration.workerUrl) {
baseMessage = "Please make sure the Worker URL ".concat(configuration.workerUrl, " is correct and CSP is correctly configured.");
}
else {
baseMessage = 'Please make sure CSP is correctly configured.';
}
display.error("".concat(baseMessage, " See documentation at https://docs.datadoghq.com/integrations/content_security_policy_logs/#use-csp-with-real-user-monitoring-and-session-replay"));
}

@@ -80,0 +100,0 @@ else {

{
"name": "@datadog/browser-rum",
"version": "4.46.0",
"version": "4.47.0",
"license": "Apache-2.0",

@@ -15,8 +15,8 @@ "main": "cjs/entries/main.js",

"dependencies": {
"@datadog/browser-core": "4.46.0",
"@datadog/browser-rum-core": "4.46.0",
"@datadog/browser-worker": "4.46.0"
"@datadog/browser-core": "4.47.0",
"@datadog/browser-rum-core": "4.47.0",
"@datadog/browser-worker": "4.47.0"
},
"peerDependencies": {
"@datadog/browser-logs": "4.46.0"
"@datadog/browser-logs": "4.47.0"
},

@@ -43,3 +43,3 @@ "peerDependenciesMeta": {

},
"gitHead": "fdd9a6034d8e1460cbb3dfdac188f102de10347f"
"gitHead": "8aa80956202b4b2eb82b15ffd0f815c58679873d"
}

@@ -116,3 +116,3 @@ import type { RelativeTime } from '@datadog/browser-core'

runOnReadyState('interactive', () => {
runOnReadyState(configuration, 'interactive', () => {
if (state.status !== RecorderStatus.Starting) {

@@ -122,3 +122,3 @@ return

startDeflateWorkerImpl((worker) => {
startDeflateWorkerImpl(configuration, (worker) => {
if (state.status !== RecorderStatus.Starting) {

@@ -125,0 +125,0 @@ return

@@ -31,7 +31,8 @@ import type { RawError, HttpRequest } from '@datadog/browser-core'

const replayRequest =
httpRequest || createHttpRequest(configuration.sessionReplayEndpointBuilder, SEGMENT_BYTES_LIMIT, reportError)
httpRequest ||
createHttpRequest(configuration, configuration.sessionReplayEndpointBuilder, SEGMENT_BYTES_LIMIT, reportError)
const { addRecord, stop: stopSegmentCollection } = startSegmentCollection(
lifeCycle,
configuration.applicationId,
configuration,
sessionManager,

@@ -38,0 +39,0 @@ viewContexts,

import type { ListenerHandler } from '@datadog/browser-core'
import { DOM_EVENT, addEventListeners } from '@datadog/browser-core'
import type { RumConfiguration } from '@datadog/browser-rum-core'
import type { FocusRecord } from '../../../types'

@@ -7,6 +8,6 @@

export function initFocusObserver(focusCb: FocusCallback): ListenerHandler {
return addEventListeners(window, [DOM_EVENT.FOCUS, DOM_EVENT.BLUR], () => {
export function initFocusObserver(configuration: RumConfiguration, focusCb: FocusCallback): ListenerHandler {
return addEventListeners(configuration, window, [DOM_EVENT.FOCUS, DOM_EVENT.BLUR], () => {
focusCb({ has_focus: document.hasFocus() })
}).stop
}

@@ -1,3 +0,4 @@

import type { DefaultPrivacyLevel, ListenerHandler } from '@datadog/browser-core'
import { instrumentSetter, assign, DOM_EVENT, addEventListeners, forEach, noop } from '@datadog/browser-core'
import type { ListenerHandler } from '@datadog/browser-core'
import { instrumentSetter, assign, DOM_EVENT, addEventListeners, forEach, noop, cssEscape } from '@datadog/browser-core'
import type { RumConfiguration } from '@datadog/browser-rum-core'
import { NodePrivacyLevel } from '../../../constants'

@@ -12,6 +13,7 @@ import type { InputState } from '../../../types'

export function initInputObserver(
configuration: RumConfiguration,
cb: InputCallback,
defaultPrivacyLevel: DefaultPrivacyLevel,
target: Document | ShadowRoot = document
): ListenerHandler {
const defaultPrivacyLevel = configuration.defaultPrivacyLevel
const lastInputStateMap: WeakMap<Node, InputState> = new WeakMap()

@@ -22,2 +24,3 @@

const { stop: stopEventListeners } = addEventListeners(
configuration,
target,

@@ -93,3 +96,3 @@ // The 'input' event bubbles across shadow roots, so we don't have to listen for it on shadow

if (type === 'radio' && name && (target as HTMLInputElement).checked) {
forEach(document.querySelectorAll(`input[type="radio"][name="${name}"]`), (el: Element) => {
forEach(document.querySelectorAll(`input[type="radio"][name="${cssEscape(name)}"]`), (el: Element) => {
if (el !== target) {

@@ -96,0 +99,0 @@ // TODO: Consider the privacy implications for various differing input privacy levels

import type { DefaultPrivacyLevel, ListenerHandler } from '@datadog/browser-core'
import { DOM_EVENT, addEventListeners } from '@datadog/browser-core'
import type { RumConfiguration } from '@datadog/browser-rum-core'
import { NodePrivacyLevel } from '../../../constants'

@@ -13,2 +14,3 @@ import type { MediaInteraction } from '../../../types'

export function initMediaInteractionObserver(
configuration: RumConfiguration,
mediaInteractionCb: MediaInteractionCallback,

@@ -31,3 +33,6 @@ defaultPrivacyLevel: DefaultPrivacyLevel

}
return addEventListeners(document, [DOM_EVENT.PLAY, DOM_EVENT.PAUSE], handler, { capture: true, passive: true }).stop
return addEventListeners(configuration, document, [DOM_EVENT.PLAY, DOM_EVENT.PAUSE], handler, {
capture: true,
passive: true,
}).stop
}

@@ -1,3 +0,4 @@

import type { DefaultPrivacyLevel, ListenerHandler } from '@datadog/browser-core'
import type { ListenerHandler } from '@datadog/browser-core'
import { assign, addEventListeners, DOM_EVENT } from '@datadog/browser-core'
import type { RumConfiguration } from '@datadog/browser-rum-core'
import { NodePrivacyLevel } from '../../../constants'

@@ -37,4 +38,4 @@ import type { MouseInteraction, MouseInteractionData, BrowserIncrementalSnapshotRecord } from '../../../types'

export function initMouseInteractionObserver(
configuration: RumConfiguration,
cb: MouseInteractionCallBack,
defaultPrivacyLevel: DefaultPrivacyLevel,
recordIds: RecordIds

@@ -44,3 +45,6 @@ ): ListenerHandler {

const target = getEventTarget(event)
if (getNodePrivacyLevel(target, defaultPrivacyLevel) === NodePrivacyLevel.HIDDEN || !hasSerializedNode(target)) {
if (
getNodePrivacyLevel(target, configuration.defaultPrivacyLevel) === NodePrivacyLevel.HIDDEN ||
!hasSerializedNode(target)
) {
return

@@ -69,2 +73,3 @@ }

return addEventListeners(
configuration,
document,

@@ -71,0 +76,0 @@ Object.keys(eventTypeToMouseInteraction) as Array<keyof typeof eventTypeToMouseInteraction>,

import type { ListenerHandler } from '@datadog/browser-core'
import { addEventListeners, addTelemetryDebug, DOM_EVENT, throttle } from '@datadog/browser-core'
import type { RumConfiguration } from '@datadog/browser-rum-core'
import { getSerializedNodeId, hasSerializedNode } from '../serialization'

@@ -16,3 +17,3 @@ import type { MousePosition } from '../../../types'

export function initMoveObserver(cb: MousemoveCallBack): ListenerHandler {
export function initMoveObserver(configuration: RumConfiguration, cb: MousemoveCallBack): ListenerHandler {
const { throttled: updatePosition } = throttle(

@@ -42,3 +43,3 @@ (event: MouseEvent | TouchEvent) => {

return addEventListeners(document, [DOM_EVENT.MOUSE_MOVE, DOM_EVENT.TOUCH_MOVE], updatePosition, {
return addEventListeners(configuration, document, [DOM_EVENT.MOUSE_MOVE, DOM_EVENT.TOUCH_MOVE], updatePosition, {
capture: true,

@@ -45,0 +46,0 @@ passive: true,

@@ -45,15 +45,20 @@ import type { ListenerHandler } from '@datadog/browser-core'

export function initObservers(o: ObserverParam): { stop: ListenerHandler; flush: ListenerHandler } {
export function initObservers(
configuration: RumConfiguration,
o: ObserverParam
): { stop: ListenerHandler; flush: ListenerHandler } {
const recordIds = initRecordIds()
const mutationHandler = initMutationObserver(o.mutationCb, o.configuration, o.shadowRootsController, document)
const mousemoveHandler = initMoveObserver(o.mousemoveCb)
const mouseInteractionHandler = initMouseInteractionObserver(
o.mouseInteractionCb,
const mousemoveHandler = initMoveObserver(configuration, o.mousemoveCb)
const mouseInteractionHandler = initMouseInteractionObserver(configuration, o.mouseInteractionCb, recordIds)
const scrollHandler = initScrollObserver(
configuration,
o.scrollCb,
o.configuration.defaultPrivacyLevel,
recordIds
o.elementsScrollPositions
)
const scrollHandler = initScrollObserver(o.scrollCb, o.configuration.defaultPrivacyLevel, o.elementsScrollPositions)
const viewportResizeHandler = initViewportResizeObserver(o.viewportResizeCb)
const inputHandler = initInputObserver(o.inputCb, o.configuration.defaultPrivacyLevel)
const viewportResizeHandler = initViewportResizeObserver(configuration, o.viewportResizeCb)
const inputHandler = initInputObserver(configuration, o.inputCb)
const mediaInteractionHandler = initMediaInteractionObserver(
configuration,
o.mediaInteractionCb,

@@ -63,4 +68,4 @@ o.configuration.defaultPrivacyLevel

const styleSheetObserver = initStyleSheetObserver(o.styleSheetCb)
const focusHandler = initFocusObserver(o.focusCb)
const visualViewportResizeHandler = initVisualViewportResizeObserver(o.visualViewportResizeCb)
const focusHandler = initFocusObserver(configuration, o.focusCb)
const visualViewportResizeHandler = initVisualViewportResizeObserver(configuration, o.visualViewportResizeCb)
const frustrationHandler = initFrustrationObserver(o.lifeCycle, o.frustrationCb, recordIds)

@@ -67,0 +72,0 @@

import type { DefaultPrivacyLevel, ListenerHandler } from '@datadog/browser-core'
import { DOM_EVENT, throttle, addEventListener } from '@datadog/browser-core'
import type { RumConfiguration } from '@datadog/browser-rum-core'
import { getScrollX, getScrollY } from '@datadog/browser-rum-core'

@@ -16,2 +17,3 @@ import type { ElementsScrollPositions } from '../elementsScrollPositions'

export function initScrollObserver(
configuration: RumConfiguration,
cb: ScrollCallback,

@@ -48,3 +50,4 @@ defaultPrivacyLevel: DefaultPrivacyLevel,

}, SCROLL_OBSERVER_THRESHOLD)
return addEventListener(document, DOM_EVENT.SCROLL, updatePosition, { capture: true, passive: true }).stop
return addEventListener(configuration, document, DOM_EVENT.SCROLL, updatePosition, { capture: true, passive: true })
.stop
}
import type { ListenerHandler } from '@datadog/browser-core'
import { throttle, DOM_EVENT, addEventListeners, noop } from '@datadog/browser-core'
import type { RumConfiguration } from '@datadog/browser-rum-core'
import { initViewportObservable } from '@datadog/browser-rum-core'

@@ -13,7 +14,13 @@ import type { ViewportResizeDimension, VisualViewportRecord } from '../../../types'

export function initViewportResizeObserver(cb: ViewportResizeCallback): ListenerHandler {
return initViewportObservable().subscribe(cb).unsubscribe
export function initViewportResizeObserver(
configuration: RumConfiguration,
cb: ViewportResizeCallback
): ListenerHandler {
return initViewportObservable(configuration).subscribe(cb).unsubscribe
}
export function initVisualViewportResizeObserver(cb: VisualViewportResizeCallback): ListenerHandler {
export function initVisualViewportResizeObserver(
configuration: RumConfiguration,
cb: VisualViewportResizeCallback
): ListenerHandler {
const visualViewport = window.visualViewport

@@ -32,6 +39,12 @@ if (!visualViewport) {

)
const removeListener = addEventListeners(visualViewport, [DOM_EVENT.RESIZE, DOM_EVENT.SCROLL], updateDimension, {
capture: true,
passive: true,
}).stop
const removeListener = addEventListeners(
configuration,
visualViewport,
[DOM_EVENT.RESIZE, DOM_EVENT.SCROLL],
updateDimension,
{
capture: true,
passive: true,
}
).stop

@@ -38,0 +51,0 @@ return function stop() {

@@ -40,3 +40,3 @@ import type { TimeStamp } from '@datadog/browser-core'

export function record(options: RecordOptions): RecordAPI {
const { emit } = options
const { emit, configuration } = options
// runtime checks for user options

@@ -54,3 +54,3 @@ if (!emit) {

const shadowRootsController = initShadowRootsController(options.configuration, { mutationCb, inputCb })
const shadowRootsController = initShadowRootsController(configuration, { mutationCb, inputCb })

@@ -86,3 +86,3 @@ const takeFullSnapshot = (

data: {
node: serializeDocument(document, options.configuration, serializationContext),
node: serializeDocument(document, configuration, serializationContext),
initialOffset: {

@@ -108,5 +108,5 @@ left: getScrollX(),

const { stop: stopObservers, flush: flushMutationsFromObservers } = initObservers({
const { stop: stopObservers, flush: flushMutationsFromObservers } = initObservers(configuration, {
lifeCycle: options.lifeCycle,
configuration: options.configuration,
configuration,
elementsScrollPositions,

@@ -113,0 +113,0 @@ inputCb,

@@ -40,3 +40,3 @@ import type { RumConfiguration } from '@datadog/browser-rum-core'

// the change event no do bubble up across the shadow root, we have to listen on the shadow root
const stopInputObserver = initInputObserver(inputCb, configuration.defaultPrivacyLevel, shadowRoot)
const stopInputObserver = initInputObserver(configuration, inputCb, shadowRoot)
controllerByShadowRoot.set(shadowRoot, {

@@ -43,0 +43,0 @@ flush,

import { addTelemetryDebug, assign, sendToExtension, addEventListener, concatBuffers } from '@datadog/browser-core'
import type { DeflateWorkerResponse } from '@datadog/browser-worker'
import type { RumConfiguration } from '@datadog/browser-rum-core'
import type { BrowserRecord, BrowserSegmentMetadata, CreationReason, SegmentContext } from '../../types'

@@ -23,2 +24,3 @@ import { RecordType } from '../../types'

constructor(
configuration: RumConfiguration,
private worker: DeflateWorker,

@@ -53,2 +55,3 @@ context: SegmentContext,

const { stop: removeMessageListener } = addEventListener(
configuration,
worker,

@@ -55,0 +58,0 @@ 'message',

import type { HttpRequest, TimeoutId } from '@datadog/browser-core'
import { isPageExitReason, ONE_SECOND, clearTimeout, setTimeout } from '@datadog/browser-core'
import type { LifeCycle, ViewContexts, RumSessionManager } from '@datadog/browser-rum-core'
import type { LifeCycle, ViewContexts, RumSessionManager, RumConfiguration } from '@datadog/browser-rum-core'
import { LifeCycleEventType } from '@datadog/browser-rum-core'

@@ -45,3 +45,3 @@ import type { BrowserRecord, CreationReason, SegmentContext } from '../../types'

lifeCycle: LifeCycle,
applicationId: string,
configuration: RumConfiguration,
sessionManager: RumSessionManager,

@@ -54,3 +54,4 @@ viewContexts: ViewContexts,

lifeCycle,
() => computeSegmentContext(applicationId, sessionManager, viewContexts),
configuration,
() => computeSegmentContext(configuration.applicationId, sessionManager, viewContexts),
httpRequest,

@@ -82,2 +83,3 @@ worker

lifeCycle: LifeCycle,
configuration: RumConfiguration,
getSegmentContext: () => SegmentContext | undefined,

@@ -128,2 +130,3 @@ httpRequest: HttpRequest,

const segment = new Segment(
configuration,
worker,

@@ -130,0 +133,0 @@ context,

@@ -1,5 +0,8 @@

import { addTelemetryError, display, includes, addEventListener } from '@datadog/browser-core'
import { addTelemetryError, display, includes, addEventListener, setTimeout, ONE_SECOND } from '@datadog/browser-core'
import type { DeflateWorkerAction, DeflateWorkerResponse } from '@datadog/browser-worker'
import { workerString } from '@datadog/browser-worker/string'
import type { RumConfiguration } from '@datadog/browser-rum-core'
export const INITIALIZATION_TIME_OUT_DELAY = 10 * ONE_SECOND
/**

@@ -38,15 +41,20 @@ * In order to be sure that the worker is correctly working, we need a round trip of

let workerURL: string | undefined
let workerBlobUrl: string | undefined
export function createDeflateWorker(): DeflateWorker {
function createWorkerBlobUrl() {
// Lazily compute the worker URL to allow importing the SDK in NodeJS
if (!workerURL) {
workerURL = URL.createObjectURL(new Blob([workerString]))
if (!workerBlobUrl) {
workerBlobUrl = URL.createObjectURL(new Blob([workerString]))
}
return new Worker(workerURL)
return workerBlobUrl
}
export function createDeflateWorker(configuration: RumConfiguration): DeflateWorker {
return new Worker(configuration.workerUrl || createWorkerBlobUrl())
}
let state: DeflateWorkerState = { status: DeflateWorkerStatus.Nil }
export function startDeflateWorker(
configuration: RumConfiguration,
callback: (worker?: DeflateWorker) => void,

@@ -58,3 +66,3 @@ createDeflateWorkerImpl = createDeflateWorker

state = { status: DeflateWorkerStatus.Loading, callbacks: [callback] }
doStartDeflateWorker(createDeflateWorkerImpl)
doStartDeflateWorker(configuration, createDeflateWorkerImpl)
break

@@ -86,9 +94,11 @@ case DeflateWorkerStatus.Loading:

*/
export function doStartDeflateWorker(createDeflateWorkerImpl = createDeflateWorker) {
export function doStartDeflateWorker(configuration: RumConfiguration, createDeflateWorkerImpl = createDeflateWorker) {
try {
const worker = createDeflateWorkerImpl()
addEventListener(worker, 'error', onError)
addEventListener(worker, 'message', ({ data }: MessageEvent<DeflateWorkerResponse>) => {
const worker = createDeflateWorkerImpl(configuration)
addEventListener(configuration, worker, 'error', (error) => {
onError(configuration, error)
})
addEventListener(configuration, worker, 'message', ({ data }: MessageEvent<DeflateWorkerResponse>) => {
if (data.type === 'errored') {
onError(data.error, data.streamId)
onError(configuration, data.error, data.streamId)
} else if (data.type === 'initialized') {

@@ -99,8 +109,17 @@ onInitialized(worker, data.version)

worker.postMessage({ action: 'init' })
setTimeout(onTimeout, INITIALIZATION_TIME_OUT_DELAY)
return worker
} catch (error) {
onError(error)
onError(configuration, error)
}
}
function onTimeout() {
if (state.status === DeflateWorkerStatus.Loading) {
display.error('Session Replay recording failed to start: a timeout occurred while initializing the Worker')
state.callbacks.forEach((callback) => callback())
state = { status: DeflateWorkerStatus.Error }
}
}
function onInitialized(worker: DeflateWorker, version: string) {

@@ -113,9 +132,14 @@ if (state.status === DeflateWorkerStatus.Loading) {

function onError(error: unknown, streamId?: number) {
function onError(configuration: RumConfiguration, error: unknown, streamId?: number) {
if (state.status === DeflateWorkerStatus.Loading) {
display.error('Session Replay recording failed to start: an error occurred while creating the Worker:', error)
if (error instanceof Event || (error instanceof Error && isMessageCspRelated(error.message))) {
let baseMessage
if (configuration.workerUrl) {
baseMessage = `Please make sure the Worker URL ${configuration.workerUrl} is correct and CSP is correctly configured.`
} else {
baseMessage = 'Please make sure CSP is correctly configured.'
}
display.error(
'Please make sure CSP is correctly configured ' +
'https://docs.datadoghq.com/real_user_monitoring/faq/content_security_policy'
`${baseMessage} See documentation at https://docs.datadoghq.com/integrations/content_security_policy_logs/#use-csp-with-real-user-monitoring-and-session-replay`
)

@@ -122,0 +146,0 @@ } else {

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc