Socket
Socket
Sign inDemoInstall

@datadog/browser-rum

Package Overview
Dependencies
Maintainers
1
Versions
256
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@datadog/browser-rum - npm Package Compare versions

Comparing version 4.38.0 to 4.39.0

cjs/boot/isBrowserSupported.d.ts

18

cjs/boot/recorderApi.js

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

var replayStats_1 = require("../domain/replayStats");
var getSessionReplayLink_1 = require("../domain/getSessionReplayLink");
var segmentCollection_1 = require("../domain/segmentCollection");
var isBrowserSupported_1 = require("./isBrowserSupported");
function makeRecorderApi(startRecordingImpl, startDeflateWorkerImpl) {
if (startDeflateWorkerImpl === void 0) { startDeflateWorkerImpl = segmentCollection_1.startDeflateWorker; }
if ((0, browser_core_1.canUseEventBridge)() || !isBrowserSupported()) {
if ((0, browser_core_1.canUseEventBridge)() || !(0, isBrowserSupported_1.isBrowserSupported)()) {
return {

@@ -17,2 +19,3 @@ start: browser_core_1.noop,

isRecording: function () { return false; },
getSessionReplayLink: function () { return undefined; },
};

@@ -33,2 +36,5 @@ }

getReplayStats: replayStats_1.getReplayStats,
getSessionReplayLink: function (configuration, sessionManager, viewContexts) {
return (0, getSessionReplayLink_1.getSessionReplayLink)(configuration, sessionManager, viewContexts, state.status !== 0 /* RecorderStatus.Stopped */);
},
onRumStart: function (lifeCycle, configuration, sessionManager, viewContexts) {

@@ -97,12 +103,2 @@ lifeCycle.subscribe(7 /* LifeCycleEventType.SESSION_EXPIRED */, function () {

exports.makeRecorderApi = makeRecorderApi;
/**
* Test for Browser features used while recording
*/
function isBrowserSupported() {
return (
// Array.from is a bit less supported by browsers than CSSSupportsRule, but has higher chances
// to be polyfilled. Test for both to be more confident. We could add more things if we find out
// this test is not sufficient.
typeof Array.from === 'function' && typeof CSSSupportsRule === 'function' && 'forEach' in NodeList.prototype);
}
//# sourceMappingURL=recorderApi.js.map

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

if (pendingMutations.length === 0) {
cancelScheduledFlush = (0, browser_core_1.requestIdleCallback)(flush, { timeout: MUTATION_PROCESS_MAX_DELAY });
cancelScheduledFlush = requestIdleCallback(flush, { timeout: MUTATION_PROCESS_MAX_DELAY });
}

@@ -35,2 +35,18 @@ pendingMutations.push.apply(pendingMutations, mutations);

exports.createMutationBatch = createMutationBatch;
/**
* Use 'requestIdleCallback' when available: it will throttle the mutation processing if the
* browser is busy rendering frames (ex: when frames are below 60fps). When not available, the
* fallback on 'requestAnimationFrame' will still ensure the mutations are processed after any
* browser rendering process (Layout, Recalculate Style, etc.), so we can serialize DOM nodes efficiently.
*
* Note: check both 'requestIdleCallback' and 'cancelIdleCallback' existence because some polyfills only implement 'requestIdleCallback'.
*/
function requestIdleCallback(callback, opts) {
if (window.requestIdleCallback && window.cancelIdleCallback) {
var id_1 = window.requestIdleCallback((0, browser_core_1.monitor)(callback), opts);
return function () { return window.cancelIdleCallback(id_1); };
}
var id = window.requestAnimationFrame((0, browser_core_1.monitor)(callback));
return function () { return window.cancelAnimationFrame(id); };
}
//# sourceMappingURL=mutationBatch.js.map
export { initObservers } from './observers';
export { InputCallback, initInputObserver } from './inputObserver';
export { initMutationObserver, MutationCallBack, RumMutationRecord } from './mutationObserver';
export { DEFAULT_CONFIGURATION } from './observers.specHelper';
export { DEFAULT_SHADOW_ROOT_CONTROLLER } from './observers.specHelper';
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.DEFAULT_SHADOW_ROOT_CONTROLLER = exports.DEFAULT_CONFIGURATION = exports.initMutationObserver = exports.initInputObserver = exports.initObservers = void 0;
exports.initMutationObserver = exports.initInputObserver = exports.initObservers = void 0;
var observers_1 = require("./observers");

@@ -10,6 +10,2 @@ Object.defineProperty(exports, "initObservers", { enumerable: true, get: function () { return observers_1.initObservers; } });

Object.defineProperty(exports, "initMutationObserver", { enumerable: true, get: function () { return mutationObserver_1.initMutationObserver; } });
var observers_specHelper_1 = require("./observers.specHelper");
Object.defineProperty(exports, "DEFAULT_CONFIGURATION", { enumerable: true, get: function () { return observers_specHelper_1.DEFAULT_CONFIGURATION; } });
var observers_specHelper_2 = require("./observers.specHelper");
Object.defineProperty(exports, "DEFAULT_SHADOW_ROOT_CONTROLLER", { enumerable: true, get: function () { return observers_specHelper_2.DEFAULT_SHADOW_ROOT_CONTROLLER; } });
//# sourceMappingURL=index.js.map

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

domEvents?: Array<DOM_EVENT.INPUT | DOM_EVENT.CHANGE>;
target?: Node;
target?: Document | ShadowRoot;
};

@@ -9,0 +9,0 @@ export type InputCallback = (v: InputState & {

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.initShadowRootsController = void 0;
var browser_core_1 = require("@datadog/browser-core");
var observers_1 = require("./observers");

@@ -28,10 +27,3 @@ var initShadowRootsController = function (configuration, _a) {

if (!entry) {
(0, browser_core_1.addTelemetryDebug)('no shadow root in map', {
shadowRoot: shadowRoot ? shadowRoot.nodeName : 'no node name',
childrenLength: shadowRoot ? shadowRoot.childElementCount : '-1',
controllerByShadowRootSize: controllerByShadowRoot.size,
html: shadowRoot && (0, browser_core_1.isExperimentalFeatureEnabled)(browser_core_1.ExperimentalFeature.SHADOW_DOM_DEBUG)
? shadowRoot.innerHTML.substring(0, 2000)
: undefined,
});
// unidentified root cause: observed in some cases with shadow DOM added by browser extensions
return;

@@ -38,0 +30,0 @@ }

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

replayStats.addRecord(viewId);
var listener = (0, browser_core_1.monitor)(function (_a) {
var removeMessageListener = (0, browser_core_1.addEventListener)(worker, 'message', function (_a) {
var data = _a.data;

@@ -58,3 +58,3 @@ if (data.type === 'errored' || data.type === 'initialized') {

onFlushed(data.result, data.rawBytesCount);
worker.removeEventListener('message', listener);
removeMessageListener();
}

@@ -74,7 +74,6 @@ else {

// help investigate the issue.
worker.removeEventListener('message', listener);
removeMessageListener();
(0, browser_core_1.addTelemetryDebug)("Segment did not receive a 'flush' response before being replaced.");
}
});
worker.addEventListener('message', listener);
}).stop;
(0, browser_core_1.sendToExtension)('record', { record: initialRecord, segment: this.metadata });

@@ -81,0 +80,0 @@ this.worker.postMessage({ data: "{\"records\":[".concat(JSON.stringify(initialRecord)), id: this.id, action: 'write' });

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

var worker_1 = createDeflateWorkerImpl();
worker_1.addEventListener('error', (0, browser_core_1.monitor)(onError));
worker_1.addEventListener('message', (0, browser_core_1.monitor)(function (_a) {
(0, browser_core_1.addEventListener)(worker_1, 'error', onError);
(0, browser_core_1.addEventListener)(worker_1, 'message', function (_a) {
var data = _a.data;

@@ -53,3 +53,3 @@ if (data.type === 'errored') {

}
}));
});
worker_1.postMessage({ action: 'init' });

@@ -56,0 +56,0 @@ return worker_1;

@@ -32,2 +32,3 @@ export { DefaultPrivacyLevel } from '@datadog/browser-core';

addFeatureFlagEvaluation: (key: string, value: any) => void;
getSessionReplayLink: () => string | undefined;
} & {

@@ -34,0 +35,0 @@ onReady(callback: () => void): void;

@@ -33,2 +33,3 @@ export { CommonProperties, RumPublicApi as RumGlobal, RumInitConfiguration, RumEvent, RumActionEvent, RumErrorEvent, RumLongTaskEvent, RumResourceEvent, RumViewEvent, RumEventDomainContext, RumViewEventDomainContext, RumErrorEventDomainContext, RumActionEventDomainContext, RumFetchResourceEventDomainContext, RumXhrResourceEventDomainContext, RumOtherResourceEventDomainContext, RumLongTaskEventDomainContext, } from '@datadog/browser-rum-core';

addFeatureFlagEvaluation: (key: string, value: any) => void;
getSessionReplayLink: () => string | undefined;
} & {

@@ -35,0 +36,0 @@ onReady(callback: () => void): void;

import { canUseEventBridge, noop, runOnReadyState } from '@datadog/browser-core';
import { getReplayStats } from '../domain/replayStats';
import { getSessionReplayLink } from '../domain/getSessionReplayLink';
import { startDeflateWorker } from '../domain/segmentCollection';
import { isBrowserSupported } from './isBrowserSupported';
export function makeRecorderApi(startRecordingImpl, startDeflateWorkerImpl) {

@@ -13,2 +15,3 @@ if (startDeflateWorkerImpl === void 0) { startDeflateWorkerImpl = startDeflateWorker; }

isRecording: function () { return false; },
getSessionReplayLink: function () { return undefined; },
};

@@ -29,2 +32,5 @@ }

getReplayStats: getReplayStats,
getSessionReplayLink: function (configuration, sessionManager, viewContexts) {
return getSessionReplayLink(configuration, sessionManager, viewContexts, state.status !== 0 /* RecorderStatus.Stopped */);
},
onRumStart: function (lifeCycle, configuration, sessionManager, viewContexts) {

@@ -92,12 +98,2 @@ lifeCycle.subscribe(7 /* LifeCycleEventType.SESSION_EXPIRED */, function () {

}
/**
* Test for Browser features used while recording
*/
function isBrowserSupported() {
return (
// Array.from is a bit less supported by browsers than CSSSupportsRule, but has higher chances
// to be polyfilled. Test for both to be more confident. We could add more things if we find out
// this test is not sufficient.
typeof Array.from === 'function' && typeof CSSSupportsRule === 'function' && 'forEach' in NodeList.prototype);
}
//# sourceMappingURL=recorderApi.js.map

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

import { noop, requestIdleCallback } from '@datadog/browser-core';
import { noop, monitor } from '@datadog/browser-core';
/**

@@ -30,2 +30,18 @@ * Maximum duration to wait before processing mutations. If the browser is idle, mutations will be

}
/**
* Use 'requestIdleCallback' when available: it will throttle the mutation processing if the
* browser is busy rendering frames (ex: when frames are below 60fps). When not available, the
* fallback on 'requestAnimationFrame' will still ensure the mutations are processed after any
* browser rendering process (Layout, Recalculate Style, etc.), so we can serialize DOM nodes efficiently.
*
* Note: check both 'requestIdleCallback' and 'cancelIdleCallback' existence because some polyfills only implement 'requestIdleCallback'.
*/
function requestIdleCallback(callback, opts) {
if (window.requestIdleCallback && window.cancelIdleCallback) {
var id_1 = window.requestIdleCallback(monitor(callback), opts);
return function () { return window.cancelIdleCallback(id_1); };
}
var id = window.requestAnimationFrame(monitor(callback));
return function () { return window.cancelAnimationFrame(id); };
}
//# sourceMappingURL=mutationBatch.js.map
export { initObservers } from './observers';
export { InputCallback, initInputObserver } from './inputObserver';
export { initMutationObserver, MutationCallBack, RumMutationRecord } from './mutationObserver';
export { DEFAULT_CONFIGURATION } from './observers.specHelper';
export { DEFAULT_SHADOW_ROOT_CONTROLLER } from './observers.specHelper';
export { initObservers } from './observers';
export { initInputObserver } from './inputObserver';
export { initMutationObserver } from './mutationObserver';
export { DEFAULT_CONFIGURATION } from './observers.specHelper';
export { DEFAULT_SHADOW_ROOT_CONTROLLER } from './observers.specHelper';
//# sourceMappingURL=index.js.map

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

domEvents?: Array<DOM_EVENT.INPUT | DOM_EVENT.CHANGE>;
target?: Node;
target?: Document | ShadowRoot;
};

@@ -9,0 +9,0 @@ export type InputCallback = (v: InputState & {

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

import { addTelemetryDebug, ExperimentalFeature, isExperimentalFeatureEnabled } from '@datadog/browser-core';
import { initInputObserver, initMutationObserver } from './observers';

@@ -25,10 +24,3 @@ export var initShadowRootsController = function (configuration, _a) {

if (!entry) {
addTelemetryDebug('no shadow root in map', {
shadowRoot: shadowRoot ? shadowRoot.nodeName : 'no node name',
childrenLength: shadowRoot ? shadowRoot.childElementCount : '-1',
controllerByShadowRootSize: controllerByShadowRoot.size,
html: shadowRoot && isExperimentalFeatureEnabled(ExperimentalFeature.SHADOW_DOM_DEBUG)
? shadowRoot.innerHTML.substring(0, 2000)
: undefined,
});
// unidentified root cause: observed in some cases with shadow DOM added by browser extensions
return;

@@ -35,0 +27,0 @@ }

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

import { addTelemetryDebug, assign, monitor, sendToExtension } from '@datadog/browser-core';
import { addTelemetryDebug, assign, sendToExtension, addEventListener } from '@datadog/browser-core';
import { RecordType } from '../../types';

@@ -22,3 +22,3 @@ import * as replayStats from '../replayStats';

replayStats.addRecord(viewId);
var listener = monitor(function (_a) {
var removeMessageListener = addEventListener(worker, 'message', function (_a) {
var data = _a.data;

@@ -32,3 +32,3 @@ if (data.type === 'errored' || data.type === 'initialized') {

onFlushed(data.result, data.rawBytesCount);
worker.removeEventListener('message', listener);
removeMessageListener();
}

@@ -48,7 +48,6 @@ else {

// help investigate the issue.
worker.removeEventListener('message', listener);
removeMessageListener();
addTelemetryDebug("Segment did not receive a 'flush' response before being replaced.");
}
});
worker.addEventListener('message', listener);
}).stop;
sendToExtension('record', { record: initialRecord, segment: this.metadata });

@@ -55,0 +54,0 @@ this.worker.postMessage({ data: "{\"records\":[".concat(JSON.stringify(initialRecord)), id: this.id, action: 'write' });

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

import { addTelemetryError, display, includes, monitor } from '@datadog/browser-core';
import { addTelemetryError, display, includes, addEventListener } from '@datadog/browser-core';
import { createDeflateWorker } from './deflateWorker';

@@ -38,4 +38,4 @@ var state = { status: 0 /* DeflateWorkerStatus.Nil */ };

var worker_1 = createDeflateWorkerImpl();
worker_1.addEventListener('error', monitor(onError));
worker_1.addEventListener('message', monitor(function (_a) {
addEventListener(worker_1, 'error', onError);
addEventListener(worker_1, 'message', function (_a) {
var data = _a.data;

@@ -48,3 +48,3 @@ if (data.type === 'errored') {

}
}));
});
worker_1.postMessage({ action: 'init' });

@@ -51,0 +51,0 @@ return worker_1;

@@ -32,2 +32,3 @@ export { DefaultPrivacyLevel } from '@datadog/browser-core';

addFeatureFlagEvaluation: (key: string, value: any) => void;
getSessionReplayLink: () => string | undefined;
} & {

@@ -34,0 +35,0 @@ onReady(callback: () => void): void;

@@ -33,2 +33,3 @@ export { CommonProperties, RumPublicApi as RumGlobal, RumInitConfiguration, RumEvent, RumActionEvent, RumErrorEvent, RumLongTaskEvent, RumResourceEvent, RumViewEvent, RumEventDomainContext, RumViewEventDomainContext, RumErrorEventDomainContext, RumActionEventDomainContext, RumFetchResourceEventDomainContext, RumXhrResourceEventDomainContext, RumOtherResourceEventDomainContext, RumLongTaskEventDomainContext, } from '@datadog/browser-rum-core';

addFeatureFlagEvaluation: (key: string, value: any) => void;
getSessionReplayLink: () => string | undefined;
} & {

@@ -35,0 +36,0 @@ onReady(callback: () => void): void;

{
"name": "@datadog/browser-rum",
"version": "4.38.0",
"version": "4.39.0",
"license": "Apache-2.0",

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

"dependencies": {
"@datadog/browser-core": "4.38.0",
"@datadog/browser-rum-core": "4.38.0"
"@datadog/browser-core": "4.39.0",
"@datadog/browser-rum-core": "4.39.0"
},
"peerDependencies": {
"@datadog/browser-logs": "4.38.0"
"@datadog/browser-logs": "4.39.0"
},

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

},
"gitHead": "61ff7fdf8c51ea1bb789cb3d865ad094bfcdcf71"
"gitHead": "128da89b469c77d6cfdabca15eb3d7ac09c3d5ae"
}

@@ -11,5 +11,7 @@ import { canUseEventBridge, noop, runOnReadyState } from '@datadog/browser-core'

import { getReplayStats } from '../domain/replayStats'
import { getSessionReplayLink } from '../domain/getSessionReplayLink'
import { startDeflateWorker } from '../domain/segmentCollection'
import type { startRecording } from './startRecording'
import { isBrowserSupported } from './isBrowserSupported'

@@ -55,2 +57,3 @@ export type StartRecording = typeof startRecording

isRecording: () => false,
getSessionReplayLink: () => undefined,
}

@@ -73,3 +76,4 @@ }

getReplayStats,
getSessionReplayLink: (configuration, sessionManager, viewContexts) =>
getSessionReplayLink(configuration, sessionManager, viewContexts, state.status !== RecorderStatus.Stopped),
onRumStart: (

@@ -161,13 +165,1 @@ lifeCycle: LifeCycle,

}
/**
* Test for Browser features used while recording
*/
function isBrowserSupported() {
return (
// Array.from is a bit less supported by browsers than CSSSupportsRule, but has higher chances
// to be polyfilled. Test for both to be more confident. We could add more things if we find out
// this test is not sufficient.
typeof Array.from === 'function' && typeof CSSSupportsRule === 'function' && 'forEach' in NodeList.prototype
)
}

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

import type { TimeStamp, HttpRequest } from '@datadog/browser-core'
import type { TimeStamp, HttpRequest, ClocksState } from '@datadog/browser-core'
import { PageExitReason, DefaultPrivacyLevel, noop, isIE, timeStampNow } from '@datadog/browser-core'

@@ -46,3 +46,3 @@ import type { LifeCycle, ViewCreatedEvent } from '@datadog/browser-rum-core'

findView() {
return { id: viewId }
return { id: viewId, startClocks: {} as ClocksState }
},

@@ -49,0 +49,0 @@ })

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

import { noop, requestIdleCallback } from '@datadog/browser-core'
import { noop, monitor } from '@datadog/browser-core'
import type { RumMutationRecord } from './observers'

@@ -37,1 +37,18 @@

}
/**
* Use 'requestIdleCallback' when available: it will throttle the mutation processing if the
* browser is busy rendering frames (ex: when frames are below 60fps). When not available, the
* fallback on 'requestAnimationFrame' will still ensure the mutations are processed after any
* browser rendering process (Layout, Recalculate Style, etc.), so we can serialize DOM nodes efficiently.
*
* Note: check both 'requestIdleCallback' and 'cancelIdleCallback' existence because some polyfills only implement 'requestIdleCallback'.
*/
function requestIdleCallback(callback: () => void, opts?: { timeout?: number }) {
if (window.requestIdleCallback && window.cancelIdleCallback) {
const id = window.requestIdleCallback(monitor(callback), opts)
return () => window.cancelIdleCallback(id)
}
const id = window.requestAnimationFrame(monitor(callback))
return () => window.cancelAnimationFrame(id)
}
export { initObservers } from './observers'
export { InputCallback, initInputObserver } from './inputObserver'
export { initMutationObserver, MutationCallBack, RumMutationRecord } from './mutationObserver'
export { DEFAULT_CONFIGURATION } from './observers.specHelper'
export { DEFAULT_SHADOW_ROOT_CONTROLLER } from './observers.specHelper'

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

domEvents?: Array<DOM_EVENT.INPUT | DOM_EVENT.CHANGE>
target?: Node
target?: Document | ShadowRoot
}

@@ -14,0 +14,0 @@ export type InputCallback = (v: InputState & { id: number }) => void

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

): ListenerHandler {
const handler = (event: MouseEvent | TouchEvent) => {
const handler = (event: MouseEvent | TouchEvent | FocusEvent) => {
const target = getEventTarget(event)

@@ -52,3 +52,3 @@ if (getNodePrivacyLevel(target, defaultPrivacyLevel) === NodePrivacyLevel.HIDDEN || !hasSerializedNode(target)) {

if (type !== MouseInteractionType.Blur && type !== MouseInteractionType.Focus) {
const coordinates = tryToComputeCoordinates(event)
const coordinates = tryToComputeCoordinates(event as MouseEvent | TouchEvent)
if (!coordinates) {

@@ -68,6 +68,11 @@ return

}
return addEventListeners(document, Object.keys(eventTypeToMouseInteraction) as DOM_EVENT[], handler, {
capture: true,
passive: true,
}).stop
return addEventListeners(
document,
Object.keys(eventTypeToMouseInteraction) as Array<keyof typeof eventTypeToMouseInteraction>,
handler,
{
capture: true,
passive: true,
}
).stop
}

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

): ListenerHandler {
const { throttled: updatePosition } = throttle((event: UIEvent) => {
const { throttled: updatePosition } = throttle((event: Event) => {
const target = getEventTarget(event) as HTMLElement | Document

@@ -23,0 +23,0 @@ if (

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

import { addTelemetryDebug, DOM_EVENT, ExperimentalFeature, isExperimentalFeatureEnabled } from '@datadog/browser-core'
import { DOM_EVENT } from '@datadog/browser-core'
import type { RumConfiguration } from '@datadog/browser-rum-core'

@@ -56,11 +56,3 @@ import type { InputCallback, MutationCallBack } from './observers'

if (!entry) {
addTelemetryDebug('no shadow root in map', {
shadowRoot: shadowRoot ? shadowRoot.nodeName : 'no node name',
childrenLength: shadowRoot ? shadowRoot.childElementCount : '-1',
controllerByShadowRootSize: controllerByShadowRoot.size,
html:
shadowRoot && isExperimentalFeatureEnabled(ExperimentalFeature.SHADOW_DOM_DEBUG)
? shadowRoot.innerHTML.substring(0, 2000)
: undefined,
})
// unidentified root cause: observed in some cases with shadow DOM added by browser extensions
return

@@ -67,0 +59,0 @@ }

export function createDeflateWorker(): DeflateWorker
export interface DeflateWorker {
addEventListener(name: 'message', listener: DeflateWorkerListener): void
addEventListener(name: 'error', listener: (error: ErrorEvent) => void): void
removeEventListener(name: 'message', listener: DeflateWorkerListener): void
removeEventListener(name: 'error', listener: (error: ErrorEvent) => void): void
export interface DeflateWorker extends Worker {
postMessage(message: DeflateWorkerAction): void
terminate(): void
}

@@ -12,0 +6,0 @@

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

import { addTelemetryDebug, assign, monitor, sendToExtension } from '@datadog/browser-core'
import { addTelemetryDebug, assign, sendToExtension, addEventListener } from '@datadog/browser-core'
import type { BrowserRecord, BrowserSegmentMetadata, CreationReason, SegmentContext } from '../../types'
import { RecordType } from '../../types'
import * as replayStats from '../replayStats'
import type { DeflateWorker, DeflateWorkerListener } from './deflateWorker'
import type { DeflateWorker, DeflateWorkerResponse } from './deflateWorker'

@@ -44,29 +44,32 @@ let nextId = 0

const listener: DeflateWorkerListener = monitor(({ data }) => {
if (data.type === 'errored' || data.type === 'initialized') {
return
}
const { stop: removeMessageListener } = addEventListener(
worker,
'message',
({ data }: MessageEvent<DeflateWorkerResponse>) => {
if (data.type === 'errored' || data.type === 'initialized') {
return
}
if (data.id === this.id) {
replayStats.addWroteData(viewId, data.additionalBytesCount)
if (data.type === 'flushed') {
onFlushed(data.result, data.rawBytesCount)
worker.removeEventListener('message', listener)
} else {
onWrote(data.compressedBytesCount)
if (data.id === this.id) {
replayStats.addWroteData(viewId, data.additionalBytesCount)
if (data.type === 'flushed') {
onFlushed(data.result, data.rawBytesCount)
removeMessageListener()
} else {
onWrote(data.compressedBytesCount)
}
} else if (data.id > this.id) {
// Messages should be received in the same order as they are sent, so if we receive a
// message with an id superior to this Segment instance id, we know that another, more
// recent Segment instance is being used.
//
// In theory, a "flush" response should have been received at this point, so the listener
// should already have been removed. But if something goes wrong and we didn't receive a
// "flush" response, remove the listener to avoid any leak, and send a monitor message to
// help investigate the issue.
removeMessageListener()
addTelemetryDebug("Segment did not receive a 'flush' response before being replaced.")
}
} else if (data.id > this.id) {
// Messages should be received in the same order as they are sent, so if we receive a
// message with an id superior to this Segment instance id, we know that another, more
// recent Segment instance is being used.
//
// In theory, a "flush" response should have been received at this point, so the listener
// should already have been removed. But if something goes wrong and we didn't receive a
// "flush" response, remove the listener to avoid any leak, and send a monitor message to
// help investigate the issue.
worker.removeEventListener('message', listener)
addTelemetryDebug("Segment did not receive a 'flush' response before being replaced.")
}
})
worker.addEventListener('message', listener)
)
sendToExtension('record', { record: initialRecord, segment: this.metadata })

@@ -73,0 +76,0 @@ this.worker.postMessage({ data: `{"records":[${JSON.stringify(initialRecord)}`, id: this.id, action: 'write' })

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

import type { HttpRequest, TimeStamp } from '@datadog/browser-core'
import type { ClocksState, HttpRequest, TimeStamp } from '@datadog/browser-core'
import { PageExitReason, isIE } from '@datadog/browser-core'

@@ -285,3 +285,3 @@ import type { ViewContexts, ViewContext } from '@datadog/browser-rum-core'

describe('computeSegmentContext', () => {
const DEFAULT_VIEW_CONTEXT: ViewContext = { id: '123' }
const DEFAULT_VIEW_CONTEXT: ViewContext = { id: '123', startClocks: {} as ClocksState }
const DEFAULT_SESSION = createRumSessionManagerMock().setId('456')

@@ -288,0 +288,0 @@

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

import { addTelemetryError, display, includes, monitor } from '@datadog/browser-core'
import type { DeflateWorker } from './deflateWorker'
import { addTelemetryError, display, includes, addEventListener } from '@datadog/browser-core'
import type { DeflateWorker, DeflateWorkerResponse } from './deflateWorker'
import { createDeflateWorker } from './deflateWorker'

@@ -72,13 +72,10 @@

const worker = createDeflateWorkerImpl()
worker.addEventListener('error', monitor(onError))
worker.addEventListener(
'message',
monitor(({ data }) => {
if (data.type === 'errored') {
onError(data.error)
} else if (data.type === 'initialized') {
onInitialized(worker)
}
})
)
addEventListener(worker, 'error', onError)
addEventListener(worker, 'message', ({ data }: MessageEvent<DeflateWorkerResponse>) => {
if (data.type === 'errored') {
onError(data.error)
} else if (data.type === 'initialized') {
onInitialized(worker)
}
})
worker.postMessage({ action: 'init' })

@@ -85,0 +82,0 @@ return worker

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

SocketSocket SOC 2 Logo

Product

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

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc