@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.
Files changed (147) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/cjs/common/config/state/runtime.js +2 -1
  3. package/dist/cjs/common/constants/env.cdn.js +1 -1
  4. package/dist/cjs/common/constants/env.npm.js +1 -1
  5. package/dist/cjs/common/context/shared-context.js +1 -1
  6. package/dist/cjs/common/harvest/harvest.js +1 -1
  7. package/dist/cjs/common/timing/time-keeper.js +28 -28
  8. package/dist/cjs/common/vitals/cumulative-layout-shift.js +12 -5
  9. package/dist/cjs/common/vitals/first-contentful-paint.js +10 -6
  10. package/dist/cjs/common/vitals/first-input-delay.js +12 -10
  11. package/dist/cjs/common/vitals/first-paint.js +1 -2
  12. package/dist/cjs/common/vitals/interaction-to-next-paint.js +11 -7
  13. package/dist/cjs/common/vitals/largest-contentful-paint.js +19 -17
  14. package/dist/cjs/common/vitals/long-task.js +0 -1
  15. package/dist/cjs/common/vitals/time-to-first-byte.js +11 -6
  16. package/dist/cjs/common/vitals/vital-metric.js +1 -4
  17. package/dist/cjs/common/window/nreum.js +1 -1
  18. package/dist/cjs/features/ajax/aggregate/index.js +3 -2
  19. package/dist/cjs/features/ajax/instrument/index.js +1 -1
  20. package/dist/cjs/features/jserrors/aggregate/index.js +3 -2
  21. package/dist/cjs/features/jserrors/instrument/index.js +1 -1
  22. package/dist/cjs/features/page_action/aggregate/index.js +3 -2
  23. package/dist/cjs/features/page_view_event/aggregate/index.js +11 -5
  24. package/dist/cjs/features/page_view_timing/aggregate/index.js +21 -7
  25. package/dist/cjs/features/page_view_timing/instrument/index.js +1 -1
  26. package/dist/cjs/features/session_replay/aggregate/index.js +14 -9
  27. package/dist/cjs/features/session_replay/shared/recorder-events.js +9 -1
  28. package/dist/cjs/features/session_replay/shared/recorder.js +56 -12
  29. package/dist/cjs/features/session_trace/aggregate/index.js +1 -1
  30. package/dist/cjs/features/session_trace/instrument/index.js +1 -1
  31. package/dist/cjs/features/soft_navigations/aggregate/index.js +2 -2
  32. package/dist/cjs/features/soft_navigations/instrument/index.js +1 -1
  33. package/dist/cjs/features/spa/aggregate/index.js +19 -10
  34. package/dist/cjs/features/spa/instrument/index.js +1 -1
  35. package/dist/cjs/features/utils/feature-base.js +0 -2
  36. package/dist/cjs/loaders/agent-base.js +0 -2
  37. package/dist/cjs/loaders/agent.js +1 -1
  38. package/dist/cjs/loaders/api/api.js +1 -1
  39. package/dist/cjs/loaders/micro-agent.js +4 -7
  40. package/dist/esm/common/config/state/runtime.js +2 -1
  41. package/dist/esm/common/constants/env.cdn.js +1 -1
  42. package/dist/esm/common/constants/env.npm.js +1 -1
  43. package/dist/esm/common/context/shared-context.js +1 -1
  44. package/dist/esm/common/harvest/harvest.js +1 -1
  45. package/dist/esm/common/timing/time-keeper.js +28 -28
  46. package/dist/esm/common/vitals/cumulative-layout-shift.js +11 -4
  47. package/dist/esm/common/vitals/first-contentful-paint.js +9 -5
  48. package/dist/esm/common/vitals/first-input-delay.js +11 -9
  49. package/dist/esm/common/vitals/first-paint.js +1 -2
  50. package/dist/esm/common/vitals/interaction-to-next-paint.js +10 -6
  51. package/dist/esm/common/vitals/largest-contentful-paint.js +18 -16
  52. package/dist/esm/common/vitals/long-task.js +0 -1
  53. package/dist/esm/common/vitals/time-to-first-byte.js +10 -5
  54. package/dist/esm/common/vitals/vital-metric.js +1 -4
  55. package/dist/esm/common/window/nreum.js +1 -1
  56. package/dist/esm/features/ajax/aggregate/index.js +3 -2
  57. package/dist/esm/features/ajax/instrument/index.js +1 -1
  58. package/dist/esm/features/jserrors/aggregate/index.js +3 -2
  59. package/dist/esm/features/jserrors/instrument/index.js +1 -1
  60. package/dist/esm/features/page_action/aggregate/index.js +3 -2
  61. package/dist/esm/features/page_view_event/aggregate/index.js +11 -5
  62. package/dist/esm/features/page_view_timing/aggregate/index.js +21 -7
  63. package/dist/esm/features/page_view_timing/instrument/index.js +1 -1
  64. package/dist/esm/features/session_replay/aggregate/index.js +14 -9
  65. package/dist/esm/features/session_replay/shared/recorder-events.js +9 -1
  66. package/dist/esm/features/session_replay/shared/recorder.js +56 -12
  67. package/dist/esm/features/session_trace/aggregate/index.js +1 -1
  68. package/dist/esm/features/session_trace/instrument/index.js +1 -1
  69. package/dist/esm/features/soft_navigations/aggregate/index.js +2 -2
  70. package/dist/esm/features/soft_navigations/instrument/index.js +1 -1
  71. package/dist/esm/features/spa/aggregate/index.js +19 -10
  72. package/dist/esm/features/spa/instrument/index.js +1 -1
  73. package/dist/esm/features/utils/feature-base.js +0 -2
  74. package/dist/esm/loaders/agent-base.js +0 -2
  75. package/dist/esm/loaders/agent.js +1 -1
  76. package/dist/esm/loaders/api/api.js +1 -1
  77. package/dist/esm/loaders/micro-agent.js +4 -7
  78. package/dist/types/common/config/state/runtime.d.ts.map +1 -1
  79. package/dist/types/common/harvest/harvest.d.ts.map +1 -1
  80. package/dist/types/common/timing/time-keeper.d.ts +7 -6
  81. package/dist/types/common/timing/time-keeper.d.ts.map +1 -1
  82. package/dist/types/common/vitals/vital-metric.d.ts +1 -2
  83. package/dist/types/common/vitals/vital-metric.d.ts.map +1 -1
  84. package/dist/types/features/ajax/aggregate/index.d.ts.map +1 -1
  85. package/dist/types/features/ajax/instrument/index.d.ts.map +1 -1
  86. package/dist/types/features/jserrors/aggregate/index.d.ts.map +1 -1
  87. package/dist/types/features/jserrors/instrument/index.d.ts.map +1 -1
  88. package/dist/types/features/page_action/aggregate/index.d.ts.map +1 -1
  89. package/dist/types/features/page_view_event/aggregate/index.d.ts.map +1 -1
  90. package/dist/types/features/page_view_timing/aggregate/index.d.ts.map +1 -1
  91. package/dist/types/features/page_view_timing/instrument/index.d.ts.map +1 -1
  92. package/dist/types/features/session_replay/aggregate/index.d.ts +4 -0
  93. package/dist/types/features/session_replay/aggregate/index.d.ts.map +1 -1
  94. package/dist/types/features/session_replay/shared/recorder-events.d.ts +8 -0
  95. package/dist/types/features/session_replay/shared/recorder-events.d.ts.map +1 -1
  96. package/dist/types/features/session_replay/shared/recorder.d.ts +17 -1
  97. package/dist/types/features/session_replay/shared/recorder.d.ts.map +1 -1
  98. package/dist/types/features/session_trace/aggregate/index.d.ts.map +1 -1
  99. package/dist/types/features/session_trace/instrument/index.d.ts.map +1 -1
  100. package/dist/types/features/soft_navigations/instrument/index.d.ts.map +1 -1
  101. package/dist/types/features/spa/aggregate/index.d.ts +0 -2
  102. package/dist/types/features/spa/aggregate/index.d.ts.map +1 -1
  103. package/dist/types/features/utils/feature-base.d.ts +0 -1
  104. package/dist/types/features/utils/feature-base.d.ts.map +1 -1
  105. package/dist/types/loaders/agent-base.d.ts +0 -2
  106. package/dist/types/loaders/agent-base.d.ts.map +1 -1
  107. package/dist/types/loaders/micro-agent.d.ts.map +1 -1
  108. package/package.json +1 -1
  109. package/src/common/config/state/runtime.js +2 -1
  110. package/src/common/context/__mocks__/shared-context.js +3 -0
  111. package/src/common/context/shared-context.js +1 -1
  112. package/src/common/harvest/harvest.js +1 -1
  113. package/src/common/timing/__mocks__/time-keeper.js +2 -0
  114. package/src/common/timing/time-keeper.js +30 -31
  115. package/src/common/vitals/cumulative-layout-shift.js +10 -4
  116. package/src/common/vitals/first-contentful-paint.js +9 -4
  117. package/src/common/vitals/first-input-delay.js +11 -6
  118. package/src/common/vitals/first-paint.js +1 -1
  119. package/src/common/vitals/interaction-to-next-paint.js +10 -3
  120. package/src/common/vitals/largest-contentful-paint.js +19 -15
  121. package/src/common/vitals/long-task.js +0 -1
  122. package/src/common/vitals/time-to-first-byte.js +5 -4
  123. package/src/common/vitals/vital-metric.js +2 -4
  124. package/src/common/window/nreum.js +1 -1
  125. package/src/features/ajax/aggregate/index.js +3 -2
  126. package/src/features/ajax/instrument/index.js +1 -1
  127. package/src/features/jserrors/aggregate/index.js +3 -2
  128. package/src/features/jserrors/instrument/index.js +1 -1
  129. package/src/features/page_action/aggregate/index.js +3 -2
  130. package/src/features/page_view_event/aggregate/index.js +13 -4
  131. package/src/features/page_view_timing/aggregate/index.js +16 -6
  132. package/src/features/page_view_timing/instrument/index.js +1 -1
  133. package/src/features/session_replay/aggregate/index.js +13 -9
  134. package/src/features/session_replay/shared/recorder-events.js +6 -1
  135. package/src/features/session_replay/shared/recorder.js +33 -9
  136. package/src/features/session_trace/aggregate/index.js +1 -1
  137. package/src/features/session_trace/instrument/index.js +1 -1
  138. package/src/features/soft_navigations/aggregate/index.js +2 -2
  139. package/src/features/soft_navigations/instrument/index.js +1 -1
  140. package/src/features/spa/aggregate/index.js +19 -8
  141. package/src/features/spa/instrument/index.js +1 -1
  142. package/src/features/utils/feature-base.js +0 -3
  143. package/src/loaders/agent-base.js +0 -2
  144. package/src/loaders/agent.js +1 -1
  145. package/src/loaders/api/api.js +1 -1
  146. package/src/loaders/micro-agent.js +4 -6
  147. 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 => e.__serialized).join(','), "]")));
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 || agentOffset + relativeNow;
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 = new RecorderEvents();
13
+ #events;
14
14
  /** Backlog used for a 2-part sliding window to guarantee a 15-30s buffer window */
15
- #backloggedEvents = new RecorderEvents();
15
+ #backloggedEvents;
16
16
  /** array of recorder events -- Will be filled only if forced harvest was triggered and harvester does not exist */
17
- #preloaded = [new RecorderEvents()];
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) return {
38
- ...this.#preloaded[0],
39
- type: 'preloaded'
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: [...this.#backloggedEvents.events, ...this.#events.events].filter(x => x),
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
- this.#events = new RecorderEvents();
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
- entries
29
+ attrs
30
30
  } = _ref2;
31
- const loadEventTime = entries[0].loadEventEnd;
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: getRuntime(agentIdentifier).origin,
52
- lastSeenUrl: getRuntime(agentIdentifier).origin,
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 = this.scheduler = new HarvestScheduler('events', {
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
- this.scheduler.harvest.on('events', onHarvestStarted);
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]) this[SPA_NODE].dt = dtPayload;
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.scheduleHarvest(0);
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 initial the agent. Could not determine the runtime environment.');
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
- let agentIdentifier = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : generateRandomHexString(16);
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":"AA+BA,yCAIC;AAED,oDAKC"}
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;8BAZjC,2BAA2B;2BAF9B,mBAAmB"}
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
- static getTimeKeeperByAgentIdentifier(agentIdentifier: any): any;
8
- constructor(agent: any);
9
- get correctedPageOriginTime(): number;
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 rumRequestUrl {string} The full url of the rum request
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, rumRequestUrl: string): void;
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} The correct timestamp as a unix/epoch timestamp value
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":"AAIA;;;;GAIG;AACH;IAoBE,iEAKC;IATD,wBAEC;IASD,sCAEC;IAED;;;;OAIG;IACH,8BAHsB,cAAc,iBACX,MAAM,QAgC9B;IAED;;;;;OAKG;IACH,uCAHwB,MAAM,GACjB,MAAM,CAIlB;IAED;;;;OAIG;IACH,oCAHqB,MAAM,GACf,MAAM,CAIjB;;CACF"}
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"}
@@ -4,9 +4,8 @@ export class VitalMetric {
4
4
  name: any;
5
5
  attrs: {};
6
6
  roundingMethod: any;
7
- update({ value, entries, attrs }: {
7
+ update({ value, attrs }: {
8
8
  value: any;
9
- entries?: any[] | undefined;
10
9
  attrs?: {} | undefined;
11
10
  }): void;
12
11
  get current(): any;
@@ -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;;;;aAiBC;IAED,mBAOC;IAED,uBAEC;IAED,uEAMC;;CACF"}
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,mDAkPC;IAvNC,uFAAwB;IACxB;;;;eAAoC;IACpC;;;MAA2E;CAsN9E;8BAzP6B,4BAA4B"}
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;+BAnD8B,6BAA6B;mBAFzC,uBAAuB"}
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,4EAsFC;IA4BD,yDA6BC;IAED,qFAOC;;CACF;wBAtQY,OAAO,0BAA0B,EAAE,SAAS;8BAL3B,4BAA4B"}
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;+BA3I8B,6BAA6B"}
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,wDAoCC;CACF;8BAnG6B,4BAA4B"}
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":"AAkBA;IACE,2BAA2C;IAC3C,mDAoBC;IAjBC,wBAAwB;IACxB,8BAA8B;IAC9B,8BAA8B;IAiBhC,gBA4FC;CACF;8BA9H6B,4BAA4B"}
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":"AAuBA;IACE,2BAAiC;IAMjC,mDAoCC;IAjCC,eAAiB;IACjB,mBAAqB;IACrB,4BAA+B;IAiCjC;;;OAGG;IACH,6BAFW,MAAM,QAOhB;IAED;;OAEG;IACH,uCAUC;IAED,mDAsBC;IAED,qCAKC;IAED,gDAWC;IAGD;;;;kBAWC;IAGD,8BAuBC;;CACF;8BApK6B,4BAA4B"}
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;+BAlB8B,6BAA6B"}
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,8DAkHC;IAhHC,8GAA8G;IAC9G,wBAAgH;IAChH,iFAAiF;IACjF,qBAAwB;IAGxB,2CAA2C;IAC3C,sDAAwB;IACxB,6CAA6C;IAC7C,gDAAmB;IAGnB,UAAuD;IAEvD,0BAA0B;IAC1B,kBAAqB;IAErB,cAA8B;IA8B9B,4BAKQ;IAmBN,sBAAwB;IA2C5B,qBAWC;IAED;;;;;;;OAOG;IACH,iCALW,OAAO,cACP,OAAO,iBACP,OAAO,GACL,IAAI,CA4DhB;IAED,2BASC;IAED;;;;;;;;;;;oBAiCC;IAED;;;;;;;;;MAqEC;IAED,qCAOC;IAED;;;;OAIG;IACH,mCAKC;IAED,yDAAyD;IACzD,yBAUC;IAED,yCAGC;CACF;8BAlX6B,4BAA4B;iCAHzB,2CAA2C"}
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"}