@newrelic/browser-agent 1.254.0 → 1.255.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -0
- package/dist/cjs/common/config/state/runtime.js +2 -1
- package/dist/cjs/common/constants/env.cdn.js +1 -1
- package/dist/cjs/common/constants/env.npm.js +1 -1
- package/dist/cjs/common/context/shared-context.js +1 -1
- package/dist/cjs/common/harvest/harvest.js +1 -1
- package/dist/cjs/common/timing/time-keeper.js +28 -28
- package/dist/cjs/common/vitals/cumulative-layout-shift.js +12 -5
- package/dist/cjs/common/vitals/first-contentful-paint.js +10 -6
- package/dist/cjs/common/vitals/first-input-delay.js +12 -10
- package/dist/cjs/common/vitals/first-paint.js +1 -2
- package/dist/cjs/common/vitals/interaction-to-next-paint.js +11 -7
- package/dist/cjs/common/vitals/largest-contentful-paint.js +19 -17
- package/dist/cjs/common/vitals/long-task.js +0 -1
- package/dist/cjs/common/vitals/time-to-first-byte.js +11 -6
- package/dist/cjs/common/vitals/vital-metric.js +1 -4
- package/dist/cjs/common/window/nreum.js +1 -1
- package/dist/cjs/features/ajax/aggregate/index.js +3 -2
- package/dist/cjs/features/ajax/instrument/index.js +1 -1
- package/dist/cjs/features/jserrors/aggregate/index.js +3 -2
- package/dist/cjs/features/jserrors/instrument/index.js +1 -1
- package/dist/cjs/features/page_action/aggregate/index.js +3 -2
- package/dist/cjs/features/page_view_event/aggregate/index.js +11 -5
- package/dist/cjs/features/page_view_timing/aggregate/index.js +21 -7
- package/dist/cjs/features/page_view_timing/instrument/index.js +1 -1
- package/dist/cjs/features/session_replay/aggregate/index.js +14 -9
- package/dist/cjs/features/session_replay/shared/recorder-events.js +9 -1
- package/dist/cjs/features/session_replay/shared/recorder.js +56 -12
- package/dist/cjs/features/session_trace/aggregate/index.js +1 -1
- package/dist/cjs/features/session_trace/instrument/index.js +1 -1
- package/dist/cjs/features/soft_navigations/aggregate/index.js +2 -2
- package/dist/cjs/features/soft_navigations/instrument/index.js +1 -1
- package/dist/cjs/features/spa/aggregate/index.js +19 -10
- package/dist/cjs/features/spa/instrument/index.js +1 -1
- package/dist/cjs/features/utils/feature-base.js +0 -2
- package/dist/cjs/loaders/agent-base.js +0 -2
- package/dist/cjs/loaders/agent.js +1 -1
- package/dist/cjs/loaders/api/api.js +1 -1
- package/dist/cjs/loaders/micro-agent.js +4 -7
- package/dist/esm/common/config/state/runtime.js +2 -1
- package/dist/esm/common/constants/env.cdn.js +1 -1
- package/dist/esm/common/constants/env.npm.js +1 -1
- package/dist/esm/common/context/shared-context.js +1 -1
- package/dist/esm/common/harvest/harvest.js +1 -1
- package/dist/esm/common/timing/time-keeper.js +28 -28
- package/dist/esm/common/vitals/cumulative-layout-shift.js +11 -4
- package/dist/esm/common/vitals/first-contentful-paint.js +9 -5
- package/dist/esm/common/vitals/first-input-delay.js +11 -9
- package/dist/esm/common/vitals/first-paint.js +1 -2
- package/dist/esm/common/vitals/interaction-to-next-paint.js +10 -6
- package/dist/esm/common/vitals/largest-contentful-paint.js +18 -16
- package/dist/esm/common/vitals/long-task.js +0 -1
- package/dist/esm/common/vitals/time-to-first-byte.js +10 -5
- package/dist/esm/common/vitals/vital-metric.js +1 -4
- package/dist/esm/common/window/nreum.js +1 -1
- package/dist/esm/features/ajax/aggregate/index.js +3 -2
- package/dist/esm/features/ajax/instrument/index.js +1 -1
- package/dist/esm/features/jserrors/aggregate/index.js +3 -2
- package/dist/esm/features/jserrors/instrument/index.js +1 -1
- package/dist/esm/features/page_action/aggregate/index.js +3 -2
- package/dist/esm/features/page_view_event/aggregate/index.js +11 -5
- package/dist/esm/features/page_view_timing/aggregate/index.js +21 -7
- package/dist/esm/features/page_view_timing/instrument/index.js +1 -1
- package/dist/esm/features/session_replay/aggregate/index.js +14 -9
- package/dist/esm/features/session_replay/shared/recorder-events.js +9 -1
- package/dist/esm/features/session_replay/shared/recorder.js +56 -12
- package/dist/esm/features/session_trace/aggregate/index.js +1 -1
- package/dist/esm/features/session_trace/instrument/index.js +1 -1
- package/dist/esm/features/soft_navigations/aggregate/index.js +2 -2
- package/dist/esm/features/soft_navigations/instrument/index.js +1 -1
- package/dist/esm/features/spa/aggregate/index.js +19 -10
- package/dist/esm/features/spa/instrument/index.js +1 -1
- package/dist/esm/features/utils/feature-base.js +0 -2
- package/dist/esm/loaders/agent-base.js +0 -2
- package/dist/esm/loaders/agent.js +1 -1
- package/dist/esm/loaders/api/api.js +1 -1
- package/dist/esm/loaders/micro-agent.js +4 -7
- package/dist/types/common/config/state/runtime.d.ts.map +1 -1
- package/dist/types/common/harvest/harvest.d.ts.map +1 -1
- package/dist/types/common/timing/time-keeper.d.ts +7 -6
- package/dist/types/common/timing/time-keeper.d.ts.map +1 -1
- package/dist/types/common/vitals/vital-metric.d.ts +1 -2
- package/dist/types/common/vitals/vital-metric.d.ts.map +1 -1
- package/dist/types/features/ajax/aggregate/index.d.ts.map +1 -1
- package/dist/types/features/ajax/instrument/index.d.ts.map +1 -1
- package/dist/types/features/jserrors/aggregate/index.d.ts.map +1 -1
- package/dist/types/features/jserrors/instrument/index.d.ts.map +1 -1
- package/dist/types/features/page_action/aggregate/index.d.ts.map +1 -1
- package/dist/types/features/page_view_event/aggregate/index.d.ts.map +1 -1
- package/dist/types/features/page_view_timing/aggregate/index.d.ts.map +1 -1
- package/dist/types/features/page_view_timing/instrument/index.d.ts.map +1 -1
- package/dist/types/features/session_replay/aggregate/index.d.ts +4 -0
- package/dist/types/features/session_replay/aggregate/index.d.ts.map +1 -1
- package/dist/types/features/session_replay/shared/recorder-events.d.ts +8 -0
- package/dist/types/features/session_replay/shared/recorder-events.d.ts.map +1 -1
- package/dist/types/features/session_replay/shared/recorder.d.ts +17 -1
- package/dist/types/features/session_replay/shared/recorder.d.ts.map +1 -1
- package/dist/types/features/session_trace/aggregate/index.d.ts.map +1 -1
- package/dist/types/features/session_trace/instrument/index.d.ts.map +1 -1
- package/dist/types/features/soft_navigations/instrument/index.d.ts.map +1 -1
- package/dist/types/features/spa/aggregate/index.d.ts +0 -2
- package/dist/types/features/spa/aggregate/index.d.ts.map +1 -1
- package/dist/types/features/utils/feature-base.d.ts +0 -1
- package/dist/types/features/utils/feature-base.d.ts.map +1 -1
- package/dist/types/loaders/agent-base.d.ts +0 -2
- package/dist/types/loaders/agent-base.d.ts.map +1 -1
- package/dist/types/loaders/micro-agent.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/common/config/state/runtime.js +2 -1
- package/src/common/context/__mocks__/shared-context.js +3 -0
- package/src/common/context/shared-context.js +1 -1
- package/src/common/harvest/harvest.js +1 -1
- package/src/common/timing/__mocks__/time-keeper.js +2 -0
- package/src/common/timing/time-keeper.js +30 -31
- package/src/common/vitals/cumulative-layout-shift.js +10 -4
- package/src/common/vitals/first-contentful-paint.js +9 -4
- package/src/common/vitals/first-input-delay.js +11 -6
- package/src/common/vitals/first-paint.js +1 -1
- package/src/common/vitals/interaction-to-next-paint.js +10 -3
- package/src/common/vitals/largest-contentful-paint.js +19 -15
- package/src/common/vitals/long-task.js +0 -1
- package/src/common/vitals/time-to-first-byte.js +5 -4
- package/src/common/vitals/vital-metric.js +2 -4
- package/src/common/window/nreum.js +1 -1
- package/src/features/ajax/aggregate/index.js +3 -2
- package/src/features/ajax/instrument/index.js +1 -1
- package/src/features/jserrors/aggregate/index.js +3 -2
- package/src/features/jserrors/instrument/index.js +1 -1
- package/src/features/page_action/aggregate/index.js +3 -2
- package/src/features/page_view_event/aggregate/index.js +13 -4
- package/src/features/page_view_timing/aggregate/index.js +16 -6
- package/src/features/page_view_timing/instrument/index.js +1 -1
- package/src/features/session_replay/aggregate/index.js +13 -9
- package/src/features/session_replay/shared/recorder-events.js +6 -1
- package/src/features/session_replay/shared/recorder.js +33 -9
- package/src/features/session_trace/aggregate/index.js +1 -1
- package/src/features/session_trace/instrument/index.js +1 -1
- package/src/features/soft_navigations/aggregate/index.js +2 -2
- package/src/features/soft_navigations/instrument/index.js +1 -1
- package/src/features/spa/aggregate/index.js +19 -8
- package/src/features/spa/instrument/index.js +1 -1
- package/src/features/utils/feature-base.js +0 -3
- package/src/loaders/agent-base.js +0 -2
- package/src/loaders/agent.js +1 -1
- package/src/loaders/api/api.js +1 -1
- package/src/loaders/micro-agent.js +4 -6
- package/src/common/vitals/__mocks__/web-vitals.js +0 -19
|
@@ -23,11 +23,11 @@ import { SUPPORTABILITY_METRIC_CHANNEL } from '../../metrics/constants';
|
|
|
23
23
|
import { handle } from '../../../common/event-emitter/handle';
|
|
24
24
|
import { FEATURE_NAMES } from '../../../loaders/features/features';
|
|
25
25
|
import { RRWEB_VERSION } from "../../../common/constants/env.npm";
|
|
26
|
-
import { now } from '../../../common/timing/now';
|
|
27
26
|
import { MODE, SESSION_EVENTS, SESSION_EVENT_TYPES } from '../../../common/session/constants';
|
|
28
27
|
import { stringify } from '../../../common/util/stringify';
|
|
29
28
|
import { stylesheetEvaluator } from '../shared/stylesheet-evaluator';
|
|
30
29
|
import { deregisterDrain } from '../../../common/drain/drain';
|
|
30
|
+
import { now } from '../../../common/timing/now';
|
|
31
31
|
export class Aggregate extends AggregateBase {
|
|
32
32
|
static featureName = FEATURE_NAME;
|
|
33
33
|
// pass the recorder into the aggregator
|
|
@@ -51,6 +51,8 @@ export class Aggregate extends AggregateBase {
|
|
|
51
51
|
|
|
52
52
|
/** set by BCS response */
|
|
53
53
|
this.entitled = false;
|
|
54
|
+
/** set at BCS response, stored in runtime */
|
|
55
|
+
this.timeKeeper = undefined;
|
|
54
56
|
this.recorder = args?.recorder;
|
|
55
57
|
if (this.recorder) this.recorder.parent = this;
|
|
56
58
|
handle(SUPPORTABILITY_METRIC_CHANNEL, ['Config/SessionReplay/Enabled'], undefined, FEATURE_NAMES.metrics, this.ee);
|
|
@@ -184,8 +186,10 @@ export class Aggregate extends AggregateBase {
|
|
|
184
186
|
// session replay samples can only be decided on the first load of a session
|
|
185
187
|
// session replays can continue if already in progress
|
|
186
188
|
const {
|
|
187
|
-
session
|
|
189
|
+
session,
|
|
190
|
+
timeKeeper
|
|
188
191
|
} = getRuntime(this.agentIdentifier);
|
|
192
|
+
this.timeKeeper = timeKeeper;
|
|
189
193
|
if (!session.isNew && !ignoreSession) {
|
|
190
194
|
// inherit the mode of the existing session
|
|
191
195
|
this.mode = session.state.sessionReplayMode;
|
|
@@ -251,7 +255,7 @@ export class Aggregate extends AggregateBase {
|
|
|
251
255
|
let {
|
|
252
256
|
opts
|
|
253
257
|
} = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
254
|
-
if (!this.recorder) return;
|
|
258
|
+
if (!this.recorder || !this.timeKeeper?.ready) return;
|
|
255
259
|
const recorderEvents = this.recorder.getEvents();
|
|
256
260
|
// get the event type and use that to trigger another harvest if needed
|
|
257
261
|
if (!recorderEvents.events.length || this.mode !== MODE.FULL || this.blocked) return;
|
|
@@ -262,7 +266,10 @@ export class Aggregate extends AggregateBase {
|
|
|
262
266
|
}
|
|
263
267
|
let len = 0;
|
|
264
268
|
if (!!this.gzipper && !!this.u8) {
|
|
265
|
-
payload.body = this.gzipper(this.u8("[".concat(payload.body.map(e =>
|
|
269
|
+
payload.body = this.gzipper(this.u8("[".concat(payload.body.map(e => {
|
|
270
|
+
if (e.__serialized) return e.__serialized;
|
|
271
|
+
return stringify(e);
|
|
272
|
+
}).join(','), "]")));
|
|
266
273
|
len = payload.body.length;
|
|
267
274
|
this.scheduler.opts.gzip = true;
|
|
268
275
|
} else {
|
|
@@ -315,12 +322,11 @@ export class Aggregate extends AggregateBase {
|
|
|
315
322
|
events = events.slice(0, events.length - 1);
|
|
316
323
|
recorderEvents.hasMeta = !!events.find(x => x.type === RRWEB_EVENT_TYPES.Meta);
|
|
317
324
|
}
|
|
318
|
-
const agentOffset = getRuntime(this.agentIdentifier).offset;
|
|
319
325
|
const relativeNow = now();
|
|
320
326
|
const firstEventTimestamp = events[0]?.timestamp; // from rrweb node
|
|
321
327
|
const lastEventTimestamp = events[events.length - 1]?.timestamp; // from rrweb node
|
|
322
|
-
const firstTimestamp = firstEventTimestamp || recorderEvents.cycleTimestamp; // from rrweb node || from when the harvest cycle started
|
|
323
|
-
const lastTimestamp = lastEventTimestamp ||
|
|
328
|
+
const firstTimestamp = firstEventTimestamp || this.timeKeeper.correctAbsoluteTimestamp(recorderEvents.cycleTimestamp); // from rrweb node || from when the harvest cycle started
|
|
329
|
+
const lastTimestamp = lastEventTimestamp || this.timeKeeper.convertRelativeTimestamp(relativeNow);
|
|
324
330
|
const agentMetadata = agentRuntime.appMetadata?.agents?.[0] || {};
|
|
325
331
|
return {
|
|
326
332
|
qs: {
|
|
@@ -328,6 +334,7 @@ export class Aggregate extends AggregateBase {
|
|
|
328
334
|
type: 'SessionReplay',
|
|
329
335
|
app_id: info.applicationID,
|
|
330
336
|
protocol_version: '0',
|
|
337
|
+
timestamp: firstTimestamp,
|
|
331
338
|
attributes: encodeObj({
|
|
332
339
|
// this section of attributes must be controllable and stay below the query param padding limit -- see QUERY_PARAM_PADDING
|
|
333
340
|
// if not, data could be lost to truncation at time of sending, potentially breaking parsing / API behavior in NR1
|
|
@@ -338,9 +345,7 @@ export class Aggregate extends AggregateBase {
|
|
|
338
345
|
entityGuid: agentMetadata.entityGuid
|
|
339
346
|
}),
|
|
340
347
|
'replay.firstTimestamp': firstTimestamp,
|
|
341
|
-
'replay.firstTimestampOffset': firstTimestamp - agentOffset,
|
|
342
348
|
'replay.lastTimestamp': lastTimestamp,
|
|
343
|
-
'replay.durationMs': lastTimestamp - firstTimestamp,
|
|
344
349
|
'replay.nodes': events.length,
|
|
345
350
|
'session.durationMs': agentRuntime.session.getDuration(),
|
|
346
351
|
agentVersion: agentRuntime.version,
|
|
@@ -1,11 +1,19 @@
|
|
|
1
1
|
export class RecorderEvents {
|
|
2
|
-
constructor() {
|
|
2
|
+
constructor(_ref) {
|
|
3
|
+
let {
|
|
4
|
+
canCorrectTimestamps
|
|
5
|
+
} = _ref;
|
|
3
6
|
/** The buffer to hold recorder event nodes */
|
|
4
7
|
this.events = [];
|
|
5
8
|
/** Payload metadata -- Should indicate when a replay blob started recording. Resets each time a harvest occurs.
|
|
6
9
|
* cycle timestamps are used as fallbacks if event timestamps cannot be used
|
|
7
10
|
*/
|
|
8
11
|
this.cycleTimestamp = Date.now();
|
|
12
|
+
/** Payload metadata -- Whether timestamps can be corrected, defaults as false, can be set to true if timekeeper is present at init time. Used to determine
|
|
13
|
+
* if harvest needs to re-loop through nodes and correct them before sending. Ideal behavior is to correct them as they flow into the recorder
|
|
14
|
+
* to prevent re-looping, but is not always possible since the timekeeper is not set until after page load and the recorder can be preloaded.
|
|
15
|
+
*/
|
|
16
|
+
this.canCorrectTimestamps = !!canCorrectTimestamps;
|
|
9
17
|
/** A value which increments with every new mutation node reported. Resets after a harvest is sent */
|
|
10
18
|
this.payloadBytesEstimation = 0;
|
|
11
19
|
/** Payload metadata -- Should indicate that the payload being sent has a full DOM snapshot. This can happen
|
|
@@ -10,14 +10,23 @@ import { SUPPORTABILITY_METRIC_CHANNEL } from '../../metrics/constants';
|
|
|
10
10
|
import { FEATURE_NAMES } from '../../../loaders/features/features';
|
|
11
11
|
export class Recorder {
|
|
12
12
|
/** Each page mutation or event will be stored (raw) in this array. This array will be cleared on each harvest */
|
|
13
|
-
#events
|
|
13
|
+
#events;
|
|
14
14
|
/** Backlog used for a 2-part sliding window to guarantee a 15-30s buffer window */
|
|
15
|
-
#backloggedEvents
|
|
15
|
+
#backloggedEvents;
|
|
16
16
|
/** array of recorder events -- Will be filled only if forced harvest was triggered and harvester does not exist */
|
|
17
|
-
#preloaded
|
|
17
|
+
#preloaded;
|
|
18
18
|
/** flag that if true, blocks events from being "stored". Only set to true when a full snapshot has incomplete nodes (only stylesheets ATM) */
|
|
19
19
|
#fixing = false;
|
|
20
20
|
constructor(parent) {
|
|
21
|
+
this.#events = new RecorderEvents({
|
|
22
|
+
canCorrectTimestamps: !!parent.timeKeeper?.ready
|
|
23
|
+
});
|
|
24
|
+
this.#backloggedEvents = new RecorderEvents({
|
|
25
|
+
canCorrectTimestamps: !!parent.timeKeeper?.ready
|
|
26
|
+
});
|
|
27
|
+
this.#preloaded = [new RecorderEvents({
|
|
28
|
+
canCorrectTimestamps: !!parent.timeKeeper?.ready
|
|
29
|
+
})];
|
|
21
30
|
/** True when actively recording, false when paused or stopped */
|
|
22
31
|
this.recording = false;
|
|
23
32
|
/** The pointer to the current bucket holding rrweb events */
|
|
@@ -34,12 +43,18 @@ export class Recorder {
|
|
|
34
43
|
this.stopRecording = () => {/* no-op until set by rrweb initializer */};
|
|
35
44
|
}
|
|
36
45
|
getEvents() {
|
|
37
|
-
if (this.#preloaded[0]?.events.length)
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
46
|
+
if (this.#preloaded[0]?.events.length) {
|
|
47
|
+
const preloadedEvents = this.returnCorrectTimestamps(this.#preloaded[0]);
|
|
48
|
+
return {
|
|
49
|
+
...this.#preloaded[0],
|
|
50
|
+
events: preloadedEvents,
|
|
51
|
+
type: 'preloaded'
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
const backloggedEvents = this.returnCorrectTimestamps(this.#backloggedEvents);
|
|
55
|
+
const events = this.returnCorrectTimestamps(this.#events);
|
|
41
56
|
return {
|
|
42
|
-
events: [...
|
|
57
|
+
events: [...backloggedEvents, ...events].filter(x => x),
|
|
43
58
|
type: 'standard',
|
|
44
59
|
cycleTimestamp: Math.min(this.#backloggedEvents.cycleTimestamp, this.#events.cycleTimestamp),
|
|
45
60
|
payloadBytesEstimation: this.#backloggedEvents.payloadBytesEstimation + this.#events.payloadBytesEstimation,
|
|
@@ -50,10 +65,34 @@ export class Recorder {
|
|
|
50
65
|
};
|
|
51
66
|
}
|
|
52
67
|
|
|
68
|
+
/**
|
|
69
|
+
* Returns time-corrected events. If the events were correctable from the beginning, this correction will have already been applied.
|
|
70
|
+
* @param {SessionReplayEvent[]} events The array of buffered SR nodes
|
|
71
|
+
* @returns {CorrectedSessionReplayEvent[]}
|
|
72
|
+
*/
|
|
73
|
+
returnCorrectTimestamps(events) {
|
|
74
|
+
if (!this.parent.timeKeeper?.ready) return events.events;
|
|
75
|
+
return events.canCorrectTimestamps ? events.events : events.events.map(_ref => {
|
|
76
|
+
let {
|
|
77
|
+
__serialized,
|
|
78
|
+
timestamp,
|
|
79
|
+
...e
|
|
80
|
+
} = _ref;
|
|
81
|
+
return {
|
|
82
|
+
timestamp: this.parent.timeKeeper.correctAbsoluteTimestamp(timestamp),
|
|
83
|
+
...e
|
|
84
|
+
};
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
|
|
53
88
|
/** Clears the buffer (this.#events), and resets all payload metadata properties */
|
|
54
89
|
clearBuffer() {
|
|
55
|
-
if (this.#preloaded[0]?.events.length) this.#preloaded.shift();else if (this.parent.mode === MODE.ERROR) this.#backloggedEvents = this.#events;else this.#backloggedEvents = new RecorderEvents(
|
|
56
|
-
|
|
90
|
+
if (this.#preloaded[0]?.events.length) this.#preloaded.shift();else if (this.parent.mode === MODE.ERROR) this.#backloggedEvents = this.#events;else this.#backloggedEvents = new RecorderEvents({
|
|
91
|
+
canCorrectTimestamps: !!this.parent.timeKeeper?.ready
|
|
92
|
+
});
|
|
93
|
+
this.#events = new RecorderEvents({
|
|
94
|
+
canCorrectTimestamps: !!this.parent.timeKeeper?.ready
|
|
95
|
+
});
|
|
57
96
|
}
|
|
58
97
|
|
|
59
98
|
/** Begin recording using configured recording lib */
|
|
@@ -130,9 +169,12 @@ export class Recorder {
|
|
|
130
169
|
/** Store a payload in the buffer (this.#events). This should be the callback to the recording lib noticing a mutation */
|
|
131
170
|
store(event, isCheckout) {
|
|
132
171
|
if (!event) return;
|
|
133
|
-
event.__serialized = stringify(event);
|
|
134
172
|
if (!this.parent.scheduler && this.#preloaded.length) this.currentBufferTarget = this.#preloaded[this.#preloaded.length - 1];else this.currentBufferTarget = this.#events;
|
|
135
173
|
if (this.parent.blocked) return;
|
|
174
|
+
if (this.currentBufferTarget.canCorrectTimestamps) {
|
|
175
|
+
event.timestamp = this.parent.timeKeeper.correctAbsoluteTimestamp(event.timestamp);
|
|
176
|
+
}
|
|
177
|
+
event.__serialized = stringify(event);
|
|
136
178
|
const eventBytes = event.__serialized.length;
|
|
137
179
|
/** The estimated size of the payload after compression */
|
|
138
180
|
const payloadSize = this.getPayloadSize(eventBytes);
|
|
@@ -164,7 +206,9 @@ export class Recorder {
|
|
|
164
206
|
this.parent.scheduler.runHarvest();
|
|
165
207
|
} else {
|
|
166
208
|
// we are still in "preload" and it triggered a "stop point". Make a new set, which will get pointed at on next cycle
|
|
167
|
-
this.#preloaded.push(new RecorderEvents(
|
|
209
|
+
this.#preloaded.push(new RecorderEvents({
|
|
210
|
+
canCorrectTimestamps: !!this.parent.timeKeeper?.ready
|
|
211
|
+
}));
|
|
168
212
|
}
|
|
169
213
|
}
|
|
170
214
|
}
|
|
@@ -6,12 +6,12 @@ import { registerHandler } from '../../../common/event-emitter/register-handler'
|
|
|
6
6
|
import { HarvestScheduler } from '../../../common/harvest/harvest-scheduler';
|
|
7
7
|
import { parseUrl } from '../../../common/url/parse-url';
|
|
8
8
|
import { getConfigurationValue, getRuntime } from '../../../common/config/config';
|
|
9
|
-
import { now } from '../../../common/timing/now';
|
|
10
9
|
import { FEATURE_NAME } from '../constants';
|
|
11
10
|
import { HandlerCache } from '../../utils/handler-cache';
|
|
12
11
|
import { getSessionReplayMode } from '../../session_replay/shared/replay-mode';
|
|
13
12
|
import { AggregateBase } from '../../utils/aggregate-base';
|
|
14
13
|
import { MODE, SESSION_EVENTS } from '../../../common/session/constants';
|
|
14
|
+
import { now } from '../../../common/timing/now';
|
|
15
15
|
const ignoredEvents = {
|
|
16
16
|
// we find that certain events make the data too noisy to be useful
|
|
17
17
|
global: {
|
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { handle } from '../../../common/event-emitter/handle';
|
|
6
6
|
import { wrapHistory, wrapEvents } from '../../../common/wrap';
|
|
7
|
-
import { now } from '../../../common/timing/now';
|
|
8
7
|
import { InstrumentBase } from '../../utils/instrument-base';
|
|
9
8
|
import * as CONSTANTS from '../constants';
|
|
10
9
|
import { FEATURE_NAMES } from '../../../loaders/features/features';
|
|
11
10
|
import { isBrowserScope } from '../../../common/constants/runtime';
|
|
11
|
+
import { now } from '../../../common/timing/now';
|
|
12
12
|
const {
|
|
13
13
|
BST_RESOURCE,
|
|
14
14
|
RESOURCE,
|
|
@@ -26,9 +26,9 @@ export class Aggregate extends AggregateBase {
|
|
|
26
26
|
this.initialPageLoadInteraction = new InitialPageLoadInteraction(agentIdentifier);
|
|
27
27
|
timeToFirstByte.subscribe(_ref2 => {
|
|
28
28
|
let {
|
|
29
|
-
|
|
29
|
+
attrs
|
|
30
30
|
} = _ref2;
|
|
31
|
-
const loadEventTime =
|
|
31
|
+
const loadEventTime = attrs.navigationEntry.loadEventEnd;
|
|
32
32
|
this.initialPageLoadInteraction.forceSave = true;
|
|
33
33
|
this.initialPageLoadInteraction.done(loadEventTime);
|
|
34
34
|
this.interactionsToHarvest.push(this.initialPageLoadInteraction);
|
|
@@ -2,11 +2,11 @@ import { originals } from '../../../common/config/config';
|
|
|
2
2
|
import { isBrowserScope } from '../../../common/constants/runtime';
|
|
3
3
|
import { handle } from '../../../common/event-emitter/handle';
|
|
4
4
|
import { windowAddEventListener } from '../../../common/event-listener/event-listener-opts';
|
|
5
|
-
import { now } from '../../../common/timing/now';
|
|
6
5
|
import { debounce } from '../../../common/util/invoke';
|
|
7
6
|
import { wrapEvents, wrapHistory } from '../../../common/wrap';
|
|
8
7
|
import { InstrumentBase } from '../../utils/instrument-base';
|
|
9
8
|
import { FEATURE_NAME, INTERACTION_TRIGGERS } from '../constants';
|
|
9
|
+
import { now } from '../../../common/timing/now';
|
|
10
10
|
|
|
11
11
|
/** The minimal time after a UI event for which no further events will be processed - i.e. a throttling rate to reduce spam.
|
|
12
12
|
* This also give some time for the new interaction to complete without being discarded by a subsequent UI event and wrongly attributed.
|
|
@@ -25,6 +25,7 @@ import { loadedAsDeferredBrowserScript } from '../../../common/constants/runtime
|
|
|
25
25
|
import { handle } from '../../../common/event-emitter/handle';
|
|
26
26
|
import { SUPPORTABILITY_METRIC_CHANNEL } from '../../metrics/constants';
|
|
27
27
|
import { deregisterDrain } from '../../../common/drain/drain';
|
|
28
|
+
import { warn } from '../../../common/util/console';
|
|
28
29
|
const {
|
|
29
30
|
FEATURE_NAME,
|
|
30
31
|
INTERACTION_EVENTS,
|
|
@@ -47,9 +48,10 @@ export class Aggregate extends AggregateBase {
|
|
|
47
48
|
static featureName = FEATURE_NAME;
|
|
48
49
|
constructor(agentIdentifier, aggregator) {
|
|
49
50
|
super(agentIdentifier, aggregator, FEATURE_NAME);
|
|
51
|
+
const agentRuntime = getRuntime(agentIdentifier);
|
|
50
52
|
this.state = {
|
|
51
|
-
initialPageURL:
|
|
52
|
-
lastSeenUrl:
|
|
53
|
+
initialPageURL: agentRuntime.origin,
|
|
54
|
+
lastSeenUrl: agentRuntime.origin,
|
|
53
55
|
lastSeenRouteName: null,
|
|
54
56
|
timerMap: {},
|
|
55
57
|
timerBudget: MAX_TIMER_BUDGET,
|
|
@@ -72,9 +74,6 @@ export class Aggregate extends AggregateBase {
|
|
|
72
74
|
state,
|
|
73
75
|
serializer
|
|
74
76
|
} = this;
|
|
75
|
-
let {
|
|
76
|
-
blocked
|
|
77
|
-
} = this;
|
|
78
77
|
const baseEE = ee.get(agentIdentifier); // <-- parent baseEE
|
|
79
78
|
const mutationEE = baseEE.get('mutation');
|
|
80
79
|
const promiseEE = baseEE.get('promise');
|
|
@@ -121,14 +120,14 @@ export class Aggregate extends AggregateBase {
|
|
|
121
120
|
this.waitForFlags(['spa']).then(_ref => {
|
|
122
121
|
let [spaFlag] = _ref;
|
|
123
122
|
if (spaFlag) {
|
|
124
|
-
scheduler =
|
|
123
|
+
scheduler = new HarvestScheduler('events', {
|
|
125
124
|
onFinished: onHarvestFinished,
|
|
126
125
|
retryDelay: state.harvestTimeSeconds
|
|
127
126
|
}, {
|
|
128
127
|
agentIdentifier,
|
|
129
128
|
ee: baseEE
|
|
130
129
|
});
|
|
131
|
-
|
|
130
|
+
scheduler.harvest.on('events', onHarvestStarted);
|
|
132
131
|
this.drain();
|
|
133
132
|
} else {
|
|
134
133
|
this.blocked = true;
|
|
@@ -307,6 +306,9 @@ export class Aggregate extends AggregateBase {
|
|
|
307
306
|
if (node && !this.sent) {
|
|
308
307
|
this.sent = true;
|
|
309
308
|
node.dt = this.dt;
|
|
309
|
+
if (node.dt?.timestamp) {
|
|
310
|
+
node.dt.timestamp = agentRuntime.timeKeeper.correctAbsoluteTimestamp(node.dt.timestamp);
|
|
311
|
+
}
|
|
310
312
|
node.jsEnd = node.start = this.startTime;
|
|
311
313
|
node[INTERACTION][REMAINING]++;
|
|
312
314
|
}
|
|
@@ -391,7 +393,12 @@ export class Aggregate extends AggregateBase {
|
|
|
391
393
|
}
|
|
392
394
|
if (state.currentNode) {
|
|
393
395
|
this[SPA_NODE] = state.currentNode.child('ajax', this[FETCH_START]);
|
|
394
|
-
if (dtPayload && this[SPA_NODE])
|
|
396
|
+
if (dtPayload && this[SPA_NODE]) {
|
|
397
|
+
this[SPA_NODE].dt = dtPayload;
|
|
398
|
+
if (this[SPA_NODE].dt?.timestamp) {
|
|
399
|
+
this[SPA_NODE].dt.timestamp = agentRuntime.timeKeeper.correctAbsoluteTimestamp(this[SPA_NODE].dt.timestamp);
|
|
400
|
+
}
|
|
401
|
+
}
|
|
395
402
|
}
|
|
396
403
|
}
|
|
397
404
|
}, this.featureName, fetchEE);
|
|
@@ -611,8 +618,9 @@ export class Aggregate extends AggregateBase {
|
|
|
611
618
|
});
|
|
612
619
|
setCurrentNode(null);
|
|
613
620
|
}
|
|
621
|
+
const classThis = this;
|
|
614
622
|
function onHarvestStarted(options) {
|
|
615
|
-
if (state.interactionsToHarvest.length === 0 || blocked) return {};
|
|
623
|
+
if (state.interactionsToHarvest.length === 0 || classThis.blocked) return {};
|
|
616
624
|
var payload = serializer.serializeMultiple(state.interactionsToHarvest, 0, navTiming);
|
|
617
625
|
if (options.retry) {
|
|
618
626
|
state.interactionsToHarvest.forEach(function (interaction) {
|
|
@@ -674,7 +682,8 @@ export class Aggregate extends AggregateBase {
|
|
|
674
682
|
let smCategory;
|
|
675
683
|
if (interaction.root?.attrs?.trigger === 'initialPageLoad') smCategory = 'InitialPageLoad';else if (interaction.routeChange) smCategory = 'RouteChange';else smCategory = 'Custom';
|
|
676
684
|
handle(SUPPORTABILITY_METRIC_CHANNEL, ["Spa/Interaction/".concat(smCategory, "/Duration/Ms"), Math.max((interaction.root?.end || 0) - (interaction.root?.start || 0), 0)], undefined, FEATURE_NAMES.metrics, baseEE);
|
|
677
|
-
scheduler
|
|
685
|
+
scheduler?.scheduleHarvest(0);
|
|
686
|
+
if (!scheduler) warn('SPA scheduler is not initialized. Saved interaction is not sent!');
|
|
678
687
|
}
|
|
679
688
|
function isEnabled() {
|
|
680
689
|
var enabled = getConfigurationValue(agentIdentifier, 'spa.enabled');
|
|
@@ -6,9 +6,9 @@ import { wrapMutation, wrapPromise, wrapHistory, wrapTimer, wrapFetch, wrapXhr,
|
|
|
6
6
|
import { eventListenerOpts } from '../../../common/event-listener/event-listener-opts';
|
|
7
7
|
import { InstrumentBase } from '../../utils/instrument-base';
|
|
8
8
|
import { getRuntime } from '../../../common/config/config';
|
|
9
|
-
import { now } from '../../../common/timing/now';
|
|
10
9
|
import * as CONSTANTS from '../constants';
|
|
11
10
|
import { isBrowserScope } from '../../../common/constants/runtime';
|
|
11
|
+
import { now } from '../../../common/timing/now';
|
|
12
12
|
const {
|
|
13
13
|
FEATURE_NAME,
|
|
14
14
|
START,
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { ee } from '../../common/event-emitter/contextual-ee';
|
|
2
|
-
import { TimeKeeper } from '../../common/timing/time-keeper';
|
|
3
2
|
export class FeatureBase {
|
|
4
3
|
constructor(agentIdentifier, aggregator, featureName) {
|
|
5
4
|
/** @type {string} */
|
|
@@ -16,6 +15,5 @@ export class FeatureBase {
|
|
|
16
15
|
* @type {boolean}
|
|
17
16
|
*/
|
|
18
17
|
this.blocked = false;
|
|
19
|
-
this.timeKeeper = TimeKeeper.getTimeKeeperByAgentIdentifier(this.agentIdentifier);
|
|
20
18
|
}
|
|
21
19
|
}
|
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
import { warn } from '../common/util/console';
|
|
4
4
|
import { SR_EVENT_EMITTER_TYPES } from '../features/session_replay/constants';
|
|
5
5
|
import { generateRandomHexString } from '../common/ids/unique-id';
|
|
6
|
-
import { TimeKeeper } from '../common/timing/time-keeper';
|
|
7
6
|
|
|
8
7
|
/**
|
|
9
8
|
* @typedef {import('./api/interaction-types').InteractionInstance} InteractionInstance
|
|
@@ -11,7 +10,6 @@ import { TimeKeeper } from '../common/timing/time-keeper';
|
|
|
11
10
|
|
|
12
11
|
export class AgentBase {
|
|
13
12
|
agentIdentifier;
|
|
14
|
-
timeKeeper = new TimeKeeper(this);
|
|
15
13
|
constructor() {
|
|
16
14
|
let agentIdentifier = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : generateRandomHexString(16);
|
|
17
15
|
this.agentIdentifier = agentIdentifier;
|
|
@@ -26,7 +26,7 @@ export class Agent extends AgentBase {
|
|
|
26
26
|
if (!globalScope) {
|
|
27
27
|
// We could not determine the runtime environment. Short-circuite the agent here
|
|
28
28
|
// to avoid possible exceptions later that may cause issues with customer's application.
|
|
29
|
-
warn('Failed to
|
|
29
|
+
warn('Failed to initialize the agent. Could not determine the runtime environment.');
|
|
30
30
|
return;
|
|
31
31
|
}
|
|
32
32
|
this.sharedAggregator = new Aggregator({
|
|
@@ -6,7 +6,6 @@ import { FEATURE_NAMES } from '../features/features';
|
|
|
6
6
|
import { getRuntime, setInfo, getInfo } from '../../common/config/config';
|
|
7
7
|
import { handle } from '../../common/event-emitter/handle';
|
|
8
8
|
import { ee } from '../../common/event-emitter/contextual-ee';
|
|
9
|
-
import { now } from '../../common/timing/now';
|
|
10
9
|
import { drain, registerDrain } from '../../common/drain/drain';
|
|
11
10
|
import { onWindowLoad } from '../../common/window/load';
|
|
12
11
|
import { isBrowserScope } from '../../common/constants/runtime';
|
|
@@ -15,6 +14,7 @@ import { SUPPORTABILITY_METRIC_CHANNEL } from '../../features/metrics/constants'
|
|
|
15
14
|
import { gosCDN } from '../../common/window/nreum';
|
|
16
15
|
import { apiMethods, asyncApiMethods } from './api-methods';
|
|
17
16
|
import { SR_EVENT_EMITTER_TYPES } from '../../features/session_replay/constants';
|
|
17
|
+
import { now } from '../../common/timing/now';
|
|
18
18
|
export function setTopLevelCallers() {
|
|
19
19
|
const nr = gosCDN();
|
|
20
20
|
apiMethods.forEach(f => {
|
|
@@ -5,7 +5,6 @@ import { configure } from './configure/configure';
|
|
|
5
5
|
// core files
|
|
6
6
|
import { Aggregator } from '../common/aggregate/aggregator';
|
|
7
7
|
import { setNREUMInitializedAgent } from '../common/window/nreum';
|
|
8
|
-
import { generateRandomHexString } from '../common/ids/unique-id';
|
|
9
8
|
import { getConfiguration, getConfigurationValue, getInfo, getLoaderConfig, getRuntime } from '../common/config/config';
|
|
10
9
|
import { FEATURE_NAMES } from './features/features';
|
|
11
10
|
import { warn } from '../common/util/console';
|
|
@@ -23,15 +22,13 @@ export class MicroAgent extends AgentBase {
|
|
|
23
22
|
* @param {Object} options - Specifies features and runtime configuration,
|
|
24
23
|
* @param {string=} agentIdentifier - The optional unique ID of the agent.
|
|
25
24
|
*/
|
|
26
|
-
constructor(options) {
|
|
27
|
-
|
|
28
|
-
super();
|
|
29
|
-
this.agentIdentifier = agentIdentifier;
|
|
25
|
+
constructor(options, agentIdentifier) {
|
|
26
|
+
super(agentIdentifier);
|
|
30
27
|
this.sharedAggregator = new Aggregator({
|
|
31
28
|
agentIdentifier: this.agentIdentifier
|
|
32
29
|
});
|
|
33
30
|
this.features = {};
|
|
34
|
-
setNREUMInitializedAgent(agentIdentifier, this);
|
|
31
|
+
setNREUMInitializedAgent(this.agentIdentifier, this);
|
|
35
32
|
configure(this, {
|
|
36
33
|
...options,
|
|
37
34
|
runtime: {
|
|
@@ -46,7 +43,7 @@ export class MicroAgent extends AgentBase {
|
|
|
46
43
|
* @param {string|string[]|undefined} name The feature name(s) to start. If no name(s) are passed, all features will be started
|
|
47
44
|
*/
|
|
48
45
|
this.start = features => this.run(features);
|
|
49
|
-
this.run(nonAutoFeatures.filter(featureName => getConfigurationValue(agentIdentifier, "".concat(featureName, ".autoStart"))));
|
|
46
|
+
this.run(nonAutoFeatures.filter(featureName => getConfigurationValue(this.agentIdentifier, "".concat(featureName, ".autoStart"))));
|
|
50
47
|
}
|
|
51
48
|
get config() {
|
|
52
49
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../../../src/common/config/state/runtime.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../../../src/common/config/state/runtime.js"],"names":[],"mappings":"AAgCA,yCAIC;AAED,oDAKC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"harvest.d.ts","sourceRoot":"","sources":["../../../../src/common/harvest/harvest.js"],"names":[],"mappings":"AAsBA;;;;;;GAMG;AACH;IAII,0BAA2H;IAC3H,uBAAoD;IAEpD,YAAiB;IAGnB;;;;;OAKG;IACH,aAFW,eAAe,WAWzB;IAED;;;OAGG;IACH,YAFW,eAAe,WAMzB;IAED;;;OAGG;IACH,wBAFW,eAAe,WAMzB;IAED;;;;;;OAMG;IACH,gGAJW,eAAe,GACb,OAAO,CAsFnB;IAGD,iCAoBC;IAED;;;;;;;OAOG;IACH,wBALW,yBAAyB,WACzB,6BAA6B,GAE3B,cAAc,CA2B1B;IAED;;;;;;;OAOG;IACH,uBAHW,cAAc,GACZ,cAAc,CAuB1B;IAED;;;;;OAKG;IACH,aAHW,yBAAyB,YACzB,sBAAsB,QAQhC;CACF;8BAvPY,OAAO,YAAY,EAAE,eAAe;wCACpC,OAAO,YAAY,EAAE,yBAAyB;6BAC9C,OAAO,YAAY,EAAE,cAAc;qCACnC,OAAO,YAAY,EAAE,sBAAsB;4CAC3C,OAAO,YAAY,EAAE,6BAA6B;
|
|
1
|
+
{"version":3,"file":"harvest.d.ts","sourceRoot":"","sources":["../../../../src/common/harvest/harvest.js"],"names":[],"mappings":"AAsBA;;;;;;GAMG;AACH;IAII,0BAA2H;IAC3H,uBAAoD;IAEpD,YAAiB;IAGnB;;;;;OAKG;IACH,aAFW,eAAe,WAWzB;IAED;;;OAGG;IACH,YAFW,eAAe,WAMzB;IAED;;;OAGG;IACH,wBAFW,eAAe,WAMzB;IAED;;;;;;OAMG;IACH,gGAJW,eAAe,GACb,OAAO,CAsFnB;IAGD,iCAoBC;IAED;;;;;;;OAOG;IACH,wBALW,yBAAyB,WACzB,6BAA6B,GAE3B,cAAc,CA2B1B;IAED;;;;;;;OAOG;IACH,uBAHW,cAAc,GACZ,cAAc,CAuB1B;IAED;;;;;OAKG;IACH,aAHW,yBAAyB,YACzB,sBAAsB,QAQhC;CACF;8BAvPY,OAAO,YAAY,EAAE,eAAe;wCACpC,OAAO,YAAY,EAAE,yBAAyB;6BAC9C,OAAO,YAAY,EAAE,cAAc;qCACnC,OAAO,YAAY,EAAE,sBAAsB;4CAC3C,OAAO,YAAY,EAAE,6BAA6B;8BAbjC,2BAA2B;2BAF9B,mBAAmB"}
|
|
@@ -4,20 +4,21 @@
|
|
|
4
4
|
* to the harvested data event offset time.
|
|
5
5
|
*/
|
|
6
6
|
export class TimeKeeper {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
get
|
|
7
|
+
get ready(): number;
|
|
8
|
+
get originTime(): number;
|
|
9
|
+
get correctedOriginTime(): number;
|
|
10
10
|
/**
|
|
11
11
|
* Process a rum request to calculate NR server time.
|
|
12
12
|
* @param rumRequest {XMLHttpRequest} The xhr for the rum request
|
|
13
|
-
* @param
|
|
13
|
+
* @param startTime {number} The start time of the RUM request
|
|
14
|
+
* @param endTime {number} The end time of the RUM request
|
|
14
15
|
*/
|
|
15
|
-
processRumRequest(rumRequest: XMLHttpRequest,
|
|
16
|
+
processRumRequest(rumRequest: XMLHttpRequest, startTime: number, endTime: number): void;
|
|
16
17
|
/**
|
|
17
18
|
* Converts a page origin relative time to an absolute timestamp
|
|
18
19
|
* corrected to NR server time.
|
|
19
20
|
* @param relativeTime {number} The relative time of the event in milliseconds
|
|
20
|
-
* @returns {number}
|
|
21
|
+
* @returns {number} Corrected unix/epoch timestamp
|
|
21
22
|
*/
|
|
22
23
|
convertRelativeTimestamp(relativeTime: number): number;
|
|
23
24
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"time-keeper.d.ts","sourceRoot":"","sources":["../../../../src/common/timing/time-keeper.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"time-keeper.d.ts","sourceRoot":"","sources":["../../../../src/common/timing/time-keeper.js"],"names":[],"mappings":"AAEA;;;;GAIG;AACH;IA+BE,oBAEC;IAED,yBAEC;IAED,kCAEC;IAED;;;;;OAKG;IACH,8BAJsB,cAAc,aACf,MAAM,WACR,MAAM,QAoBxB;IAED;;;;;OAKG;IACH,uCAHwB,MAAM,GACjB,MAAM,CAIlB;IAED;;;;OAIG;IACH,oCAHqB,MAAM,GACf,MAAM,CAIjB;;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vital-metric.d.ts","sourceRoot":"","sources":["../../../../src/common/vitals/vital-metric.js"],"names":[],"mappings":"AAAA;IAIE,4CAIC;IAND,eAAY;IAGV,UAAgB;IAChB,UAAe;IACf,oBAAwF;IAG1F
|
|
1
|
+
{"version":3,"file":"vital-metric.d.ts","sourceRoot":"","sources":["../../../../src/common/vitals/vital-metric.js"],"names":[],"mappings":"AAAA;IAIE,4CAIC;IAND,eAAY;IAGV,UAAgB;IAChB,UAAe;IACf,oBAAwF;IAG1F;;;aAgBC;IAED,mBAMC;IAED,uBAEC;IAED,uEAMC;;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/features/ajax/aggregate/index.js"],"names":[],"mappings":"AAkBA;IACE,2BAAiC;IACjC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/features/ajax/aggregate/index.js"],"names":[],"mappings":"AAkBA;IACE,2BAAiC;IACjC,mDAmPC;IAvNC,uFAAwB;IACxB;;;;eAAoC;IACpC;;;MAA2E;CAsN9E;8BA1P6B,4BAA4B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/features/ajax/instrument/index.js"],"names":[],"mappings":"AA0BA;IACE,2BAAiC;IACjC,mEAqCC;IA/BC,mBAAiC;IAEjC,4EAAkF;CA8BrF;+
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/features/ajax/instrument/index.js"],"names":[],"mappings":"AA0BA;IACE,2BAAiC;IACjC,mEAqCC;IA/BC,mBAAiC;IAEjC,4EAAkF;CA8BrF;+BApD8B,6BAA6B;mBAFzC,uBAAuB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/features/jserrors/aggregate/index.js"],"names":[],"mappings":"AAyBA;;GAEG;AAEH;IACE,2BAAiC;IACjC,mDAgCC;IA7BC,kBAAuB;IACvB,eAAoB;IACpB,qBAA0B;IAC1B,2BAAgC;IAChC,mCAA4B;IAC5B,qBAAwB;IA0B1B;;;MAoBC;IAED,qCAWC;IAED,8BAEC;IAED,oEAMC;IAED;;;;;;OAMG;IACH,qCAHW,SAAS,GACP,MAAM,CAgBlB;IAED,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/features/jserrors/aggregate/index.js"],"names":[],"mappings":"AAyBA;;GAEG;AAEH;IACE,2BAAiC;IACjC,mDAgCC;IA7BC,kBAAuB;IACvB,eAAoB;IACpB,qBAA0B;IAC1B,2BAAgC;IAChC,mCAA4B;IAC5B,qBAAwB;IA0B1B;;;MAoBC;IAED,qCAWC;IAED,8BAEC;IAED,oEAMC;IAED;;;;;;OAMG;IACH,qCAHW,SAAS,GACP,MAAM,CAgBlB;IAED,4EAuFC;IA4BD,yDA6BC;IAED,qFAOC;;CACF;wBAvQY,OAAO,0BAA0B,EAAE,SAAS;8BAN3B,4BAA4B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/features/jserrors/instrument/index.js"],"names":[],"mappings":"AAeA;IACE,2BAAiC;IAIjC,mEA4CC;IAvCG,2CAA0C;IAqC5C,yBAA+B;;CAoFlC;+
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/features/jserrors/instrument/index.js"],"names":[],"mappings":"AAeA;IACE,2BAAiC;IAIjC,mEA4CC;IAvCG,2CAA0C;IAqC5C,yBAA+B;;CAoFlC;+BA5I8B,6BAA6B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/features/page_action/aggregate/index.js"],"names":[],"mappings":"AAgBA;IACE,2BAAiC;IACjC,mDA2BC;IAzBC,wBAA0B;IAC1B,wBAAsL;IACtL,yBAA2E;IAC3E,gCAA4B;IAC5B,wCAA8B;IAE9B,cAAgB;IAEhB,SAAqD;IAmBvD;;;;;;;;MAkBC;IAED,qCAKC;IAGD,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/features/page_action/aggregate/index.js"],"names":[],"mappings":"AAgBA;IACE,2BAAiC;IACjC,mDA2BC;IAzBC,wBAA0B;IAC1B,wBAAsL;IACtL,yBAA2E;IAC3E,gCAA4B;IAC5B,wCAA8B;IAE9B,cAAgB;IAEhB,SAAqD;IAmBvD;;;;;;;;MAkBC;IAED,qCAKC;IAGD,wDAqCC;CACF;8BApG6B,4BAA4B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/features/page_view_event/aggregate/index.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/features/page_view_event/aggregate/index.js"],"names":[],"mappings":"AAoBA;IACE,2BAA2C;IAC3C,mDAoBC;IAjBC,wBAAwB;IACxB,8BAA8B;IAC9B,8BAA8B;IAiBhC,gBAmGC;CACF;8BAvI6B,4BAA4B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/features/page_view_timing/aggregate/index.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/features/page_view_timing/aggregate/index.js"],"names":[],"mappings":"AAyBA;IACE,2BAAiC;IAMjC,mDA2CC;IAxCC,eAAiB;IACjB,mBAAqB;IACrB,4BAA+B;IAwCjC;;;OAGG;IACH,6BAFW,MAAM,QAOhB;IAED;;OAEG;IACH,uCAUC;IAED,mDAuBC;IAED,qCAKC;IAED,gDAWC;IAGD;;;;kBAWC;IAGD,8BAuBC;;CACF;8BA9K6B,4BAA4B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/features/page_view_timing/instrument/index.js"],"names":[],"mappings":"AAYA;IACE,2BAAiC;IACjC,mEAWC;CACF;+
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/features/page_view_timing/instrument/index.js"],"names":[],"mappings":"AAYA;IACE,2BAAiC;IACjC,mEAWC;CACF;+BAnB8B,6BAA6B"}
|
|
@@ -12,6 +12,8 @@ export class Aggregate extends AggregateBase {
|
|
|
12
12
|
mode: any;
|
|
13
13
|
/** set by BCS response */
|
|
14
14
|
entitled: boolean;
|
|
15
|
+
/** set at BCS response, stored in runtime */
|
|
16
|
+
timeKeeper: any;
|
|
15
17
|
recorder: any;
|
|
16
18
|
scheduler: HarvestScheduler;
|
|
17
19
|
errorNoticed: boolean;
|
|
@@ -34,6 +36,7 @@ export class Aggregate extends AggregateBase {
|
|
|
34
36
|
type: string;
|
|
35
37
|
app_id: any;
|
|
36
38
|
protocol_version: string;
|
|
39
|
+
timestamp: any;
|
|
37
40
|
attributes: string;
|
|
38
41
|
};
|
|
39
42
|
body: any;
|
|
@@ -44,6 +47,7 @@ export class Aggregate extends AggregateBase {
|
|
|
44
47
|
type: string;
|
|
45
48
|
app_id: any;
|
|
46
49
|
protocol_version: string;
|
|
50
|
+
timestamp: any;
|
|
47
51
|
attributes: string;
|
|
48
52
|
};
|
|
49
53
|
body: any;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/features/session_replay/aggregate/index.js"],"names":[],"mappings":"AA+BA;IACE,2BAAiC;IAEjC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/features/session_replay/aggregate/index.js"],"names":[],"mappings":"AA+BA;IACE,2BAAiC;IAEjC,8DAoHC;IAlHC,8GAA8G;IAC9G,wBAAgH;IAChH,iFAAiF;IACjF,qBAAwB;IAGxB,2CAA2C;IAC3C,sDAAwB;IACxB,6CAA6C;IAC7C,gDAAmB;IAGnB,UAAuD;IAEvD,0BAA0B;IAC1B,kBAAqB;IACrB,6CAA6C;IAC7C,gBAA2B;IAE3B,cAA8B;IA8B9B,4BAKQ;IAmBN,sBAAwB;IA2C5B,qBAWC;IAED;;;;;;;OAOG;IACH,iCALW,OAAO,cACP,OAAO,iBACP,OAAO,GACL,IAAI,CA6DhB;IAED,2BASC;IAED;;;;;;;;;;;;oBAoCC;IAED;;;;;;;;;;MAmEC;IAED,qCAOC;IAED;;;;OAIG;IACH,mCAKC;IAED,yDAAyD;IACzD,yBAUC;IAED,yCAGC;CACF;8BAtX6B,4BAA4B;iCAHzB,2CAA2C"}
|