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