@amplitude/session-replay-browser 1.31.7 → 1.32.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 (50) hide show
  1. package/lib/cjs/index.d.ts +1 -1
  2. package/lib/cjs/index.d.ts.map +1 -1
  3. package/lib/cjs/plugins/url-tracking-plugin.d.ts +21 -0
  4. package/lib/cjs/plugins/url-tracking-plugin.d.ts.map +1 -1
  5. package/lib/cjs/plugins/url-tracking-plugin.js +117 -104
  6. package/lib/cjs/plugins/url-tracking-plugin.js.map +1 -1
  7. package/lib/cjs/session-replay.d.ts +11 -1
  8. package/lib/cjs/session-replay.d.ts.map +1 -1
  9. package/lib/cjs/session-replay.js +108 -47
  10. package/lib/cjs/session-replay.js.map +1 -1
  11. package/lib/cjs/targeting/targeting-manager.d.ts +3 -2
  12. package/lib/cjs/targeting/targeting-manager.d.ts.map +1 -1
  13. package/lib/cjs/targeting/targeting-manager.js +16 -13
  14. package/lib/cjs/targeting/targeting-manager.js.map +1 -1
  15. package/lib/cjs/typings/session-replay.d.ts +2 -2
  16. package/lib/cjs/typings/session-replay.d.ts.map +1 -1
  17. package/lib/cjs/typings/session-replay.js.map +1 -1
  18. package/lib/cjs/version.d.ts +1 -1
  19. package/lib/cjs/version.js +1 -1
  20. package/lib/cjs/version.js.map +1 -1
  21. package/lib/esm/index.d.ts +1 -1
  22. package/lib/esm/index.d.ts.map +1 -1
  23. package/lib/esm/plugins/url-tracking-plugin.d.ts +21 -0
  24. package/lib/esm/plugins/url-tracking-plugin.d.ts.map +1 -1
  25. package/lib/esm/plugins/url-tracking-plugin.js +115 -103
  26. package/lib/esm/plugins/url-tracking-plugin.js.map +1 -1
  27. package/lib/esm/session-replay.d.ts +11 -1
  28. package/lib/esm/session-replay.d.ts.map +1 -1
  29. package/lib/esm/session-replay.js +109 -48
  30. package/lib/esm/session-replay.js.map +1 -1
  31. package/lib/esm/targeting/targeting-manager.d.ts +3 -2
  32. package/lib/esm/targeting/targeting-manager.d.ts.map +1 -1
  33. package/lib/esm/targeting/targeting-manager.js +16 -13
  34. package/lib/esm/targeting/targeting-manager.js.map +1 -1
  35. package/lib/esm/typings/session-replay.d.ts +2 -2
  36. package/lib/esm/typings/session-replay.d.ts.map +1 -1
  37. package/lib/esm/typings/session-replay.js.map +1 -1
  38. package/lib/esm/version.d.ts +1 -1
  39. package/lib/esm/version.js +1 -1
  40. package/lib/esm/version.js.map +1 -1
  41. package/lib/scripts/index-min.js +1 -1
  42. package/lib/scripts/index-min.js.gz +0 -0
  43. package/lib/scripts/index-min.js.map +1 -1
  44. package/lib/scripts/session-replay-browser-min.js +1 -1
  45. package/lib/scripts/session-replay-browser-min.js.gz +0 -0
  46. package/lib/scripts/session-replay-browser-min.js.map +1 -1
  47. package/lib/scripts/targeting-min.js +1 -1
  48. package/lib/scripts/targeting-min.js.gz +0 -0
  49. package/lib/scripts/targeting-min.js.map +1 -1
  50. package/package.json +3 -3
@@ -29,6 +29,10 @@ var SessionReplay = /** @class */ (function () {
29
29
  this.pageLeaveFns = [];
30
30
  // Cache the dynamically imported record function
31
31
  this.recordFunction = null;
32
+ /** Cleanup for URL change listener used to re-evaluate targeting on SPA route changes */
33
+ this.urlChangeCleanup = null;
34
+ /** Monotonic counter to ignore stale URL-change targeting results */
35
+ this.latestUrlChangeTargetingEvaluationId = 0;
32
36
  this.teardownEventListeners = function (teardown) {
33
37
  var globalScope = (0, analytics_core_1.getGlobalScope)();
34
38
  if (globalScope) {
@@ -68,13 +72,15 @@ var SessionReplay = /** @class */ (function () {
68
72
  fn(e);
69
73
  });
70
74
  };
71
- this.evaluateTargetingAndCapture = function (targetingParams, isInit, forceRestart) {
75
+ this.evaluateTargetingAndCapture = function (targetingParams, isInit, forceRestart, forceTargetingReevaluation) {
72
76
  if (isInit === void 0) { isInit = false; }
73
77
  if (forceRestart === void 0) { forceRestart = false; }
78
+ if (forceTargetingReevaluation === void 0) { forceTargetingReevaluation = false; }
74
79
  return tslib_1.__awaiter(_this, void 0, void 0, function () {
75
- var eventForTargeting, _a;
76
- return tslib_1.__generator(this, function (_b) {
77
- switch (_b.label) {
80
+ var targetingConfig, shouldReEvaluate, urlChangeEvaluationId, eventForTargeting, pageUrl, pageForTargeting, targetingMatch;
81
+ var _a, _b, _c, _d, _e, _f;
82
+ return tslib_1.__generator(this, function (_g) {
83
+ switch (_g.label) {
78
84
  case 0:
79
85
  if (!this.identifiers || !this.identifiers.sessionId || !this.config) {
80
86
  if (this.identifiers && !this.identifiers.sessionId) {
@@ -97,48 +103,59 @@ var SessionReplay = /** @class */ (function () {
97
103
  }
98
104
  // Store targeting parameters for use in getShouldRecord
99
105
  this.lastTargetingParams = targetingParams;
100
- if (!(this.config.targetingConfig && !this.sessionTargetingMatch)) return [3 /*break*/, 2];
106
+ targetingConfig = this.config.targetingConfig;
107
+ shouldReEvaluate = targetingConfig && !this.sessionTargetingMatch;
108
+ if (!shouldReEvaluate) return [3 /*break*/, 2];
109
+ urlChangeEvaluationId = forceTargetingReevaluation ? this.latestUrlChangeTargetingEvaluationId : undefined;
101
110
  eventForTargeting = targetingParams.event;
102
111
  if (eventForTargeting &&
103
112
  Object.values(analytics_core_1.SpecialEventType).includes(eventForTargeting.event_type)) {
104
113
  eventForTargeting = undefined;
105
114
  }
106
- // We're setting this on this class because fetching the value from idb
107
- // is async, we need to access this value synchronously (for record
108
- // and for getSessionReplayProperties - both synchronous fns)
109
- _a = this;
115
+ pageUrl = (_e = (_b = (_a = targetingParams.page) === null || _a === void 0 ? void 0 : _a.url) !== null && _b !== void 0 ? _b : (_d = (_c = (0, analytics_core_1.getGlobalScope)()) === null || _c === void 0 ? void 0 : _c.location) === null || _d === void 0 ? void 0 : _d.href) !== null && _e !== void 0 ? _e : '';
116
+ pageForTargeting = (_f = targetingParams.page) !== null && _f !== void 0 ? _f : (pageUrl !== '' ? { url: pageUrl } : undefined);
110
117
  return [4 /*yield*/, (0, targeting_manager_1.evaluateTargetingAndStore)({
111
118
  sessionId: this.identifiers.sessionId,
112
- targetingConfig: this.config.targetingConfig,
119
+ targetingConfig: targetingConfig,
113
120
  loggerProvider: this.loggerProvider,
114
121
  apiKey: this.config.apiKey,
115
- targetingParams: { userProperties: targetingParams.userProperties, event: eventForTargeting },
122
+ targetingParams: {
123
+ userProperties: targetingParams.userProperties,
124
+ event: eventForTargeting,
125
+ page: pageForTargeting,
126
+ },
127
+ urlChange: forceTargetingReevaluation,
116
128
  })];
117
129
  case 1:
118
- // We're setting this on this class because fetching the value from idb
119
- // is async, we need to access this value synchronously (for record
120
- // and for getSessionReplayProperties - both synchronous fns)
121
- _a.sessionTargetingMatch = _b.sent();
122
- // Log the targeting config to debug
130
+ targetingMatch = _g.sent();
131
+ if (forceTargetingReevaluation &&
132
+ urlChangeEvaluationId !== undefined &&
133
+ urlChangeEvaluationId !== this.latestUrlChangeTargetingEvaluationId) {
134
+ this.loggerProvider.debug("Ignoring stale URL-change targeting result #".concat(urlChangeEvaluationId, "; latest is #").concat(this.latestUrlChangeTargetingEvaluationId, "."));
135
+ return [2 /*return*/];
136
+ }
137
+ // Keep targeting match monotonic within a session: once true, always true.
138
+ // This avoids races where an older in-flight evaluation resolves false after
139
+ // a newer evaluation already resolved true.
140
+ this.sessionTargetingMatch = this.sessionTargetingMatch || targetingMatch;
123
141
  this.loggerProvider.debug(JSON.stringify({
124
142
  name: 'targeted replay capture config',
125
143
  sessionTargetingMatch: this.sessionTargetingMatch,
126
144
  event: eventForTargeting,
127
145
  targetingParams: targetingParams,
128
146
  }, null, 2));
129
- _b.label = 2;
147
+ _g.label = 2;
130
148
  case 2:
131
149
  if (!isInit) return [3 /*break*/, 3];
132
150
  void this.initialize(true);
133
151
  return [3 /*break*/, 5];
134
152
  case 3:
135
153
  if (!(forceRestart || !this.recordCancelCallback)) return [3 /*break*/, 5];
136
- // Only call recordEvents if we're not already recording, unless forceRestart is true
137
154
  this.loggerProvider.log('Recording events for session due to forceRestart or no ongoing recording.');
138
155
  return [4 /*yield*/, this.recordEvents()];
139
156
  case 4:
140
- _b.sent();
141
- _b.label = 5;
157
+ _g.sent();
158
+ _g.label = 5;
142
159
  case 5: return [2 /*return*/];
143
160
  }
144
161
  });
@@ -202,27 +219,64 @@ var SessionReplay = /** @class */ (function () {
202
219
  SessionReplay.prototype.init = function (apiKey, options) {
203
220
  return (0, analytics_core_1.returnWrapper)(this._init(apiKey, options));
204
221
  };
222
+ /**
223
+ * Subscribes to SPA URL changes via the URL tracking plugin and re-evaluates targeting so we
224
+ * can start/stop recording when the user navigates to a page that matches or no longer matches.
225
+ */
226
+ SessionReplay.prototype.setupUrlChangeListenerForTargeting = function () {
227
+ var _this = this;
228
+ var _a;
229
+ // If init() runs multiple times, remove the previous URL-change subscription first
230
+ // so we don't leak callbacks and trigger duplicate targeting evaluations.
231
+ (_a = this.urlChangeCleanup) === null || _a === void 0 ? void 0 : _a.call(this);
232
+ var globalScope = (0, analytics_core_1.getGlobalScope)();
233
+ if (!(globalScope === null || globalScope === void 0 ? void 0 : globalScope.location)) {
234
+ return;
235
+ }
236
+ var onUrlChange = function (href) {
237
+ var evaluationId = ++_this.latestUrlChangeTargetingEvaluationId;
238
+ void _this.evaluateTargetingAndCapture({
239
+ userProperties: {},
240
+ event: undefined,
241
+ page: { url: href },
242
+ }, false, false, true);
243
+ _this.loggerProvider.debug("Queued URL-change targeting re-evaluation #".concat(evaluationId, " for ").concat(href, "."));
244
+ };
245
+ var unsubscribe = url_tracking_plugin_1.subscribeToUrlChanges(globalScope, onUrlChange);
246
+ this.urlChangeCleanup = function () {
247
+ unsubscribe();
248
+ _this.urlChangeCleanup = null;
249
+ };
250
+ };
251
+ SessionReplay.prototype.getCurrentPageForTargeting = function () {
252
+ var _a, _b;
253
+ var currentUrl = (_b = (_a = (0, analytics_core_1.getGlobalScope)()) === null || _a === void 0 ? void 0 : _a.location) === null || _b === void 0 ? void 0 : _b.href;
254
+ return currentUrl != null ? { url: currentUrl } : undefined;
255
+ };
205
256
  SessionReplay.prototype._init = function (apiKey, options) {
206
- var _a, _b, _c, _d, _e, _f, _g;
257
+ var _a, _b, _c, _d, _e, _f, _g, _h;
207
258
  return tslib_1.__awaiter(this, void 0, void 0, function () {
208
- var _h, _j, joinedConfig, localConfig, remoteConfig, scrollWatcher, managers, storeType, rrwebEventManager, error_1, typedError, payloadBatcher, interactionEventManager, error_2, typedError, workerScript, globalScope, compressionScript, messenger;
209
- return tslib_1.__generator(this, function (_k) {
210
- switch (_k.label) {
259
+ var _j, _k, joinedConfig, localConfig, remoteConfig, scrollWatcher, managers, storeType, rrwebEventManager, error_1, typedError, payloadBatcher, interactionEventManager, error_2, typedError, workerScript, globalScope, compressionScript, messenger;
260
+ return tslib_1.__generator(this, function (_l) {
261
+ switch (_l.label) {
211
262
  case 0:
263
+ // Re-init should always tear down any previous URL-change subscription, even when the
264
+ // next config has no targeting config and we don't subscribe again.
265
+ (_a = this.urlChangeCleanup) === null || _a === void 0 ? void 0 : _a.call(this);
212
266
  this.loggerProvider = new logger_1.SafeLoggerProvider(options.loggerProvider || new analytics_core_1.Logger());
213
267
  Object.prototype.hasOwnProperty.call(options, 'logLevel') &&
214
268
  this.loggerProvider.enable(options.logLevel);
215
269
  this.identifiers = new identifiers_1.SessionIdentifiers({ sessionId: options.sessionId, deviceId: options.deviceId });
216
- _h = this;
270
+ _j = this;
217
271
  return [4 /*yield*/, (0, joined_config_1.createSessionReplayJoinedConfigGenerator)(apiKey, options)];
218
272
  case 1:
219
- _h.joinedConfigGenerator = _k.sent();
273
+ _j.joinedConfigGenerator = _l.sent();
220
274
  return [4 /*yield*/, this.joinedConfigGenerator.generateJoinedConfig()];
221
275
  case 2:
222
- _j = _k.sent(), joinedConfig = _j.joinedConfig, localConfig = _j.localConfig, remoteConfig = _j.remoteConfig;
276
+ _k = _l.sent(), joinedConfig = _k.joinedConfig, localConfig = _k.localConfig, remoteConfig = _k.remoteConfig;
223
277
  this.config = joinedConfig;
224
- this.setMetadata(options.sessionId, joinedConfig, localConfig, remoteConfig, (_a = options.version) === null || _a === void 0 ? void 0 : _a.version, version_1.VERSION, (_b = options.version) === null || _b === void 0 ? void 0 : _b.type);
225
- if (options.sessionId && ((_c = this.config.interactionConfig) === null || _c === void 0 ? void 0 : _c.enabled)) {
278
+ this.setMetadata(options.sessionId, joinedConfig, localConfig, remoteConfig, (_b = options.version) === null || _b === void 0 ? void 0 : _b.version, version_1.VERSION, (_c = options.version) === null || _c === void 0 ? void 0 : _c.type);
279
+ if (options.sessionId && ((_d = this.config.interactionConfig) === null || _d === void 0 ? void 0 : _d.enabled)) {
226
280
  scrollWatcher = scroll_1.ScrollWatcher.default({
227
281
  sessionId: options.sessionId,
228
282
  type: 'interaction',
@@ -233,48 +287,48 @@ var SessionReplay = /** @class */ (function () {
233
287
  }
234
288
  managers = [];
235
289
  storeType = this.config.storeType;
236
- if (storeType === 'idb' && !((_d = (0, analytics_core_1.getGlobalScope)()) === null || _d === void 0 ? void 0 : _d.indexedDB)) {
290
+ if (storeType === 'idb' && !((_e = (0, analytics_core_1.getGlobalScope)()) === null || _e === void 0 ? void 0 : _e.indexedDB)) {
237
291
  storeType = 'memory';
238
292
  this.loggerProvider.warn('Could not use preferred indexedDB storage, reverting to in memory option.');
239
293
  }
240
294
  this.loggerProvider.log("Using ".concat(storeType, " for event storage."));
241
- _k.label = 3;
295
+ _l.label = 3;
242
296
  case 3:
243
- _k.trys.push([3, 5, , 6]);
297
+ _l.trys.push([3, 5, , 6]);
244
298
  return [4 /*yield*/, (0, events_manager_1.createEventsManager)({
245
299
  config: this.config,
246
300
  type: 'replay',
247
301
  storeType: storeType,
248
302
  })];
249
303
  case 4:
250
- rrwebEventManager = _k.sent();
304
+ rrwebEventManager = _l.sent();
251
305
  managers.push({ name: 'replay', manager: rrwebEventManager });
252
306
  return [3 /*break*/, 6];
253
307
  case 5:
254
- error_1 = _k.sent();
308
+ error_1 = _l.sent();
255
309
  typedError = error_1;
256
310
  this.loggerProvider.warn("Error occurred while creating replay events manager: ".concat(typedError.toString()));
257
311
  return [3 /*break*/, 6];
258
312
  case 6:
259
- if (!((_e = this.config.interactionConfig) === null || _e === void 0 ? void 0 : _e.enabled)) return [3 /*break*/, 10];
313
+ if (!((_f = this.config.interactionConfig) === null || _f === void 0 ? void 0 : _f.enabled)) return [3 /*break*/, 10];
260
314
  payloadBatcher = this.config.interactionConfig.batch ? click_1.clickBatcher : click_1.clickNonBatcher;
261
- _k.label = 7;
315
+ _l.label = 7;
262
316
  case 7:
263
- _k.trys.push([7, 9, , 10]);
317
+ _l.trys.push([7, 9, , 10]);
264
318
  return [4 /*yield*/, (0, events_manager_1.createEventsManager)({
265
319
  config: this.config,
266
320
  type: 'interaction',
267
- minInterval: (_f = this.config.interactionConfig.trackEveryNms) !== null && _f !== void 0 ? _f : constants_1.INTERACTION_MIN_INTERVAL,
321
+ minInterval: (_g = this.config.interactionConfig.trackEveryNms) !== null && _g !== void 0 ? _g : constants_1.INTERACTION_MIN_INTERVAL,
268
322
  maxInterval: constants_1.INTERACTION_MAX_INTERVAL,
269
323
  payloadBatcher: payloadBatcher,
270
324
  storeType: storeType,
271
325
  })];
272
326
  case 8:
273
- interactionEventManager = _k.sent();
327
+ interactionEventManager = _l.sent();
274
328
  managers.push({ name: 'interaction', manager: interactionEventManager });
275
329
  return [3 /*break*/, 10];
276
330
  case 9:
277
- error_2 = _k.sent();
331
+ error_2 = _l.sent();
278
332
  typedError = error_2;
279
333
  this.loggerProvider.warn("Error occurred while creating interaction events manager: ".concat(typedError.toString()));
280
334
  return [3 /*break*/, 10];
@@ -289,27 +343,30 @@ var SessionReplay = /** @class */ (function () {
289
343
  if (!(this.config.useWebWorker && globalScope && globalScope.Worker)) return [3 /*break*/, 12];
290
344
  return [4 /*yield*/, Promise.resolve().then(function () { return tslib_1.__importStar(require('./worker')); })];
291
345
  case 11:
292
- compressionScript = (_k.sent()).compressionScript;
346
+ compressionScript = (_l.sent()).compressionScript;
293
347
  workerScript = compressionScript;
294
- _k.label = 12;
348
+ _l.label = 12;
295
349
  case 12:
296
350
  this.eventCompressor = new event_compressor_1.EventCompressor(this.eventsManager, this.config, this.getDeviceId(), workerScript);
297
351
  return [4 /*yield*/, this.initializeNetworkObservers()];
298
352
  case 13:
299
- _k.sent();
353
+ _l.sent();
300
354
  // Enable background capture when this page is opened by the Amplitude app
301
355
  // (window.opener exists). Uses the shared messenger singleton so that if
302
356
  // autocapture is also loaded, both share a single messenger and script load.
303
- if ((_g = (0, analytics_core_1.getGlobalScope)()) === null || _g === void 0 ? void 0 : _g.opener) {
357
+ if ((_h = (0, analytics_core_1.getGlobalScope)()) === null || _h === void 0 ? void 0 : _h.opener) {
304
358
  messenger = (0, analytics_core_1.getOrCreateWindowMessenger)();
305
359
  (0, analytics_core_1.enableBackgroundCapture)(messenger);
306
360
  messenger.setup(tslib_1.__assign({ logger: this.loggerProvider }, (this.config.serverZone && { endpoint: analytics_core_1.AMPLITUDE_ORIGINS_MAP[this.config.serverZone] })));
307
361
  }
308
362
  this.loggerProvider.log('Installing @amplitude/session-replay-browser.');
309
363
  this.teardownEventListeners(false);
310
- return [4 /*yield*/, this.evaluateTargetingAndCapture({ userProperties: options.userProperties }, true)];
364
+ return [4 /*yield*/, this.evaluateTargetingAndCapture({ userProperties: options.userProperties, page: this.getCurrentPageForTargeting() }, true)];
311
365
  case 14:
312
- _k.sent();
366
+ _l.sent();
367
+ if (this.config.targetingConfig) {
368
+ this.setupUrlChangeListenerForTargeting();
369
+ }
313
370
  return [2 /*return*/];
314
371
  }
315
372
  });
@@ -325,6 +382,8 @@ var SessionReplay = /** @class */ (function () {
325
382
  return tslib_1.__generator(this, function (_b) {
326
383
  switch (_b.label) {
327
384
  case 0:
385
+ // Invalidate any in-flight URL-change re-evaluations from the previous session.
386
+ this.latestUrlChangeTargetingEvaluationId++;
328
387
  this.sessionTargetingMatch = false;
329
388
  this.lastShouldRecordDecision = undefined; // Reset targeting decision for new session
330
389
  previousSessionId = this.identifiers && this.identifiers.sessionId;
@@ -344,7 +403,7 @@ var SessionReplay = /** @class */ (function () {
344
403
  _b.label = 2;
345
404
  case 2:
346
405
  if (!((_a = this.config) === null || _a === void 0 ? void 0 : _a.targetingConfig)) return [3 /*break*/, 4];
347
- return [4 /*yield*/, this.evaluateTargetingAndCapture({ userProperties: options === null || options === void 0 ? void 0 : options.userProperties }, false, true)];
406
+ return [4 /*yield*/, this.evaluateTargetingAndCapture({ userProperties: options === null || options === void 0 ? void 0 : options.userProperties, page: this.getCurrentPageForTargeting() }, false, true)];
348
407
  case 3:
349
408
  _b.sent();
350
409
  return [3 /*break*/, 6];
@@ -705,6 +764,8 @@ var SessionReplay = /** @class */ (function () {
705
764
  });
706
765
  };
707
766
  SessionReplay.prototype.shutdown = function () {
767
+ var _a;
768
+ (_a = this.urlChangeCleanup) === null || _a === void 0 ? void 0 : _a.call(this);
708
769
  this.teardownEventListeners(true);
709
770
  this.stopRecordingEvents();
710
771
  this.sendEvents();
@@ -1 +1 @@
1
- {"version":3,"file":"session-replay.js","sourceRoot":"","sources":["../../src/session-replay.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n getAnalyticsConnector,\n getGlobalScope,\n ILogger,\n Logger,\n LogLevel,\n returnWrapper,\n SpecialEventType,\n generateHashCode,\n isTimestampInSample,\n getOrCreateWindowMessenger,\n enableBackgroundCapture,\n AMPLITUDE_ORIGINS_MAP,\n} from '@amplitude/analytics-core';\n\n// Import only specific types to avoid pulling in the entire rrweb-types package\nimport { eventWithTime, EventType as RRWebEventType, scrollCallback } from '@amplitude/rrweb-types';\nimport { TargetingParameters } from '@amplitude/targeting';\nimport { createSessionReplayJoinedConfigGenerator } from './config/joined-config';\nimport {\n LoggingConfig,\n SessionReplayJoinedConfig,\n SessionReplayJoinedConfigGenerator,\n SessionReplayLocalConfig,\n SessionReplayMetadata,\n SessionReplayRemoteConfig,\n} from './config/types';\nimport {\n BLOCK_CLASS,\n CustomRRwebEvent,\n DEFAULT_SESSION_REPLAY_PROPERTY,\n INTERACTION_MAX_INTERVAL,\n INTERACTION_MIN_INTERVAL,\n MASK_TEXT_CLASS,\n SESSION_REPLAY_DEBUG_PROPERTY,\n} from './constants';\nimport { EventCompressor } from './events/event-compressor';\nimport { createEventsManager } from './events/events-manager';\nimport { MultiEventManager } from './events/multi-manager';\nimport { getDebugConfig, getPageUrl, getStorageSize, maskFn } from './helpers';\nimport { clickBatcher, ClickHandler, clickNonBatcher } from './hooks/click';\nimport { ScrollWatcher } from './hooks/scroll';\nimport { SessionIdentifiers } from './identifiers';\nimport { SafeLoggerProvider } from './logger';\nimport { evaluateTargetingAndStore } from './targeting/targeting-manager';\nimport {\n AmplitudeSessionReplay,\n SessionReplayEventsManager as AmplitudeSessionReplayEventsManager,\n DebugInfo,\n EventsManagerWithType,\n EventType,\n SessionIdentifiers as ISessionIdentifiers,\n SessionReplayOptions,\n} from './typings/session-replay';\nimport { VERSION } from './version';\n\n// Import only the type for NetworkRequestEvent to keep type safety\nimport type { NetworkObservers, NetworkRequestEvent } from './observers';\nimport { createUrlTrackingPlugin } from './plugins/url-tracking-plugin';\nimport type { RecordFunction } from './utils/rrweb';\n\ntype PageLeaveFn = (e: PageTransitionEvent | Event) => void;\n\nexport class SessionReplay implements AmplitudeSessionReplay {\n name = '@amplitude/session-replay-browser';\n config: SessionReplayJoinedConfig | undefined;\n joinedConfigGenerator: SessionReplayJoinedConfigGenerator | undefined;\n identifiers: ISessionIdentifiers | undefined;\n eventsManager?: AmplitudeSessionReplayEventsManager<'replay' | 'interaction', string>;\n loggerProvider: ILogger;\n recordCancelCallback: ReturnType<RecordFunction> | null = null;\n eventCount = 0;\n eventCompressor: EventCompressor | undefined;\n sessionTargetingMatch = false;\n private lastTargetingParams?: Pick<TargetingParameters, 'event' | 'userProperties'>;\n private lastShouldRecordDecision?: boolean;\n\n // Visible for testing only\n pageLeaveFns: PageLeaveFn[] = [];\n private scrollHook?: scrollCallback;\n private clickHandler?: ClickHandler;\n private networkObservers?: NetworkObservers;\n private metadata: SessionReplayMetadata | undefined;\n\n // Cache the dynamically imported record function\n private recordFunction: RecordFunction | null = null;\n\n constructor() {\n this.loggerProvider = new SafeLoggerProvider(new Logger());\n }\n\n init(apiKey: string, options: SessionReplayOptions) {\n return returnWrapper(this._init(apiKey, options));\n }\n\n private teardownEventListeners = (teardown: boolean) => {\n const globalScope = getGlobalScope();\n if (globalScope) {\n globalScope.removeEventListener('blur', this.blurListener);\n globalScope.removeEventListener('focus', this.focusListener);\n !teardown && globalScope.addEventListener('blur', this.blurListener);\n !teardown && globalScope.addEventListener('focus', this.focusListener);\n // prefer pagehide to unload events, this is the standard going forward. it is not\n // 100% reliable, but is bfcache-compatible.\n if (globalScope.self && 'onpagehide' in globalScope.self) {\n globalScope.removeEventListener('pagehide', this.pageLeaveListener);\n !teardown && globalScope.addEventListener('pagehide', this.pageLeaveListener);\n } else {\n // this has performance implications, but is the only way we can reliably send events\n // in browser that don't support pagehide.\n globalScope.removeEventListener('beforeunload', this.pageLeaveListener);\n !teardown && globalScope.addEventListener('beforeunload', this.pageLeaveListener);\n }\n }\n };\n\n protected async _init(apiKey: string, options: SessionReplayOptions) {\n this.loggerProvider = new SafeLoggerProvider(options.loggerProvider || new Logger());\n Object.prototype.hasOwnProperty.call(options, 'logLevel') &&\n this.loggerProvider.enable(options.logLevel as LogLevel);\n this.identifiers = new SessionIdentifiers({ sessionId: options.sessionId, deviceId: options.deviceId });\n this.joinedConfigGenerator = await createSessionReplayJoinedConfigGenerator(apiKey, options);\n const { joinedConfig, localConfig, remoteConfig } = await this.joinedConfigGenerator.generateJoinedConfig();\n this.config = joinedConfig;\n\n this.setMetadata(\n options.sessionId,\n joinedConfig,\n localConfig,\n remoteConfig,\n options.version?.version,\n VERSION,\n options.version?.type,\n );\n\n if (options.sessionId && this.config.interactionConfig?.enabled) {\n const scrollWatcher = ScrollWatcher.default(\n {\n sessionId: options.sessionId,\n type: 'interaction',\n },\n this.config,\n );\n this.pageLeaveFns = [scrollWatcher.send(this.getDeviceId.bind(this)).bind(scrollWatcher)];\n this.scrollHook = scrollWatcher.hook.bind(scrollWatcher);\n this.clickHandler = new ClickHandler(this.loggerProvider, scrollWatcher);\n }\n\n const managers: EventsManagerWithType<EventType, string>[] = [];\n let { storeType } = this.config;\n if (storeType === 'idb' && !getGlobalScope()?.indexedDB) {\n storeType = 'memory';\n this.loggerProvider.warn('Could not use preferred indexedDB storage, reverting to in memory option.');\n }\n this.loggerProvider.log(`Using ${storeType} for event storage.`);\n try {\n const rrwebEventManager = await createEventsManager<'replay'>({\n config: this.config,\n type: 'replay',\n storeType,\n });\n managers.push({ name: 'replay', manager: rrwebEventManager });\n } catch (error) {\n const typedError = error as Error;\n this.loggerProvider.warn(`Error occurred while creating replay events manager: ${typedError.toString()}`);\n }\n\n if (this.config.interactionConfig?.enabled) {\n const payloadBatcher = this.config.interactionConfig.batch ? clickBatcher : clickNonBatcher;\n try {\n const interactionEventManager = await createEventsManager<'interaction'>({\n config: this.config,\n type: 'interaction',\n minInterval: this.config.interactionConfig.trackEveryNms ?? INTERACTION_MIN_INTERVAL,\n maxInterval: INTERACTION_MAX_INTERVAL,\n payloadBatcher,\n storeType,\n });\n managers.push({ name: 'interaction', manager: interactionEventManager });\n } catch (error) {\n const typedError = error as Error;\n this.loggerProvider.warn(`Error occurred while creating interaction events manager: ${typedError.toString()}`);\n }\n }\n\n this.eventsManager = new MultiEventManager<'replay' | 'interaction', string>(...managers);\n // To prevent too many threads.\n if (this.eventCompressor) {\n this.eventCompressor.terminate();\n }\n\n let workerScript = undefined;\n const globalScope = getGlobalScope();\n if (this.config.useWebWorker && globalScope && globalScope.Worker) {\n const { compressionScript } = await import('./worker');\n\n workerScript = compressionScript;\n }\n\n this.eventCompressor = new EventCompressor(this.eventsManager, this.config, this.getDeviceId(), workerScript);\n\n await this.initializeNetworkObservers();\n\n // Enable background capture when this page is opened by the Amplitude app\n // (window.opener exists). Uses the shared messenger singleton so that if\n // autocapture is also loaded, both share a single messenger and script load.\n if (getGlobalScope()?.opener) {\n const messenger = getOrCreateWindowMessenger();\n enableBackgroundCapture(messenger);\n messenger.setup({\n logger: this.loggerProvider,\n ...(this.config.serverZone && { endpoint: AMPLITUDE_ORIGINS_MAP[this.config.serverZone] }),\n });\n }\n\n this.loggerProvider.log('Installing @amplitude/session-replay-browser.');\n\n this.teardownEventListeners(false);\n\n await this.evaluateTargetingAndCapture({ userProperties: options.userProperties }, true);\n }\n\n setSessionId(sessionId: string | number, deviceId?: string) {\n return returnWrapper(this.asyncSetSessionId(sessionId, deviceId));\n }\n\n async asyncSetSessionId(\n sessionId: string | number,\n deviceId?: string,\n options?: { userProperties?: { [key: string]: any } },\n ) {\n this.sessionTargetingMatch = false;\n this.lastShouldRecordDecision = undefined; // Reset targeting decision for new session\n\n const previousSessionId = this.identifiers && this.identifiers.sessionId;\n if (previousSessionId) {\n this.sendEvents(previousSessionId);\n }\n\n const deviceIdForReplayId = deviceId || this.getDeviceId();\n this.identifiers = new SessionIdentifiers({\n sessionId: sessionId,\n deviceId: deviceIdForReplayId,\n });\n\n // If there is no previous session id, SDK is being initialized for the first time,\n // and config was just fetched in initialization, so no need to fetch it a second time\n if (this.joinedConfigGenerator && previousSessionId) {\n const { joinedConfig } = await this.joinedConfigGenerator.generateJoinedConfig();\n this.config = joinedConfig;\n }\n\n if (this.config?.targetingConfig) {\n await this.evaluateTargetingAndCapture({ userProperties: options?.userProperties }, false, true);\n } else {\n await this.recordEvents();\n }\n }\n\n getSessionReplayProperties() {\n const config = this.config;\n const identifiers = this.identifiers;\n if (!config || !identifiers) {\n this.loggerProvider.warn('Session replay init has not been called, cannot get session replay properties.');\n return {};\n }\n\n const shouldRecord = this.getShouldRecord();\n let eventProperties: { [key: string]: string | null } = {};\n\n if (shouldRecord) {\n eventProperties = {\n [DEFAULT_SESSION_REPLAY_PROPERTY]: identifiers.sessionReplayId ? identifiers.sessionReplayId : null,\n };\n if (config.debugMode) {\n eventProperties[SESSION_REPLAY_DEBUG_PROPERTY] = JSON.stringify({\n appHash: generateHashCode(config.apiKey).toString(),\n });\n }\n }\n\n void this.addCustomRRWebEvent(\n CustomRRwebEvent.GET_SR_PROPS,\n {\n shouldRecord,\n eventProperties: eventProperties,\n },\n this.eventCount === 10,\n );\n if (this.eventCount === 10) {\n this.eventCount = 0;\n }\n this.eventCount++;\n\n return eventProperties;\n }\n\n blurListener = () => {\n this.sendEvents();\n };\n\n focusListener = () => {\n // Restart recording on focus to ensure that when user\n // switches tabs, we take a full snapshot\n void this.recordEvents(false);\n };\n\n /**\n * This is an instance member so that if init is called multiple times\n * it doesn't add another listener to the page leave event. This is to\n * prevent duplicate listener actions from firing.\n */\n private pageLeaveListener = (e: PageTransitionEvent | Event) => {\n this.pageLeaveFns.forEach((fn) => {\n fn(e);\n });\n };\n\n evaluateTargetingAndCapture = async (\n targetingParams: Pick<TargetingParameters, 'event' | 'userProperties'>,\n isInit = false,\n forceRestart = false,\n ) => {\n if (!this.identifiers || !this.identifiers.sessionId || !this.config) {\n if (this.identifiers && !this.identifiers.sessionId) {\n this.loggerProvider.log('Session ID has not been set yet, cannot evaluate targeting for Session Replay.');\n } else {\n this.loggerProvider.warn('Session replay init has not been called, cannot evaluate targeting.');\n }\n return;\n }\n\n // Handle cases where there's no targeting config\n if (!this.config.targetingConfig) {\n if (isInit) {\n this.loggerProvider.log('Targeting config has not been set yet, cannot evaluate targeting.');\n } else {\n this.loggerProvider.log('No targeting config set, skipping initialization/recording for event.');\n return;\n }\n }\n\n // Store targeting parameters for use in getShouldRecord\n this.lastTargetingParams = targetingParams;\n\n if (this.config.targetingConfig && !this.sessionTargetingMatch) {\n let eventForTargeting = targetingParams.event;\n if (\n eventForTargeting &&\n Object.values(SpecialEventType).includes(eventForTargeting.event_type as SpecialEventType)\n ) {\n eventForTargeting = undefined;\n }\n\n // We're setting this on this class because fetching the value from idb\n // is async, we need to access this value synchronously (for record\n // and for getSessionReplayProperties - both synchronous fns)\n this.sessionTargetingMatch = await evaluateTargetingAndStore({\n sessionId: this.identifiers.sessionId,\n targetingConfig: this.config.targetingConfig,\n loggerProvider: this.loggerProvider,\n apiKey: this.config.apiKey,\n targetingParams: { userProperties: targetingParams.userProperties, event: eventForTargeting },\n });\n\n // Log the targeting config to debug\n this.loggerProvider.debug(\n JSON.stringify(\n {\n name: 'targeted replay capture config',\n sessionTargetingMatch: this.sessionTargetingMatch,\n event: eventForTargeting,\n targetingParams: targetingParams,\n },\n null,\n 2,\n ),\n );\n }\n\n if (isInit) {\n void this.initialize(true);\n } else if (forceRestart || !this.recordCancelCallback) {\n // Only call recordEvents if we're not already recording, unless forceRestart is true\n this.loggerProvider.log('Recording events for session due to forceRestart or no ongoing recording.');\n await this.recordEvents();\n }\n };\n\n sendEvents(sessionId?: string | number) {\n const sessionIdToSend = sessionId || this.identifiers?.sessionId;\n const deviceId = this.getDeviceId();\n this.eventsManager &&\n sessionIdToSend &&\n deviceId &&\n this.eventsManager.sendCurrentSequenceEvents({ sessionId: sessionIdToSend, deviceId });\n }\n\n async initialize(shouldSendStoredEvents = false) {\n if (!this.identifiers?.sessionId) {\n this.loggerProvider.log(`Session is not being recorded due to lack of session id.`);\n return Promise.resolve();\n }\n\n const deviceId = this.getDeviceId();\n if (!deviceId) {\n this.loggerProvider.log(`Session is not being recorded due to lack of device id.`);\n return Promise.resolve();\n }\n this.eventsManager && shouldSendStoredEvents && void this.eventsManager.sendStoredEvents({ deviceId });\n\n return this.recordEvents();\n }\n\n shouldOptOut() {\n let identityStoreOptOut: boolean | undefined;\n if (this.config?.instanceName) {\n const identityStore = getAnalyticsConnector(this.config.instanceName).identityStore;\n identityStoreOptOut = identityStore.getIdentity().optOut;\n }\n\n return identityStoreOptOut !== undefined ? identityStoreOptOut : this.config?.optOut;\n }\n\n getShouldRecord() {\n if (!this.identifiers || !this.config || !this.identifiers.sessionId) {\n this.loggerProvider.warn(`Session is not being recorded due to lack of config, please call sessionReplay.init.`);\n return false;\n }\n\n if (!this.config.captureEnabled) {\n this.loggerProvider.log(\n `Session ${this.identifiers.sessionId} not being captured due to capture being disabled for project or because the remote config could not be fetched.`,\n );\n return false;\n }\n\n if (this.shouldOptOut()) {\n this.loggerProvider.log(`Opting session ${this.identifiers.sessionId} out of recording due to optOut config.`);\n return false;\n }\n\n let shouldRecord = false;\n let message = '';\n let matched = false;\n\n // If targetingConfig exists, we'll use the sessionTargetingMatch to determine whether to record\n // Otherwise, we'll evaluate the session against the overall sample rate\n if (this.config.targetingConfig) {\n if (!this.sessionTargetingMatch) {\n message = `Not capturing replays for session ${this.identifiers.sessionId} due to not matching targeting conditions.`;\n this.loggerProvider.log(message);\n shouldRecord = false;\n matched = false;\n } else {\n message = `Capturing replays for session ${this.identifiers.sessionId} due to matching targeting conditions.`;\n this.loggerProvider.log(message);\n shouldRecord = true;\n matched = true;\n }\n } else {\n const isInSample = isTimestampInSample(this.identifiers.sessionId, this.config.sampleRate);\n if (!isInSample) {\n message = `Opting session ${this.identifiers.sessionId} out of recording due to sample rate.`;\n this.loggerProvider.log(message);\n shouldRecord = false;\n matched = false;\n } else {\n shouldRecord = true;\n matched = true;\n }\n }\n\n // Only send custom rrweb event for targeting decision when the decision changes\n if (this.lastShouldRecordDecision !== shouldRecord && this.config.targetingConfig) {\n void this.addCustomRRWebEvent(CustomRRwebEvent.TARGETING_DECISION, {\n message,\n sessionId: this.identifiers.sessionId,\n matched,\n targetingParams: this.lastTargetingParams,\n });\n this.lastShouldRecordDecision = shouldRecord;\n }\n\n return shouldRecord;\n }\n\n getBlockSelectors(): string | string[] | undefined {\n // For some reason, this defaults to empty array ([]) if undefined in the compiled script.\n // Empty arrays cause errors when being evaluated in Safari.\n // Force the selector to be undefined if it's an empty array.\n const blockSelector = this.config?.privacyConfig?.blockSelector ?? [];\n if (blockSelector.length === 0) {\n return undefined;\n }\n return blockSelector;\n }\n\n getMaskTextSelectors(): string | undefined {\n if (this.config?.privacyConfig?.defaultMaskLevel === 'conservative') {\n return '*';\n }\n\n const maskSelector = this.config?.privacyConfig?.maskSelector;\n if (!maskSelector) {\n return;\n }\n\n return maskSelector as unknown as string;\n }\n\n async getRecordingPlugins(loggingConfig: LoggingConfig | undefined) {\n const plugins = [];\n\n // Add URL tracking plugin\n try {\n const urlTrackingPlugin = createUrlTrackingPlugin({\n ugcFilterRules: this.config?.interactionConfig?.ugcFilterRules || [],\n enablePolling: this.config?.enableUrlChangePolling || false,\n pollingInterval: this.config?.urlChangePollingInterval,\n captureDocumentTitle: this.config?.captureDocumentTitle,\n });\n\n plugins.push(urlTrackingPlugin);\n } catch (error) {\n this.loggerProvider.warn('Failed to create URL tracking plugin:', error);\n }\n\n // Default plugin settings -\n // {\n // level: ['info', 'log', 'warn', 'error'],\n // lengthThreshold: 10000,\n // stringifyOptions: {\n // stringLengthLimit: undefined,\n // numOfKeysLimit: 50,\n // depthOfLimit: 4,\n // },\n // logger: window.console,\n // }\n if (loggingConfig?.console?.enabled) {\n try {\n // Dynamic import keeps console plugin separate and only loads when needed\n const { getRecordConsolePlugin } = await import('@amplitude/rrweb-plugin-console-record');\n plugins.push(getRecordConsolePlugin({ level: loggingConfig.console.levels }));\n } catch (error) {\n this.loggerProvider.warn('Failed to load console plugin:', error);\n }\n }\n\n return plugins.length > 0 ? plugins : undefined;\n }\n\n private async getRecordFunction(): Promise<RecordFunction | null> {\n if (this.recordFunction) {\n return this.recordFunction;\n }\n\n try {\n const { record } = await import('@amplitude/rrweb-record');\n this.recordFunction = record;\n return record;\n } catch (error) {\n this.loggerProvider.warn('Failed to load rrweb-record module:', error);\n return null;\n }\n }\n\n async recordEvents(shouldLogMetadata = true) {\n const config = this.config;\n const shouldRecord = this.getShouldRecord();\n const sessionId = this.identifiers?.sessionId;\n if (!shouldRecord || !sessionId || !config) {\n return;\n }\n this.stopRecordingEvents();\n\n const recordFunction = await this.getRecordFunction();\n\n // May be undefined if cannot import rrweb-record\n if (!recordFunction) {\n return;\n }\n\n await this.initializeNetworkObservers();\n\n this.networkObservers?.start((event: NetworkRequestEvent) => {\n void this.addCustomRRWebEvent(CustomRRwebEvent.FETCH_REQUEST, event);\n });\n const { privacyConfig, interactionConfig, loggingConfig } = config;\n\n const hooks = interactionConfig?.enabled\n ? {\n mouseInteraction:\n this.eventsManager &&\n this.clickHandler?.createHook({\n eventsManager: this.eventsManager,\n sessionId,\n deviceIdFn: this.getDeviceId.bind(this),\n mirror: recordFunction.mirror,\n ugcFilterRules: interactionConfig.ugcFilterRules ?? [],\n performanceOptions: config.performanceConfig?.interaction,\n }),\n scroll: this.scrollHook,\n }\n : {};\n\n const ugcFilterRules =\n interactionConfig?.enabled && interactionConfig.ugcFilterRules ? interactionConfig.ugcFilterRules : [];\n\n this.loggerProvider.log(`Session Replay capture beginning for ${sessionId}.`);\n\n try {\n this.recordCancelCallback = recordFunction({\n emit: (event: eventWithTime) => {\n if (this.shouldOptOut()) {\n this.loggerProvider.log(`Opting session ${sessionId} out of recording due to optOut config.`);\n this.stopRecordingEvents();\n this.sendEvents();\n return;\n }\n\n if (event.type === RRWebEventType.Meta) {\n event.data.href = getPageUrl(event.data.href, ugcFilterRules);\n }\n\n if (this.eventCompressor) {\n // Schedule processing during idle time if the browser supports requestIdleCallback\n this.eventCompressor.enqueueEvent(event, sessionId);\n }\n },\n inlineStylesheet: config.shouldInlineStylesheet,\n hooks,\n maskAllInputs: true,\n maskTextClass: MASK_TEXT_CLASS,\n blockClass: BLOCK_CLASS,\n blockSelector: this.getBlockSelectors() as string | undefined,\n applyBackgroundColorToBlockedElements: config.applyBackgroundColorToBlockedElements,\n maskInputFn: maskFn('input', privacyConfig),\n maskTextFn: maskFn('text', privacyConfig),\n maskTextSelector: this.getMaskTextSelectors(),\n recordCanvas: false,\n slimDOMOptions: {\n script: config.omitElementTags?.script,\n comment: config.omitElementTags?.comment,\n },\n errorHandler: (error: unknown) => {\n const typedError = error as Error & { _external_?: boolean };\n\n // styled-components relies on this error being thrown and bubbled up, rrweb is otherwise suppressing it\n if (typedError.message.includes('insertRule') && typedError.message.includes('CSSStyleSheet')) {\n throw typedError;\n }\n\n // rrweb does monkey patching on certain window functions such as CSSStyleSheet.proptype.insertRule,\n // and errors from external clients calling these functions can get suppressed. Styled components depend\n // on these errors being re-thrown.\n if (typedError._external_) {\n throw typedError;\n }\n\n this.loggerProvider.warn('Error while capturing replay: ', typedError.toString());\n // Return true so that we don't clutter user's consoles with internal rrweb errors\n return true;\n },\n plugins: await this.getRecordingPlugins(loggingConfig),\n });\n\n void this.addCustomRRWebEvent(CustomRRwebEvent.DEBUG_INFO);\n if (shouldLogMetadata) {\n void this.addCustomRRWebEvent(CustomRRwebEvent.METADATA, this.metadata);\n }\n } catch (error) {\n this.loggerProvider.warn('Failed to initialize session replay:', error);\n }\n }\n\n addCustomRRWebEvent = async (\n eventName: CustomRRwebEvent,\n eventData: { [key: string]: any } = {},\n addStorageInfo = true,\n ) => {\n try {\n let debugInfo: DebugInfo | undefined = undefined;\n const config = this.config;\n // Only add debug info for non-metadata events\n if (config && eventName !== CustomRRwebEvent.METADATA) {\n debugInfo = {\n config: getDebugConfig(config),\n version: VERSION,\n };\n if (addStorageInfo) {\n const storageSizeData = await getStorageSize();\n debugInfo = {\n ...storageSizeData,\n ...debugInfo,\n };\n }\n }\n // Check first to ensure we are recording\n if (this.recordCancelCallback && this.recordFunction) {\n this.recordFunction.addCustomEvent(eventName, {\n ...eventData,\n ...debugInfo,\n });\n } else {\n this.loggerProvider.debug(\n `Not able to add custom replay capture event ${eventName} due to no ongoing recording.`,\n );\n }\n } catch (e) {\n this.loggerProvider.debug('Error while adding custom replay capture event: ', e);\n }\n };\n\n stopRecordingEvents = () => {\n try {\n this.loggerProvider.log('Session Replay capture stopping.');\n this.recordCancelCallback && this.recordCancelCallback();\n this.recordCancelCallback = null;\n this.networkObservers?.stop();\n } catch (error) {\n const typedError = error as Error;\n this.loggerProvider.warn(`Error occurred while stopping replay capture: ${typedError.toString()}`);\n }\n };\n\n getDeviceId() {\n return this.identifiers?.deviceId;\n }\n\n getSessionId() {\n return this.identifiers?.sessionId;\n }\n\n async flush(useRetry = false) {\n return this.eventsManager?.flush(useRetry);\n }\n\n shutdown() {\n this.teardownEventListeners(true);\n this.stopRecordingEvents();\n this.sendEvents();\n }\n\n private mapSDKType(sdkType: string | undefined) {\n if (sdkType === 'plugin') {\n return '@amplitude/plugin-session-replay-browser';\n }\n\n if (sdkType === 'segment') {\n return '@amplitude/segment-session-replay-plugin';\n }\n\n return null;\n }\n\n private setMetadata(\n sessionId: string | number | undefined,\n joinedConfig: SessionReplayJoinedConfig,\n localConfig: SessionReplayLocalConfig,\n remoteConfig: SessionReplayRemoteConfig | undefined,\n replaySDKVersion: string | undefined,\n standaloneSDKVersion: string | undefined,\n sdkType: string | undefined,\n ) {\n const hashValue = sessionId?.toString() ? generateHashCode(sessionId.toString()) : undefined;\n\n this.metadata = {\n joinedConfig,\n localConfig,\n remoteConfig,\n sessionId,\n hashValue,\n sampleRate: joinedConfig.sampleRate,\n replaySDKType: this.mapSDKType(sdkType),\n replaySDKVersion,\n standaloneSDKType: '@amplitude/session-replay-browser',\n standaloneSDKVersion,\n };\n }\n\n private async initializeNetworkObservers(): Promise<void> {\n if (this.config?.loggingConfig?.network?.enabled && !this.networkObservers) {\n try {\n const { NetworkObservers: NetworkObserversClass } = await import('./observers');\n this.networkObservers = new NetworkObserversClass();\n } catch (error) {\n this.loggerProvider.warn('Failed to import or instantiate NetworkObservers:', error);\n }\n }\n }\n}\n"]}
1
+ {"version":3,"file":"session-replay.js","sourceRoot":"","sources":["../../src/session-replay.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n getAnalyticsConnector,\n getGlobalScope,\n ILogger,\n Logger,\n LogLevel,\n returnWrapper,\n SpecialEventType,\n generateHashCode,\n isTimestampInSample,\n getOrCreateWindowMessenger,\n enableBackgroundCapture,\n AMPLITUDE_ORIGINS_MAP,\n} from '@amplitude/analytics-core';\n\n// Import only specific types to avoid pulling in the entire rrweb-types package\nimport { eventWithTime, EventType as RRWebEventType, scrollCallback } from '@amplitude/rrweb-types';\nimport { TargetingParameters } from '@amplitude/targeting';\nimport { createSessionReplayJoinedConfigGenerator } from './config/joined-config';\nimport {\n LoggingConfig,\n SessionReplayJoinedConfig,\n SessionReplayJoinedConfigGenerator,\n SessionReplayLocalConfig,\n SessionReplayMetadata,\n SessionReplayRemoteConfig,\n} from './config/types';\nimport {\n BLOCK_CLASS,\n CustomRRwebEvent,\n DEFAULT_SESSION_REPLAY_PROPERTY,\n INTERACTION_MAX_INTERVAL,\n INTERACTION_MIN_INTERVAL,\n MASK_TEXT_CLASS,\n SESSION_REPLAY_DEBUG_PROPERTY,\n} from './constants';\nimport { EventCompressor } from './events/event-compressor';\nimport { createEventsManager } from './events/events-manager';\nimport { MultiEventManager } from './events/multi-manager';\nimport { getDebugConfig, getPageUrl, getStorageSize, maskFn } from './helpers';\nimport { clickBatcher, ClickHandler, clickNonBatcher } from './hooks/click';\nimport { ScrollWatcher } from './hooks/scroll';\nimport { SessionIdentifiers } from './identifiers';\nimport { SafeLoggerProvider } from './logger';\nimport { evaluateTargetingAndStore } from './targeting/targeting-manager';\nimport {\n AmplitudeSessionReplay,\n SessionReplayEventsManager as AmplitudeSessionReplayEventsManager,\n DebugInfo,\n EventsManagerWithType,\n EventType,\n SessionIdentifiers as ISessionIdentifiers,\n SessionReplayOptions,\n} from './typings/session-replay';\nimport { VERSION } from './version';\n\n// Import only the type for NetworkRequestEvent to keep type safety\nimport type { NetworkObservers, NetworkRequestEvent } from './observers';\nimport { createUrlTrackingPlugin, subscribeToUrlChanges } from './plugins/url-tracking-plugin';\nimport type { RecordFunction } from './utils/rrweb';\n\ntype PageLeaveFn = (e: PageTransitionEvent | Event) => void;\n\nexport class SessionReplay implements AmplitudeSessionReplay {\n name = '@amplitude/session-replay-browser';\n config: SessionReplayJoinedConfig | undefined;\n joinedConfigGenerator: SessionReplayJoinedConfigGenerator | undefined;\n identifiers: ISessionIdentifiers | undefined;\n eventsManager?: AmplitudeSessionReplayEventsManager<'replay' | 'interaction', string>;\n loggerProvider: ILogger;\n recordCancelCallback: ReturnType<RecordFunction> | null = null;\n eventCount = 0;\n eventCompressor: EventCompressor | undefined;\n sessionTargetingMatch = false;\n private lastTargetingParams?: Pick<TargetingParameters, 'event' | 'userProperties' | 'page'>;\n private lastShouldRecordDecision?: boolean;\n\n // Visible for testing only\n pageLeaveFns: PageLeaveFn[] = [];\n private scrollHook?: scrollCallback;\n private clickHandler?: ClickHandler;\n private networkObservers?: NetworkObservers;\n private metadata: SessionReplayMetadata | undefined;\n\n // Cache the dynamically imported record function\n private recordFunction: RecordFunction | null = null;\n\n /** Cleanup for URL change listener used to re-evaluate targeting on SPA route changes */\n private urlChangeCleanup: (() => void) | null = null;\n /** Monotonic counter to ignore stale URL-change targeting results */\n private latestUrlChangeTargetingEvaluationId = 0;\n\n constructor() {\n this.loggerProvider = new SafeLoggerProvider(new Logger());\n }\n\n init(apiKey: string, options: SessionReplayOptions) {\n return returnWrapper(this._init(apiKey, options));\n }\n\n private teardownEventListeners = (teardown: boolean) => {\n const globalScope = getGlobalScope();\n if (globalScope) {\n globalScope.removeEventListener('blur', this.blurListener);\n globalScope.removeEventListener('focus', this.focusListener);\n !teardown && globalScope.addEventListener('blur', this.blurListener);\n !teardown && globalScope.addEventListener('focus', this.focusListener);\n // prefer pagehide to unload events, this is the standard going forward. it is not\n // 100% reliable, but is bfcache-compatible.\n if (globalScope.self && 'onpagehide' in globalScope.self) {\n globalScope.removeEventListener('pagehide', this.pageLeaveListener);\n !teardown && globalScope.addEventListener('pagehide', this.pageLeaveListener);\n } else {\n // this has performance implications, but is the only way we can reliably send events\n // in browser that don't support pagehide.\n globalScope.removeEventListener('beforeunload', this.pageLeaveListener);\n !teardown && globalScope.addEventListener('beforeunload', this.pageLeaveListener);\n }\n }\n };\n\n /**\n * Subscribes to SPA URL changes via the URL tracking plugin and re-evaluates targeting so we\n * can start/stop recording when the user navigates to a page that matches or no longer matches.\n */\n private setupUrlChangeListenerForTargeting(): void {\n // If init() runs multiple times, remove the previous URL-change subscription first\n // so we don't leak callbacks and trigger duplicate targeting evaluations.\n this.urlChangeCleanup?.();\n\n const globalScope = getGlobalScope() as Window | undefined;\n if (!globalScope?.location) {\n return;\n }\n\n const onUrlChange = (href: string): void => {\n const evaluationId = ++this.latestUrlChangeTargetingEvaluationId;\n void this.evaluateTargetingAndCapture(\n {\n userProperties: {},\n event: undefined,\n page: { url: href },\n },\n false,\n false,\n true,\n );\n this.loggerProvider.debug(`Queued URL-change targeting re-evaluation #${evaluationId} for ${href}.`);\n };\n type UrlUnsubscribe = (scope: Window | undefined, cb: (href: string) => void) => () => void;\n const unsubscribe = (subscribeToUrlChanges as UrlUnsubscribe)(globalScope, onUrlChange);\n\n this.urlChangeCleanup = (): void => {\n unsubscribe();\n this.urlChangeCleanup = null;\n };\n }\n\n private getCurrentPageForTargeting(): Pick<TargetingParameters, 'page'>['page'] {\n const currentUrl = getGlobalScope()?.location?.href;\n return currentUrl != null ? { url: currentUrl } : undefined;\n }\n\n protected async _init(apiKey: string, options: SessionReplayOptions) {\n // Re-init should always tear down any previous URL-change subscription, even when the\n // next config has no targeting config and we don't subscribe again.\n this.urlChangeCleanup?.();\n\n this.loggerProvider = new SafeLoggerProvider(options.loggerProvider || new Logger());\n Object.prototype.hasOwnProperty.call(options, 'logLevel') &&\n this.loggerProvider.enable(options.logLevel as LogLevel);\n this.identifiers = new SessionIdentifiers({ sessionId: options.sessionId, deviceId: options.deviceId });\n this.joinedConfigGenerator = await createSessionReplayJoinedConfigGenerator(apiKey, options);\n const { joinedConfig, localConfig, remoteConfig } = await this.joinedConfigGenerator.generateJoinedConfig();\n this.config = joinedConfig;\n\n this.setMetadata(\n options.sessionId,\n joinedConfig,\n localConfig,\n remoteConfig,\n options.version?.version,\n VERSION,\n options.version?.type,\n );\n\n if (options.sessionId && this.config.interactionConfig?.enabled) {\n const scrollWatcher = ScrollWatcher.default(\n {\n sessionId: options.sessionId,\n type: 'interaction',\n },\n this.config,\n );\n this.pageLeaveFns = [scrollWatcher.send(this.getDeviceId.bind(this)).bind(scrollWatcher)];\n this.scrollHook = scrollWatcher.hook.bind(scrollWatcher);\n this.clickHandler = new ClickHandler(this.loggerProvider, scrollWatcher);\n }\n\n const managers: EventsManagerWithType<EventType, string>[] = [];\n let { storeType } = this.config;\n if (storeType === 'idb' && !getGlobalScope()?.indexedDB) {\n storeType = 'memory';\n this.loggerProvider.warn('Could not use preferred indexedDB storage, reverting to in memory option.');\n }\n this.loggerProvider.log(`Using ${storeType} for event storage.`);\n try {\n const rrwebEventManager = await createEventsManager<'replay'>({\n config: this.config,\n type: 'replay',\n storeType,\n });\n managers.push({ name: 'replay', manager: rrwebEventManager });\n } catch (error) {\n const typedError = error as Error;\n this.loggerProvider.warn(`Error occurred while creating replay events manager: ${typedError.toString()}`);\n }\n\n if (this.config.interactionConfig?.enabled) {\n const payloadBatcher = this.config.interactionConfig.batch ? clickBatcher : clickNonBatcher;\n try {\n const interactionEventManager = await createEventsManager<'interaction'>({\n config: this.config,\n type: 'interaction',\n minInterval: this.config.interactionConfig.trackEveryNms ?? INTERACTION_MIN_INTERVAL,\n maxInterval: INTERACTION_MAX_INTERVAL,\n payloadBatcher,\n storeType,\n });\n managers.push({ name: 'interaction', manager: interactionEventManager });\n } catch (error) {\n const typedError = error as Error;\n this.loggerProvider.warn(`Error occurred while creating interaction events manager: ${typedError.toString()}`);\n }\n }\n\n this.eventsManager = new MultiEventManager<'replay' | 'interaction', string>(...managers);\n // To prevent too many threads.\n if (this.eventCompressor) {\n this.eventCompressor.terminate();\n }\n\n let workerScript = undefined;\n const globalScope = getGlobalScope();\n if (this.config.useWebWorker && globalScope && globalScope.Worker) {\n const { compressionScript } = await import('./worker');\n\n workerScript = compressionScript;\n }\n\n this.eventCompressor = new EventCompressor(this.eventsManager, this.config, this.getDeviceId(), workerScript);\n\n await this.initializeNetworkObservers();\n\n // Enable background capture when this page is opened by the Amplitude app\n // (window.opener exists). Uses the shared messenger singleton so that if\n // autocapture is also loaded, both share a single messenger and script load.\n if (getGlobalScope()?.opener) {\n const messenger = getOrCreateWindowMessenger();\n enableBackgroundCapture(messenger);\n messenger.setup({\n logger: this.loggerProvider,\n ...(this.config.serverZone && { endpoint: AMPLITUDE_ORIGINS_MAP[this.config.serverZone] }),\n });\n }\n\n this.loggerProvider.log('Installing @amplitude/session-replay-browser.');\n\n this.teardownEventListeners(false);\n\n await this.evaluateTargetingAndCapture(\n { userProperties: options.userProperties, page: this.getCurrentPageForTargeting() },\n true,\n );\n\n if (this.config.targetingConfig) {\n this.setupUrlChangeListenerForTargeting();\n }\n }\n\n setSessionId(sessionId: string | number, deviceId?: string) {\n return returnWrapper(this.asyncSetSessionId(sessionId, deviceId));\n }\n\n async asyncSetSessionId(\n sessionId: string | number,\n deviceId?: string,\n options?: { userProperties?: { [key: string]: any } },\n ) {\n // Invalidate any in-flight URL-change re-evaluations from the previous session.\n this.latestUrlChangeTargetingEvaluationId++;\n this.sessionTargetingMatch = false;\n this.lastShouldRecordDecision = undefined; // Reset targeting decision for new session\n\n const previousSessionId = this.identifiers && this.identifiers.sessionId;\n if (previousSessionId) {\n this.sendEvents(previousSessionId);\n }\n\n const deviceIdForReplayId = deviceId || this.getDeviceId();\n this.identifiers = new SessionIdentifiers({\n sessionId: sessionId,\n deviceId: deviceIdForReplayId,\n });\n\n // If there is no previous session id, SDK is being initialized for the first time,\n // and config was just fetched in initialization, so no need to fetch it a second time\n if (this.joinedConfigGenerator && previousSessionId) {\n const { joinedConfig } = await this.joinedConfigGenerator.generateJoinedConfig();\n this.config = joinedConfig;\n }\n\n if (this.config?.targetingConfig) {\n await this.evaluateTargetingAndCapture(\n { userProperties: options?.userProperties, page: this.getCurrentPageForTargeting() },\n false,\n true,\n );\n } else {\n await this.recordEvents();\n }\n }\n\n getSessionReplayProperties() {\n const config = this.config;\n const identifiers = this.identifiers;\n if (!config || !identifiers) {\n this.loggerProvider.warn('Session replay init has not been called, cannot get session replay properties.');\n return {};\n }\n\n const shouldRecord = this.getShouldRecord();\n let eventProperties: { [key: string]: string | null } = {};\n\n if (shouldRecord) {\n eventProperties = {\n [DEFAULT_SESSION_REPLAY_PROPERTY]: identifiers.sessionReplayId ? identifiers.sessionReplayId : null,\n };\n if (config.debugMode) {\n eventProperties[SESSION_REPLAY_DEBUG_PROPERTY] = JSON.stringify({\n appHash: generateHashCode(config.apiKey).toString(),\n });\n }\n }\n\n void this.addCustomRRWebEvent(\n CustomRRwebEvent.GET_SR_PROPS,\n {\n shouldRecord,\n eventProperties: eventProperties,\n },\n this.eventCount === 10,\n );\n if (this.eventCount === 10) {\n this.eventCount = 0;\n }\n this.eventCount++;\n\n return eventProperties;\n }\n\n blurListener = () => {\n this.sendEvents();\n };\n\n focusListener = () => {\n // Restart recording on focus to ensure that when user\n // switches tabs, we take a full snapshot\n void this.recordEvents(false);\n };\n\n /**\n * This is an instance member so that if init is called multiple times\n * it doesn't add another listener to the page leave event. This is to\n * prevent duplicate listener actions from firing.\n */\n private pageLeaveListener = (e: PageTransitionEvent | Event) => {\n this.pageLeaveFns.forEach((fn) => {\n fn(e);\n });\n };\n\n evaluateTargetingAndCapture = async (\n targetingParams: Pick<TargetingParameters, 'event' | 'userProperties' | 'page'>,\n isInit = false,\n forceRestart = false,\n forceTargetingReevaluation = false,\n ) => {\n if (!this.identifiers || !this.identifiers.sessionId || !this.config) {\n if (this.identifiers && !this.identifiers.sessionId) {\n this.loggerProvider.log('Session ID has not been set yet, cannot evaluate targeting for Session Replay.');\n } else {\n this.loggerProvider.warn('Session replay init has not been called, cannot evaluate targeting.');\n }\n return;\n }\n\n // Handle cases where there's no targeting config\n if (!this.config.targetingConfig) {\n if (isInit) {\n this.loggerProvider.log('Targeting config has not been set yet, cannot evaluate targeting.');\n } else {\n this.loggerProvider.log('No targeting config set, skipping initialization/recording for event.');\n return;\n }\n }\n\n // Store targeting parameters for use in getShouldRecord\n this.lastTargetingParams = targetingParams;\n\n // Re-evaluate only until we get the first match in this session.\n // Once matched, keep recording for the rest of the session.\n const targetingConfig = this.config.targetingConfig;\n const shouldReEvaluate = targetingConfig && !this.sessionTargetingMatch;\n if (shouldReEvaluate) {\n // Capture URL-change evaluation id so out-of-order async completions can be discarded.\n const urlChangeEvaluationId = forceTargetingReevaluation ? this.latestUrlChangeTargetingEvaluationId : undefined;\n let eventForTargeting = targetingParams.event;\n if (\n eventForTargeting &&\n Object.values(SpecialEventType).includes(eventForTargeting.event_type as SpecialEventType)\n ) {\n eventForTargeting = undefined;\n }\n\n const pageUrl = targetingParams.page?.url ?? getGlobalScope()?.location?.href ?? '';\n const pageForTargeting = targetingParams.page ?? (pageUrl !== '' ? { url: pageUrl } : undefined);\n\n const targetingMatch = await evaluateTargetingAndStore({\n sessionId: this.identifiers.sessionId,\n targetingConfig,\n loggerProvider: this.loggerProvider,\n apiKey: this.config.apiKey,\n targetingParams: {\n userProperties: targetingParams.userProperties,\n event: eventForTargeting,\n page: pageForTargeting,\n },\n urlChange: forceTargetingReevaluation,\n });\n\n if (\n forceTargetingReevaluation &&\n urlChangeEvaluationId !== undefined &&\n urlChangeEvaluationId !== this.latestUrlChangeTargetingEvaluationId\n ) {\n this.loggerProvider.debug(\n `Ignoring stale URL-change targeting result #${urlChangeEvaluationId}; latest is #${this.latestUrlChangeTargetingEvaluationId}.`,\n );\n return;\n }\n // Keep targeting match monotonic within a session: once true, always true.\n // This avoids races where an older in-flight evaluation resolves false after\n // a newer evaluation already resolved true.\n this.sessionTargetingMatch = this.sessionTargetingMatch || targetingMatch;\n\n this.loggerProvider.debug(\n JSON.stringify(\n {\n name: 'targeted replay capture config',\n sessionTargetingMatch: this.sessionTargetingMatch,\n event: eventForTargeting,\n targetingParams: targetingParams,\n },\n null,\n 2,\n ),\n );\n }\n\n if (isInit) {\n void this.initialize(true);\n } else if (forceRestart || !this.recordCancelCallback) {\n this.loggerProvider.log('Recording events for session due to forceRestart or no ongoing recording.');\n await this.recordEvents();\n }\n };\n\n sendEvents(sessionId?: string | number) {\n const sessionIdToSend = sessionId || this.identifiers?.sessionId;\n const deviceId = this.getDeviceId();\n this.eventsManager &&\n sessionIdToSend &&\n deviceId &&\n this.eventsManager.sendCurrentSequenceEvents({ sessionId: sessionIdToSend, deviceId });\n }\n\n async initialize(shouldSendStoredEvents = false) {\n if (!this.identifiers?.sessionId) {\n this.loggerProvider.log(`Session is not being recorded due to lack of session id.`);\n return Promise.resolve();\n }\n\n const deviceId = this.getDeviceId();\n if (!deviceId) {\n this.loggerProvider.log(`Session is not being recorded due to lack of device id.`);\n return Promise.resolve();\n }\n this.eventsManager && shouldSendStoredEvents && void this.eventsManager.sendStoredEvents({ deviceId });\n\n return this.recordEvents();\n }\n\n shouldOptOut() {\n let identityStoreOptOut: boolean | undefined;\n if (this.config?.instanceName) {\n const identityStore = getAnalyticsConnector(this.config.instanceName).identityStore;\n identityStoreOptOut = identityStore.getIdentity().optOut;\n }\n\n return identityStoreOptOut !== undefined ? identityStoreOptOut : this.config?.optOut;\n }\n\n getShouldRecord() {\n if (!this.identifiers || !this.config || !this.identifiers.sessionId) {\n this.loggerProvider.warn(`Session is not being recorded due to lack of config, please call sessionReplay.init.`);\n return false;\n }\n\n if (!this.config.captureEnabled) {\n this.loggerProvider.log(\n `Session ${this.identifiers.sessionId} not being captured due to capture being disabled for project or because the remote config could not be fetched.`,\n );\n return false;\n }\n\n if (this.shouldOptOut()) {\n this.loggerProvider.log(`Opting session ${this.identifiers.sessionId} out of recording due to optOut config.`);\n return false;\n }\n\n let shouldRecord = false;\n let message = '';\n let matched = false;\n\n // If targetingConfig exists, we'll use the sessionTargetingMatch to determine whether to record\n // Otherwise, we'll evaluate the session against the overall sample rate\n if (this.config.targetingConfig) {\n if (!this.sessionTargetingMatch) {\n message = `Not capturing replays for session ${this.identifiers.sessionId} due to not matching targeting conditions.`;\n this.loggerProvider.log(message);\n shouldRecord = false;\n matched = false;\n } else {\n message = `Capturing replays for session ${this.identifiers.sessionId} due to matching targeting conditions.`;\n this.loggerProvider.log(message);\n shouldRecord = true;\n matched = true;\n }\n } else {\n const isInSample = isTimestampInSample(this.identifiers.sessionId, this.config.sampleRate);\n if (!isInSample) {\n message = `Opting session ${this.identifiers.sessionId} out of recording due to sample rate.`;\n this.loggerProvider.log(message);\n shouldRecord = false;\n matched = false;\n } else {\n shouldRecord = true;\n matched = true;\n }\n }\n\n // Only send custom rrweb event for targeting decision when the decision changes\n if (this.lastShouldRecordDecision !== shouldRecord && this.config.targetingConfig) {\n void this.addCustomRRWebEvent(CustomRRwebEvent.TARGETING_DECISION, {\n message,\n sessionId: this.identifiers.sessionId,\n matched,\n targetingParams: this.lastTargetingParams,\n });\n this.lastShouldRecordDecision = shouldRecord;\n }\n\n return shouldRecord;\n }\n\n getBlockSelectors(): string | string[] | undefined {\n // For some reason, this defaults to empty array ([]) if undefined in the compiled script.\n // Empty arrays cause errors when being evaluated in Safari.\n // Force the selector to be undefined if it's an empty array.\n const blockSelector = this.config?.privacyConfig?.blockSelector ?? [];\n if (blockSelector.length === 0) {\n return undefined;\n }\n return blockSelector;\n }\n\n getMaskTextSelectors(): string | undefined {\n if (this.config?.privacyConfig?.defaultMaskLevel === 'conservative') {\n return '*';\n }\n\n const maskSelector = this.config?.privacyConfig?.maskSelector;\n if (!maskSelector) {\n return;\n }\n\n return maskSelector as unknown as string;\n }\n\n async getRecordingPlugins(loggingConfig: LoggingConfig | undefined) {\n const plugins = [];\n\n // Add URL tracking plugin\n try {\n const urlTrackingPlugin = createUrlTrackingPlugin({\n ugcFilterRules: this.config?.interactionConfig?.ugcFilterRules || [],\n enablePolling: this.config?.enableUrlChangePolling || false,\n pollingInterval: this.config?.urlChangePollingInterval,\n captureDocumentTitle: this.config?.captureDocumentTitle,\n });\n\n plugins.push(urlTrackingPlugin);\n } catch (error) {\n this.loggerProvider.warn('Failed to create URL tracking plugin:', error);\n }\n\n // Default plugin settings -\n // {\n // level: ['info', 'log', 'warn', 'error'],\n // lengthThreshold: 10000,\n // stringifyOptions: {\n // stringLengthLimit: undefined,\n // numOfKeysLimit: 50,\n // depthOfLimit: 4,\n // },\n // logger: window.console,\n // }\n if (loggingConfig?.console?.enabled) {\n try {\n // Dynamic import keeps console plugin separate and only loads when needed\n const { getRecordConsolePlugin } = await import('@amplitude/rrweb-plugin-console-record');\n plugins.push(getRecordConsolePlugin({ level: loggingConfig.console.levels }));\n } catch (error) {\n this.loggerProvider.warn('Failed to load console plugin:', error);\n }\n }\n\n return plugins.length > 0 ? plugins : undefined;\n }\n\n private async getRecordFunction(): Promise<RecordFunction | null> {\n if (this.recordFunction) {\n return this.recordFunction;\n }\n\n try {\n const { record } = await import('@amplitude/rrweb-record');\n this.recordFunction = record;\n return record;\n } catch (error) {\n this.loggerProvider.warn('Failed to load rrweb-record module:', error);\n return null;\n }\n }\n\n async recordEvents(shouldLogMetadata = true) {\n const config = this.config;\n const shouldRecord = this.getShouldRecord();\n const sessionId = this.identifiers?.sessionId;\n if (!shouldRecord || !sessionId || !config) {\n return;\n }\n this.stopRecordingEvents();\n\n const recordFunction = await this.getRecordFunction();\n\n // May be undefined if cannot import rrweb-record\n if (!recordFunction) {\n return;\n }\n\n await this.initializeNetworkObservers();\n\n this.networkObservers?.start((event: NetworkRequestEvent) => {\n void this.addCustomRRWebEvent(CustomRRwebEvent.FETCH_REQUEST, event);\n });\n const { privacyConfig, interactionConfig, loggingConfig } = config;\n\n const hooks = interactionConfig?.enabled\n ? {\n mouseInteraction:\n this.eventsManager &&\n this.clickHandler?.createHook({\n eventsManager: this.eventsManager,\n sessionId,\n deviceIdFn: this.getDeviceId.bind(this),\n mirror: recordFunction.mirror,\n ugcFilterRules: interactionConfig.ugcFilterRules ?? [],\n performanceOptions: config.performanceConfig?.interaction,\n }),\n scroll: this.scrollHook,\n }\n : {};\n\n const ugcFilterRules =\n interactionConfig?.enabled && interactionConfig.ugcFilterRules ? interactionConfig.ugcFilterRules : [];\n\n this.loggerProvider.log(`Session Replay capture beginning for ${sessionId}.`);\n\n try {\n this.recordCancelCallback = recordFunction({\n emit: (event: eventWithTime) => {\n if (this.shouldOptOut()) {\n this.loggerProvider.log(`Opting session ${sessionId} out of recording due to optOut config.`);\n this.stopRecordingEvents();\n this.sendEvents();\n return;\n }\n\n if (event.type === RRWebEventType.Meta) {\n event.data.href = getPageUrl(event.data.href, ugcFilterRules);\n }\n\n if (this.eventCompressor) {\n // Schedule processing during idle time if the browser supports requestIdleCallback\n this.eventCompressor.enqueueEvent(event, sessionId);\n }\n },\n inlineStylesheet: config.shouldInlineStylesheet,\n hooks,\n maskAllInputs: true,\n maskTextClass: MASK_TEXT_CLASS,\n blockClass: BLOCK_CLASS,\n blockSelector: this.getBlockSelectors() as string | undefined,\n applyBackgroundColorToBlockedElements: config.applyBackgroundColorToBlockedElements,\n maskInputFn: maskFn('input', privacyConfig),\n maskTextFn: maskFn('text', privacyConfig),\n maskTextSelector: this.getMaskTextSelectors(),\n recordCanvas: false,\n slimDOMOptions: {\n script: config.omitElementTags?.script,\n comment: config.omitElementTags?.comment,\n },\n errorHandler: (error: unknown) => {\n const typedError = error as Error & { _external_?: boolean };\n\n // styled-components relies on this error being thrown and bubbled up, rrweb is otherwise suppressing it\n if (typedError.message.includes('insertRule') && typedError.message.includes('CSSStyleSheet')) {\n throw typedError;\n }\n\n // rrweb does monkey patching on certain window functions such as CSSStyleSheet.proptype.insertRule,\n // and errors from external clients calling these functions can get suppressed. Styled components depend\n // on these errors being re-thrown.\n if (typedError._external_) {\n throw typedError;\n }\n\n this.loggerProvider.warn('Error while capturing replay: ', typedError.toString());\n // Return true so that we don't clutter user's consoles with internal rrweb errors\n return true;\n },\n plugins: await this.getRecordingPlugins(loggingConfig),\n });\n\n void this.addCustomRRWebEvent(CustomRRwebEvent.DEBUG_INFO);\n if (shouldLogMetadata) {\n void this.addCustomRRWebEvent(CustomRRwebEvent.METADATA, this.metadata);\n }\n } catch (error) {\n this.loggerProvider.warn('Failed to initialize session replay:', error);\n }\n }\n\n addCustomRRWebEvent = async (\n eventName: CustomRRwebEvent,\n eventData: { [key: string]: any } = {},\n addStorageInfo = true,\n ) => {\n try {\n let debugInfo: DebugInfo | undefined = undefined;\n const config = this.config;\n // Only add debug info for non-metadata events\n if (config && eventName !== CustomRRwebEvent.METADATA) {\n debugInfo = {\n config: getDebugConfig(config),\n version: VERSION,\n };\n if (addStorageInfo) {\n const storageSizeData = await getStorageSize();\n debugInfo = {\n ...storageSizeData,\n ...debugInfo,\n };\n }\n }\n // Check first to ensure we are recording\n if (this.recordCancelCallback && this.recordFunction) {\n this.recordFunction.addCustomEvent(eventName, {\n ...eventData,\n ...debugInfo,\n });\n } else {\n this.loggerProvider.debug(\n `Not able to add custom replay capture event ${eventName} due to no ongoing recording.`,\n );\n }\n } catch (e) {\n this.loggerProvider.debug('Error while adding custom replay capture event: ', e);\n }\n };\n\n stopRecordingEvents = () => {\n try {\n this.loggerProvider.log('Session Replay capture stopping.');\n this.recordCancelCallback && this.recordCancelCallback();\n this.recordCancelCallback = null;\n this.networkObservers?.stop();\n } catch (error) {\n const typedError = error as Error;\n this.loggerProvider.warn(`Error occurred while stopping replay capture: ${typedError.toString()}`);\n }\n };\n\n getDeviceId() {\n return this.identifiers?.deviceId;\n }\n\n getSessionId() {\n return this.identifiers?.sessionId;\n }\n\n async flush(useRetry = false) {\n return this.eventsManager?.flush(useRetry);\n }\n\n shutdown() {\n this.urlChangeCleanup?.();\n this.teardownEventListeners(true);\n this.stopRecordingEvents();\n this.sendEvents();\n }\n\n private mapSDKType(sdkType: string | undefined) {\n if (sdkType === 'plugin') {\n return '@amplitude/plugin-session-replay-browser';\n }\n\n if (sdkType === 'segment') {\n return '@amplitude/segment-session-replay-plugin';\n }\n\n return null;\n }\n\n private setMetadata(\n sessionId: string | number | undefined,\n joinedConfig: SessionReplayJoinedConfig,\n localConfig: SessionReplayLocalConfig,\n remoteConfig: SessionReplayRemoteConfig | undefined,\n replaySDKVersion: string | undefined,\n standaloneSDKVersion: string | undefined,\n sdkType: string | undefined,\n ) {\n const hashValue = sessionId?.toString() ? generateHashCode(sessionId.toString()) : undefined;\n\n this.metadata = {\n joinedConfig,\n localConfig,\n remoteConfig,\n sessionId,\n hashValue,\n sampleRate: joinedConfig.sampleRate,\n replaySDKType: this.mapSDKType(sdkType),\n replaySDKVersion,\n standaloneSDKType: '@amplitude/session-replay-browser',\n standaloneSDKVersion,\n };\n }\n\n private async initializeNetworkObservers(): Promise<void> {\n if (this.config?.loggingConfig?.network?.enabled && !this.networkObservers) {\n try {\n const { NetworkObservers: NetworkObserversClass } = await import('./observers');\n this.networkObservers = new NetworkObserversClass();\n } catch (error) {\n this.loggerProvider.warn('Failed to import or instantiate NetworkObservers:', error);\n }\n }\n }\n}\n"]}
@@ -1,11 +1,12 @@
1
1
  import type { TargetingParameters } from '@amplitude/targeting';
2
2
  import { TargetingConfig } from '../config/types';
3
3
  import { Logger } from '@amplitude/analytics-types';
4
- export declare const evaluateTargetingAndStore: ({ sessionId, targetingConfig, loggerProvider, apiKey, targetingParams, }: {
4
+ export declare const evaluateTargetingAndStore: ({ sessionId, targetingConfig, loggerProvider, apiKey, targetingParams, urlChange, }: {
5
5
  sessionId: string | number;
6
6
  targetingConfig: TargetingConfig;
7
7
  loggerProvider: Logger;
8
8
  apiKey: string;
9
- targetingParams?: Pick<TargetingParameters, "event" | "userProperties"> | undefined;
9
+ targetingParams?: Pick<TargetingParameters, "event" | "userProperties" | "page"> | undefined;
10
+ urlChange?: boolean | undefined;
10
11
  }) => Promise<boolean>;
11
12
  //# sourceMappingURL=targeting-manager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"targeting-manager.d.ts","sourceRoot":"","sources":["../../../src/targeting/targeting-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAGpD,eAAO,MAAM,yBAAyB;eAOzB,MAAM,GAAG,MAAM;qBACT,eAAe;oBAChB,MAAM;YACd,MAAM;;sBAgDf,CAAC"}
1
+ {"version":3,"file":"targeting-manager.d.ts","sourceRoot":"","sources":["../../../src/targeting/targeting-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAGpD,eAAO,MAAM,yBAAyB;eAQzB,MAAM,GAAG,MAAM;qBACT,eAAe;oBAChB,MAAM;YACd,MAAM;;;sBAoDf,CAAC"}