Socket
Socket
Sign inDemoInstall

@datadog/browser-rum-core

Package Overview
Dependencies
Maintainers
1
Versions
179
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@datadog/browser-rum-core - npm Package Compare versions

Comparing version 2.5.5 to 2.6.0

2

cjs/boot/buildEnv.js

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

datacenter: 'us',
sdkVersion: '2.5.5',
sdkVersion: '2.6.0',
};
//# sourceMappingURL=buildEnv.js.map

@@ -15,3 +15,3 @@ import { Configuration } from '@datadog/browser-core';

addError: ({ error, startTime, context: customerContext, source }: import("../domain/rumEventsCollection/error/errorCollection").ProvidedError, savedCommonContext?: CommonContext | undefined) => void;
addTiming: (name: string, time?: number) => void;
addTiming: (name: string, time?: import("@datadog/browser-core").RelativeTime) => void;
configuration: Configuration;

@@ -27,4 +27,4 @@ lifeCycle: LifeCycle;

parentContexts: import("../domain/parentContexts").ParentContexts;
addTiming: (name: string, time?: number) => void;
addTiming: (name: string, time?: import("@datadog/browser-core").RelativeTime) => void;
stop(): void;
};

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

resourceCollection_1.startResourceCollection(lifeCycle, session);
var addTiming = viewCollection_1.startViewCollection(lifeCycle, location, onNewLocation).addTiming;
var _a = viewCollection_1.startViewCollection(lifeCycle, location, onNewLocation && browser_core_1.catchUserErrors(onNewLocation, 'onNewLocation threw an error:')), addTiming = _a.addTiming, stopViewCollection = _a.stop;
var addError = errorCollection_1.startErrorCollection(lifeCycle, configuration).addError;

@@ -65,2 +65,3 @@ var addAction = actionCollection_1.startActionCollection(lifeCycle, configuration).addAction;

stop: function () {
stopViewCollection();
// prevent batch from previous tests to keep running and send unwanted requests

@@ -67,0 +68,0 @@ // could be replaced by stopping all the component when they will all have a stop method

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

var addTimingStrategy = function (name) {
beforeInitAddTiming.add([name, performance.now()]);
beforeInitAddTiming.add([name, browser_core_1.relativeNow()]);
};

@@ -69,3 +69,3 @@ var beforeInitAddAction = new browser_core_1.BoundedBuffer();

context: browser_core_1.deepClone(context),
startTime: performance.now(),
startTime: browser_core_1.relativeNow(),
type: rawRumEvent_types_1.ActionType.CUSTOM,

@@ -94,3 +94,3 @@ });

source: checkedSource,
startTime: performance.now(),
startTime: browser_core_1.relativeNow(),
});

@@ -97,0 +97,0 @@ }),

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

import { Configuration } from '@datadog/browser-core';
import { Configuration, Duration, Omit, RelativeTime } from '@datadog/browser-core';
import { LifeCycle } from '../domain/lifeCycle';

@@ -7,15 +7,15 @@ export interface RumPerformanceResourceTiming {

name: string;
startTime: number;
duration: number;
fetchStart: number;
domainLookupStart: number;
domainLookupEnd: number;
connectStart: number;
secureConnectionStart: number;
connectEnd: number;
requestStart: number;
responseStart: number;
responseEnd: number;
redirectStart: number;
redirectEnd: number;
startTime: RelativeTime;
duration: Duration;
fetchStart: RelativeTime;
domainLookupStart: RelativeTime;
domainLookupEnd: RelativeTime;
connectStart: RelativeTime;
secureConnectionStart: RelativeTime;
connectEnd: RelativeTime;
requestStart: RelativeTime;
responseStart: RelativeTime;
responseEnd: RelativeTime;
redirectStart: RelativeTime;
redirectEnd: RelativeTime;
decodedBodySize: number;

@@ -26,4 +26,4 @@ traceId?: string;

entryType: 'longtask';
startTime: number;
duration: number;
startTime: RelativeTime;
duration: Duration;
}

@@ -33,19 +33,19 @@ export interface RumPerformancePaintTiming {

name: 'first-paint' | 'first-contentful-paint';
startTime: number;
startTime: RelativeTime;
}
export interface RumPerformanceNavigationTiming {
entryType: 'navigation';
domComplete: number;
domContentLoadedEventEnd: number;
domInteractive: number;
loadEventEnd: number;
domComplete: RelativeTime;
domContentLoadedEventEnd: RelativeTime;
domInteractive: RelativeTime;
loadEventEnd: RelativeTime;
}
export interface RumLargestContentfulPaintTiming {
entryType: 'largest-contentful-paint';
startTime: number;
startTime: RelativeTime;
}
export interface RumFirstInputTiming {
entryType: 'first-input';
startTime: number;
processingStart: number;
startTime: RelativeTime;
processingStart: RelativeTime;
}

@@ -61,1 +61,4 @@ export interface RumLayoutShiftTiming {

export declare function retrieveInitialDocumentResourceTiming(callback: (timing: RumPerformanceResourceTiming) => void): void;
export declare type RelativePerformanceTiming = {
-readonly [key in keyof Omit<PerformanceTiming, 'toJSON'>]: RelativeTime;
};

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

function retrieveInitialDocumentResourceTiming(callback) {
runOnReadyState('interactive', function () {
browser_core_1.runOnReadyState('interactive', function () {
var timing;

@@ -83,3 +83,3 @@ var forcedAttributes = {

}
runOnReadyState('complete', function () {
browser_core_1.runOnReadyState('complete', function () {
// Send it a bit after the actual load event, so the "loadEventEnd" timing is accurate

@@ -96,3 +96,3 @@ setTimeout(browser_core_1.monitor(sendFakeTiming));

var timingSent = false;
var removeEventListeners = browser_core_1.addEventListeners(window, [browser_core_1.DOM_EVENT.CLICK, browser_core_1.DOM_EVENT.MOUSE_DOWN, browser_core_1.DOM_EVENT.KEY_DOWN, browser_core_1.DOM_EVENT.TOUCH_START, browser_core_1.DOM_EVENT.POINTER_DOWN], function (evt) {
var removeEventListeners = browser_core_1.addEventListeners(window, ["click" /* CLICK */, "mousedown" /* MOUSE_DOWN */, "keydown" /* KEY_DOWN */, "touchstart" /* TOUCH_START */, "pointerdown" /* POINTER_DOWN */], function (evt) {
// Only count cancelable events, which should trigger behavior important to the user.

@@ -107,6 +107,6 @@ if (!evt.cancelable) {

entryType: 'first-input',
processingStart: performance.now(),
processingStart: browser_core_1.relativeNow(),
startTime: evt.timeStamp,
};
if (evt.type === browser_core_1.DOM_EVENT.POINTER_DOWN) {
if (evt.type === "pointerdown" /* POINTER_DOWN */) {
sendTimingIfPointerIsNotCancelled(timing);

@@ -120,3 +120,3 @@ }

* Pointer events are a special case, because they can trigger main or compositor thread behavior.
* We differenciate these cases based on whether or not we see a pointercancel event, which are
* We differentiate these cases based on whether or not we see a pointercancel event, which are
* fired when we scroll. If we're scrolling we don't need to report input delay since FID excludes

@@ -126,4 +126,4 @@ * scrolling and pinch/zooming.

function sendTimingIfPointerIsNotCancelled(timing) {
browser_core_1.addEventListeners(window, [browser_core_1.DOM_EVENT.POINTER_UP, browser_core_1.DOM_EVENT.POINTER_CANCEL], function (event) {
if (event.type === browser_core_1.DOM_EVENT.POINTER_UP) {
browser_core_1.addEventListeners(window, ["pointerup" /* POINTER_UP */, "pointercancel" /* POINTER_CANCEL */], function (event) {
if (event.type === "pointerup" /* POINTER_UP */) {
sendTiming(timing);

@@ -149,11 +149,2 @@ }

}
function runOnReadyState(expectedReadyState, callback) {
if (document.readyState === expectedReadyState || document.readyState === 'complete') {
callback();
}
else {
var eventName = expectedReadyState === 'complete' ? browser_core_1.DOM_EVENT.LOAD : browser_core_1.DOM_EVENT.DOM_CONTENT_LOADED;
browser_core_1.addEventListener(window, eventName, callback, { once: true });
}
}
function computeRelativePerformanceTiming() {

@@ -164,3 +155,6 @@ var result = {};

if (browser_core_1.isNumber(timing[key])) {
result[key] = timing[key] === 0 ? 0 : browser_core_1.getRelativeTime(timing[key]);
var numberKey = key;
// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
var timingElement = timing[numberKey];
result[numberKey] = timingElement === 0 ? 0 : browser_core_1.getRelativeTime(timingElement);
}

@@ -167,0 +161,0 @@ }

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

},
date: new Date().getTime(),
date: browser_core_1.timeStampNow(),
service: configuration.service,

@@ -38,0 +38,0 @@ session: {

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

import { Context } from '@datadog/browser-core';
import { Context, RelativeTime } from '@datadog/browser-core';
import { RumPerformanceEntry } from '../browser/performanceCollection';

@@ -38,3 +38,3 @@ import { CommonContext, RawRumEvent } from '../rawRumEvent.types';

notify(eventType: LifeCycleEventType.RAW_RUM_EVENT_COLLECTED, data: {
startTime: number;
startTime: RelativeTime;
rawRumEvent: RawRumEvent;

@@ -54,3 +54,3 @@ savedCommonContext?: CommonContext;

subscribe(eventType: LifeCycleEventType.RAW_RUM_EVENT_COLLECTED, callback: (data: {
startTime: number;
startTime: RelativeTime;
rawRumEvent: RawRumEvent;

@@ -57,0 +57,0 @@ savedCommonContext?: CommonContext;

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

import { RelativeTime } from '@datadog/browser-core';
import { ActionContext, ViewContext } from '../rawRumEvent.types';

@@ -8,6 +9,6 @@ import { LifeCycle } from './lifeCycle';

export interface ParentContexts {
findAction: (startTime?: number) => ActionContext | undefined;
findView: (startTime?: number) => ViewContext | undefined;
findAction: (startTime?: RelativeTime) => ActionContext | undefined;
findView: (startTime?: RelativeTime) => ViewContext | undefined;
stop: () => void;
}
export declare function startParentContexts(lifeCycle: LifeCycle, session: RumSession): ParentContexts;

@@ -40,3 +40,4 @@ "use strict";

context: buildCurrentActionContext(),
endTime: currentAction.startTime + action.duration,
// eslint-disable-next-line @typescript-eslint/restrict-plus-operands
endTime: (currentAction.startTime + action.duration),
startTime: currentAction.startTime,

@@ -43,0 +44,0 @@ });

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

import { Configuration, FetchCompleteContext, FetchStartContext, Observable, RequestType, XhrCompleteContext, XhrStartContext } from '@datadog/browser-core';
import { Configuration, Duration, FetchCompleteContext, FetchStartContext, RelativeTime, RequestType, XhrCompleteContext, XhrStartContext } from '@datadog/browser-core';
import { LifeCycle } from './lifeCycle';

@@ -28,10 +28,9 @@ import { TraceIdentifier, Tracer } from './tracing/tracer';

responseType?: string;
startTime: number;
duration: number;
startTime: RelativeTime;
duration: Duration;
spanId?: TraceIdentifier;
traceId?: TraceIdentifier;
}
export declare type RequestObservables = [Observable<RequestStartEvent>, Observable<RequestCompleteEvent>];
export declare function startRequestCollection(lifeCycle: LifeCycle, configuration: Configuration): void;
export declare function trackXhr(lifeCycle: LifeCycle, configuration: Configuration, tracer: Tracer): import("@datadog/browser-core").XhrProxy<RumXhrStartContext, RumXhrCompleteContext>;
export declare function trackFetch(lifeCycle: LifeCycle, configuration: Configuration, tracer: Tracer): import("@datadog/browser-core").FetchProxy<RumFetchStartContext, RumFetchCompleteContext>;

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

id: action.id,
loading_time: browser_core_1.msToNs(action.duration),
loading_time: browser_core_1.toServerDuration(action.duration),
long_task: {

@@ -50,3 +50,3 @@ count: action.counts.longTaskCount,

},
date: browser_core_1.getTimestamp(action.startTime),
date: browser_core_1.getTimeStamp(action.startTime),
type: rawRumEvent_types_1.RumEventType.ACTION,

@@ -53,0 +53,0 @@ }, autoActionProperties);

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

import { Context } from '@datadog/browser-core';
import { Context, Duration, RelativeTime } from '@datadog/browser-core';
import { LifeCycle } from '../../lifeCycle';

@@ -13,3 +13,3 @@ import { ActionType } from '../../../rawRumEvent.types';

name: string;
startTime: number;
startTime: RelativeTime;
context?: Context;

@@ -21,4 +21,4 @@ }

name: string;
startTime: number;
duration: number;
startTime: RelativeTime;
duration: Duration;
counts: ActionCounts;

@@ -28,3 +28,3 @@ }

id: string;
startTime: number;
startTime: RelativeTime;
}

@@ -31,0 +31,0 @@ export declare function trackActions(lifeCycle: LifeCycle): {

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

});
var stopListener = browser_core_1.addEventListener(window, browser_core_1.DOM_EVENT.CLICK, function (event) {
var stopListener = browser_core_1.addEventListener(window, "click" /* CLICK */, function (event) {
if (!(event.target instanceof Element)) {

@@ -71,3 +71,3 @@ return;

this.id = browser_core_1.generateUUID();
this.startTime = performance.now();
this.startTime = browser_core_1.relativeNow();
this.eventCountsSubscription = trackEventCounts_1.trackEventCounts(lifeCycle);

@@ -84,3 +84,3 @@ this.lifeCycle.notify(lifeCycle_1.LifeCycleEventType.AUTO_ACTION_CREATED, { id: this.id, startTime: this.startTime });

},
duration: endTime - this.startTime,
duration: browser_core_1.elapsed(this.startTime, endTime),
id: this.id,

@@ -87,0 +87,0 @@ name: this.name,

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

import { Configuration, Context, Observable, RawError } from '@datadog/browser-core';
import { Configuration, Context, Observable, RawError, RelativeTime } from '@datadog/browser-core';
import { CommonContext } from '../../../rawRumEvent.types';
import { LifeCycle } from '../../lifeCycle';
export interface ProvidedError {
startTime: number;
startTime: RelativeTime;
error: unknown;

@@ -7,0 +7,0 @@ context?: Context;

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

var rawRumEvent = {
date: browser_core_1.getTimestamp(error.startTime),
date: browser_core_1.getTimeStamp(error.startTime),
error: {

@@ -33,0 +33,0 @@ message: error.message,

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

var rawRumEvent = {
date: browser_core_1.getTimestamp(entry.startTime),
date: browser_core_1.getTimeStamp(entry.startTime),
long_task: {
duration: browser_core_1.msToNs(entry.duration),
duration: browser_core_1.toServerDuration(entry.duration),
},

@@ -18,0 +18,0 @@ type: rawRumEvent_types_1.RumEventType.LONG_TASK,

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

function endTime(timing) {
return timing.startTime + timing.duration;
// eslint-disable-next-line @typescript-eslint/restrict-plus-operands
return (timing.startTime + timing.duration);
}

@@ -46,0 +47,0 @@ function isBetween(timing, start, end) {

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

var resourceEvent = browser_core_1.combine({
date: browser_core_1.getTimestamp(startTime),
date: browser_core_1.getTimeStamp(startTime),
resource: {
type: type,
duration: browser_core_1.msToNs(request.duration),
duration: browser_core_1.toServerDuration(request.duration),
method: request.method,

@@ -48,3 +48,3 @@ status_code: request.status,

var resourceEvent = browser_core_1.combine({
date: browser_core_1.getTimestamp(entry.startTime),
date: browser_core_1.getTimeStamp(entry.startTime),
resource: {

@@ -51,0 +51,0 @@ type: type,

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

import { Configuration, ResourceType } from '@datadog/browser-core';
import { Configuration, ResourceType, ServerDuration } from '@datadog/browser-core';
import { RumPerformanceResourceTiming } from '../../../browser/performanceCollection';
import { PerformanceResourceDetailsElement } from '../../../rawRumEvent.types';
import { RumPerformanceResourceTiming } from '../../../browser/performanceCollection';
export interface PerformanceResourceDetails {

@@ -15,3 +15,3 @@ redirect?: PerformanceResourceDetailsElement;

export declare function isRequestKind(timing: RumPerformanceResourceTiming): boolean;
export declare function computePerformanceResourceDuration(entry: RumPerformanceResourceTiming): number;
export declare function computePerformanceResourceDuration(entry: RumPerformanceResourceTiming): ServerDuration;
export declare function computePerformanceResourceDetails(entry: RumPerformanceResourceTiming): PerformanceResourceDetails | undefined;

@@ -18,0 +18,0 @@ export declare function toValidEntry(entry: RumPerformanceResourceTiming): RumPerformanceResourceTiming | undefined;

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

if (duration === 0 && startTime < responseEnd) {
return browser_core_1.msToNs(responseEnd - startTime);
return browser_core_1.toServerDuration(browser_core_1.elapsed(startTime, responseEnd));
}
return browser_core_1.msToNs(duration);
return browser_core_1.toServerDuration(duration);
}

@@ -132,4 +132,4 @@ exports.computePerformanceResourceDuration = computePerformanceResourceDuration;

return {
duration: browser_core_1.msToNs(end - start),
start: browser_core_1.msToNs(start - origin),
duration: browser_core_1.toServerDuration(browser_core_1.elapsed(start, end)),
start: browser_core_1.toServerDuration(browser_core_1.elapsed(origin, start)),
};

@@ -136,0 +136,0 @@ }

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

import { EventEmitter } from '@datadog/browser-core';
import { EventEmitter, RelativeTime } from '@datadog/browser-core';
export declare function trackFirstHidden(emitter?: EventEmitter): {
timeStamp: number;
timeStamp: RelativeTime;
};
export declare function resetFirstHidden(): void;

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

};
(stopListeners = browser_core_1.addEventListener(emitter, browser_core_1.DOM_EVENT.PAGE_HIDE, function (_a) {
(stopListeners = browser_core_1.addEventListener(emitter, "pagehide" /* PAGE_HIDE */, function (_a) {
var timeStamp = _a.timeStamp;

@@ -20,0 +20,0 @@ trackFirstHiddenSingleton.timeStamp = timeStamp;

@@ -1,12 +0,12 @@

import { EventEmitter } from '@datadog/browser-core';
import { Duration, EventEmitter, RelativeTime } from '@datadog/browser-core';
import { LifeCycle } from '../../lifeCycle';
export interface Timings {
firstContentfulPaint?: number;
domInteractive?: number;
domContentLoaded?: number;
domComplete?: number;
loadEvent?: number;
largestContentfulPaint?: number;
firstInputDelay?: number;
firstInputTime?: number;
firstContentfulPaint?: Duration;
domInteractive?: Duration;
domContentLoaded?: Duration;
domComplete?: Duration;
loadEvent?: Duration;
largestContentfulPaint?: Duration;
firstInputDelay?: Duration;
firstInputTime?: Duration;
}

@@ -19,3 +19,3 @@ export declare function trackTimings(lifeCycle: LifeCycle, callback: (timings: Timings) => void): {

};
export declare function trackFirstContentfulPaint(lifeCycle: LifeCycle, callback: (fcp: number) => void): {
export declare function trackFirstContentfulPaint(lifeCycle: LifeCycle, callback: (fcp: RelativeTime) => void): {
stop: () => void;

@@ -29,3 +29,3 @@ };

*/
export declare function trackLargestContentfulPaint(lifeCycle: LifeCycle, emitter: EventEmitter, callback: (value: number) => void): {
export declare function trackLargestContentfulPaint(lifeCycle: LifeCycle, emitter: EventEmitter, callback: (value: RelativeTime) => void): {
stop: () => void;

@@ -42,6 +42,6 @@ };

export declare function trackFirstInputTimings(lifeCycle: LifeCycle, callback: ({ firstInputDelay, firstInputTime }: {
firstInputDelay: number;
firstInputTime: number;
firstInputDelay: Duration;
firstInputTime: Duration;
}) => void): {
stop: () => void;
};

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

var firstInteractionTimestamp = Infinity;
var stopEventListener = browser_core_1.addEventListeners(emitter, [browser_core_1.DOM_EVENT.POINTER_DOWN, browser_core_1.DOM_EVENT.KEY_DOWN], function (event) {
var stopEventListener = browser_core_1.addEventListeners(emitter, ["pointerdown" /* POINTER_DOWN */, "keydown" /* KEY_DOWN */], function (event) {
firstInteractionTimestamp = event.timeStamp;
}, { capture: true, once: true }).stop;
var unsubcribeLifeCycle = lifeCycle.subscribe(lifeCycle_1.LifeCycleEventType.PERFORMANCE_ENTRY_COLLECTED, function (entry) {
var unsubscribeLifeCycle = lifeCycle.subscribe(lifeCycle_1.LifeCycleEventType.PERFORMANCE_ENTRY_COLLECTED, function (entry) {
if (entry.entryType === 'largest-contentful-paint' &&

@@ -92,3 +92,3 @@ entry.startTime < firstInteractionTimestamp &&

stopEventListener();
unsubcribeLifeCycle();
unsubscribeLifeCycle();
},

@@ -111,3 +111,3 @@ };

callback({
firstInputDelay: entry.processingStart - entry.startTime,
firstInputDelay: browser_core_1.elapsed(entry.startTime, entry.processingStart),
firstInputTime: entry.startTime,

@@ -114,0 +114,0 @@ });

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

import { Duration, RelativeTime } from '@datadog/browser-core';
import { NewLocationListener } from '../../../boot/rum';

@@ -15,6 +16,6 @@ import { LifeCycle } from '../../lifeCycle';

documentVersion: number;
startTime: number;
duration: number;
startTime: RelativeTime;
duration: Duration;
isActive: boolean;
loadingTime?: number | undefined;
loadingTime?: Duration;
loadingType: ViewLoadingType;

@@ -28,3 +29,3 @@ cumulativeLayoutShift?: number;

referrer: string;
startTime: number;
startTime: RelativeTime;
}

@@ -34,4 +35,4 @@ export declare const THROTTLE_VIEW_UPDATE_PERIOD = 3000;

export declare function trackViews(location: Location, lifeCycle: LifeCycle, onNewLocation?: NewLocationListener): {
addTiming: (name: string, time?: number) => void;
addTiming: (name: string, time?: RelativeTime) => void;
stop: () => void;
};

@@ -17,3 +17,2 @@ "use strict";

if (onNewLocation === void 0) { onNewLocation = function () { return undefined; }; }
onNewLocation = wrapOnNewLocation(onNewLocation);
var startOrigin = 0;

@@ -57,3 +56,3 @@ var initialView = newView(lifeCycle, location, rawRumEvent_types_1.ViewLoadingType.INITIAL_LOAD, document.referrer, startOrigin, (_a = onNewLocation(location)) === null || _a === void 0 ? void 0 : _a.viewName);

addTiming: function (name, time) {
if (time === void 0) { time = performance.now(); }
if (time === void 0) { time = browser_core_1.relativeNow(); }
currentView.addTiming(name, time);

@@ -73,3 +72,3 @@ currentView.triggerUpdate();

function newView(lifeCycle, initialLocation, loadingType, referrer, startTime, name) {
if (startTime === void 0) { startTime = performance.now(); }
if (startTime === void 0) { startTime = browser_core_1.relativeNow(); }
// Setup initial values

@@ -132,3 +131,3 @@ var id = browser_core_1.generateUUID();

timings: timings,
duration: (endTime === undefined ? performance.now() : endTime) - startTime,
duration: browser_core_1.elapsed(startTime, endTime === undefined ? browser_core_1.relativeNow() : endTime),
isActive: endTime === undefined,

@@ -140,3 +139,3 @@ });

end: function () {
endTime = performance.now();
endTime = browser_core_1.relativeNow();
stopEventCountsTracking();

@@ -165,4 +164,4 @@ stopActivityLoadingTimeTracking();

},
addTiming: function (name, time) {
customTimings[sanitizeTiming(name)] = time - startTime;
addTiming: function (name, endTime) {
customTimings[sanitizeTiming(name)] = browser_core_1.elapsed(startTime, endTime);
},

@@ -194,3 +193,3 @@ updateLocation: function (newLocation) {

});
var removeListener = browser_core_1.addEventListener(window, browser_core_1.DOM_EVENT.POP_STATE, onHistoryChange).stop;
var removeListener = browser_core_1.addEventListener(window, "popstate" /* POP_STATE */, onHistoryChange).stop;
var stop = function () {

@@ -204,3 +203,3 @@ removeListener();

function trackHash(onHashChange) {
return browser_core_1.addEventListener(window, browser_core_1.DOM_EVENT.HASH_CHANGE, onHashChange);
return browser_core_1.addEventListener(window, "hashchange" /* HASH_CHANGE */, onHashChange);
}

@@ -236,6 +235,6 @@ function trackLoadingTime(loadType, callback) {

function trackActivityLoadingTime(lifeCycle, callback) {
var startTime = performance.now();
var startTime = browser_core_1.relativeNow();
var stopWaitIdlePageActivity = trackPageActivities_1.waitIdlePageActivity(lifeCycle, function (hadActivity, endTime) {
if (hadActivity) {
callback(endTime - startTime);
callback(browser_core_1.elapsed(startTime, endTime));
}

@@ -249,3 +248,3 @@ else {

/**
* Track layout shifts (LS) occuring during the Views. This yields multiple values that can be
* Track layout shifts (LS) occurring during the Views. This yields multiple values that can be
* added up to compute the cumulated layout shift (CLS).

@@ -284,14 +283,2 @@ *

}
function wrapOnNewLocation(onNewLocation) {
return function (newLocation, oldLocation) {
var result;
try {
result = onNewLocation(newLocation, oldLocation);
}
catch (err) {
console.error('onNewLocation threw an error:', err);
}
return result;
};
}
//# sourceMappingURL=trackViews.js.map
import { NewLocationListener } from '../../../boot/rum';
import { LifeCycle } from '../../lifeCycle';
export declare function startViewCollection(lifeCycle: LifeCycle, location: Location, onNewLocation?: NewLocationListener): {
addTiming: (name: string, time?: number) => void;
addTiming: (name: string, time?: import("@datadog/browser-core").RelativeTime) => void;
stop: () => void;
};

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

},
date: browser_core_1.getTimestamp(view.startTime),
date: browser_core_1.getTimeStamp(view.startTime),
type: rawRumEvent_types_1.RumEventType.VIEW,

@@ -28,16 +28,16 @@ view: {

cumulative_layout_shift: view.cumulativeLayoutShift,
dom_complete: browser_core_1.msToNs(view.timings.domComplete),
dom_content_loaded: browser_core_1.msToNs(view.timings.domContentLoaded),
dom_interactive: browser_core_1.msToNs(view.timings.domInteractive),
dom_complete: browser_core_1.toServerDuration(view.timings.domComplete),
dom_content_loaded: browser_core_1.toServerDuration(view.timings.domContentLoaded),
dom_interactive: browser_core_1.toServerDuration(view.timings.domInteractive),
error: {
count: view.eventCounts.errorCount,
},
first_contentful_paint: browser_core_1.msToNs(view.timings.firstContentfulPaint),
first_input_delay: browser_core_1.msToNs(view.timings.firstInputDelay),
first_input_time: browser_core_1.msToNs(view.timings.firstInputTime),
first_contentful_paint: browser_core_1.toServerDuration(view.timings.firstContentfulPaint),
first_input_delay: browser_core_1.toServerDuration(view.timings.firstInputDelay),
first_input_time: browser_core_1.toServerDuration(view.timings.firstInputTime),
is_active: view.isActive,
name: view.name,
largest_contentful_paint: browser_core_1.msToNs(view.timings.largestContentfulPaint),
load_event: browser_core_1.msToNs(view.timings.loadEvent),
loading_time: browser_core_1.msToNs(view.loadingTime),
largest_contentful_paint: browser_core_1.toServerDuration(view.timings.largestContentfulPaint),
load_event: browser_core_1.toServerDuration(view.timings.loadEvent),
loading_time: browser_core_1.toServerDuration(view.loadingTime),
loading_type: view.loadingType,

@@ -50,7 +50,7 @@ long_task: {

},
time_spent: browser_core_1.msToNs(view.duration),
time_spent: browser_core_1.toServerDuration(view.duration),
},
};
if (!browser_core_1.isEmptyObject(view.customTimings)) {
viewEvent.view.custom_timings = browser_core_1.mapValues(view.customTimings, browser_core_1.msToNs);
viewEvent.view.custom_timings = browser_core_1.mapValues(view.customTimings, browser_core_1.toServerDuration);
}

@@ -57,0 +57,0 @@ return {

@@ -0,4 +1,5 @@

import { TimeStamp } from '@datadog/browser-core';
interface DocumentTraceData {
traceId: string;
traceTime: number;
traceTime: TimeStamp;
}

@@ -5,0 +6,0 @@ export declare const INITIAL_DOCUMENT_OUTDATED_TRACE_ID_THRESHOLD: number;

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

// Try to look for the comment at the end of the <body> by by iterating over its child nodes in
// reverse order, stoping if we come accross a non-text node.
// reverse order, stopping if we come across a non-text node.
if (document.body) {

@@ -56,0 +56,0 @@ for (var i = document.body.childNodes.length - 1; i >= 0; i -= 1) {

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

import { Observable } from '@datadog/browser-core';
import { Observable, RelativeTime } from '@datadog/browser-core';
import { LifeCycle } from './lifeCycle';

@@ -9,3 +9,3 @@ export declare const PAGE_ACTIVITY_VALIDATION_DELAY = 100;

}
export declare function waitIdlePageActivity(lifeCycle: LifeCycle, completionCallback: (hadActivity: boolean, endTime: number) => void): {
export declare function waitIdlePageActivity(lifeCycle: LifeCycle, completionCallback: (hadActivity: boolean, endTime: RelativeTime) => void): {
stop: () => void;

@@ -17,4 +17,4 @@ };

};
export declare function waitPageActivitiesCompletion(pageActivitiesObservable: Observable<PageActivityEvent>, stopPageActivitiesTracking: () => void, completionCallback: (hadActivity: boolean, endTime: number) => void): {
export declare function waitPageActivitiesCompletion(pageActivitiesObservable: Observable<PageActivityEvent>, stopPageActivitiesTracking: () => void, completionCallback: (hadActivity: boolean, endTime: RelativeTime) => void): {
stop: () => void;
};

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

var validationTimeoutId = setTimeout(browser_core_1.monitor(function () { return complete(false, 0); }), exports.PAGE_ACTIVITY_VALIDATION_DELAY);
var maxDurationTimeoutId = setTimeout(browser_core_1.monitor(function () { return complete(true, performance.now()); }), exports.PAGE_ACTIVITY_MAX_DURATION);
var maxDurationTimeoutId = setTimeout(browser_core_1.monitor(function () { return complete(true, browser_core_1.relativeNow()); }), exports.PAGE_ACTIVITY_MAX_DURATION);
pageActivitiesObservable.subscribe(function (_a) {

@@ -94,3 +94,3 @@ var isBusy = _a.isBusy;

clearTimeout(idleTimeoutId);
var lastChangeTime = performance.now();
var lastChangeTime = browser_core_1.relativeNow();
if (!isBusy) {

@@ -97,0 +97,0 @@ idleTimeoutId = setTimeout(browser_core_1.monitor(function () { return complete(true, lastChangeTime); }), exports.PAGE_ACTIVITY_END_DELAY);

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

import { Context, ErrorSource, ResourceType } from '@datadog/browser-core';
import { Context, Duration, ErrorSource, ResourceType, ServerDuration, TimeStamp } from '@datadog/browser-core';
export declare enum RumEventType {

@@ -10,3 +10,3 @@ ACTION = "action",

export interface RawRumResourceEvent {
date: number;
date: TimeStamp;
type: RumEventType.RESOURCE;

@@ -16,3 +16,3 @@ resource: {

id?: string;
duration: number;
duration: ServerDuration;
url: string;

@@ -35,7 +35,7 @@ method?: string;

export interface PerformanceResourceDetailsElement {
duration: number;
start: number;
duration: ServerDuration;
start: ServerDuration;
}
export interface RawRumErrorEvent {
date: number;
date: TimeStamp;
type: RumEventType.ERROR;

@@ -55,18 +55,20 @@ error: {

export interface RawRumViewEvent {
date: number;
date: TimeStamp;
type: RumEventType.VIEW;
view: {
loading_type: ViewLoadingType;
first_contentful_paint?: number;
first_input_delay?: number;
first_input_time?: number;
first_contentful_paint?: ServerDuration;
first_input_delay?: ServerDuration;
first_input_time?: ServerDuration;
cumulative_layout_shift?: number;
custom_timings?: ViewCustomTimings;
largest_contentful_paint?: number;
dom_interactive?: number;
dom_content_loaded?: number;
dom_complete?: number;
load_event?: number;
loading_time?: number;
time_spent: number;
custom_timings?: {
[key: string]: ServerDuration;
};
largest_contentful_paint?: ServerDuration;
dom_interactive?: ServerDuration;
dom_content_loaded?: ServerDuration;
dom_complete?: ServerDuration;
load_event?: ServerDuration;
loading_time?: ServerDuration;
time_spent: ServerDuration;
is_active: boolean;

@@ -88,3 +90,3 @@ name?: string;

export interface ViewCustomTimings {
[key: string]: number;
[key: string]: Duration;
}

@@ -95,10 +97,10 @@ interface Count {

export interface RawRumLongTaskEvent {
date: number;
date: TimeStamp;
type: RumEventType.LONG_TASK;
long_task: {
duration: number;
duration: ServerDuration;
};
}
export interface RawRumActionEvent {
date?: number;
date: TimeStamp;
type: RumEventType.ACTION;

@@ -108,3 +110,3 @@ action: {

type: ActionType;
loading_time?: number;
loading_time?: ServerDuration;
error?: Count;

@@ -124,3 +126,3 @@ long_task?: Count;

export interface RumContext {
date: number;
date: TimeStamp;
application: {

@@ -127,0 +129,0 @@ id: string;

export var buildEnv = {
buildMode: 'release',
datacenter: 'us',
sdkVersion: '2.5.5',
sdkVersion: '2.6.0',
};
//# sourceMappingURL=buildEnv.js.map

@@ -15,3 +15,3 @@ import { Configuration } from '@datadog/browser-core';

addError: ({ error, startTime, context: customerContext, source }: import("../domain/rumEventsCollection/error/errorCollection").ProvidedError, savedCommonContext?: CommonContext | undefined) => void;
addTiming: (name: string, time?: number) => void;
addTiming: (name: string, time?: import("@datadog/browser-core").RelativeTime) => void;
configuration: Configuration;

@@ -27,4 +27,4 @@ lifeCycle: LifeCycle;

parentContexts: import("../domain/parentContexts").ParentContexts;
addTiming: (name: string, time?: number) => void;
addTiming: (name: string, time?: import("@datadog/browser-core").RelativeTime) => void;
stop(): void;
};

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

import { combine, commonInit } from '@datadog/browser-core';
import { catchUserErrors, combine, commonInit } from '@datadog/browser-core';
import { startDOMMutationCollection } from '../browser/domMutationCollection';

@@ -51,3 +51,3 @@ import { startPerformanceCollection } from '../browser/performanceCollection';

startResourceCollection(lifeCycle, session);
var addTiming = startViewCollection(lifeCycle, location, onNewLocation).addTiming;
var _a = startViewCollection(lifeCycle, location, onNewLocation && catchUserErrors(onNewLocation, 'onNewLocation threw an error:')), addTiming = _a.addTiming, stopViewCollection = _a.stop;
var addError = startErrorCollection(lifeCycle, configuration).addError;

@@ -61,2 +61,3 @@ var addAction = startActionCollection(lifeCycle, configuration).addAction;

stop: function () {
stopViewCollection();
// prevent batch from previous tests to keep running and send unwanted requests

@@ -63,0 +64,0 @@ // could be replaced by stopping all the component when they will all have a stop method

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

import { BoundedBuffer, buildCookieOptions, checkCookiesAuthorized, checkIsNotLocalFile, createContextManager, deepClone, ErrorSource, isPercentage, makePublicApi, monitor, } from '@datadog/browser-core';
import { BoundedBuffer, buildCookieOptions, checkCookiesAuthorized, checkIsNotLocalFile, createContextManager, deepClone, ErrorSource, isPercentage, makePublicApi, monitor, relativeNow, } from '@datadog/browser-core';
import { ActionType } from '../rawRumEvent.types';

@@ -10,3 +10,3 @@ export function makeRumPublicApi(startRumImpl) {

var addTimingStrategy = function (name) {
beforeInitAddTiming.add([name, performance.now()]);
beforeInitAddTiming.add([name, relativeNow()]);
};

@@ -66,3 +66,3 @@ var beforeInitAddAction = new BoundedBuffer();

context: deepClone(context),
startTime: performance.now(),
startTime: relativeNow(),
type: ActionType.CUSTOM,

@@ -91,3 +91,3 @@ });

source: checkedSource,
startTime: performance.now(),
startTime: relativeNow(),
});

@@ -94,0 +94,0 @@ }),

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

import { Configuration } from '@datadog/browser-core';
import { Configuration, Duration, Omit, RelativeTime } from '@datadog/browser-core';
import { LifeCycle } from '../domain/lifeCycle';

@@ -7,15 +7,15 @@ export interface RumPerformanceResourceTiming {

name: string;
startTime: number;
duration: number;
fetchStart: number;
domainLookupStart: number;
domainLookupEnd: number;
connectStart: number;
secureConnectionStart: number;
connectEnd: number;
requestStart: number;
responseStart: number;
responseEnd: number;
redirectStart: number;
redirectEnd: number;
startTime: RelativeTime;
duration: Duration;
fetchStart: RelativeTime;
domainLookupStart: RelativeTime;
domainLookupEnd: RelativeTime;
connectStart: RelativeTime;
secureConnectionStart: RelativeTime;
connectEnd: RelativeTime;
requestStart: RelativeTime;
responseStart: RelativeTime;
responseEnd: RelativeTime;
redirectStart: RelativeTime;
redirectEnd: RelativeTime;
decodedBodySize: number;

@@ -26,4 +26,4 @@ traceId?: string;

entryType: 'longtask';
startTime: number;
duration: number;
startTime: RelativeTime;
duration: Duration;
}

@@ -33,19 +33,19 @@ export interface RumPerformancePaintTiming {

name: 'first-paint' | 'first-contentful-paint';
startTime: number;
startTime: RelativeTime;
}
export interface RumPerformanceNavigationTiming {
entryType: 'navigation';
domComplete: number;
domContentLoadedEventEnd: number;
domInteractive: number;
loadEventEnd: number;
domComplete: RelativeTime;
domContentLoadedEventEnd: RelativeTime;
domInteractive: RelativeTime;
loadEventEnd: RelativeTime;
}
export interface RumLargestContentfulPaintTiming {
entryType: 'largest-contentful-paint';
startTime: number;
startTime: RelativeTime;
}
export interface RumFirstInputTiming {
entryType: 'first-input';
startTime: number;
processingStart: number;
startTime: RelativeTime;
processingStart: RelativeTime;
}

@@ -61,1 +61,4 @@ export interface RumLayoutShiftTiming {

export declare function retrieveInitialDocumentResourceTiming(callback: (timing: RumPerformanceResourceTiming) => void): void;
export declare type RelativePerformanceTiming = {
-readonly [key in keyof Omit<PerformanceTiming, 'toJSON'>]: RelativeTime;
};
import { __assign } from "tslib";
import { addEventListener, addEventListeners, DOM_EVENT, getRelativeTime, isNumber, monitor, } from '@datadog/browser-core';
import { addEventListeners, getRelativeTime, isNumber, monitor, relativeNow, runOnReadyState, } from '@datadog/browser-core';
import { LifeCycleEventType } from '../domain/lifeCycle';

@@ -88,3 +88,3 @@ import { FAKE_INITIAL_DOCUMENT, isAllowedRequestUrl } from '../domain/rumEventsCollection/resource/resourceUtils';

var timingSent = false;
var removeEventListeners = addEventListeners(window, [DOM_EVENT.CLICK, DOM_EVENT.MOUSE_DOWN, DOM_EVENT.KEY_DOWN, DOM_EVENT.TOUCH_START, DOM_EVENT.POINTER_DOWN], function (evt) {
var removeEventListeners = addEventListeners(window, ["click" /* CLICK */, "mousedown" /* MOUSE_DOWN */, "keydown" /* KEY_DOWN */, "touchstart" /* TOUCH_START */, "pointerdown" /* POINTER_DOWN */], function (evt) {
// Only count cancelable events, which should trigger behavior important to the user.

@@ -99,6 +99,6 @@ if (!evt.cancelable) {

entryType: 'first-input',
processingStart: performance.now(),
processingStart: relativeNow(),
startTime: evt.timeStamp,
};
if (evt.type === DOM_EVENT.POINTER_DOWN) {
if (evt.type === "pointerdown" /* POINTER_DOWN */) {
sendTimingIfPointerIsNotCancelled(timing);

@@ -112,3 +112,3 @@ }

* Pointer events are a special case, because they can trigger main or compositor thread behavior.
* We differenciate these cases based on whether or not we see a pointercancel event, which are
* We differentiate these cases based on whether or not we see a pointercancel event, which are
* fired when we scroll. If we're scrolling we don't need to report input delay since FID excludes

@@ -118,4 +118,4 @@ * scrolling and pinch/zooming.

function sendTimingIfPointerIsNotCancelled(timing) {
addEventListeners(window, [DOM_EVENT.POINTER_UP, DOM_EVENT.POINTER_CANCEL], function (event) {
if (event.type === DOM_EVENT.POINTER_UP) {
addEventListeners(window, ["pointerup" /* POINTER_UP */, "pointercancel" /* POINTER_CANCEL */], function (event) {
if (event.type === "pointerup" /* POINTER_UP */) {
sendTiming(timing);

@@ -141,11 +141,2 @@ }

}
function runOnReadyState(expectedReadyState, callback) {
if (document.readyState === expectedReadyState || document.readyState === 'complete') {
callback();
}
else {
var eventName = expectedReadyState === 'complete' ? DOM_EVENT.LOAD : DOM_EVENT.DOM_CONTENT_LOADED;
addEventListener(window, eventName, callback, { once: true });
}
}
function computeRelativePerformanceTiming() {

@@ -156,3 +147,6 @@ var result = {};

if (isNumber(timing[key])) {
result[key] = timing[key] === 0 ? 0 : getRelativeTime(timing[key]);
var numberKey = key;
// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
var timingElement = timing[numberKey];
result[numberKey] = timingElement === 0 ? 0 : getRelativeTime(timingElement);
}

@@ -159,0 +153,0 @@ }

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

import { combine, isEmptyObject, limitModification } from '@datadog/browser-core';
import { combine, isEmptyObject, limitModification, timeStampNow } from '@datadog/browser-core';
import { RumEventType, } from '../rawRumEvent.types';

@@ -32,3 +32,3 @@ import { LifeCycleEventType } from './lifeCycle';

},
date: new Date().getTime(),
date: timeStampNow(),
service: configuration.service,

@@ -35,0 +35,0 @@ session: {

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

import { Context } from '@datadog/browser-core';
import { Context, RelativeTime } from '@datadog/browser-core';
import { RumPerformanceEntry } from '../browser/performanceCollection';

@@ -38,3 +38,3 @@ import { CommonContext, RawRumEvent } from '../rawRumEvent.types';

notify(eventType: LifeCycleEventType.RAW_RUM_EVENT_COLLECTED, data: {
startTime: number;
startTime: RelativeTime;
rawRumEvent: RawRumEvent;

@@ -54,3 +54,3 @@ savedCommonContext?: CommonContext;

subscribe(eventType: LifeCycleEventType.RAW_RUM_EVENT_COLLECTED, callback: (data: {
startTime: number;
startTime: RelativeTime;
rawRumEvent: RawRumEvent;

@@ -57,0 +57,0 @@ savedCommonContext?: CommonContext;

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

import { RelativeTime } from '@datadog/browser-core';
import { ActionContext, ViewContext } from '../rawRumEvent.types';

@@ -8,6 +9,6 @@ import { LifeCycle } from './lifeCycle';

export interface ParentContexts {
findAction: (startTime?: number) => ActionContext | undefined;
findView: (startTime?: number) => ViewContext | undefined;
findAction: (startTime?: RelativeTime) => ActionContext | undefined;
findView: (startTime?: RelativeTime) => ViewContext | undefined;
stop: () => void;
}
export declare function startParentContexts(lifeCycle: LifeCycle, session: RumSession): ParentContexts;

@@ -37,3 +37,4 @@ import { monitor, ONE_MINUTE, SESSION_TIME_OUT_DELAY } from '@datadog/browser-core';

context: buildCurrentActionContext(),
endTime: currentAction.startTime + action.duration,
// eslint-disable-next-line @typescript-eslint/restrict-plus-operands
endTime: (currentAction.startTime + action.duration),
startTime: currentAction.startTime,

@@ -40,0 +41,0 @@ });

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

import { Configuration, FetchCompleteContext, FetchStartContext, Observable, RequestType, XhrCompleteContext, XhrStartContext } from '@datadog/browser-core';
import { Configuration, Duration, FetchCompleteContext, FetchStartContext, RelativeTime, RequestType, XhrCompleteContext, XhrStartContext } from '@datadog/browser-core';
import { LifeCycle } from './lifeCycle';

@@ -28,10 +28,9 @@ import { TraceIdentifier, Tracer } from './tracing/tracer';

responseType?: string;
startTime: number;
duration: number;
startTime: RelativeTime;
duration: Duration;
spanId?: TraceIdentifier;
traceId?: TraceIdentifier;
}
export declare type RequestObservables = [Observable<RequestStartEvent>, Observable<RequestCompleteEvent>];
export declare function startRequestCollection(lifeCycle: LifeCycle, configuration: Configuration): void;
export declare function trackXhr(lifeCycle: LifeCycle, configuration: Configuration, tracer: Tracer): import("@datadog/browser-core").XhrProxy<RumXhrStartContext, RumXhrCompleteContext>;
export declare function trackFetch(lifeCycle: LifeCycle, configuration: Configuration, tracer: Tracer): import("@datadog/browser-core").FetchProxy<RumFetchStartContext, RumFetchCompleteContext>;
import { __assign } from "tslib";
import { combine, getTimestamp, msToNs } from '@datadog/browser-core';
import { RumEventType, ActionType } from '../../../rawRumEvent.types';
import { combine, getTimeStamp, toServerDuration } from '@datadog/browser-core';
import { ActionType, RumEventType } from '../../../rawRumEvent.types';
import { LifeCycleEventType } from '../../lifeCycle';

@@ -27,3 +27,3 @@ import { trackActions } from './trackActions';

id: action.id,
loading_time: msToNs(action.duration),
loading_time: toServerDuration(action.duration),
long_task: {

@@ -46,3 +46,3 @@ count: action.counts.longTaskCount,

},
date: getTimestamp(action.startTime),
date: getTimeStamp(action.startTime),
type: RumEventType.ACTION,

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

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

import { Context } from '@datadog/browser-core';
import { Context, Duration, RelativeTime } from '@datadog/browser-core';
import { LifeCycle } from '../../lifeCycle';

@@ -13,3 +13,3 @@ import { ActionType } from '../../../rawRumEvent.types';

name: string;
startTime: number;
startTime: RelativeTime;
context?: Context;

@@ -21,4 +21,4 @@ }

name: string;
startTime: number;
duration: number;
startTime: RelativeTime;
duration: Duration;
counts: ActionCounts;

@@ -28,3 +28,3 @@ }

id: string;
startTime: number;
startTime: RelativeTime;
}

@@ -31,0 +31,0 @@ export declare function trackActions(lifeCycle: LifeCycle): {

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

import { addEventListener, DOM_EVENT, generateUUID } from '@datadog/browser-core';
import { addEventListener, elapsed, generateUUID, relativeNow, } from '@datadog/browser-core';
import { LifeCycleEventType } from '../../lifeCycle';

@@ -13,3 +13,3 @@ import { trackEventCounts } from '../../trackEventCounts';

});
var stopListener = addEventListener(window, DOM_EVENT.CLICK, function (event) {
var stopListener = addEventListener(window, "click" /* CLICK */, function (event) {
if (!(event.target instanceof Element)) {

@@ -67,3 +67,3 @@ return;

this.id = generateUUID();
this.startTime = performance.now();
this.startTime = relativeNow();
this.eventCountsSubscription = trackEventCounts(lifeCycle);

@@ -80,3 +80,3 @@ this.lifeCycle.notify(LifeCycleEventType.AUTO_ACTION_CREATED, { id: this.id, startTime: this.startTime });

},
duration: endTime - this.startTime,
duration: elapsed(this.startTime, endTime),
id: this.id,

@@ -83,0 +83,0 @@ name: this.name,

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

import { Configuration, Context, Observable, RawError } from '@datadog/browser-core';
import { Configuration, Context, Observable, RawError, RelativeTime } from '@datadog/browser-core';
import { CommonContext } from '../../../rawRumEvent.types';
import { LifeCycle } from '../../lifeCycle';
export interface ProvidedError {
startTime: number;
startTime: RelativeTime;
error: unknown;

@@ -7,0 +7,0 @@ context?: Context;

import { __assign } from "tslib";
import { computeStackTrace, formatUnknownError, getTimestamp, startAutomaticErrorCollection, } from '@datadog/browser-core';
import { computeStackTrace, formatUnknownError, getTimeStamp, startAutomaticErrorCollection, } from '@datadog/browser-core';
import { RumEventType } from '../../../rawRumEvent.types';

@@ -25,3 +25,3 @@ import { LifeCycleEventType } from '../../lifeCycle';

var rawRumEvent = {
date: getTimestamp(error.startTime),
date: getTimeStamp(error.startTime),
error: {

@@ -28,0 +28,0 @@ message: error.message,

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

import { getTimestamp, msToNs } from '@datadog/browser-core';
import { getTimeStamp, toServerDuration } from '@datadog/browser-core';
import { RumEventType } from '../../../rawRumEvent.types';

@@ -10,5 +10,5 @@ import { LifeCycleEventType } from '../../lifeCycle';

var rawRumEvent = {
date: getTimestamp(entry.startTime),
date: getTimeStamp(entry.startTime),
long_task: {
duration: msToNs(entry.duration),
duration: toServerDuration(entry.duration),
},

@@ -15,0 +15,0 @@ type: RumEventType.LONG_TASK,

@@ -39,3 +39,4 @@ import { toValidEntry } from './resourceUtils';

function endTime(timing) {
return timing.startTime + timing.duration;
// eslint-disable-next-line @typescript-eslint/restrict-plus-operands
return (timing.startTime + timing.duration);
}

@@ -42,0 +43,0 @@ function isBetween(timing, start, end) {

import { __assign } from "tslib";
import { combine, generateUUID, getTimestamp, msToNs, RequestType, ResourceType } from '@datadog/browser-core';
import { combine, generateUUID, getTimeStamp, RequestType, ResourceType, toServerDuration } from '@datadog/browser-core';
import { RumEventType } from '../../../rawRumEvent.types';

@@ -26,6 +26,6 @@ import { LifeCycleEventType } from '../../lifeCycle';

var resourceEvent = combine({
date: getTimestamp(startTime),
date: getTimeStamp(startTime),
resource: {
type: type,
duration: msToNs(request.duration),
duration: toServerDuration(request.duration),
method: request.method,

@@ -44,3 +44,3 @@ status_code: request.status,

var resourceEvent = combine({
date: getTimestamp(entry.startTime),
date: getTimeStamp(entry.startTime),
resource: {

@@ -47,0 +47,0 @@ type: type,

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

import { Configuration, ResourceType } from '@datadog/browser-core';
import { Configuration, ResourceType, ServerDuration } from '@datadog/browser-core';
import { RumPerformanceResourceTiming } from '../../../browser/performanceCollection';
import { PerformanceResourceDetailsElement } from '../../../rawRumEvent.types';
import { RumPerformanceResourceTiming } from '../../../browser/performanceCollection';
export interface PerformanceResourceDetails {

@@ -15,3 +15,3 @@ redirect?: PerformanceResourceDetailsElement;

export declare function isRequestKind(timing: RumPerformanceResourceTiming): boolean;
export declare function computePerformanceResourceDuration(entry: RumPerformanceResourceTiming): number;
export declare function computePerformanceResourceDuration(entry: RumPerformanceResourceTiming): ServerDuration;
export declare function computePerformanceResourceDetails(entry: RumPerformanceResourceTiming): PerformanceResourceDetails | undefined;

@@ -18,0 +18,0 @@ export declare function toValidEntry(entry: RumPerformanceResourceTiming): RumPerformanceResourceTiming | undefined;

import { __assign } from "tslib";
import { addMonitoringMessage, getPathName, includes, isValidUrl, msToNs, ResourceType, } from '@datadog/browser-core';
import { addMonitoringMessage, elapsed, getPathName, includes, isValidUrl, ResourceType, toServerDuration, } from '@datadog/browser-core';
export var FAKE_INITIAL_DOCUMENT = 'initial_document';

@@ -59,5 +59,5 @@ var RESOURCE_TYPES = [

if (duration === 0 && startTime < responseEnd) {
return msToNs(responseEnd - startTime);
return toServerDuration(elapsed(startTime, responseEnd));
}
return msToNs(duration);
return toServerDuration(duration);
}

@@ -124,4 +124,4 @@ export function computePerformanceResourceDetails(entry) {

return {
duration: msToNs(end - start),
start: msToNs(start - origin),
duration: toServerDuration(elapsed(start, end)),
start: toServerDuration(elapsed(origin, start)),
};

@@ -128,0 +128,0 @@ }

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

import { EventEmitter } from '@datadog/browser-core';
import { EventEmitter, RelativeTime } from '@datadog/browser-core';
export declare function trackFirstHidden(emitter?: EventEmitter): {
timeStamp: number;
timeStamp: RelativeTime;
};
export declare function resetFirstHidden(): void;

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

import { addEventListener, DOM_EVENT } from '@datadog/browser-core';
import { addEventListener } from '@datadog/browser-core';
var trackFirstHiddenSingleton;

@@ -14,3 +14,3 @@ var stopListeners;

};
(stopListeners = addEventListener(emitter, DOM_EVENT.PAGE_HIDE, function (_a) {
(stopListeners = addEventListener(emitter, "pagehide" /* PAGE_HIDE */, function (_a) {
var timeStamp = _a.timeStamp;

@@ -17,0 +17,0 @@ trackFirstHiddenSingleton.timeStamp = timeStamp;

@@ -1,12 +0,12 @@

import { EventEmitter } from '@datadog/browser-core';
import { Duration, EventEmitter, RelativeTime } from '@datadog/browser-core';
import { LifeCycle } from '../../lifeCycle';
export interface Timings {
firstContentfulPaint?: number;
domInteractive?: number;
domContentLoaded?: number;
domComplete?: number;
loadEvent?: number;
largestContentfulPaint?: number;
firstInputDelay?: number;
firstInputTime?: number;
firstContentfulPaint?: Duration;
domInteractive?: Duration;
domContentLoaded?: Duration;
domComplete?: Duration;
loadEvent?: Duration;
largestContentfulPaint?: Duration;
firstInputDelay?: Duration;
firstInputTime?: Duration;
}

@@ -19,3 +19,3 @@ export declare function trackTimings(lifeCycle: LifeCycle, callback: (timings: Timings) => void): {

};
export declare function trackFirstContentfulPaint(lifeCycle: LifeCycle, callback: (fcp: number) => void): {
export declare function trackFirstContentfulPaint(lifeCycle: LifeCycle, callback: (fcp: RelativeTime) => void): {
stop: () => void;

@@ -29,3 +29,3 @@ };

*/
export declare function trackLargestContentfulPaint(lifeCycle: LifeCycle, emitter: EventEmitter, callback: (value: number) => void): {
export declare function trackLargestContentfulPaint(lifeCycle: LifeCycle, emitter: EventEmitter, callback: (value: RelativeTime) => void): {
stop: () => void;

@@ -42,6 +42,6 @@ };

export declare function trackFirstInputTimings(lifeCycle: LifeCycle, callback: ({ firstInputDelay, firstInputTime }: {
firstInputDelay: number;
firstInputTime: number;
firstInputDelay: Duration;
firstInputTime: Duration;
}) => void): {
stop: () => void;
};
import { __assign } from "tslib";
import { addEventListeners, DOM_EVENT } from '@datadog/browser-core';
import { addEventListeners, elapsed } from '@datadog/browser-core';
import { LifeCycleEventType } from '../../lifeCycle';

@@ -72,6 +72,6 @@ import { trackFirstHidden } from './trackFirstHidden';

var firstInteractionTimestamp = Infinity;
var stopEventListener = addEventListeners(emitter, [DOM_EVENT.POINTER_DOWN, DOM_EVENT.KEY_DOWN], function (event) {
var stopEventListener = addEventListeners(emitter, ["pointerdown" /* POINTER_DOWN */, "keydown" /* KEY_DOWN */], function (event) {
firstInteractionTimestamp = event.timeStamp;
}, { capture: true, once: true }).stop;
var unsubcribeLifeCycle = lifeCycle.subscribe(LifeCycleEventType.PERFORMANCE_ENTRY_COLLECTED, function (entry) {
var unsubscribeLifeCycle = lifeCycle.subscribe(LifeCycleEventType.PERFORMANCE_ENTRY_COLLECTED, function (entry) {
if (entry.entryType === 'largest-contentful-paint' &&

@@ -86,3 +86,3 @@ entry.startTime < firstInteractionTimestamp &&

stopEventListener();
unsubcribeLifeCycle();
unsubscribeLifeCycle();
},

@@ -104,3 +104,3 @@ };

callback({
firstInputDelay: entry.processingStart - entry.startTime,
firstInputDelay: elapsed(entry.startTime, entry.processingStart),
firstInputTime: entry.startTime,

@@ -107,0 +107,0 @@ });

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

import { Duration, RelativeTime } from '@datadog/browser-core';
import { NewLocationListener } from '../../../boot/rum';

@@ -15,6 +16,6 @@ import { LifeCycle } from '../../lifeCycle';

documentVersion: number;
startTime: number;
duration: number;
startTime: RelativeTime;
duration: Duration;
isActive: boolean;
loadingTime?: number | undefined;
loadingTime?: Duration;
loadingType: ViewLoadingType;

@@ -28,3 +29,3 @@ cumulativeLayoutShift?: number;

referrer: string;
startTime: number;
startTime: RelativeTime;
}

@@ -34,4 +35,4 @@ export declare const THROTTLE_VIEW_UPDATE_PERIOD = 3000;

export declare function trackViews(location: Location, lifeCycle: LifeCycle, onNewLocation?: NewLocationListener): {
addTiming: (name: string, time?: number) => void;
addTiming: (name: string, time?: RelativeTime) => void;
stop: () => void;
};
import { __assign } from "tslib";
import { addEventListener, DOM_EVENT, generateUUID, monitor, noop, ONE_MINUTE, throttle } from '@datadog/browser-core';
import { addEventListener, elapsed, generateUUID, monitor, noop, ONE_MINUTE, relativeNow, throttle, } from '@datadog/browser-core';
import { supportPerformanceTimingEvent } from '../../../browser/performanceCollection';

@@ -14,3 +14,2 @@ import { LifeCycleEventType } from '../../lifeCycle';

if (onNewLocation === void 0) { onNewLocation = function () { return undefined; }; }
onNewLocation = wrapOnNewLocation(onNewLocation);
var startOrigin = 0;

@@ -54,3 +53,3 @@ var initialView = newView(lifeCycle, location, ViewLoadingType.INITIAL_LOAD, document.referrer, startOrigin, (_a = onNewLocation(location)) === null || _a === void 0 ? void 0 : _a.viewName);

addTiming: function (name, time) {
if (time === void 0) { time = performance.now(); }
if (time === void 0) { time = relativeNow(); }
currentView.addTiming(name, time);

@@ -69,3 +68,3 @@ currentView.triggerUpdate();

function newView(lifeCycle, initialLocation, loadingType, referrer, startTime, name) {
if (startTime === void 0) { startTime = performance.now(); }
if (startTime === void 0) { startTime = relativeNow(); }
// Setup initial values

@@ -128,3 +127,3 @@ var id = generateUUID();

timings: timings,
duration: (endTime === undefined ? performance.now() : endTime) - startTime,
duration: elapsed(startTime, endTime === undefined ? relativeNow() : endTime),
isActive: endTime === undefined,

@@ -136,3 +135,3 @@ });

end: function () {
endTime = performance.now();
endTime = relativeNow();
stopEventCountsTracking();

@@ -161,4 +160,4 @@ stopActivityLoadingTimeTracking();

},
addTiming: function (name, time) {
customTimings[sanitizeTiming(name)] = time - startTime;
addTiming: function (name, endTime) {
customTimings[sanitizeTiming(name)] = elapsed(startTime, endTime);
},

@@ -190,3 +189,3 @@ updateLocation: function (newLocation) {

});
var removeListener = addEventListener(window, DOM_EVENT.POP_STATE, onHistoryChange).stop;
var removeListener = addEventListener(window, "popstate" /* POP_STATE */, onHistoryChange).stop;
var stop = function () {

@@ -200,3 +199,3 @@ removeListener();

function trackHash(onHashChange) {
return addEventListener(window, DOM_EVENT.HASH_CHANGE, onHashChange);
return addEventListener(window, "hashchange" /* HASH_CHANGE */, onHashChange);
}

@@ -232,6 +231,6 @@ function trackLoadingTime(loadType, callback) {

function trackActivityLoadingTime(lifeCycle, callback) {
var startTime = performance.now();
var startTime = relativeNow();
var stopWaitIdlePageActivity = waitIdlePageActivity(lifeCycle, function (hadActivity, endTime) {
if (hadActivity) {
callback(endTime - startTime);
callback(elapsed(startTime, endTime));
}

@@ -245,3 +244,3 @@ else {

/**
* Track layout shifts (LS) occuring during the Views. This yields multiple values that can be
* Track layout shifts (LS) occurring during the Views. This yields multiple values that can be
* added up to compute the cumulated layout shift (CLS).

@@ -280,14 +279,2 @@ *

}
function wrapOnNewLocation(onNewLocation) {
return function (newLocation, oldLocation) {
var result;
try {
result = onNewLocation(newLocation, oldLocation);
}
catch (err) {
console.error('onNewLocation threw an error:', err);
}
return result;
};
}
//# sourceMappingURL=trackViews.js.map
import { NewLocationListener } from '../../../boot/rum';
import { LifeCycle } from '../../lifeCycle';
export declare function startViewCollection(lifeCycle: LifeCycle, location: Location, onNewLocation?: NewLocationListener): {
addTiming: (name: string, time?: number) => void;
addTiming: (name: string, time?: import("@datadog/browser-core").RelativeTime) => void;
stop: () => void;
};

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

import { getTimestamp, isEmptyObject, mapValues, msToNs } from '@datadog/browser-core';
import { getTimeStamp, isEmptyObject, mapValues, toServerDuration, } from '@datadog/browser-core';
import { RumEventType } from '../../../rawRumEvent.types';

@@ -16,3 +16,3 @@ import { LifeCycleEventType } from '../../lifeCycle';

},
date: getTimestamp(view.startTime),
date: getTimeStamp(view.startTime),
type: RumEventType.VIEW,

@@ -24,16 +24,16 @@ view: {

cumulative_layout_shift: view.cumulativeLayoutShift,
dom_complete: msToNs(view.timings.domComplete),
dom_content_loaded: msToNs(view.timings.domContentLoaded),
dom_interactive: msToNs(view.timings.domInteractive),
dom_complete: toServerDuration(view.timings.domComplete),
dom_content_loaded: toServerDuration(view.timings.domContentLoaded),
dom_interactive: toServerDuration(view.timings.domInteractive),
error: {
count: view.eventCounts.errorCount,
},
first_contentful_paint: msToNs(view.timings.firstContentfulPaint),
first_input_delay: msToNs(view.timings.firstInputDelay),
first_input_time: msToNs(view.timings.firstInputTime),
first_contentful_paint: toServerDuration(view.timings.firstContentfulPaint),
first_input_delay: toServerDuration(view.timings.firstInputDelay),
first_input_time: toServerDuration(view.timings.firstInputTime),
is_active: view.isActive,
name: view.name,
largest_contentful_paint: msToNs(view.timings.largestContentfulPaint),
load_event: msToNs(view.timings.loadEvent),
loading_time: msToNs(view.loadingTime),
largest_contentful_paint: toServerDuration(view.timings.largestContentfulPaint),
load_event: toServerDuration(view.timings.loadEvent),
loading_time: toServerDuration(view.loadingTime),
loading_type: view.loadingType,

@@ -46,7 +46,7 @@ long_task: {

},
time_spent: msToNs(view.duration),
time_spent: toServerDuration(view.duration),
},
};
if (!isEmptyObject(view.customTimings)) {
viewEvent.view.custom_timings = mapValues(view.customTimings, msToNs);
viewEvent.view.custom_timings = mapValues(view.customTimings, toServerDuration);
}

@@ -53,0 +53,0 @@ return {

@@ -0,4 +1,5 @@

import { TimeStamp } from '@datadog/browser-core';
interface DocumentTraceData {
traceId: string;
traceTime: number;
traceTime: TimeStamp;
}

@@ -5,0 +6,0 @@ export declare const INITIAL_DOCUMENT_OUTDATED_TRACE_ID_THRESHOLD: number;

@@ -46,3 +46,3 @@ import { findCommaSeparatedValue, ONE_MINUTE } from '@datadog/browser-core';

// Try to look for the comment at the end of the <body> by by iterating over its child nodes in
// reverse order, stoping if we come accross a non-text node.
// reverse order, stopping if we come across a non-text node.
if (document.body) {

@@ -49,0 +49,0 @@ for (var i = document.body.childNodes.length - 1; i >= 0; i -= 1) {

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

import { Observable } from '@datadog/browser-core';
import { Observable, RelativeTime } from '@datadog/browser-core';
import { LifeCycle } from './lifeCycle';

@@ -9,3 +9,3 @@ export declare const PAGE_ACTIVITY_VALIDATION_DELAY = 100;

}
export declare function waitIdlePageActivity(lifeCycle: LifeCycle, completionCallback: (hadActivity: boolean, endTime: number) => void): {
export declare function waitIdlePageActivity(lifeCycle: LifeCycle, completionCallback: (hadActivity: boolean, endTime: RelativeTime) => void): {
stop: () => void;

@@ -17,4 +17,4 @@ };

};
export declare function waitPageActivitiesCompletion(pageActivitiesObservable: Observable<PageActivityEvent>, stopPageActivitiesTracking: () => void, completionCallback: (hadActivity: boolean, endTime: number) => void): {
export declare function waitPageActivitiesCompletion(pageActivitiesObservable: Observable<PageActivityEvent>, stopPageActivitiesTracking: () => void, completionCallback: (hadActivity: boolean, endTime: RelativeTime) => void): {
stop: () => void;
};

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

import { monitor, Observable } from '@datadog/browser-core';
import { monitor, Observable, relativeNow } from '@datadog/browser-core';
import { LifeCycleEventType } from './lifeCycle';

@@ -83,3 +83,3 @@ // Delay to wait for a page activity to validate the tracking process

var validationTimeoutId = setTimeout(monitor(function () { return complete(false, 0); }), PAGE_ACTIVITY_VALIDATION_DELAY);
var maxDurationTimeoutId = setTimeout(monitor(function () { return complete(true, performance.now()); }), PAGE_ACTIVITY_MAX_DURATION);
var maxDurationTimeoutId = setTimeout(monitor(function () { return complete(true, relativeNow()); }), PAGE_ACTIVITY_MAX_DURATION);
pageActivitiesObservable.subscribe(function (_a) {

@@ -89,3 +89,3 @@ var isBusy = _a.isBusy;

clearTimeout(idleTimeoutId);
var lastChangeTime = performance.now();
var lastChangeTime = relativeNow();
if (!isBusy) {

@@ -92,0 +92,0 @@ idleTimeoutId = setTimeout(monitor(function () { return complete(true, lastChangeTime); }), PAGE_ACTIVITY_END_DELAY);

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

import { Context, ErrorSource, ResourceType } from '@datadog/browser-core';
import { Context, Duration, ErrorSource, ResourceType, ServerDuration, TimeStamp } from '@datadog/browser-core';
export declare enum RumEventType {

@@ -10,3 +10,3 @@ ACTION = "action",

export interface RawRumResourceEvent {
date: number;
date: TimeStamp;
type: RumEventType.RESOURCE;

@@ -16,3 +16,3 @@ resource: {

id?: string;
duration: number;
duration: ServerDuration;
url: string;

@@ -35,7 +35,7 @@ method?: string;

export interface PerformanceResourceDetailsElement {
duration: number;
start: number;
duration: ServerDuration;
start: ServerDuration;
}
export interface RawRumErrorEvent {
date: number;
date: TimeStamp;
type: RumEventType.ERROR;

@@ -55,18 +55,20 @@ error: {

export interface RawRumViewEvent {
date: number;
date: TimeStamp;
type: RumEventType.VIEW;
view: {
loading_type: ViewLoadingType;
first_contentful_paint?: number;
first_input_delay?: number;
first_input_time?: number;
first_contentful_paint?: ServerDuration;
first_input_delay?: ServerDuration;
first_input_time?: ServerDuration;
cumulative_layout_shift?: number;
custom_timings?: ViewCustomTimings;
largest_contentful_paint?: number;
dom_interactive?: number;
dom_content_loaded?: number;
dom_complete?: number;
load_event?: number;
loading_time?: number;
time_spent: number;
custom_timings?: {
[key: string]: ServerDuration;
};
largest_contentful_paint?: ServerDuration;
dom_interactive?: ServerDuration;
dom_content_loaded?: ServerDuration;
dom_complete?: ServerDuration;
load_event?: ServerDuration;
loading_time?: ServerDuration;
time_spent: ServerDuration;
is_active: boolean;

@@ -88,3 +90,3 @@ name?: string;

export interface ViewCustomTimings {
[key: string]: number;
[key: string]: Duration;
}

@@ -95,10 +97,10 @@ interface Count {

export interface RawRumLongTaskEvent {
date: number;
date: TimeStamp;
type: RumEventType.LONG_TASK;
long_task: {
duration: number;
duration: ServerDuration;
};
}
export interface RawRumActionEvent {
date?: number;
date: TimeStamp;
type: RumEventType.ACTION;

@@ -108,3 +110,3 @@ action: {

type: ActionType;
loading_time?: number;
loading_time?: ServerDuration;
error?: Count;

@@ -124,3 +126,3 @@ long_task?: Count;

export interface RumContext {
date: number;
date: TimeStamp;
application: {

@@ -127,0 +129,0 @@ id: string;

{
"name": "@datadog/browser-rum-core",
"version": "2.5.5",
"version": "2.6.0",
"license": "Apache-2.0",

@@ -15,3 +15,3 @@ "main": "cjs/index.js",

"dependencies": {
"@datadog/browser-core": "2.5.5",
"@datadog/browser-core": "2.6.0",
"tslib": "^1.10.0"

@@ -27,3 +27,3 @@ },

},
"gitHead": "3dd657412678742c415e4c49815deb96b3dabd53"
"gitHead": "11bd1eee2c07c3b658724d93646209bbefc087ce"
}

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

import { isIE } from '@datadog/browser-core'
import { isIE, RelativeTime } from '@datadog/browser-core'
import { setup, TestSetupBuilder } from '../../test/specHelper'

@@ -8,3 +8,3 @@ import { RumPerformanceNavigationTiming } from '../browser/performanceCollection'

import { RumEvent } from '../rumEvent.types'
import { startRumEventCollection } from './rum'
import { NewLocationListener, startRumEventCollection } from './rum'

@@ -135,7 +135,7 @@ function collectServerEvents(lifeCycle: LifeCycle) {

const FAKE_NAVIGATION_ENTRY: RumPerformanceNavigationTiming = {
domComplete: 456,
domContentLoadedEventEnd: 345,
domInteractive: 234,
domComplete: 456 as RelativeTime,
domContentLoadedEventEnd: 345 as RelativeTime,
domInteractive: 234 as RelativeTime,
entryType: 'navigation',
loadEventEnd: 567,
loadEventEnd: 567 as RelativeTime,
}

@@ -189,1 +189,40 @@ const VIEW_DURATION = 1000

})
describe('rum onNewLocation', () => {
let setupBuilder: TestSetupBuilder
let serverRumEvents: RumEvent[]
let onNewLocation: NewLocationListener
beforeEach(() => {
setupBuilder = setup().beforeBuild(({ applicationId, location, lifeCycle, configuration, session }) => {
serverRumEvents = collectServerEvents(lifeCycle)
return startRumEventCollection(
applicationId,
location,
lifeCycle,
configuration,
session,
() => ({
context: {},
user: {},
}),
onNewLocation
)
})
})
afterEach(() => {
setupBuilder.cleanup()
})
it('should catch errors thrown by onNewLocation', () => {
const myError = 'Ooops!'
onNewLocation = () => {
throw myError
}
const consoleErrorSpy = spyOn(console, 'error')
setupBuilder.withFakeLocation('http://foo.com/').build()
expect(serverRumEvents[0].view.url).toEqual('http://foo.com/')
expect(consoleErrorSpy).toHaveBeenCalledWith('onNewLocation threw an error:', myError)
})
})

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

import { combine, commonInit, Configuration } from '@datadog/browser-core'
import { catchUserErrors, combine, commonInit, Configuration } from '@datadog/browser-core'
import { startDOMMutationCollection } from '../browser/domMutationCollection'

@@ -90,3 +90,7 @@ import { startPerformanceCollection } from '../browser/performanceCollection'

startResourceCollection(lifeCycle, session)
const { addTiming } = startViewCollection(lifeCycle, location, onNewLocation)
const { addTiming, stop: stopViewCollection } = startViewCollection(
lifeCycle,
location,
onNewLocation && catchUserErrors(onNewLocation, 'onNewLocation threw an error:')
)
const { addError } = startErrorCollection(lifeCycle, configuration)

@@ -103,2 +107,3 @@ const { addAction } = startActionCollection(lifeCycle, configuration)

stop() {
stopViewCollection()
// prevent batch from previous tests to keep running and send unwanted requests

@@ -105,0 +110,0 @@ // could be replaced by stopping all the component when they will all have a stop method

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

import { ErrorSource, ONE_SECOND } from '@datadog/browser-core'
import { ErrorSource, ONE_SECOND, RelativeTime } from '@datadog/browser-core'
import { setup, TestSetupBuilder } from '../../test/specHelper'

@@ -189,3 +189,3 @@ import { ActionType } from '../rawRumEvent.types'

expect(addActionSpy.calls.argsFor(0)[0].startTime).toEqual(ONE_SECOND)
expect(addActionSpy.calls.argsFor(0)[0].startTime as number).toEqual(ONE_SECOND)
})

@@ -292,3 +292,3 @@

expect(addErrorSpy.calls.argsFor(0)[0].startTime).toEqual(ONE_SECOND)
expect(addErrorSpy.calls.argsFor(0)[0].startTime as number).toEqual(ONE_SECOND)
})

@@ -426,3 +426,3 @@

expect(addTimingSpy.calls.argsFor(0)[0]).toEqual('foo')
expect(addTimingSpy.calls.argsFor(0)[1]).toEqual(10)
expect(addTimingSpy.calls.argsFor(0)[1]).toEqual(10 as RelativeTime)
})

@@ -429,0 +429,0 @@

@@ -13,2 +13,4 @@ import {

monitor,
relativeNow,
RelativeTime,
UserConfiguration,

@@ -39,5 +41,5 @@ } from '@datadog/browser-core'

const beforeInitAddTiming = new BoundedBuffer<[string, number]>()
const beforeInitAddTiming = new BoundedBuffer<[string, RelativeTime]>()
let addTimingStrategy: ReturnType<StartRum>['addTiming'] = (name) => {
beforeInitAddTiming.add([name, performance.now()])
beforeInitAddTiming.add([name, relativeNow()])
}

@@ -104,3 +106,3 @@

context: deepClone(context as Context),
startTime: performance.now(),
startTime: relativeNow(),
type: ActionType.CUSTOM,

@@ -129,3 +131,3 @@ })

source: checkedSource,
startTime: performance.now(),
startTime: relativeNow(),
})

@@ -132,0 +134,0 @@ }),

import {
addEventListener,
addEventListeners,
Configuration,
DOM_EVENT,
Duration,
getRelativeTime,
isNumber,
monitor,
Omit,
relativeNow,
RelativeTime,
runOnReadyState,
TimeStamp,
} from '@datadog/browser-core'

@@ -19,15 +24,15 @@ import { LifeCycle, LifeCycleEventType } from '../domain/lifeCycle'

name: string
startTime: number
duration: number
fetchStart: number
domainLookupStart: number
domainLookupEnd: number
connectStart: number
secureConnectionStart: number
connectEnd: number
requestStart: number
responseStart: number
responseEnd: number
redirectStart: number
redirectEnd: number
startTime: RelativeTime
duration: Duration
fetchStart: RelativeTime
domainLookupStart: RelativeTime
domainLookupEnd: RelativeTime
connectStart: RelativeTime
secureConnectionStart: RelativeTime
connectEnd: RelativeTime
requestStart: RelativeTime
responseStart: RelativeTime
responseEnd: RelativeTime
redirectStart: RelativeTime
redirectEnd: RelativeTime
decodedBodySize: number

@@ -39,4 +44,4 @@ traceId?: string

entryType: 'longtask'
startTime: number
duration: number
startTime: RelativeTime
duration: Duration
}

@@ -47,3 +52,3 @@

name: 'first-paint' | 'first-contentful-paint'
startTime: number
startTime: RelativeTime
}

@@ -53,6 +58,6 @@

entryType: 'navigation'
domComplete: number
domContentLoadedEventEnd: number
domInteractive: number
loadEventEnd: number
domComplete: RelativeTime
domContentLoadedEventEnd: RelativeTime
domInteractive: RelativeTime
loadEventEnd: RelativeTime
}

@@ -62,3 +67,3 @@

entryType: 'largest-contentful-paint'
startTime: number
startTime: RelativeTime
}

@@ -68,4 +73,4 @@

entryType: 'first-input'
startTime: number
processingStart: number
startTime: RelativeTime
processingStart: RelativeTime
}

@@ -164,3 +169,3 @@

name: window.location.href,
startTime: 0,
startTime: 0 as RelativeTime,
...forcedAttributes,

@@ -209,4 +214,4 @@ }

entryType: 'first-input',
processingStart: performance.now(),
startTime: evt.timeStamp,
processingStart: relativeNow(),
startTime: evt.timeStamp as RelativeTime,
}

@@ -225,3 +230,3 @@

* Pointer events are a special case, because they can trigger main or compositor thread behavior.
* We differenciate these cases based on whether or not we see a pointercancel event, which are
* We differentiate these cases based on whether or not we see a pointercancel event, which are
* fired when we scroll. If we're scrolling we don't need to report input delay since FID excludes

@@ -260,24 +265,18 @@ * scrolling and pinch/zooming.

function runOnReadyState(expectedReadyState: 'complete' | 'interactive', callback: () => void) {
if (document.readyState === expectedReadyState || document.readyState === 'complete') {
callback()
} else {
const eventName = expectedReadyState === 'complete' ? DOM_EVENT.LOAD : DOM_EVENT.DOM_CONTENT_LOADED
addEventListener(window, eventName, callback, { once: true })
}
export type RelativePerformanceTiming = {
-readonly [key in keyof Omit<PerformanceTiming, 'toJSON'>]: RelativeTime
}
interface IndexedPerformanceTiming extends PerformanceTiming {
[key: string]: any
}
function computeRelativePerformanceTiming() {
const result: Partial<IndexedPerformanceTiming> = {}
const timing = performance.timing as IndexedPerformanceTiming
const result: Partial<RelativePerformanceTiming> = {}
const timing = performance.timing
for (const key in timing) {
if (isNumber(timing[key])) {
result[key] = timing[key] === 0 ? 0 : getRelativeTime(timing[key] as number)
if (isNumber(timing[key as keyof PerformanceTiming])) {
const numberKey = key as keyof RelativePerformanceTiming
// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
const timingElement = timing[numberKey] as TimeStamp
result[numberKey] = timingElement === 0 ? (0 as RelativeTime) : getRelativeTime(timingElement)
}
}
return result as PerformanceTiming
return result as RelativePerformanceTiming
}

@@ -296,3 +295,3 @@

) {
handleRumPerformanceEntry(lifeCycle, configuration, entry as RumPerformanceEntry)
handleRumPerformanceEntry(lifeCycle, configuration, (entry as unknown) as RumPerformanceEntry)
}

@@ -299,0 +298,0 @@ })

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

import { DEFAULT_CONFIGURATION, noop } from '@datadog/browser-core'
import { DEFAULT_CONFIGURATION, noop, RelativeTime } from '@datadog/browser-core'
import { createRawRumEvent } from '../../test/fixtures'

@@ -74,3 +74,3 @@ import { setup, TestSetupBuilder } from '../../test/specHelper'

rawRumEvent: createRawRumEvent(RumEventType.LONG_TASK, { view: { url: '/path?foo=bar' } }),
startTime: 0,
startTime: 0 as RelativeTime,
})

@@ -88,3 +88,3 @@

}),
startTime: 0,
startTime: 0 as RelativeTime,
})

@@ -102,3 +102,3 @@

}),
startTime: 0,
startTime: 0 as RelativeTime,
})

@@ -110,3 +110,3 @@

}),
startTime: 0,
startTime: 0 as RelativeTime,
})

@@ -118,3 +118,3 @@

}),
startTime: 0,
startTime: 0 as RelativeTime,
})

@@ -126,3 +126,3 @@

}),
startTime: 0,
startTime: 0 as RelativeTime,
})

@@ -140,3 +140,3 @@

}),
startTime: 0,
startTime: 0 as RelativeTime,
})

@@ -155,3 +155,3 @@

rawRumEvent: createRawRumEvent(RumEventType.VIEW, undefined),
startTime: 0,
startTime: 0 as RelativeTime,
})

@@ -166,3 +166,3 @@

rawRumEvent: createRawRumEvent(RumEventType.VIEW, { date: 10 }),
startTime: 0,
startTime: 0 as RelativeTime,
})

@@ -179,3 +179,3 @@

rawRumEvent: createRawRumEvent(RumEventType.VIEW),
startTime: 0,
startTime: 0 as RelativeTime,
})

@@ -190,3 +190,3 @@

rawRumEvent: createRawRumEvent(RumEventType.VIEW),
startTime: 0,
startTime: 0 as RelativeTime,
})

@@ -201,3 +201,3 @@

rawRumEvent: createRawRumEvent(RumEventType.VIEW),
startTime: 0,
startTime: 0 as RelativeTime,
})

@@ -207,3 +207,3 @@ delete commonContext.context.bar

rawRumEvent: createRawRumEvent(RumEventType.VIEW),
startTime: 0,
startTime: 0 as RelativeTime,
})

@@ -224,3 +224,3 @@

},
startTime: 0,
startTime: 0 as RelativeTime,
})

@@ -238,3 +238,3 @@

rawRumEvent: createRawRumEvent(RumEventType.VIEW),
startTime: 0,
startTime: 0 as RelativeTime,
})

@@ -249,3 +249,3 @@

rawRumEvent: createRawRumEvent(RumEventType.VIEW),
startTime: 0,
startTime: 0 as RelativeTime,
})

@@ -265,3 +265,3 @@

},
startTime: 0,
startTime: 0 as RelativeTime,
})

@@ -279,3 +279,3 @@

rawRumEvent: createRawRumEvent(RumEventType.VIEW),
startTime: 0,
startTime: 0 as RelativeTime,
})

@@ -292,3 +292,3 @@

rawRumEvent: createRawRumEvent(category),
startTime: 0,
startTime: 0 as RelativeTime,
})

@@ -301,3 +301,3 @@ expect(serverRumEvents[0].action).toEqual({ id: '7890' })

rawRumEvent: createRawRumEvent(RumEventType.VIEW),
startTime: 0,
startTime: 0 as RelativeTime,
})

@@ -309,3 +309,3 @@ expect(serverRumEvents[0].action).not.toBeDefined()

rawRumEvent: createRawRumEvent(RumEventType.ACTION),
startTime: 0,
startTime: 0 as RelativeTime,
})

@@ -321,3 +321,3 @@ expect((serverRumEvents[0] as RumActionEvent).action.id).not.toBeDefined()

rawRumEvent: createRawRumEvent(RumEventType.ACTION),
startTime: 0,
startTime: 0 as RelativeTime,
})

@@ -339,3 +339,3 @@ expect(serverRumEvents[0].view).toEqual({

rawRumEvent: createRawRumEvent(RumEventType.VIEW),
startTime: 0,
startTime: 0 as RelativeTime,
})

@@ -350,3 +350,3 @@ expect(serverRumEvents.length).toBe(1)

rawRumEvent: createRawRumEvent(RumEventType.VIEW),
startTime: 0,
startTime: 0 as RelativeTime,
})

@@ -361,3 +361,3 @@ expect(serverRumEvents.length).toBe(0)

rawRumEvent: createRawRumEvent(RumEventType.VIEW),
startTime: 0,
startTime: 0 as RelativeTime,
})

@@ -372,3 +372,3 @@ expect(serverRumEvents.length).toBe(1)

rawRumEvent: createRawRumEvent(RumEventType.VIEW),
startTime: 0,
startTime: 0 as RelativeTime,
})

@@ -383,3 +383,3 @@ expect(serverRumEvents.length).toBe(0)

rawRumEvent: createRawRumEvent(RumEventType.VIEW),
startTime: 0,
startTime: 0 as RelativeTime,
})

@@ -398,3 +398,3 @@ expect(serverRumEvents[0].session).toEqual({

rawRumEvent: createRawRumEvent(RumEventType.VIEW),
startTime: 0,
startTime: 0 as RelativeTime,
})

@@ -401,0 +401,0 @@ expect(serverRumEvents[0].session.has_replay).toBe(true)

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

import { combine, Configuration, Context, isEmptyObject, limitModification } from '@datadog/browser-core'
import { combine, Configuration, Context, isEmptyObject, limitModification, timeStampNow } from '@datadog/browser-core'
import {

@@ -58,3 +58,3 @@ CommonContext,

},
date: new Date().getTime(),
date: timeStampNow(),
service: configuration.service,

@@ -61,0 +61,0 @@ session: {

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

import { RelativeTime } from '@datadog/browser-core'
import { InternalContext } from '../rawRumEvent.types'

@@ -12,5 +13,5 @@ import { ParentContexts } from './parentContexts'

get: (startTime?: number): InternalContext | undefined => {
const viewContext = parentContexts.findView(startTime)
const viewContext = parentContexts.findView(startTime as RelativeTime)
if (session.isTracked() && viewContext && viewContext.session.id) {
const actionContext = parentContexts.findAction(startTime)
const actionContext = parentContexts.findAction(startTime as RelativeTime)
return {

@@ -17,0 +18,0 @@ application_id: applicationId,

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

import { Context } from '@datadog/browser-core'
import { Context, RelativeTime } from '@datadog/browser-core'
import { RumPerformanceEntry } from '../browser/performanceCollection'

@@ -51,3 +51,3 @@ import { CommonContext, RawRumEvent } from '../rawRumEvent.types'

data: {
startTime: number
startTime: RelativeTime
rawRumEvent: RawRumEvent

@@ -94,3 +94,3 @@ savedCommonContext?: CommonContext

callback: (data: {
startTime: number
startTime: RelativeTime
rawRumEvent: RawRumEvent

@@ -97,0 +97,0 @@ savedCommonContext?: CommonContext

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

import { Duration, RelativeTime } from '@datadog/browser-core'
import { setup, TestSetupBuilder } from '../../test/specHelper'

@@ -14,3 +15,3 @@ import { LifeCycleEventType } from './lifeCycle'

function stubActionWithDuration(duration: number): AutoAction {
const action: Partial<AutoAction> = { duration }
const action: Partial<AutoAction> = { duration: duration as Duration }
return action as AutoAction

@@ -21,3 +22,3 @@ }

const FAKE_ID = 'fake'
const startTime = 10
const startTime = 10 as RelativeTime

@@ -70,9 +71,18 @@ function buildViewCreatedEvent(partialViewCreatedEvent: Partial<ViewCreatedEvent> = {}): ViewCreatedEvent {

lifeCycle.notify(LifeCycleEventType.VIEW_CREATED, buildViewCreatedEvent({ startTime: 10, id: 'view 1' }))
lifeCycle.notify(LifeCycleEventType.VIEW_CREATED, buildViewCreatedEvent({ startTime: 20, id: 'view 2' }))
lifeCycle.notify(LifeCycleEventType.VIEW_CREATED, buildViewCreatedEvent({ startTime: 30, id: 'view 3' }))
lifeCycle.notify(
LifeCycleEventType.VIEW_CREATED,
buildViewCreatedEvent({ startTime: 10 as RelativeTime, id: 'view 1' })
)
lifeCycle.notify(
LifeCycleEventType.VIEW_CREATED,
buildViewCreatedEvent({ startTime: 20 as RelativeTime, id: 'view 2' })
)
lifeCycle.notify(
LifeCycleEventType.VIEW_CREATED,
buildViewCreatedEvent({ startTime: 30 as RelativeTime, id: 'view 3' })
)
expect(parentContexts.findView(15)!.view.id).toEqual('view 1')
expect(parentContexts.findView(20)!.view.id).toEqual('view 2')
expect(parentContexts.findView(40)!.view.id).toEqual('view 3')
expect(parentContexts.findView(15 as RelativeTime)!.view.id).toEqual('view 1')
expect(parentContexts.findView(20 as RelativeTime)!.view.id).toEqual('view 2')
expect(parentContexts.findView(40 as RelativeTime)!.view.id).toEqual('view 3')
})

@@ -83,6 +93,12 @@

lifeCycle.notify(LifeCycleEventType.VIEW_CREATED, buildViewCreatedEvent({ startTime: 10, id: 'view 1' }))
lifeCycle.notify(LifeCycleEventType.VIEW_CREATED, buildViewCreatedEvent({ startTime: 20, id: 'view 2' }))
lifeCycle.notify(
LifeCycleEventType.VIEW_CREATED,
buildViewCreatedEvent({ startTime: 10 as RelativeTime, id: 'view 1' })
)
lifeCycle.notify(
LifeCycleEventType.VIEW_CREATED,
buildViewCreatedEvent({ startTime: 20 as RelativeTime, id: 'view 2' })
)
expect(parentContexts.findView(5)).not.toBeDefined()
expect(parentContexts.findView(5 as RelativeTime)).not.toBeDefined()
})

@@ -151,14 +167,14 @@

lifeCycle.notify(LifeCycleEventType.AUTO_ACTION_CREATED, { startTime: 10, id: 'action 1' })
lifeCycle.notify(LifeCycleEventType.AUTO_ACTION_CREATED, { startTime: 10 as RelativeTime, id: 'action 1' })
lifeCycle.notify(LifeCycleEventType.AUTO_ACTION_COMPLETED, stubActionWithDuration(10))
lifeCycle.notify(LifeCycleEventType.AUTO_ACTION_CREATED, { startTime: 30, id: 'action 2' })
lifeCycle.notify(LifeCycleEventType.AUTO_ACTION_CREATED, { startTime: 30 as RelativeTime, id: 'action 2' })
lifeCycle.notify(LifeCycleEventType.AUTO_ACTION_COMPLETED, stubActionWithDuration(10))
lifeCycle.notify(LifeCycleEventType.AUTO_ACTION_CREATED, { startTime: 50, id: 'action 3' })
lifeCycle.notify(LifeCycleEventType.AUTO_ACTION_CREATED, { startTime: 50 as RelativeTime, id: 'action 3' })
expect(parentContexts.findAction(15)!.action.id).toBe('action 1')
expect(parentContexts.findAction(20)!.action.id).toBe('action 1')
expect(parentContexts.findAction(30)!.action.id).toBe('action 2')
expect(parentContexts.findAction(55)!.action.id).toBe('action 3')
expect(parentContexts.findAction(15 as RelativeTime)!.action.id).toBe('action 1')
expect(parentContexts.findAction(20 as RelativeTime)!.action.id).toBe('action 1')
expect(parentContexts.findAction(30 as RelativeTime)!.action.id).toBe('action 2')
expect(parentContexts.findAction(55 as RelativeTime)!.action.id).toBe('action 3')
})

@@ -169,8 +185,8 @@

lifeCycle.notify(LifeCycleEventType.AUTO_ACTION_CREATED, { startTime: 10, id: 'action 1' })
lifeCycle.notify(LifeCycleEventType.AUTO_ACTION_CREATED, { startTime: 10 as RelativeTime, id: 'action 1' })
lifeCycle.notify(LifeCycleEventType.AUTO_ACTION_DISCARDED)
lifeCycle.notify(LifeCycleEventType.AUTO_ACTION_CREATED, { startTime: 20, id: 'action 2' })
lifeCycle.notify(LifeCycleEventType.AUTO_ACTION_CREATED, { startTime: 20 as RelativeTime, id: 'action 2' })
expect(parentContexts.findAction(10)).toBeUndefined()
expect(parentContexts.findAction(10 as RelativeTime)).toBeUndefined()
})

@@ -205,3 +221,3 @@

id: 'view 1',
startTime: 10,
startTime: 10 as RelativeTime,
})

@@ -213,20 +229,20 @@ )

id: 'view 2',
startTime: 20,
startTime: 20 as RelativeTime,
})
)
lifeCycle.notify(LifeCycleEventType.AUTO_ACTION_CREATED, { startTime: 10, id: 'action 1' })
lifeCycle.notify(LifeCycleEventType.AUTO_ACTION_CREATED, { startTime: 10 as RelativeTime, id: 'action 1' })
lifeCycle.notify(LifeCycleEventType.AUTO_ACTION_COMPLETED, stubActionWithDuration(10))
lifeCycle.notify(LifeCycleEventType.AUTO_ACTION_CREATED, { startTime: 20, id: 'action 2' })
lifeCycle.notify(LifeCycleEventType.AUTO_ACTION_CREATED, { startTime: 20 as RelativeTime, id: 'action 2' })
expect(parentContexts.findView(15)).toBeDefined()
expect(parentContexts.findAction(15)).toBeDefined()
expect(parentContexts.findView(25)).toBeDefined()
expect(parentContexts.findAction(25)).toBeDefined()
expect(parentContexts.findView(15 as RelativeTime)).toBeDefined()
expect(parentContexts.findAction(15 as RelativeTime)).toBeDefined()
expect(parentContexts.findView(25 as RelativeTime)).toBeDefined()
expect(parentContexts.findAction(25 as RelativeTime)).toBeDefined()
lifeCycle.notify(LifeCycleEventType.SESSION_RENEWED)
expect(parentContexts.findView(15)).toBeUndefined()
expect(parentContexts.findAction(15)).toBeUndefined()
expect(parentContexts.findView(25)).toBeUndefined()
expect(parentContexts.findAction(25)).toBeUndefined()
expect(parentContexts.findView(15 as RelativeTime)).toBeUndefined()
expect(parentContexts.findAction(15 as RelativeTime)).toBeUndefined()
expect(parentContexts.findView(25 as RelativeTime)).toBeUndefined()
expect(parentContexts.findAction(25 as RelativeTime)).toBeUndefined()
})

@@ -238,3 +254,3 @@

const originalTime = performance.now()
const targetTime = originalTime + 5
const targetTime = (originalTime + 5) as RelativeTime

@@ -245,10 +261,13 @@ lifeCycle.notify(

id: 'view 1',
startTime: originalTime,
startTime: originalTime as RelativeTime,
})
)
lifeCycle.notify(LifeCycleEventType.AUTO_ACTION_CREATED, { startTime: originalTime, id: 'action 1' })
lifeCycle.notify(LifeCycleEventType.AUTO_ACTION_CREATED, {
startTime: originalTime as RelativeTime,
id: 'action 1',
})
lifeCycle.notify(LifeCycleEventType.AUTO_ACTION_COMPLETED, stubActionWithDuration(10))
lifeCycle.notify(
LifeCycleEventType.VIEW_CREATED,
buildViewCreatedEvent({ startTime: originalTime + 10, id: 'view 2' })
buildViewCreatedEvent({ startTime: (originalTime + 10) as RelativeTime, id: 'view 2' })
)

@@ -255,0 +274,0 @@

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

import { monitor, ONE_MINUTE, SESSION_TIME_OUT_DELAY } from '@datadog/browser-core'
import { monitor, ONE_MINUTE, RelativeTime, SESSION_TIME_OUT_DELAY } from '@datadog/browser-core'
import { ActionContext, ViewContext } from '../rawRumEvent.types'

@@ -13,4 +13,4 @@ import { LifeCycle, LifeCycleEventType } from './lifeCycle'

interface PreviousContext<T> {
startTime: number
endTime: number
startTime: RelativeTime
endTime: RelativeTime
context: T

@@ -20,4 +20,4 @@ }

export interface ParentContexts {
findAction: (startTime?: number) => ActionContext | undefined
findView: (startTime?: number) => ViewContext | undefined
findAction: (startTime?: RelativeTime) => ActionContext | undefined
findView: (startTime?: RelativeTime) => ViewContext | undefined
stop: () => void

@@ -62,3 +62,4 @@ }

context: buildCurrentActionContext(),
endTime: currentAction.startTime + action.duration,
// eslint-disable-next-line @typescript-eslint/restrict-plus-operands
endTime: (currentAction.startTime + action.duration) as RelativeTime,
startTime: currentAction.startTime,

@@ -117,4 +118,4 @@ })

previousContexts: Array<PreviousContext<T>>,
currentContext?: { startTime: number },
startTime?: number
currentContext?: { startTime: RelativeTime },
startTime?: RelativeTime
) {

@@ -121,0 +122,0 @@ if (startTime === undefined) {

import {
Configuration,
Duration,
FetchCompleteContext,
FetchStartContext,
Observable,
RelativeTime,
RequestType,

@@ -38,4 +39,4 @@ startFetchProxy,

responseType?: string
startTime: number
duration: number
startTime: RelativeTime
duration: Duration
spanId?: TraceIdentifier

@@ -45,4 +46,2 @@ traceId?: TraceIdentifier

export type RequestObservables = [Observable<RequestStartEvent>, Observable<RequestCompleteEvent>]
let nextRequestIndex = 1

@@ -49,0 +48,0 @@

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

import { Duration, RelativeTime, ServerDuration } from '@datadog/browser-core'
import { setup, TestSetupBuilder } from '../../../../test/specHelper'

@@ -31,6 +32,6 @@ import { RumEventType, ActionType } from '../../../rawRumEvent.types'

},
duration: 100,
duration: 100 as Duration,
id: 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee',
name: 'foo',
startTime: 1234,
startTime: 1234 as RelativeTime,
type: ActionType.CLICK,

@@ -46,3 +47,3 @@ })

id: 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee',
loading_time: 100 * 1e6,
loading_time: (100 * 1e6) as ServerDuration,
long_task: {

@@ -68,3 +69,3 @@ count: 10,

name: 'foo',
startTime: 1234,
startTime: 1234 as RelativeTime,
type: ActionType.CUSTOM,

@@ -71,0 +72,0 @@ })

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

import { combine, Configuration, getTimestamp, msToNs } from '@datadog/browser-core'
import { CommonContext, RumEventType, ActionType } from '../../../rawRumEvent.types'
import { combine, Configuration, getTimeStamp, toServerDuration } from '@datadog/browser-core'
import { ActionType, CommonContext, RumEventType } from '../../../rawRumEvent.types'
import { LifeCycle, LifeCycleEventType } from '../../lifeCycle'

@@ -33,3 +33,3 @@ import { AutoAction, CustomAction, trackActions } from './trackActions'

id: action.id,
loading_time: msToNs(action.duration),
loading_time: toServerDuration(action.duration),
long_task: {

@@ -53,3 +53,3 @@ count: action.counts.longTaskCount,

},
date: getTimestamp(action.startTime),
date: getTimeStamp(action.startTime),
type: RumEventType.ACTION as const,

@@ -56,0 +56,0 @@ },

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

import { Context, DOM_EVENT } from '@datadog/browser-core'
import { Context, DOM_EVENT, RelativeTime } from '@datadog/browser-core'
import { RumEvent } from '../../../../../rum/src'

@@ -85,3 +85,3 @@ import { setup, TestSetupBuilder } from '../../../../test/specHelper'

referrer: 'http://foo.com',
startTime: 0,
startTime: 0 as RelativeTime,
})

@@ -88,0 +88,0 @@ clock.tick(EXPIRE_DELAY)

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

import { addEventListener, Context, DOM_EVENT, generateUUID } from '@datadog/browser-core'
import {
addEventListener,
Context,
DOM_EVENT,
Duration,
elapsed,
generateUUID,
relativeNow,
RelativeTime,
} from '@datadog/browser-core'
import { LifeCycle, LifeCycleEventType } from '../../lifeCycle'

@@ -19,3 +28,3 @@ import { EventCounts, trackEventCounts } from '../../trackEventCounts'

name: string
startTime: number
startTime: RelativeTime
context?: Context

@@ -28,4 +37,4 @@ }

name: string
startTime: number
duration: number
startTime: RelativeTime
duration: Duration
counts: ActionCounts

@@ -36,3 +45,3 @@ }

id: string
startTime: number
startTime: RelativeTime
}

@@ -107,3 +116,3 @@

private id: string
private startTime: number
private startTime: RelativeTime
private eventCountsSubscription: { eventCounts: EventCounts; stop(): void }

@@ -113,3 +122,3 @@

this.id = generateUUID()
this.startTime = performance.now()
this.startTime = relativeNow()
this.eventCountsSubscription = trackEventCounts(lifeCycle)

@@ -119,3 +128,3 @@ this.lifeCycle.notify(LifeCycleEventType.AUTO_ACTION_CREATED, { id: this.id, startTime: this.startTime })

complete(endTime: number) {
complete(endTime: RelativeTime) {
const eventCounts = this.eventCountsSubscription.eventCounts

@@ -128,3 +137,3 @@ this.lifeCycle.notify(LifeCycleEventType.AUTO_ACTION_COMPLETED, {

},
duration: endTime - this.startTime,
duration: elapsed(this.startTime, endTime),
id: this.id,

@@ -131,0 +140,0 @@ name: this.name,

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

import { ErrorSource, Observable, RawError } from '@datadog/browser-core'
import { ErrorSource, Observable, RawError, RelativeTime } from '@datadog/browser-core'
import { setup, TestSetupBuilder } from '../../../../test/specHelper'

@@ -31,3 +31,3 @@ import { RumEventType } from '../../../rawRumEvent.types'

source: ErrorSource.CUSTOM,
startTime: 12,
startTime: 12 as RelativeTime,
})

@@ -60,3 +60,3 @@

source: ErrorSource.CUSTOM,
startTime: 12,
startTime: 12 as RelativeTime,
})

@@ -74,3 +74,3 @@ expect(rawRumEvents[0].customerContext).toEqual({

source: ErrorSource.CUSTOM,
startTime: 12,
startTime: 12 as RelativeTime,
},

@@ -90,3 +90,3 @@ { context: { foo: 'bar' }, user: {} }

source: ErrorSource.CUSTOM,
startTime: 12,
startTime: 12 as RelativeTime,
},

@@ -113,3 +113,3 @@ { context: {}, user: { id: 'foo' } }

stack: 'bar',
startTime: 1234,
startTime: 1234 as RelativeTime,
type: 'foo',

@@ -116,0 +116,0 @@ })

@@ -6,5 +6,6 @@ import {

formatUnknownError,
getTimestamp,
getTimeStamp,
Observable,
RawError,
RelativeTime,
startAutomaticErrorCollection,

@@ -16,3 +17,3 @@ } from '@datadog/browser-core'

export interface ProvidedError {
startTime: number
startTime: RelativeTime
error: unknown

@@ -47,3 +48,3 @@ context?: Context

function computeRawError(error: unknown, startTime: number, source: ProvidedSource): RawError {
function computeRawError(error: unknown, startTime: RelativeTime, source: ProvidedSource): RawError {
const stackTrace = error instanceof Error ? computeStackTrace(error) : undefined

@@ -55,3 +56,3 @@ return { startTime, source, ...formatUnknownError(stackTrace, error, 'Provided') }

const rawRumEvent: RawRumErrorEvent = {
date: getTimestamp(error.startTime),
date: getTimeStamp(error.startTime),
error: {

@@ -58,0 +59,0 @@ message: error.message,

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

import { Duration, RelativeTime, ServerDuration } from '@datadog/browser-core'
import { setup, TestSetupBuilder } from '../../../../test/specHelper'

@@ -27,6 +28,6 @@ import { RumPerformanceEntry } from '../../../browser/performanceCollection'

;[
{ duration: 100, entryType: 'longtask', startTime: 1234 },
{ duration: 100, entryType: 'navigation', startTime: 1234 },
{ duration: 100, entryType: 'resource', startTime: 1234 },
{ duration: 100, entryType: 'paint', startTime: 1234 },
{ duration: 100 as Duration, entryType: 'longtask', startTime: 1234 },
{ duration: 100 as Duration, entryType: 'navigation', startTime: 1234 },
{ duration: 100 as Duration, entryType: 'resource', startTime: 1234 },
{ duration: 100 as Duration, entryType: 'paint', startTime: 1234 },
].forEach((entry) => {

@@ -41,5 +42,5 @@ lifeCycle.notify(LifeCycleEventType.PERFORMANCE_ENTRY_COLLECTED, entry as RumPerformanceEntry)

lifeCycle.notify(LifeCycleEventType.PERFORMANCE_ENTRY_COLLECTED, {
duration: 100,
duration: 100 as Duration,
entryType: 'longtask',
startTime: 1234,
startTime: 1234 as RelativeTime,
})

@@ -51,3 +52,3 @@

long_task: {
duration: 100 * 1e6,
duration: (100 * 1e6) as ServerDuration,
},

@@ -54,0 +55,0 @@ type: RumEventType.LONG_TASK,

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

import { getTimestamp, msToNs } from '@datadog/browser-core'
import { getTimeStamp, toServerDuration } from '@datadog/browser-core'
import { RawRumLongTaskEvent, RumEventType } from '../../../rawRumEvent.types'

@@ -11,5 +11,5 @@ import { LifeCycle, LifeCycleEventType } from '../../lifeCycle'

const rawRumEvent: RawRumLongTaskEvent = {
date: getTimestamp(entry.startTime),
date: getTimeStamp(entry.startTime),
long_task: {
duration: msToNs(entry.duration),
duration: toServerDuration(entry.duration),
},

@@ -16,0 +16,0 @@ type: RumEventType.LONG_TASK,

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

import { isIE } from '@datadog/browser-core'
import { Duration, isIE, RelativeTime } from '@datadog/browser-core'
import { createResourceEntry } from '../../../../test/fixtures'

@@ -9,3 +9,3 @@ import { RumPerformanceResourceTiming } from '../../../browser/performanceCollection'

describe('matchRequestTiming', () => {
const FAKE_REQUEST: Partial<RequestCompleteEvent> = { startTime: 100, duration: 500 }
const FAKE_REQUEST: Partial<RequestCompleteEvent> = { startTime: 100 as RelativeTime, duration: 500 as Duration }
let entries: RumPerformanceResourceTiming[]

@@ -18,7 +18,7 @@

entries = []
spyOn(performance, 'getEntriesByName').and.returnValues(entries as PerformanceResourceTiming[])
spyOn(performance, 'getEntriesByName').and.returnValues((entries as unknown) as PerformanceResourceTiming[])
})
it('should match single timing nested in the request ', () => {
const match = createResourceEntry({ startTime: 200, duration: 300 })
const match = createResourceEntry({ startTime: 200 as RelativeTime, duration: 300 as Duration })
entries.push(match)

@@ -32,3 +32,3 @@

it('should not match single timing outside the request ', () => {
const match = createResourceEntry({ startTime: 0, duration: 300 })
const match = createResourceEntry({ startTime: 0 as RelativeTime, duration: 300 as Duration })
entries.push(match)

@@ -42,4 +42,4 @@

it('should match two following timings nested in the request ', () => {
const optionsTiming = createResourceEntry({ startTime: 150, duration: 50 })
const actualTiming = createResourceEntry({ startTime: 200, duration: 100 })
const optionsTiming = createResourceEntry({ startTime: 150 as RelativeTime, duration: 50 as Duration })
const actualTiming = createResourceEntry({ startTime: 200 as RelativeTime, duration: 100 as Duration })
entries.push(optionsTiming, actualTiming)

@@ -53,4 +53,4 @@

it('should not match two not following timings nested in the request ', () => {
const match1 = createResourceEntry({ startTime: 150, duration: 100 })
const match2 = createResourceEntry({ startTime: 200, duration: 100 })
const match1 = createResourceEntry({ startTime: 150 as RelativeTime, duration: 100 as Duration })
const match2 = createResourceEntry({ startTime: 200 as RelativeTime, duration: 100 as Duration })
entries.push(match1, match2)

@@ -64,5 +64,5 @@

it('should not match multiple timings nested in the request', () => {
const match1 = createResourceEntry({ startTime: 100, duration: 50 })
const match2 = createResourceEntry({ startTime: 150, duration: 50 })
const match3 = createResourceEntry({ startTime: 200, duration: 50 })
const match1 = createResourceEntry({ startTime: 100 as RelativeTime, duration: 50 as Duration })
const match2 = createResourceEntry({ startTime: 150 as RelativeTime, duration: 50 as Duration })
const match3 = createResourceEntry({ startTime: 200 as RelativeTime, duration: 50 as Duration })
entries.push(match1, match2, match3)

@@ -77,5 +77,5 @@

const match = createResourceEntry({
duration: 100,
fetchStart: 0,
startTime: 200,
duration: 100 as Duration,
fetchStart: 0 as RelativeTime,
startTime: 200 as RelativeTime,
})

@@ -82,0 +82,0 @@ entries.push(match)

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

import { Duration, RelativeTime } from '@datadog/browser-core'
import { RumPerformanceResourceTiming } from '../../../browser/performanceCollection'

@@ -6,4 +7,4 @@ import { RequestCompleteEvent } from '../../requestCollection'

interface Timing {
startTime: number
duration: number
startTime: RelativeTime
duration: Duration
}

@@ -55,7 +56,8 @@

function endTime(timing: Timing) {
return timing.startTime + timing.duration
// eslint-disable-next-line @typescript-eslint/restrict-plus-operands
return (timing.startTime + timing.duration) as RelativeTime
}
function isBetween(timing: Timing, start: number, end: number) {
function isBetween(timing: Timing, start: RelativeTime, end: RelativeTime) {
return timing.startTime >= start && endTime(timing) <= end
}

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

import { RequestType, ResourceType } from '@datadog/browser-core'
import { Duration, RelativeTime, RequestType, ResourceType, ServerDuration, TimeStamp } from '@datadog/browser-core'
import { createResourceEntry } from '../../../../test/fixtures'

@@ -38,5 +38,5 @@ import { setup, TestSetupBuilder } from '../../../../test/specHelper'

createResourceEntry({
duration: 100,
duration: 100 as Duration,
name: 'https://resource.com/valid',
startTime: 1234,
startTime: 1234 as RelativeTime,
})

@@ -47,5 +47,5 @@ )

expect(rawRumEvents[0].rawRumEvent).toEqual({
date: (jasmine.any(Number) as unknown) as number,
date: (jasmine.any(Number) as unknown) as TimeStamp,
resource: {
duration: 100 * 1e6,
duration: (100 * 1e6) as ServerDuration,
size: undefined,

@@ -64,5 +64,5 @@ type: ResourceType.OTHER,

createCompletedRequest({
duration: 100,
duration: 100 as Duration,
method: 'GET',
startTime: 1234,
startTime: 1234 as RelativeTime,
status: 200,

@@ -76,5 +76,5 @@ type: RequestType.XHR,

expect(rawRumEvents[0].rawRumEvent).toEqual({
date: (jasmine.any(Number) as unknown) as number,
date: (jasmine.any(Number) as unknown) as TimeStamp,
resource: {
duration: 100 * 1e6,
duration: (100 * 1e6) as ServerDuration,
method: 'GET',

@@ -227,5 +227,5 @@ status_code: 200,

const request: Partial<RequestCompleteEvent> = {
duration: 100,
duration: 100 as Duration,
method: 'GET',
startTime: 1234,
startTime: 1234 as RelativeTime,
status: 200,

@@ -232,0 +232,0 @@ type: RequestType.XHR,

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

import { combine, generateUUID, getTimestamp, msToNs, RequestType, ResourceType } from '@datadog/browser-core'
import { combine, generateUUID, getTimeStamp, RequestType, ResourceType, toServerDuration } from '@datadog/browser-core'
import { RumPerformanceResourceTiming } from '../../../browser/performanceCollection'

@@ -41,6 +41,6 @@ import { RawRumResourceEvent, RumEventType } from '../../../rawRumEvent.types'

{
date: getTimestamp(startTime),
date: getTimeStamp(startTime),
resource: {
type,
duration: msToNs(request.duration),
duration: toServerDuration(request.duration),
method: request.method,

@@ -65,3 +65,3 @@ status_code: request.status,

{
date: getTimestamp(entry.startTime),
date: getTimeStamp(entry.startTime),
resource: {

@@ -68,0 +68,0 @@ type,

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

import { Configuration, DEFAULT_CONFIGURATION, SPEC_ENDPOINTS } from '@datadog/browser-core'
import {
Configuration,
DEFAULT_CONFIGURATION,
Duration,
RelativeTime,
ServerDuration,
SPEC_ENDPOINTS,
} from '@datadog/browser-core'
import { RumPerformanceResourceTiming } from '../../../browser/performanceCollection'

@@ -12,17 +19,17 @@ import {

const completeTiming: Partial<RumPerformanceResourceTiming> = {
connectEnd: 17,
connectStart: 15,
domainLookupEnd: 14,
domainLookupStart: 13,
duration: 50,
connectEnd: 17 as RelativeTime,
connectStart: 15 as RelativeTime,
domainLookupEnd: 14 as RelativeTime,
domainLookupStart: 13 as RelativeTime,
duration: 50 as Duration,
entryType: 'resource',
fetchStart: 12,
fetchStart: 12 as RelativeTime,
name: 'entry',
redirectEnd: 11,
redirectStart: 10,
requestStart: 20,
responseEnd: 60,
responseStart: 50,
secureConnectionStart: 16,
startTime: 10,
redirectEnd: 11 as RelativeTime,
redirectStart: 10 as RelativeTime,
requestStart: 20 as RelativeTime,
responseEnd: 60 as RelativeTime,
responseStart: 50 as RelativeTime,
secureConnectionStart: 16 as RelativeTime,
startTime: 10 as RelativeTime,
...overrides,

@@ -81,11 +88,11 @@ }

generateResourceWith({
connectEnd: 0,
connectStart: 0,
domainLookupEnd: 0,
domainLookupStart: 0,
redirectEnd: 0,
redirectStart: 0,
requestStart: 0,
responseStart: 0,
secureConnectionStart: 0,
connectEnd: 0 as RelativeTime,
connectStart: 0 as RelativeTime,
domainLookupEnd: 0 as RelativeTime,
domainLookupStart: 0 as RelativeTime,
redirectEnd: 0 as RelativeTime,
redirectStart: 0 as RelativeTime,
requestStart: 0 as RelativeTime,
responseStart: 0 as RelativeTime,
secureConnectionStart: 0 as RelativeTime,
})

@@ -98,8 +105,8 @@ )

expect(computePerformanceResourceDetails(generateResourceWith({}))).toEqual({
connect: { start: 5e6, duration: 2e6 },
dns: { start: 3e6, duration: 1e6 },
download: { start: 40e6, duration: 10e6 },
first_byte: { start: 10e6, duration: 30e6 },
redirect: { start: 0, duration: 1e6 },
ssl: { start: 6e6, duration: 1e6 },
connect: { start: 5e6 as ServerDuration, duration: 2e6 as ServerDuration },
dns: { start: 3e6 as ServerDuration, duration: 1e6 as ServerDuration },
download: { start: 40e6 as ServerDuration, duration: 10e6 as ServerDuration },
first_byte: { start: 10e6 as ServerDuration, duration: 30e6 as ServerDuration },
redirect: { start: 0 as ServerDuration, duration: 1e6 as ServerDuration },
ssl: { start: 6e6 as ServerDuration, duration: 1e6 as ServerDuration },
})

@@ -112,13 +119,13 @@ })

generateResourceWith({
fetchStart: 10,
redirectEnd: 0,
redirectStart: 0,
fetchStart: 10 as RelativeTime,
redirectEnd: 0 as RelativeTime,
redirectStart: 0 as RelativeTime,
})
)
).toEqual({
connect: { start: 5e6, duration: 2e6 },
dns: { start: 3e6, duration: 1e6 },
download: { start: 40e6, duration: 10e6 },
first_byte: { start: 10e6, duration: 30e6 },
ssl: { start: 6e6, duration: 1e6 },
connect: { start: 5e6 as ServerDuration, duration: 2e6 as ServerDuration },
dns: { start: 3e6 as ServerDuration, duration: 1e6 as ServerDuration },
download: { start: 40e6 as ServerDuration, duration: 10e6 as ServerDuration },
first_byte: { start: 10e6 as ServerDuration, duration: 30e6 as ServerDuration },
ssl: { start: 6e6 as ServerDuration, duration: 1e6 as ServerDuration },
})

@@ -131,13 +138,13 @@ })

generateResourceWith({
domainLookupEnd: 12,
domainLookupStart: 12,
fetchStart: 12,
domainLookupEnd: 12 as RelativeTime,
domainLookupStart: 12 as RelativeTime,
fetchStart: 12 as RelativeTime,
})
)
).toEqual({
connect: { start: 5e6, duration: 2e6 },
download: { start: 40e6, duration: 10e6 },
first_byte: { start: 10e6, duration: 30e6 },
redirect: { start: 0, duration: 1e6 },
ssl: { start: 6e6, duration: 1e6 },
connect: { start: 5e6 as ServerDuration, duration: 2e6 as ServerDuration },
download: { start: 40e6 as ServerDuration, duration: 10e6 as ServerDuration },
first_byte: { start: 10e6 as ServerDuration, duration: 30e6 as ServerDuration },
redirect: { start: 0 as ServerDuration, duration: 1e6 as ServerDuration },
ssl: { start: 6e6 as ServerDuration, duration: 1e6 as ServerDuration },
})

@@ -150,11 +157,11 @@ })

generateResourceWith({
secureConnectionStart: 0,
secureConnectionStart: 0 as RelativeTime,
})
)
).toEqual({
connect: { start: 5e6, duration: 2e6 },
dns: { start: 3e6, duration: 1e6 },
download: { start: 40e6, duration: 10e6 },
first_byte: { start: 10e6, duration: 30e6 },
redirect: { start: 0, duration: 1e6 },
connect: { start: 5e6 as ServerDuration, duration: 2e6 as ServerDuration },
dns: { start: 3e6 as ServerDuration, duration: 1e6 as ServerDuration },
download: { start: 40e6 as ServerDuration, duration: 10e6 as ServerDuration },
first_byte: { start: 10e6 as ServerDuration, duration: 30e6 as ServerDuration },
redirect: { start: 0 as ServerDuration, duration: 1e6 as ServerDuration },
})

@@ -167,14 +174,14 @@ })

generateResourceWith({
connectEnd: 12,
connectStart: 12,
domainLookupEnd: 12,
domainLookupStart: 12,
fetchStart: 12,
secureConnectionStart: 12,
connectEnd: 12 as RelativeTime,
connectStart: 12 as RelativeTime,
domainLookupEnd: 12 as RelativeTime,
domainLookupStart: 12 as RelativeTime,
fetchStart: 12 as RelativeTime,
secureConnectionStart: 12 as RelativeTime,
})
)
).toEqual({
download: { start: 40e6, duration: 10e6 },
first_byte: { start: 10e6, duration: 30e6 },
redirect: { start: 0, duration: 1e6 },
download: { start: 40e6 as ServerDuration, duration: 10e6 as ServerDuration },
first_byte: { start: 10e6 as ServerDuration, duration: 30e6 as ServerDuration },
redirect: { start: 0 as ServerDuration, duration: 1e6 as ServerDuration },
})

@@ -187,14 +194,14 @@ })

generateResourceWith({
connectEnd: 12,
connectStart: 12,
domainLookupEnd: 12,
domainLookupStart: 12,
fetchStart: 12,
secureConnectionStart: 0,
connectEnd: 12 as RelativeTime,
connectStart: 12 as RelativeTime,
domainLookupEnd: 12 as RelativeTime,
domainLookupStart: 12 as RelativeTime,
fetchStart: 12 as RelativeTime,
secureConnectionStart: 0 as RelativeTime,
})
)
).toEqual({
download: { start: 40e6, duration: 10e6 },
first_byte: { start: 10e6, duration: 30e6 },
redirect: { start: 0, duration: 1e6 },
download: { start: 40e6 as ServerDuration, duration: 10e6 as ServerDuration },
first_byte: { start: 10e6 as ServerDuration, duration: 30e6 as ServerDuration },
redirect: { start: 0 as ServerDuration, duration: 1e6 as ServerDuration },
})

@@ -204,9 +211,9 @@ })

{
connectEnd: 10,
connectStart: 20,
connectEnd: 10 as RelativeTime,
connectStart: 20 as RelativeTime,
reason: 'connectStart > connectEnd',
},
{
domainLookupEnd: 10,
domainLookupStart: 20,
domainLookupEnd: 10 as RelativeTime,
domainLookupStart: 20 as RelativeTime,
reason: 'domainLookupStart > domainLookupEnd',

@@ -216,24 +223,24 @@ },

reason: 'responseStart > responseEnd',
responseEnd: 10,
responseStart: 20,
responseEnd: 10 as RelativeTime,
responseStart: 20 as RelativeTime,
},
{
reason: 'requestStart > responseStart',
requestStart: 20,
responseStart: 10,
requestStart: 20 as RelativeTime,
responseStart: 10 as RelativeTime,
},
{
reason: 'redirectStart > redirectEnd',
redirectEnd: 10,
redirectStart: 20,
redirectEnd: 10 as RelativeTime,
redirectStart: 20 as RelativeTime,
},
{
connectEnd: 10,
connectEnd: 10 as RelativeTime,
reason: 'secureConnectionStart > connectEnd',
secureConnectionStart: 20,
secureConnectionStart: 20 as RelativeTime,
},
{
connectEnd: 10,
connectStart: -3,
fetchStart: 10,
connectEnd: 10 as RelativeTime,
connectStart: -3 as RelativeTime,
fetchStart: 10 as RelativeTime,
reason: 'negative timing start',

@@ -251,18 +258,18 @@ },

generateResourceWith({
connectEnd: 10,
connectStart: 10,
domainLookupEnd: 10,
domainLookupStart: 10,
fetchStart: 10,
redirectEnd: 0,
redirectStart: 0,
requestStart: 10,
responseEnd: 50,
responseStart: 40,
secureConnectionStart: 0,
connectEnd: 10 as RelativeTime,
connectStart: 10 as RelativeTime,
domainLookupEnd: 10 as RelativeTime,
domainLookupStart: 10 as RelativeTime,
fetchStart: 10 as RelativeTime,
redirectEnd: 0 as RelativeTime,
redirectStart: 0 as RelativeTime,
requestStart: 10 as RelativeTime,
responseEnd: 50 as RelativeTime,
responseStart: 40 as RelativeTime,
secureConnectionStart: 0 as RelativeTime,
})
)
).toEqual({
download: { start: 30e6, duration: 10e6 },
first_byte: { start: 0, duration: 30e6 },
download: { start: 30e6 as ServerDuration, duration: 10e6 as ServerDuration },
first_byte: { start: 0 as ServerDuration, duration: 30e6 as ServerDuration },
})

@@ -275,13 +282,13 @@ })

generateResourceWith({
redirectEnd: 0,
redirectStart: 0,
redirectEnd: 0 as RelativeTime,
redirectStart: 0 as RelativeTime,
})
)
).toEqual({
connect: { start: 5e6, duration: 2e6 },
dns: { start: 3e6, duration: 1e6 },
download: { start: 40e6, duration: 10e6 },
first_byte: { start: 10e6, duration: 30e6 },
redirect: { start: 0, duration: 2e6 },
ssl: { start: 6e6, duration: 1e6 },
connect: { start: 5e6 as ServerDuration, duration: 2e6 as ServerDuration },
dns: { start: 3e6 as ServerDuration, duration: 1e6 as ServerDuration },
download: { start: 40e6 as ServerDuration, duration: 10e6 as ServerDuration },
first_byte: { start: 10e6 as ServerDuration, duration: 30e6 as ServerDuration },
redirect: { start: 0 as ServerDuration, duration: 2e6 as ServerDuration },
ssl: { start: 6e6 as ServerDuration, duration: 1e6 as ServerDuration },
})

@@ -293,7 +300,9 @@ })

it('should return the entry duration', () => {
expect(computePerformanceResourceDuration(generateResourceWith({}))).toBe(50e6)
expect(computePerformanceResourceDuration(generateResourceWith({}))).toBe(50e6 as ServerDuration)
})
it('should use other available timing if the duration is 0', () => {
expect(computePerformanceResourceDuration(generateResourceWith({ duration: 0 }))).toBe(50e6)
expect(computePerformanceResourceDuration(generateResourceWith({ duration: 0 as Duration }))).toBe(
50e6 as ServerDuration
)
})

@@ -300,0 +309,0 @@ })

import {
addMonitoringMessage,
Configuration,
elapsed,
getPathName,
includes,
isValidUrl,
msToNs,
RelativeTime,
ResourceType,
ServerDuration,
toServerDuration,
} from '@datadog/browser-core'
import { RumPerformanceResourceTiming } from '../../../browser/performanceCollection'
import { PerformanceResourceDetailsElement } from '../../../rawRumEvent.types'
import { RumPerformanceResourceTiming } from '../../../browser/performanceCollection'

@@ -73,3 +76,3 @@ export interface PerformanceResourceDetails {

export function computePerformanceResourceDuration(entry: RumPerformanceResourceTiming): number {
export function computePerformanceResourceDuration(entry: RumPerformanceResourceTiming): ServerDuration {
const { duration, startTime, responseEnd } = entry

@@ -79,6 +82,6 @@

if (duration === 0 && startTime < responseEnd) {
return msToNs(responseEnd - startTime)
return toServerDuration(elapsed(startTime, responseEnd))
}
return msToNs(duration)
return toServerDuration(duration)
}

@@ -188,6 +191,6 @@

function formatTiming(origin: number, start: number, end: number) {
function formatTiming(origin: RelativeTime, start: RelativeTime, end: RelativeTime) {
return {
duration: msToNs(end - start),
start: msToNs(start - origin),
duration: toServerDuration(elapsed(start, end)),
start: toServerDuration(elapsed(origin, start)),
}

@@ -194,0 +197,0 @@ }

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

import { createNewEvent, DOM_EVENT, restorePageVisibility, setPageVisibility } from '@datadog/browser-core'
import {
createNewEvent,
DOM_EVENT,
RelativeTime,
restorePageVisibility,
setPageVisibility,
} from '@datadog/browser-core'
import { resetFirstHidden, trackFirstHidden } from './trackFirstHidden'

@@ -11,3 +17,3 @@

it('should return Infinity if the page was not hidden yet', () => {
expect(trackFirstHidden().timeStamp).toBe(Infinity)
expect(trackFirstHidden().timeStamp).toBe(Infinity as RelativeTime)
})

@@ -17,3 +23,3 @@

setPageVisibility('hidden')
expect(trackFirstHidden().timeStamp).toBe(0)
expect(trackFirstHidden().timeStamp).toBe(0 as RelativeTime)
})

@@ -28,3 +34,3 @@

expect(firstHidden.timeStamp).toBe(0)
expect(firstHidden.timeStamp).toBe(0 as RelativeTime)
})

@@ -38,3 +44,3 @@

expect(firstHidden.timeStamp).toBe(100)
expect(firstHidden.timeStamp).toBe(100 as RelativeTime)
})

@@ -49,4 +55,4 @@

expect(firstHidden.timeStamp).toBe(100)
expect(firstHidden.timeStamp).toBe(100 as RelativeTime)
})
})

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

import { addEventListener, DOM_EVENT, EventEmitter } from '@datadog/browser-core'
import { addEventListener, DOM_EVENT, EventEmitter, RelativeTime } from '@datadog/browser-core'
let trackFirstHiddenSingleton: { timeStamp: number } | undefined
let trackFirstHiddenSingleton: { timeStamp: RelativeTime } | undefined
let stopListeners: (() => void) | undefined

@@ -9,6 +9,6 @@

if (document.visibilityState === 'hidden') {
trackFirstHiddenSingleton = { timeStamp: 0 }
trackFirstHiddenSingleton = { timeStamp: 0 as RelativeTime }
} else {
trackFirstHiddenSingleton = {
timeStamp: Infinity,
timeStamp: Infinity as RelativeTime,
}

@@ -19,3 +19,3 @@ ;({ stop: stopListeners } = addEventListener(

({ timeStamp }) => {
trackFirstHiddenSingleton!.timeStamp = timeStamp
trackFirstHiddenSingleton!.timeStamp = timeStamp as RelativeTime
},

@@ -22,0 +22,0 @@ { capture: true, once: true }

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

import { createNewEvent, DOM_EVENT, restorePageVisibility, setPageVisibility } from '@datadog/browser-core'
import {
createNewEvent,
DOM_EVENT,
Duration,
RelativeTime,
restorePageVisibility,
setPageVisibility,
} from '@datadog/browser-core'
import { setup, TestSetupBuilder } from '../../../../test/specHelper'

@@ -23,11 +30,11 @@ import {

name: 'first-contentful-paint',
startTime: 123,
startTime: 123 as RelativeTime,
}
const FAKE_NAVIGATION_ENTRY: RumPerformanceNavigationTiming = {
domComplete: 456,
domContentLoadedEventEnd: 345,
domInteractive: 234,
domComplete: 456 as RelativeTime,
domContentLoadedEventEnd: 345 as RelativeTime,
domInteractive: 234 as RelativeTime,
entryType: 'navigation',
loadEventEnd: 567,
loadEventEnd: 567 as RelativeTime,
}

@@ -37,3 +44,3 @@

entryType: 'largest-contentful-paint',
startTime: 789,
startTime: 789 as RelativeTime,
}

@@ -43,4 +50,4 @@

entryType: 'first-input',
processingStart: 1100,
startTime: 1000,
processingStart: 1100 as RelativeTime,
startTime: 1000 as RelativeTime,
}

@@ -70,9 +77,9 @@

expect(timingsCallback.calls.mostRecent().args[0]).toEqual({
domComplete: 456,
domContentLoaded: 345,
domInteractive: 234,
firstContentfulPaint: 123,
firstInputDelay: 100,
firstInputTime: 1000,
loadEvent: 567,
domComplete: 456 as Duration,
domContentLoaded: 345 as Duration,
domInteractive: 234 as Duration,
firstContentfulPaint: 123 as Duration,
firstInputDelay: 100 as Duration,
firstInputTime: 1000 as Duration,
loadEvent: 567 as Duration,
})

@@ -102,6 +109,6 @@ })

expect(navigationTimingsCallback).toHaveBeenCalledWith({
domComplete: 456,
domContentLoaded: 345,
domInteractive: 234,
loadEvent: 567,
domComplete: 456 as Duration,
domContentLoaded: 345 as Duration,
domInteractive: 234 as Duration,
loadEvent: 567 as Duration,
})

@@ -113,3 +120,3 @@ })

let setupBuilder: TestSetupBuilder
let fcpCallback: jasmine.Spy<(value: number) => void>
let fcpCallback: jasmine.Spy<(value: RelativeTime) => void>

@@ -133,4 +140,4 @@ beforeEach(() => {

expect(fcpCallback).toHaveBeenCalledTimes(1)
expect(fcpCallback).toHaveBeenCalledWith(123)
expect(fcpCallback).toHaveBeenCalledTimes(1 as RelativeTime)
expect(fcpCallback).toHaveBeenCalledWith(123 as RelativeTime)
})

@@ -148,3 +155,3 @@

let setupBuilder: TestSetupBuilder
let lcpCallback: jasmine.Spy<(value: number) => void>
let lcpCallback: jasmine.Spy<(value: RelativeTime) => void>
let emitter: Element

@@ -169,4 +176,4 @@

lifeCycle.notify(LifeCycleEventType.PERFORMANCE_ENTRY_COLLECTED, FAKE_LARGEST_CONTENTFUL_PAINT_ENTRY)
expect(lcpCallback).toHaveBeenCalledTimes(1)
expect(lcpCallback).toHaveBeenCalledWith(789)
expect(lcpCallback).toHaveBeenCalledTimes(1 as RelativeTime)
expect(lcpCallback).toHaveBeenCalledWith(789 as RelativeTime)
})

@@ -173,0 +180,0 @@

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

import { addEventListeners, DOM_EVENT, EventEmitter } from '@datadog/browser-core'
import { addEventListeners, DOM_EVENT, Duration, elapsed, EventEmitter, RelativeTime } from '@datadog/browser-core'
import { LifeCycle, LifeCycleEventType } from '../../lifeCycle'

@@ -6,10 +6,10 @@ import { trackFirstHidden } from './trackFirstHidden'

export interface Timings {
firstContentfulPaint?: number
domInteractive?: number
domContentLoaded?: number
domComplete?: number
loadEvent?: number
largestContentfulPaint?: number
firstInputDelay?: number
firstInputTime?: number
firstContentfulPaint?: Duration
domInteractive?: Duration
domContentLoaded?: Duration
domComplete?: Duration
loadEvent?: Duration
largestContentfulPaint?: Duration
firstInputDelay?: Duration
firstInputTime?: Duration
}

@@ -65,3 +65,3 @@

export function trackFirstContentfulPaint(lifeCycle: LifeCycle, callback: (fcp: number) => void) {
export function trackFirstContentfulPaint(lifeCycle: LifeCycle, callback: (fcp: RelativeTime) => void) {
const firstHidden = trackFirstHidden()

@@ -89,3 +89,3 @@ const { unsubscribe: stop } = lifeCycle.subscribe(LifeCycleEventType.PERFORMANCE_ENTRY_COLLECTED, (entry) => {

emitter: EventEmitter,
callback: (value: number) => void
callback: (value: RelativeTime) => void
) {

@@ -107,3 +107,3 @@ const firstHidden = trackFirstHidden()

const { unsubscribe: unsubcribeLifeCycle } = lifeCycle.subscribe(
const { unsubscribe: unsubscribeLifeCycle } = lifeCycle.subscribe(
LifeCycleEventType.PERFORMANCE_ENTRY_COLLECTED,

@@ -124,3 +124,3 @@ (entry) => {

stopEventListener()
unsubcribeLifeCycle()
unsubscribeLifeCycle()
},

@@ -140,3 +140,3 @@ }

lifeCycle: LifeCycle,
callback: ({ firstInputDelay, firstInputTime }: { firstInputDelay: number; firstInputTime: number }) => void
callback: ({ firstInputDelay, firstInputTime }: { firstInputDelay: Duration; firstInputTime: Duration }) => void
) {

@@ -148,4 +148,4 @@ const firstHidden = trackFirstHidden()

callback({
firstInputDelay: entry.processingStart - entry.startTime,
firstInputTime: entry.startTime,
firstInputDelay: elapsed(entry.startTime, entry.processingStart),
firstInputTime: entry.startTime as Duration,
})

@@ -152,0 +152,0 @@ }

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

import { Context } from '../../../../../core/src'
import { catchUserErrors, Context, Duration, RelativeTime } from '../../../../../core/src'
import { RumEvent } from '../../../../../rum/src'

@@ -20,3 +20,3 @@ import { setup, TestSetupBuilder } from '../../../../test/specHelper'

const AFTER_PAGE_ACTIVITY_MAX_DURATION = PAGE_ACTIVITY_MAX_DURATION * 1.1
const BEFORE_PAGE_ACTIVITY_VALIDATION_DELAY = PAGE_ACTIVITY_VALIDATION_DELAY * 0.8
const BEFORE_PAGE_ACTIVITY_VALIDATION_DELAY = (PAGE_ACTIVITY_VALIDATION_DELAY * 0.8) as Duration
const AFTER_PAGE_ACTIVITY_END_DELAY = PAGE_ACTIVITY_END_DELAY * 1.1

@@ -27,30 +27,30 @@

name: 'first-contentful-paint',
startTime: 123,
startTime: 123 as RelativeTime,
}
const FAKE_LARGEST_CONTENTFUL_PAINT_ENTRY: RumLargestContentfulPaintTiming = {
entryType: 'largest-contentful-paint',
startTime: 789,
startTime: 789 as RelativeTime,
}
const FAKE_NAVIGATION_ENTRY: RumPerformanceNavigationTiming = {
domComplete: 456,
domContentLoadedEventEnd: 345,
domInteractive: 234,
domComplete: 456 as RelativeTime,
domContentLoadedEventEnd: 345 as RelativeTime,
domInteractive: 234 as RelativeTime,
entryType: 'navigation',
loadEventEnd: 567,
loadEventEnd: 567 as RelativeTime,
}
const FAKE_NAVIGATION_ENTRY_WITH_LOADEVENT_BEFORE_ACTIVITY_TIMING: RumPerformanceNavigationTiming = {
domComplete: 2,
domContentLoadedEventEnd: 1,
domInteractive: 1,
domComplete: 2 as RelativeTime,
domContentLoadedEventEnd: 1 as RelativeTime,
domInteractive: 1 as RelativeTime,
entryType: 'navigation',
loadEventEnd: BEFORE_PAGE_ACTIVITY_VALIDATION_DELAY * 0.8,
loadEventEnd: (BEFORE_PAGE_ACTIVITY_VALIDATION_DELAY * 0.8) as RelativeTime,
}
const FAKE_NAVIGATION_ENTRY_WITH_LOADEVENT_AFTER_ACTIVITY_TIMING: RumPerformanceNavigationTiming = {
domComplete: 2,
domContentLoadedEventEnd: 1,
domInteractive: 1,
domComplete: 2 as RelativeTime,
domContentLoadedEventEnd: 1 as RelativeTime,
domInteractive: 1 as RelativeTime,
entryType: 'navigation',
loadEventEnd: BEFORE_PAGE_ACTIVITY_VALIDATION_DELAY * 1.2,
loadEventEnd: (BEFORE_PAGE_ACTIVITY_VALIDATION_DELAY * 1.2) as RelativeTime,
}

@@ -228,3 +228,3 @@

lifeCycle.subscribe(LifeCycleEventType.VIEW_UPDATED, handler)
return trackViews(location, lifeCycle, onNewLocation)
return trackViews(location, lifeCycle, catchUserErrors(onNewLocation, 'onNewLocation threw an error:'))
})

@@ -675,6 +675,6 @@ })

expect(getViewEvent(1).timings).toEqual({
domComplete: 456,
domContentLoaded: 345,
domInteractive: 234,
loadEvent: 567,
domComplete: 456 as Duration,
domContentLoaded: 345 as Duration,
domInteractive: 234 as Duration,
loadEvent: 567 as Duration,
})

@@ -697,8 +697,8 @@ })

expect(getViewEvent(1).timings).toEqual({
domComplete: 456,
domContentLoaded: 345,
domInteractive: 234,
firstContentfulPaint: 123,
largestContentfulPaint: 789,
loadEvent: 567,
domComplete: 456 as Duration,
domContentLoaded: 345 as Duration,
domInteractive: 234 as Duration,
firstContentfulPaint: 123 as Duration,
largestContentfulPaint: 789 as Duration,
loadEvent: 567 as Duration,
})

@@ -711,3 +711,3 @@ expect(getViewEvent(2).timings).toEqual({})

let secondView: { init: View; last: View }
const VIEW_DURATION = 100
const VIEW_DURATION = 100 as Duration

@@ -751,8 +751,8 @@ beforeEach(() => {

expect(initialView.last.timings).toEqual({
domComplete: 456,
domContentLoaded: 345,
domInteractive: 234,
firstContentfulPaint: 123,
largestContentfulPaint: 789,
loadEvent: 567,
domComplete: 456 as Duration,
domContentLoaded: 345 as Duration,
domInteractive: 234 as Duration,
firstContentfulPaint: 123 as Duration,
largestContentfulPaint: 789 as Duration,
loadEvent: 567 as Duration,
})

@@ -959,3 +959,3 @@ })

let getViewEvent: (index: number) => View
let addTiming: (name: string, time?: number) => void
let addTiming: (name: string, time?: RelativeTime) => void

@@ -987,3 +987,3 @@ beforeEach(() => {

expect(event.id).toEqual(currentViewId)
expect(event.customTimings).toEqual({ foo: 20 })
expect(event.customTimings).toEqual({ foo: 20 as Duration })
})

@@ -1001,4 +1001,4 @@

expect(event.customTimings).toEqual({
bar: 30,
foo: 20,
bar: 30 as Duration,
foo: 20 as Duration,
})

@@ -1017,4 +1017,4 @@ })

expect(event.customTimings).toEqual({
bar: 30,
foo: 20,
bar: 30 as Duration,
foo: 20 as Duration,
})

@@ -1027,4 +1027,4 @@

expect(event.customTimings).toEqual({
bar: 30,
foo: 50,
bar: 30 as Duration,
foo: 50 as Duration,
})

@@ -1036,6 +1036,6 @@ })

addTiming('foo', 1234)
addTiming('foo', 1234 as RelativeTime)
expect(getViewEvent(1).customTimings).toEqual({
foo: 1234,
foo: 1234 as Duration,
})

@@ -1048,6 +1048,6 @@ })

addTiming('foo bar-qux.@zip_21%$*€👋', 1234)
addTiming('foo bar-qux.@zip_21%$*€👋', 1234 as RelativeTime)
expect(getViewEvent(1).customTimings).toEqual({
'foo_bar-qux.@zip_21_$____': 1234,
'foo_bar-qux.@zip_21_$____': 1234 as Duration,
})

@@ -1054,0 +1054,0 @@ expect(warnSpy).toHaveBeenCalled()

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

import { addEventListener, DOM_EVENT, generateUUID, monitor, noop, ONE_MINUTE, throttle } from '@datadog/browser-core'
import {
addEventListener,
DOM_EVENT,
Duration,
elapsed,
generateUUID,
monitor,
noop,
ONE_MINUTE,
relativeNow,
RelativeTime,
throttle,
} from '@datadog/browser-core'
import { NewLocationListener } from '../../../boot/rum'

@@ -20,6 +32,6 @@

documentVersion: number
startTime: number
duration: number
startTime: RelativeTime
duration: Duration
isActive: boolean
loadingTime?: number | undefined
loadingTime?: Duration
loadingType: ViewLoadingType

@@ -34,3 +46,3 @@ cumulativeLayoutShift?: number

referrer: string
startTime: number
startTime: RelativeTime
}

@@ -46,4 +58,3 @@

) {
onNewLocation = wrapOnNewLocation(onNewLocation)
const startOrigin = 0
const startOrigin = 0 as RelativeTime
const initialView = newView(

@@ -102,3 +113,3 @@ lifeCycle,

return {
addTiming: (name: string, time = performance.now()) => {
addTiming: (name: string, time = relativeNow()) => {
currentView.addTiming(name, time)

@@ -122,3 +133,3 @@ currentView.triggerUpdate()

referrer: string,
startTime: number = performance.now(),
startTime = relativeNow(),
name?: string

@@ -138,4 +149,4 @@ ) {

let cumulativeLayoutShift: number | undefined
let loadingTime: number | undefined
let endTime: number | undefined
let loadingTime: Duration | undefined
let endTime: RelativeTime | undefined
let location: Location = { ...initialLocation }

@@ -195,3 +206,3 @@

timings,
duration: (endTime === undefined ? performance.now() : endTime) - startTime,
duration: elapsed(startTime, endTime === undefined ? relativeNow() : endTime),
isActive: endTime === undefined,

@@ -204,3 +215,3 @@ })

end() {
endTime = performance.now()
endTime = relativeNow()
stopEventCountsTracking()

@@ -231,4 +242,4 @@ stopActivityLoadingTimeTracking()

},
addTiming(name: string, time: number) {
customTimings[sanitizeTiming(name)] = time - startTime
addTiming(name: string, endTime: RelativeTime) {
customTimings[sanitizeTiming(name)] = elapsed(startTime, endTime)
},

@@ -275,10 +286,10 @@ updateLocation(newLocation: Location) {

function trackLoadingTime(loadType: ViewLoadingType, callback: (loadingTime: number) => void) {
function trackLoadingTime(loadType: ViewLoadingType, callback: (loadingTime: Duration) => void) {
let isWaitingForLoadEvent = loadType === ViewLoadingType.INITIAL_LOAD
let isWaitingForActivityLoadingTime = true
const loadingTimeCandidates: number[] = []
const loadingTimeCandidates: Duration[] = []
function invokeCallbackIfAllCandidatesAreReceived() {
if (!isWaitingForActivityLoadingTime && !isWaitingForLoadEvent && loadingTimeCandidates.length > 0) {
callback(Math.max(...loadingTimeCandidates))
callback(Math.max(...loadingTimeCandidates) as Duration)
}

@@ -288,3 +299,3 @@ }

return {
setLoadEvent: (loadEvent: number) => {
setLoadEvent: (loadEvent: Duration) => {
if (isWaitingForLoadEvent) {

@@ -296,3 +307,3 @@ isWaitingForLoadEvent = false

},
setActivityLoadingTime: (activityLoadingTime: number | undefined) => {
setActivityLoadingTime: (activityLoadingTime: Duration | undefined) => {
if (isWaitingForActivityLoadingTime) {

@@ -309,7 +320,7 @@ isWaitingForActivityLoadingTime = false

function trackActivityLoadingTime(lifeCycle: LifeCycle, callback: (loadingTimeValue: number | undefined) => void) {
const startTime = performance.now()
function trackActivityLoadingTime(lifeCycle: LifeCycle, callback: (loadingTimeValue: Duration | undefined) => void) {
const startTime = relativeNow()
const { stop: stopWaitIdlePageActivity } = waitIdlePageActivity(lifeCycle, (hadActivity, endTime) => {
if (hadActivity) {
callback(endTime - startTime)
callback(elapsed(startTime, endTime))
} else {

@@ -324,3 +335,3 @@ callback(undefined)

/**
* Track layout shifts (LS) occuring during the Views. This yields multiple values that can be
* Track layout shifts (LS) occurring during the Views. This yields multiple values that can be
* added up to compute the cumulated layout shift (CLS).

@@ -362,13 +373,1 @@ *

}
function wrapOnNewLocation(onNewLocation: NewLocationListener): NewLocationListener {
return (newLocation, oldLocation) => {
let result
try {
result = onNewLocation(newLocation, oldLocation)
} catch (err) {
console.error('onNewLocation threw an error:', err)
}
return result
}
}

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

import { Duration, RelativeTime, ServerDuration } from '@datadog/browser-core'
import { setup, TestSetupBuilder } from '../../../../test/specHelper'

@@ -29,7 +30,7 @@ import { RumEventType, ViewLoadingType } from '../../../rawRumEvent.types'

customTimings: {
bar: 20,
foo: 10,
bar: 20 as Duration,
foo: 10 as Duration,
},
documentVersion: 3,
duration: 100,
duration: 100 as Duration,
eventCounts: {

@@ -44,16 +45,16 @@ errorCount: 10,

isActive: false,
loadingTime: 20,
loadingTime: 20 as Duration,
loadingType: ViewLoadingType.INITIAL_LOAD,
location: location as Location,
referrer: '',
startTime: 1234,
startTime: 1234 as RelativeTime,
timings: {
domComplete: 10,
domContentLoaded: 10,
domInteractive: 10,
firstContentfulPaint: 10,
firstInputDelay: 12,
firstInputTime: 10,
largestContentfulPaint: 10,
loadEvent: 10,
domComplete: 10 as Duration,
domContentLoaded: 10 as Duration,
domInteractive: 10 as Duration,
firstContentfulPaint: 10 as Duration,
firstInputDelay: 12 as Duration,
firstInputTime: 10 as Duration,
largestContentfulPaint: 10 as Duration,
loadEvent: 10 as Duration,
},

@@ -76,19 +77,19 @@ }

custom_timings: {
bar: 20 * 1e6,
foo: 10 * 1e6,
bar: (20 * 1e6) as ServerDuration,
foo: (10 * 1e6) as ServerDuration,
},
dom_complete: 10 * 1e6,
dom_content_loaded: 10 * 1e6,
dom_interactive: 10 * 1e6,
dom_complete: (10 * 1e6) as ServerDuration,
dom_content_loaded: (10 * 1e6) as ServerDuration,
dom_interactive: (10 * 1e6) as ServerDuration,
error: {
count: 10,
},
first_contentful_paint: 10 * 1e6,
first_input_delay: 12 * 1e6,
first_input_time: 10 * 1e6,
first_contentful_paint: (10 * 1e6) as ServerDuration,
first_input_delay: (12 * 1e6) as ServerDuration,
first_input_time: (10 * 1e6) as ServerDuration,
is_active: false,
name: undefined,
largest_contentful_paint: 10 * 1e6,
load_event: 10 * 1e6,
loading_time: 20 * 1e6,
largest_contentful_paint: (10 * 1e6) as ServerDuration,
load_event: (10 * 1e6) as ServerDuration,
loading_time: (20 * 1e6) as ServerDuration,
loading_type: ViewLoadingType.INITIAL_LOAD,

@@ -101,3 +102,3 @@ long_task: {

},
time_spent: 100 * 1e6,
time_spent: (100 * 1e6) as ServerDuration,
},

@@ -104,0 +105,0 @@ })

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

import { getTimestamp, isEmptyObject, mapValues, msToNs } from '@datadog/browser-core'
import {
Duration,
getTimeStamp,
isEmptyObject,
mapValues,
ServerDuration,
toServerDuration,
} from '@datadog/browser-core'
import { NewLocationListener } from '../../../boot/rum'

@@ -20,3 +27,3 @@ import { RawRumViewEvent, RumEventType } from '../../../rawRumEvent.types'

},
date: getTimestamp(view.startTime),
date: getTimeStamp(view.startTime),
type: RumEventType.VIEW,

@@ -28,16 +35,16 @@ view: {

cumulative_layout_shift: view.cumulativeLayoutShift,
dom_complete: msToNs(view.timings.domComplete),
dom_content_loaded: msToNs(view.timings.domContentLoaded),
dom_interactive: msToNs(view.timings.domInteractive),
dom_complete: toServerDuration(view.timings.domComplete),
dom_content_loaded: toServerDuration(view.timings.domContentLoaded),
dom_interactive: toServerDuration(view.timings.domInteractive),
error: {
count: view.eventCounts.errorCount,
},
first_contentful_paint: msToNs(view.timings.firstContentfulPaint),
first_input_delay: msToNs(view.timings.firstInputDelay),
first_input_time: msToNs(view.timings.firstInputTime),
first_contentful_paint: toServerDuration(view.timings.firstContentfulPaint),
first_input_delay: toServerDuration(view.timings.firstInputDelay),
first_input_time: toServerDuration(view.timings.firstInputTime),
is_active: view.isActive,
name: view.name,
largest_contentful_paint: msToNs(view.timings.largestContentfulPaint),
load_event: msToNs(view.timings.loadEvent),
loading_time: msToNs(view.loadingTime),
largest_contentful_paint: toServerDuration(view.timings.largestContentfulPaint),
load_event: toServerDuration(view.timings.loadEvent),
loading_time: toServerDuration(view.loadingTime),
loading_type: view.loadingType,

@@ -50,7 +57,10 @@ long_task: {

},
time_spent: msToNs(view.duration),
time_spent: toServerDuration(view.duration),
},
}
if (!isEmptyObject(view.customTimings)) {
viewEvent.view.custom_timings = mapValues(view.customTimings, msToNs)
viewEvent.view.custom_timings = mapValues(
view.customTimings,
toServerDuration as (duration: Duration) => ServerDuration
)
}

@@ -57,0 +67,0 @@ return {

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

import { TimeStamp } from '@datadog/browser-core'
import {

@@ -105,3 +106,3 @@ createDocumentTraceData,

)
).toEqual({ traceId: '123', traceTime: 456 })
).toEqual({ traceId: '123', traceTime: 456 as TimeStamp })
})

@@ -175,3 +176,3 @@

traceId: '123',
traceTime: 456,
traceTime: 456 as TimeStamp,
})

@@ -178,0 +179,0 @@ })

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

import { findCommaSeparatedValue, ONE_MINUTE } from '@datadog/browser-core'
import { findCommaSeparatedValue, ONE_MINUTE, TimeStamp } from '@datadog/browser-core'
interface DocumentTraceData {
traceId: string
traceTime: number
traceTime: TimeStamp
}

@@ -41,3 +41,3 @@

): DocumentTraceData | undefined {
const traceTime = rawTraceTime && Number(rawTraceTime)
const traceTime = rawTraceTime && (Number(rawTraceTime) as TimeStamp)
if (!traceId || !traceTime) {

@@ -68,3 +68,3 @@ return undefined

// Try to look for the comment at the end of the <body> by by iterating over its child nodes in
// reverse order, stoping if we come accross a non-text node.
// reverse order, stopping if we come across a non-text node.
if (document.body) {

@@ -71,0 +71,0 @@ for (let i = document.body.childNodes.length - 1; i >= 0; i -= 1) {

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

import { noop, Observable } from '@datadog/browser-core'
import { noop, Observable, RelativeTime } from '@datadog/browser-core'
import { RumPerformanceNavigationTiming, RumPerformanceResourceTiming } from '../browser/performanceCollection'

@@ -170,3 +170,3 @@ import { LifeCycle, LifeCycleEventType } from './lifeCycle'

expect(hadActivity).toBeTrue()
expect(endTime).toEqual(startTime + BEFORE_PAGE_ACTIVITY_VALIDATION_DELAY)
expect(endTime).toEqual((startTime + BEFORE_PAGE_ACTIVITY_VALIDATION_DELAY) as RelativeTime)
done()

@@ -191,3 +191,3 @@ })

expect(hadActivity).toBeTrue()
expect(endTime).toBe(startTime + (extendCount + 1) * BEFORE_PAGE_ACTIVITY_END_DELAY)
expect(endTime).toBe((startTime + (extendCount + 1) * BEFORE_PAGE_ACTIVITY_END_DELAY) as RelativeTime)
done()

@@ -214,3 +214,3 @@ })

expect(hadActivity).toBeTrue()
expect(endTime).toBe(startTime + PAGE_ACTIVITY_MAX_DURATION)
expect(endTime).toBe((startTime + PAGE_ACTIVITY_MAX_DURATION) as RelativeTime)
stop = true

@@ -235,3 +235,5 @@ done()

expect(hadActivity).toBeTrue()
expect(endTime).toBe(startTime + BEFORE_PAGE_ACTIVITY_VALIDATION_DELAY + PAGE_ACTIVITY_END_DELAY * 2)
expect(endTime).toBe(
(startTime + BEFORE_PAGE_ACTIVITY_VALIDATION_DELAY + PAGE_ACTIVITY_END_DELAY * 2) as RelativeTime
)
done()

@@ -254,3 +256,3 @@ })

expect(hadActivity).toBeTrue()
expect(endTime).toBe(startTime + PAGE_ACTIVITY_MAX_DURATION)
expect(endTime).toBe((startTime + PAGE_ACTIVITY_MAX_DURATION) as RelativeTime)
done()

@@ -257,0 +259,0 @@ })

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

import { monitor, Observable } from '@datadog/browser-core'
import { monitor, Observable, relativeNow, RelativeTime } from '@datadog/browser-core'
import { LifeCycle, LifeCycleEventType, Subscription } from './lifeCycle'

@@ -17,3 +17,3 @@

lifeCycle: LifeCycle,
completionCallback: (hadActivity: boolean, endTime: number) => void
completionCallback: (hadActivity: boolean, endTime: RelativeTime) => void
) {

@@ -117,3 +117,3 @@ const { observable: pageActivitiesObservable, stop: stopPageActivitiesTracking } = trackPageActivities(lifeCycle)

stopPageActivitiesTracking: () => void,
completionCallback: (hadActivity: boolean, endTime: number) => void
completionCallback: (hadActivity: boolean, endTime: RelativeTime) => void
): { stop: () => void } {

@@ -124,7 +124,7 @@ let idleTimeoutId: number

const validationTimeoutId = setTimeout(
monitor(() => complete(false, 0)),
monitor(() => complete(false, 0 as RelativeTime)),
PAGE_ACTIVITY_VALIDATION_DELAY
)
const maxDurationTimeoutId = setTimeout(
monitor(() => complete(true, performance.now())),
monitor(() => complete(true, relativeNow())),
PAGE_ACTIVITY_MAX_DURATION

@@ -136,3 +136,3 @@ )

clearTimeout(idleTimeoutId)
const lastChangeTime = performance.now()
const lastChangeTime = relativeNow()
if (!isBusy) {

@@ -154,3 +154,3 @@ idleTimeoutId = setTimeout(

function complete(hadActivity: boolean, endTime: number) {
function complete(hadActivity: boolean, endTime: RelativeTime) {
if (hasCompleted) {

@@ -157,0 +157,0 @@ return

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

import { Context, ErrorSource, ResourceType } from '@datadog/browser-core'
import { Context, Duration, ErrorSource, ResourceType, ServerDuration, TimeStamp } from '@datadog/browser-core'

@@ -12,3 +12,3 @@ export enum RumEventType {

export interface RawRumResourceEvent {
date: number
date: TimeStamp
type: RumEventType.RESOURCE

@@ -18,3 +18,3 @@ resource: {

id?: string // only for traced requests
duration: number
duration: ServerDuration
url: string

@@ -38,8 +38,8 @@ method?: string

export interface PerformanceResourceDetailsElement {
duration: number
start: number
duration: ServerDuration
start: ServerDuration
}
export interface RawRumErrorEvent {
date: number
date: TimeStamp
type: RumEventType.ERROR

@@ -60,18 +60,20 @@ error: {

export interface RawRumViewEvent {
date: number
date: TimeStamp
type: RumEventType.VIEW
view: {
loading_type: ViewLoadingType
first_contentful_paint?: number
first_input_delay?: number
first_input_time?: number
first_contentful_paint?: ServerDuration
first_input_delay?: ServerDuration
first_input_time?: ServerDuration
cumulative_layout_shift?: number
custom_timings?: ViewCustomTimings
largest_contentful_paint?: number
dom_interactive?: number
dom_content_loaded?: number
dom_complete?: number
load_event?: number
loading_time?: number
time_spent: number
custom_timings?: {
[key: string]: ServerDuration
}
largest_contentful_paint?: ServerDuration
dom_interactive?: ServerDuration
dom_content_loaded?: ServerDuration
dom_complete?: ServerDuration
load_event?: ServerDuration
loading_time?: ServerDuration
time_spent: ServerDuration
is_active: boolean

@@ -95,3 +97,3 @@ name?: string

export interface ViewCustomTimings {
[key: string]: number
[key: string]: Duration
}

@@ -104,6 +106,6 @@

export interface RawRumLongTaskEvent {
date: number
date: TimeStamp
type: RumEventType.LONG_TASK
long_task: {
duration: number
duration: ServerDuration
}

@@ -113,3 +115,3 @@ }

export interface RawRumActionEvent {
date?: number
date: TimeStamp
type: RumEventType.ACTION

@@ -119,3 +121,3 @@ action: {

type: ActionType
loading_time?: number
loading_time?: ServerDuration
error?: Count

@@ -143,3 +145,3 @@ long_task?: Count

export interface RumContext {
date: number
date: TimeStamp
application: {

@@ -146,0 +148,0 @@ id: string

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

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