@datadog/browser-rum
Advanced tools
Comparing version 4.38.0 to 4.39.0
@@ -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
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
1635075
368
28143
+ Added@datadog/browser-core@4.39.0(transitive)
+ Added@datadog/browser-logs@4.39.0(transitive)
+ Added@datadog/browser-rum-core@4.39.0(transitive)
- Removed@datadog/browser-core@4.38.0(transitive)
- Removed@datadog/browser-logs@4.38.0(transitive)
- Removed@datadog/browser-rum-core@4.38.0(transitive)
Updated@datadog/browser-core@4.39.0