@amplitude/session-replay-browser 1.40.0 → 1.41.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +85 -0
- package/lib/cjs/config/local-config.d.ts +2 -1
- package/lib/cjs/config/local-config.d.ts.map +1 -1
- package/lib/cjs/config/local-config.js +3 -0
- package/lib/cjs/config/local-config.js.map +1 -1
- package/lib/cjs/config/types.d.ts +26 -0
- package/lib/cjs/config/types.d.ts.map +1 -1
- package/lib/cjs/config/types.js.map +1 -1
- package/lib/cjs/constants.d.ts +2 -0
- package/lib/cjs/constants.d.ts.map +1 -1
- package/lib/cjs/constants.js +3 -1
- package/lib/cjs/constants.js.map +1 -1
- package/lib/cjs/cross-origin-iframes.d.ts +28 -0
- package/lib/cjs/cross-origin-iframes.d.ts.map +1 -0
- package/lib/cjs/cross-origin-iframes.js +175 -0
- package/lib/cjs/cross-origin-iframes.js.map +1 -0
- package/lib/cjs/events/events-idb-store.d.ts +25 -4
- package/lib/cjs/events/events-idb-store.d.ts.map +1 -1
- package/lib/cjs/events/events-idb-store.js +257 -61
- package/lib/cjs/events/events-idb-store.js.map +1 -1
- package/lib/cjs/session-replay.d.ts +4 -0
- package/lib/cjs/session-replay.d.ts.map +1 -1
- package/lib/cjs/session-replay.js +118 -51
- package/lib/cjs/session-replay.js.map +1 -1
- package/lib/cjs/track-destination.d.ts.map +1 -1
- package/lib/cjs/track-destination.js +5 -1
- package/lib/cjs/track-destination.js.map +1 -1
- package/lib/cjs/utils/rrweb.d.ts +1 -0
- package/lib/cjs/utils/rrweb.d.ts.map +1 -1
- package/lib/cjs/utils/rrweb.js.map +1 -1
- package/lib/cjs/version.d.ts +1 -1
- package/lib/cjs/version.js +1 -1
- package/lib/cjs/version.js.map +1 -1
- package/lib/cjs/worker/index.js +1 -1
- package/lib/esm/config/local-config.d.ts +2 -1
- package/lib/esm/config/local-config.d.ts.map +1 -1
- package/lib/esm/config/local-config.js +3 -0
- package/lib/esm/config/local-config.js.map +1 -1
- package/lib/esm/config/types.d.ts +26 -0
- package/lib/esm/config/types.d.ts.map +1 -1
- package/lib/esm/config/types.js.map +1 -1
- package/lib/esm/constants.d.ts +2 -0
- package/lib/esm/constants.d.ts.map +1 -1
- package/lib/esm/constants.js +2 -0
- package/lib/esm/constants.js.map +1 -1
- package/lib/esm/cross-origin-iframes.d.ts +28 -0
- package/lib/esm/cross-origin-iframes.d.ts.map +1 -0
- package/lib/esm/cross-origin-iframes.js +170 -0
- package/lib/esm/cross-origin-iframes.js.map +1 -0
- package/lib/esm/events/events-idb-store.d.ts +25 -4
- package/lib/esm/events/events-idb-store.d.ts.map +1 -1
- package/lib/esm/events/events-idb-store.js +255 -61
- package/lib/esm/events/events-idb-store.js.map +1 -1
- package/lib/esm/session-replay.d.ts +4 -0
- package/lib/esm/session-replay.d.ts.map +1 -1
- package/lib/esm/session-replay.js +118 -51
- package/lib/esm/session-replay.js.map +1 -1
- package/lib/esm/track-destination.d.ts.map +1 -1
- package/lib/esm/track-destination.js +6 -2
- package/lib/esm/track-destination.js.map +1 -1
- package/lib/esm/utils/rrweb.d.ts +1 -0
- package/lib/esm/utils/rrweb.d.ts.map +1 -1
- package/lib/esm/utils/rrweb.js.map +1 -1
- package/lib/esm/version.d.ts +1 -1
- package/lib/esm/version.js +1 -1
- package/lib/esm/version.js.map +1 -1
- package/lib/esm/worker/index.js +1 -1
- package/lib/scripts/index-min.js +1 -1
- package/lib/scripts/index-min.js.gz +0 -0
- package/lib/scripts/index-min.js.map +1 -1
- package/lib/scripts/session-replay-browser-min.js +1 -1
- package/lib/scripts/session-replay-browser-min.js.gz +0 -0
- package/lib/scripts/session-replay-browser-min.js.map +1 -1
- package/lib/scripts/targeting-min.js +1 -1
- package/lib/scripts/targeting-min.js.gz +0 -0
- package/lib/scripts/targeting-min.js.map +1 -1
- package/lib/scripts/worker-min.js +1 -1
- package/lib/scripts/worker-min.js.gz +0 -0
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-replay.d.ts","sourceRoot":"","sources":["../../src/session-replay.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,OAAO,EASR,MAAM,2BAA2B,CAAC;AAKnC,OAAO,EACL,aAAa,EACb,yBAAyB,EACzB,kCAAkC,EAInC,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAEL,gBAAgB,EASjB,MAAM,aAAa,CAAC;AAWrB,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAQ5D,OAAO,EACL,sBAAsB,EACtB,0BAA0B,IAAI,mCAAmC,EAIjE,kBAAkB,IAAI,mBAAmB,EACzC,oBAAoB,EACpB,2BAA2B,EAC5B,MAAM,0BAA0B,CAAC;AAOlC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"session-replay.d.ts","sourceRoot":"","sources":["../../src/session-replay.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,7 @@ import { evaluateTargetingAndStore } from './targeting/targeting-manager';
|
|
|
16
16
|
import { isSessionInSample } from './sampling';
|
|
17
17
|
import { VERSION } from './version';
|
|
18
18
|
import { createUrlTrackingPlugin, subscribeToUrlChanges } from './plugins/url-tracking-plugin';
|
|
19
|
+
import { isInIframe, CrossOriginIframeCoordinator, listenForParentSignals } from './cross-origin-iframes';
|
|
19
20
|
var SessionReplay = /** @class */ (function () {
|
|
20
21
|
function SessionReplay() {
|
|
21
22
|
var _this = this;
|
|
@@ -33,6 +34,8 @@ var SessionReplay = /** @class */ (function () {
|
|
|
33
34
|
this.recordEventsPendingShouldLogMetadata = null;
|
|
34
35
|
/** Cleanup for URL change listener used to re-evaluate targeting on SPA route changes */
|
|
35
36
|
this.urlChangeCleanup = null;
|
|
37
|
+
this.crossOriginIframeCoordinator = null;
|
|
38
|
+
this.crossOriginParentSignalCleanup = null;
|
|
36
39
|
/** Monotonic counter to ignore stale URL-change targeting results */
|
|
37
40
|
this.latestUrlChangeTargetingEvaluationId = 0;
|
|
38
41
|
this.teardownEventListeners = function (teardown) {
|
|
@@ -212,12 +215,18 @@ var SessionReplay = /** @class */ (function () {
|
|
|
212
215
|
});
|
|
213
216
|
};
|
|
214
217
|
this.stopRecordingEvents = function () {
|
|
215
|
-
var _a;
|
|
218
|
+
var _a, _b, _c;
|
|
216
219
|
try {
|
|
217
220
|
_this.loggerProvider.log('Session Replay capture stopping.');
|
|
218
221
|
_this.recordCancelCallback && _this.recordCancelCallback();
|
|
219
222
|
_this.recordCancelCallback = null;
|
|
220
223
|
(_a = _this.networkObservers) === null || _a === void 0 ? void 0 : _a.stop();
|
|
224
|
+
(_b = _this.crossOriginIframeCoordinator) === null || _b === void 0 ? void 0 : _b.stop();
|
|
225
|
+
_this.crossOriginIframeCoordinator = null;
|
|
226
|
+
// Remove the child-mode parent signal listener so a later mode change
|
|
227
|
+
// (e.g. crossOriginIframes disabled) does not leave a stale listener.
|
|
228
|
+
(_c = _this.crossOriginParentSignalCleanup) === null || _c === void 0 ? void 0 : _c.call(_this);
|
|
229
|
+
_this.crossOriginParentSignalCleanup = null;
|
|
221
230
|
}
|
|
222
231
|
catch (error) {
|
|
223
232
|
var typedError = error;
|
|
@@ -726,11 +735,11 @@ var SessionReplay = /** @class */ (function () {
|
|
|
726
735
|
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
727
736
|
if (shouldLogMetadata === void 0) { shouldLogMetadata = true; }
|
|
728
737
|
return __awaiter(this, void 0, void 0, function () {
|
|
729
|
-
var config, shouldRecord, sessionId, recordFunction, networkLoggingConfig, trackUrl, ignoredUrls,
|
|
730
|
-
var
|
|
738
|
+
var config, shouldRecord, sessionId, recordFunction, networkLoggingConfig, trackUrl, ignoredUrls, interactionConfig, loggingConfig, hooks, ugcFilterRules, crossOriginIframesEnabled, coordinateChildren, childMode, _j, _k, _l, error_5;
|
|
739
|
+
var _m;
|
|
731
740
|
var _this = this;
|
|
732
|
-
return __generator(this, function (
|
|
733
|
-
switch (
|
|
741
|
+
return __generator(this, function (_o) {
|
|
742
|
+
switch (_o.label) {
|
|
734
743
|
case 0:
|
|
735
744
|
config = this.config;
|
|
736
745
|
shouldRecord = this.getShouldRecord();
|
|
@@ -741,14 +750,14 @@ var SessionReplay = /** @class */ (function () {
|
|
|
741
750
|
this.stopRecordingEvents();
|
|
742
751
|
return [4 /*yield*/, this.getRecordFunction()];
|
|
743
752
|
case 1:
|
|
744
|
-
recordFunction =
|
|
753
|
+
recordFunction = _o.sent();
|
|
745
754
|
// May be undefined if cannot import rrweb-record
|
|
746
755
|
if (!recordFunction) {
|
|
747
756
|
return [2 /*return*/];
|
|
748
757
|
}
|
|
749
758
|
return [4 /*yield*/, this.initializeNetworkObservers()];
|
|
750
759
|
case 2:
|
|
751
|
-
|
|
760
|
+
_o.sent();
|
|
752
761
|
networkLoggingConfig = (_b = config.loggingConfig) === null || _b === void 0 ? void 0 : _b.network;
|
|
753
762
|
trackUrl = getServerUrl(config.serverZone, config.trackServerUrl);
|
|
754
763
|
ignoredUrls = [SESSION_REPLAY_SERVER_URL, SESSION_REPLAY_EU_URL, SESSION_REPLAY_STAGING_URL, trackUrl];
|
|
@@ -757,7 +766,7 @@ var SessionReplay = /** @class */ (function () {
|
|
|
757
766
|
return;
|
|
758
767
|
void _this.addCustomRRWebEvent(CustomRRwebEvent.FETCH_REQUEST, event);
|
|
759
768
|
}, networkLoggingConfig);
|
|
760
|
-
|
|
769
|
+
interactionConfig = config.interactionConfig, loggingConfig = config.loggingConfig;
|
|
761
770
|
hooks = (interactionConfig === null || interactionConfig === void 0 ? void 0 : interactionConfig.enabled)
|
|
762
771
|
? {
|
|
763
772
|
mouseInteraction: this.eventsManager &&
|
|
@@ -774,13 +783,36 @@ var SessionReplay = /** @class */ (function () {
|
|
|
774
783
|
: {};
|
|
775
784
|
ugcFilterRules = (interactionConfig === null || interactionConfig === void 0 ? void 0 : interactionConfig.enabled) && interactionConfig.ugcFilterRules ? interactionConfig.ugcFilterRules : [];
|
|
776
785
|
this.loggerProvider.log("Session Replay capture beginning for ".concat(sessionId, "."));
|
|
777
|
-
|
|
786
|
+
_o.label = 3;
|
|
778
787
|
case 3:
|
|
779
|
-
|
|
788
|
+
_o.trys.push([3, 5, , 6]);
|
|
789
|
+
crossOriginIframesEnabled = !!((_g = config.crossOriginIframes) === null || _g === void 0 ? void 0 : _g.enabled);
|
|
790
|
+
coordinateChildren = ((_h = config.crossOriginIframes) === null || _h === void 0 ? void 0 : _h.coordinateChildren) !== false;
|
|
791
|
+
childMode = crossOriginIframesEnabled && isInIframe();
|
|
792
|
+
if (childMode && coordinateChildren) {
|
|
793
|
+
// Child mode: don't self-start; wait for a start signal from the parent.
|
|
794
|
+
// (The previous listener, if any, was already removed by stopRecordingEvents above.)
|
|
795
|
+
this.crossOriginParentSignalCleanup = listenForParentSignals({
|
|
796
|
+
onStart: function () { return _this._recordEventsInChildMode(recordFunction, sessionId, config, hooks); },
|
|
797
|
+
onStop: function () {
|
|
798
|
+
try {
|
|
799
|
+
// Only cancel the rrweb recording — do NOT call stopRecordingEvents() here,
|
|
800
|
+
// which would clear crossOriginParentSignalCleanup and make the child deaf
|
|
801
|
+
// to subsequent start/stop cycles from the parent.
|
|
802
|
+
_this.recordCancelCallback && _this.recordCancelCallback();
|
|
803
|
+
_this.recordCancelCallback = null;
|
|
804
|
+
}
|
|
805
|
+
catch (error) {
|
|
806
|
+
var typedError = error;
|
|
807
|
+
_this.loggerProvider.warn("Error occurred while stopping child iframe replay capture: ".concat(typedError.toString()));
|
|
808
|
+
}
|
|
809
|
+
},
|
|
810
|
+
});
|
|
811
|
+
return [2 /*return*/];
|
|
812
|
+
}
|
|
780
813
|
_j = this;
|
|
781
814
|
_k = recordFunction;
|
|
782
|
-
_l = {
|
|
783
|
-
emit: function (event) {
|
|
815
|
+
_l = [__assign({}, this.buildRRWebRecordOptions(config, hooks, function (event) {
|
|
784
816
|
if (_this.shouldOptOut()) {
|
|
785
817
|
_this.loggerProvider.log("Opting session ".concat(sessionId, " out of recording due to optOut config."));
|
|
786
818
|
_this.stopRecordingEvents();
|
|
@@ -794,52 +826,24 @@ var SessionReplay = /** @class */ (function () {
|
|
|
794
826
|
// Schedule processing during idle time if the browser supports requestIdleCallback
|
|
795
827
|
_this.eventCompressor.enqueueEvent(event, sessionId);
|
|
796
828
|
}
|
|
797
|
-
},
|
|
798
|
-
|
|
799
|
-
hooks: hooks,
|
|
800
|
-
maskAllInputs: true,
|
|
801
|
-
maskTextClass: MASK_TEXT_CLASS,
|
|
802
|
-
blockClass: BLOCK_CLASS,
|
|
803
|
-
blockSelector: this.getBlockSelectors(),
|
|
804
|
-
applyBackgroundColorToBlockedElements: config.applyBackgroundColorToBlockedElements,
|
|
805
|
-
maskInputFn: maskFn('input', privacyConfig, function () { return _this.currentPageUrl; }),
|
|
806
|
-
maskTextFn: maskFn('text', privacyConfig, function () { return _this.currentPageUrl; }),
|
|
807
|
-
maskAttributeFn: maskAttributeFn(privacyConfig, function () { return _this.currentPageUrl; }),
|
|
808
|
-
maskTextSelector: this.getMaskTextSelectors(),
|
|
809
|
-
recordCanvas: false,
|
|
810
|
-
captureAdoptedStyleSheets: config.captureAdoptedStyleSheets,
|
|
811
|
-
slimDOMOptions: {
|
|
812
|
-
script: (_g = config.omitElementTags) === null || _g === void 0 ? void 0 : _g.script,
|
|
813
|
-
comment: (_h = config.omitElementTags) === null || _h === void 0 ? void 0 : _h.comment,
|
|
814
|
-
},
|
|
815
|
-
errorHandler: function (error) {
|
|
816
|
-
var typedError = error;
|
|
817
|
-
// styled-components relies on this error being thrown and bubbled up, rrweb is otherwise suppressing it
|
|
818
|
-
if (typedError.message.includes('insertRule') && typedError.message.includes('CSSStyleSheet')) {
|
|
819
|
-
throw typedError;
|
|
820
|
-
}
|
|
821
|
-
// rrweb does monkey patching on certain window functions such as CSSStyleSheet.proptype.insertRule,
|
|
822
|
-
// and errors from external clients calling these functions can get suppressed. Styled components depend
|
|
823
|
-
// on these errors being re-thrown.
|
|
824
|
-
if (typedError._external_) {
|
|
825
|
-
throw typedError;
|
|
826
|
-
}
|
|
827
|
-
_this.loggerProvider.warn('Error while capturing replay: ', typedError.toString());
|
|
828
|
-
// Return true so that we don't clutter user's consoles with internal rrweb errors
|
|
829
|
-
return true;
|
|
830
|
-
}
|
|
831
|
-
};
|
|
829
|
+
}, 'Error while capturing replay: '))];
|
|
830
|
+
_m = {};
|
|
832
831
|
return [4 /*yield*/, this.getRecordingPlugins(loggingConfig)];
|
|
833
832
|
case 4:
|
|
834
|
-
_j.recordCancelCallback = _k.apply(void 0, [(_l.plugins =
|
|
835
|
-
|
|
833
|
+
_j.recordCancelCallback = _k.apply(void 0, [__assign.apply(void 0, _l.concat([(_m.plugins = _o.sent(), _m.recordCrossOriginIframes = crossOriginIframesEnabled, _m)]))]);
|
|
834
|
+
if (crossOriginIframesEnabled && !childMode && coordinateChildren) {
|
|
835
|
+
if (!this.crossOriginIframeCoordinator) {
|
|
836
|
+
this.crossOriginIframeCoordinator = new CrossOriginIframeCoordinator();
|
|
837
|
+
}
|
|
838
|
+
this.crossOriginIframeCoordinator.start();
|
|
839
|
+
}
|
|
836
840
|
void this.addCustomRRWebEvent(CustomRRwebEvent.DEBUG_INFO);
|
|
837
841
|
if (shouldLogMetadata) {
|
|
838
842
|
void this.addCustomRRWebEvent(CustomRRwebEvent.METADATA, this.metadata);
|
|
839
843
|
}
|
|
840
844
|
return [3 /*break*/, 6];
|
|
841
845
|
case 5:
|
|
842
|
-
error_5 =
|
|
846
|
+
error_5 = _o.sent();
|
|
843
847
|
this.loggerProvider.warn('Failed to initialize session replay:', error_5);
|
|
844
848
|
return [3 /*break*/, 6];
|
|
845
849
|
case 6: return [2 /*return*/];
|
|
@@ -847,6 +851,67 @@ var SessionReplay = /** @class */ (function () {
|
|
|
847
851
|
});
|
|
848
852
|
});
|
|
849
853
|
};
|
|
854
|
+
SessionReplay.prototype.buildRRWebRecordOptions = function (config, hooks, emit, errorLogPrefix) {
|
|
855
|
+
var _this = this;
|
|
856
|
+
var _a, _b;
|
|
857
|
+
var privacyConfig = config.privacyConfig;
|
|
858
|
+
return {
|
|
859
|
+
emit: emit,
|
|
860
|
+
inlineStylesheet: config.shouldInlineStylesheet,
|
|
861
|
+
hooks: hooks,
|
|
862
|
+
maskAllInputs: true,
|
|
863
|
+
maskTextClass: MASK_TEXT_CLASS,
|
|
864
|
+
blockClass: BLOCK_CLASS,
|
|
865
|
+
blockSelector: this.getBlockSelectors(),
|
|
866
|
+
applyBackgroundColorToBlockedElements: config.applyBackgroundColorToBlockedElements,
|
|
867
|
+
maskInputFn: maskFn('input', privacyConfig, function () { return _this.currentPageUrl; }),
|
|
868
|
+
maskTextFn: maskFn('text', privacyConfig, function () { return _this.currentPageUrl; }),
|
|
869
|
+
maskAttributeFn: maskAttributeFn(privacyConfig, function () { return _this.currentPageUrl; }),
|
|
870
|
+
maskTextSelector: this.getMaskTextSelectors(),
|
|
871
|
+
recordCanvas: false,
|
|
872
|
+
captureAdoptedStyleSheets: config.captureAdoptedStyleSheets,
|
|
873
|
+
slimDOMOptions: {
|
|
874
|
+
script: (_a = config.omitElementTags) === null || _a === void 0 ? void 0 : _a.script,
|
|
875
|
+
comment: (_b = config.omitElementTags) === null || _b === void 0 ? void 0 : _b.comment,
|
|
876
|
+
},
|
|
877
|
+
errorHandler: function (error) {
|
|
878
|
+
var typedError = error;
|
|
879
|
+
// styled-components relies on this error being thrown and bubbled up, rrweb is otherwise suppressing it
|
|
880
|
+
if (typedError.message.includes('insertRule') && typedError.message.includes('CSSStyleSheet')) {
|
|
881
|
+
throw typedError;
|
|
882
|
+
}
|
|
883
|
+
// rrweb monkey-patches window functions like CSSStyleSheet.insertRule; errors from external callers
|
|
884
|
+
// (e.g. styled-components) must be re-thrown so they aren't silently swallowed.
|
|
885
|
+
if (typedError._external_) {
|
|
886
|
+
throw typedError;
|
|
887
|
+
}
|
|
888
|
+
_this.loggerProvider.warn(errorLogPrefix, typedError.toString());
|
|
889
|
+
// Return true so that we don't clutter user's consoles with internal rrweb errors
|
|
890
|
+
return true;
|
|
891
|
+
},
|
|
892
|
+
};
|
|
893
|
+
};
|
|
894
|
+
SessionReplay.prototype._recordEventsInChildMode = function (recordFunction, sessionId, config, hooks) {
|
|
895
|
+
// In child mode, rrweb detects window.parent !== window and routes events via
|
|
896
|
+
// postMessage to the parent instead of calling emit. The emit callback is unused.
|
|
897
|
+
// Note: recording plugins (URL tracking, console capture) are intentionally omitted
|
|
898
|
+
// here — the child's events are merged into the parent stream, so URL changes inside
|
|
899
|
+
// the iframe should not be recorded as parent page-view events.
|
|
900
|
+
try {
|
|
901
|
+
// Stop only the previous rrweb recording. Do NOT call stopRecordingEvents() here:
|
|
902
|
+
// that would clear crossOriginParentSignalCleanup — the very listener that invoked
|
|
903
|
+
// this method — making the child permanently deaf to subsequent stop/start cycles.
|
|
904
|
+
this.recordCancelCallback && this.recordCancelCallback();
|
|
905
|
+
this.recordCancelCallback = null;
|
|
906
|
+
this.recordCancelCallback = recordFunction(__assign(__assign({}, this.buildRRWebRecordOptions(config, hooks, function () {
|
|
907
|
+
// no-op: child events are forwarded to parent via postMessage by rrweb
|
|
908
|
+
}, 'Error while capturing replay (child iframe): ')), { recordCrossOriginIframes: true }));
|
|
909
|
+
this.loggerProvider.log("Session Replay child iframe capture beginning for session ".concat(sessionId, "."));
|
|
910
|
+
}
|
|
911
|
+
catch (error) {
|
|
912
|
+
this.loggerProvider.warn('Failed to initialize session replay in child iframe mode:', error);
|
|
913
|
+
}
|
|
914
|
+
};
|
|
850
915
|
SessionReplay.prototype.getDeviceId = function () {
|
|
851
916
|
var _a;
|
|
852
917
|
return (_a = this.identifiers) === null || _a === void 0 ? void 0 : _a.deviceId;
|
|
@@ -865,8 +930,10 @@ var SessionReplay = /** @class */ (function () {
|
|
|
865
930
|
});
|
|
866
931
|
};
|
|
867
932
|
SessionReplay.prototype.shutdown = function () {
|
|
868
|
-
var _a;
|
|
933
|
+
var _a, _b;
|
|
869
934
|
(_a = this.urlChangeCleanup) === null || _a === void 0 ? void 0 : _a.call(this);
|
|
935
|
+
(_b = this.crossOriginParentSignalCleanup) === null || _b === void 0 ? void 0 : _b.call(this);
|
|
936
|
+
this.crossOriginParentSignalCleanup = null;
|
|
870
937
|
this.teardownEventListeners(true);
|
|
871
938
|
this.stopRecordingEvents();
|
|
872
939
|
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 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 { 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 SESSION_REPLAY_EU_URL,\n SESSION_REPLAY_SERVER_URL,\n SESSION_REPLAY_STAGING_URL,\n} from './constants';\nimport {\n getServerUrl,\n getDebugConfig,\n getEffectiveMaskLevel,\n getPageUrl,\n getStorageSize,\n getCurrentUrl,\n maskFn,\n maskAttributeFn,\n} from './helpers';\nimport { EventCompressor } from './events/event-compressor';\nimport { createEventsManager, EventsManagerWithBeacon } from './events/events-manager';\nimport { MultiEventManager } from './events/multi-manager';\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 SessionReplayTargetingInput,\n} from './typings/session-replay';\nimport { isSessionInSample } from './sampling';\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?: SessionReplayTargetingInput;\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 private recordEventsInFlight = false;\n\n /** Current page URL, kept in sync with SPA navigations for URL-based masking */\n private currentPageUrl = '';\n\n private recordEventsPendingShouldLogMetadata: boolean | 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. Always keeps\n * `currentPageUrl` in sync (needed for URL-based masking). When a targeting\n * config is present it also re-evaluates targeting on every navigation.\n */\n private setupUrlChangeListener(): 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 hasTargeting = !!this.config?.targetingConfig;\n\n const onUrlChange = (href: string): void => {\n this.currentPageUrl = href;\n\n if (hasTargeting) {\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 };\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(): SessionReplayTargetingInput['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.currentPageUrl = getCurrentUrl();\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 this.pageLeaveFns = [];\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 let compressionWorkerScript: string | undefined;\n let trackDestinationWorkerScript: string | undefined;\n const globalScope = getGlobalScope();\n if (this.config.useWebWorker && globalScope && globalScope.Worker) {\n const { compressionScript, trackDestinationScript } = await import('./worker');\n compressionWorkerScript = compressionScript;\n trackDestinationWorkerScript = trackDestinationScript;\n }\n\n let rrwebEventManager: EventsManagerWithBeacon<'replay'> | undefined;\n try {\n rrwebEventManager = await createEventsManager<'replay'>({\n config: this.config,\n type: 'replay',\n storeType,\n trackDestinationWorkerScript,\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 trackDestinationWorkerScript,\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 this.eventCompressor = new EventCompressor(\n this.eventsManager,\n this.config,\n this.getDeviceId(),\n compressionWorkerScript,\n () => this.sendEvents(),\n );\n\n // Register beacon fallback for page exit. sendBeacon survives page unload\n // and delivers any incremental events that haven't been flushed via fetch yet.\n this.pageLeaveFns = [\n ...this.pageLeaveFns,\n () => {\n if (!this.config || !this.identifiers?.sessionId || !rrwebEventManager) return;\n const events = rrwebEventManager.getBeaconEvents();\n if (!events.length) return;\n const deviceId = this.getDeviceId();\n if (!deviceId) return;\n rrwebEventManager.trackDestination.sendBeacon({\n events,\n sessionId: this.identifiers.sessionId,\n deviceId,\n apiKey: this.config.apiKey,\n serverZone: this.config.serverZone,\n });\n },\n ];\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 const needsUrlTracking = this.config.targetingConfig || (this.config.privacyConfig?.urlMaskLevels?.length ?? 0) > 0;\n if (needsUrlTracking) {\n this.setupUrlChangeListener();\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 if (this.recordCancelCallback && this.recordFunction) {\n try {\n this.recordFunction.takeFullSnapshot(true);\n } catch (error) {\n this.loggerProvider.warn('Failed to take full snapshot on focus:', error);\n }\n } else if (!this.recordEventsInFlight) {\n void this.recordEvents(false);\n }\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: SessionReplayTargetingInput,\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 = isSessionInSample(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 const privacyConfig = this.config?.privacyConfig;\n const effectiveLevel = privacyConfig ? getEffectiveMaskLevel(this.currentPageUrl, privacyConfig) : undefined;\n\n if (effectiveLevel === 'conservative') {\n return '*';\n }\n\n // If any urlMaskLevels rule uses 'conservative', always route all text nodes\n // through maskTextFn so the dynamic URL getter can decide at call time.\n // Without this, rrweb's static maskTextSelector would miss text nodes when\n // the user navigates from a non-conservative page to a conservative one.\n if (privacyConfig?.urlMaskLevels?.some((rule) => rule.maskLevel === 'conservative')) {\n return '*';\n }\n\n // If defaultMaskLevel is 'conservative' and URL rules exist, always route text through\n // maskTextFn — a page matching no rule falls back to the conservative default, and\n // rrweb must be set up at start to call maskTextFn for those text nodes.\n const urlMaskLevels = privacyConfig?.urlMaskLevels;\n if (privacyConfig?.defaultMaskLevel === 'conservative' && urlMaskLevels && urlMaskLevels.length > 0) {\n return '*';\n }\n\n const maskSelector = 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 if (this.recordEventsInFlight) {\n this.recordEventsPendingShouldLogMetadata = shouldLogMetadata;\n return;\n }\n this.recordEventsInFlight = true;\n try {\n await this._recordEvents(shouldLogMetadata);\n while (this.recordEventsPendingShouldLogMetadata !== null) {\n const pendingArgs = this.recordEventsPendingShouldLogMetadata;\n this.recordEventsPendingShouldLogMetadata = null;\n await this._recordEvents(pendingArgs);\n }\n } finally {\n this.recordEventsInFlight = false;\n this.recordEventsPendingShouldLogMetadata = null;\n }\n }\n\n private 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 const networkLoggingConfig = config.loggingConfig?.network;\n const trackUrl = getServerUrl(config.serverZone, config.trackServerUrl);\n const ignoredUrls = [SESSION_REPLAY_SERVER_URL, SESSION_REPLAY_EU_URL, SESSION_REPLAY_STAGING_URL, trackUrl];\n this.networkObservers?.start((event: NetworkRequestEvent) => {\n if (ignoredUrls.some((url) => event.url.startsWith(url))) return;\n void this.addCustomRRWebEvent(CustomRRwebEvent.FETCH_REQUEST, event);\n }, networkLoggingConfig);\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, () => this.currentPageUrl),\n maskTextFn: maskFn('text', privacyConfig, () => this.currentPageUrl),\n maskAttributeFn: maskAttributeFn(privacyConfig, () => this.currentPageUrl),\n maskTextSelector: this.getMaskTextSelectors(),\n recordCanvas: false,\n captureAdoptedStyleSheets: config.captureAdoptedStyleSheets,\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
|
+
{"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 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 { 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 SESSION_REPLAY_EU_URL,\n SESSION_REPLAY_SERVER_URL,\n SESSION_REPLAY_STAGING_URL,\n} from './constants';\nimport {\n getServerUrl,\n getDebugConfig,\n getEffectiveMaskLevel,\n getPageUrl,\n getStorageSize,\n getCurrentUrl,\n maskFn,\n maskAttributeFn,\n} from './helpers';\nimport { EventCompressor } from './events/event-compressor';\nimport { createEventsManager, EventsManagerWithBeacon } from './events/events-manager';\nimport { MultiEventManager } from './events/multi-manager';\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 SessionReplayTargetingInput,\n} from './typings/session-replay';\nimport { isSessionInSample } from './sampling';\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';\nimport { isInIframe, CrossOriginIframeCoordinator, listenForParentSignals } from './cross-origin-iframes';\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?: SessionReplayTargetingInput;\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 private recordEventsInFlight = false;\n\n /** Current page URL, kept in sync with SPA navigations for URL-based masking */\n private currentPageUrl = '';\n\n private recordEventsPendingShouldLogMetadata: boolean | 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 private crossOriginIframeCoordinator: CrossOriginIframeCoordinator | null = null;\n private crossOriginParentSignalCleanup: (() => 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. Always keeps\n * `currentPageUrl` in sync (needed for URL-based masking). When a targeting\n * config is present it also re-evaluates targeting on every navigation.\n */\n private setupUrlChangeListener(): 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 hasTargeting = !!this.config?.targetingConfig;\n\n const onUrlChange = (href: string): void => {\n this.currentPageUrl = href;\n\n if (hasTargeting) {\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 };\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(): SessionReplayTargetingInput['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.currentPageUrl = getCurrentUrl();\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 this.pageLeaveFns = [];\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 let compressionWorkerScript: string | undefined;\n let trackDestinationWorkerScript: string | undefined;\n const globalScope = getGlobalScope();\n if (this.config.useWebWorker && globalScope && globalScope.Worker) {\n const { compressionScript, trackDestinationScript } = await import('./worker');\n compressionWorkerScript = compressionScript;\n trackDestinationWorkerScript = trackDestinationScript;\n }\n\n let rrwebEventManager: EventsManagerWithBeacon<'replay'> | undefined;\n try {\n rrwebEventManager = await createEventsManager<'replay'>({\n config: this.config,\n type: 'replay',\n storeType,\n trackDestinationWorkerScript,\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 trackDestinationWorkerScript,\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 this.eventCompressor = new EventCompressor(\n this.eventsManager,\n this.config,\n this.getDeviceId(),\n compressionWorkerScript,\n () => this.sendEvents(),\n );\n\n // Register beacon fallback for page exit. sendBeacon survives page unload\n // and delivers any incremental events that haven't been flushed via fetch yet.\n this.pageLeaveFns = [\n ...this.pageLeaveFns,\n () => {\n if (!this.config || !this.identifiers?.sessionId || !rrwebEventManager) return;\n const events = rrwebEventManager.getBeaconEvents();\n if (!events.length) return;\n const deviceId = this.getDeviceId();\n if (!deviceId) return;\n rrwebEventManager.trackDestination.sendBeacon({\n events,\n sessionId: this.identifiers.sessionId,\n deviceId,\n apiKey: this.config.apiKey,\n serverZone: this.config.serverZone,\n });\n },\n ];\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 const needsUrlTracking = this.config.targetingConfig || (this.config.privacyConfig?.urlMaskLevels?.length ?? 0) > 0;\n if (needsUrlTracking) {\n this.setupUrlChangeListener();\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 if (this.recordCancelCallback && this.recordFunction) {\n try {\n this.recordFunction.takeFullSnapshot(true);\n } catch (error) {\n this.loggerProvider.warn('Failed to take full snapshot on focus:', error);\n }\n } else if (!this.recordEventsInFlight) {\n void this.recordEvents(false);\n }\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: SessionReplayTargetingInput,\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 = isSessionInSample(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 const privacyConfig = this.config?.privacyConfig;\n const effectiveLevel = privacyConfig ? getEffectiveMaskLevel(this.currentPageUrl, privacyConfig) : undefined;\n\n if (effectiveLevel === 'conservative') {\n return '*';\n }\n\n // If any urlMaskLevels rule uses 'conservative', always route all text nodes\n // through maskTextFn so the dynamic URL getter can decide at call time.\n // Without this, rrweb's static maskTextSelector would miss text nodes when\n // the user navigates from a non-conservative page to a conservative one.\n if (privacyConfig?.urlMaskLevels?.some((rule) => rule.maskLevel === 'conservative')) {\n return '*';\n }\n\n // If defaultMaskLevel is 'conservative' and URL rules exist, always route text through\n // maskTextFn — a page matching no rule falls back to the conservative default, and\n // rrweb must be set up at start to call maskTextFn for those text nodes.\n const urlMaskLevels = privacyConfig?.urlMaskLevels;\n if (privacyConfig?.defaultMaskLevel === 'conservative' && urlMaskLevels && urlMaskLevels.length > 0) {\n return '*';\n }\n\n const maskSelector = 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 if (this.recordEventsInFlight) {\n this.recordEventsPendingShouldLogMetadata = shouldLogMetadata;\n return;\n }\n this.recordEventsInFlight = true;\n try {\n await this._recordEvents(shouldLogMetadata);\n while (this.recordEventsPendingShouldLogMetadata !== null) {\n const pendingArgs = this.recordEventsPendingShouldLogMetadata;\n this.recordEventsPendingShouldLogMetadata = null;\n await this._recordEvents(pendingArgs);\n }\n } finally {\n this.recordEventsInFlight = false;\n this.recordEventsPendingShouldLogMetadata = null;\n }\n }\n\n private 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 const networkLoggingConfig = config.loggingConfig?.network;\n const trackUrl = getServerUrl(config.serverZone, config.trackServerUrl);\n const ignoredUrls = [SESSION_REPLAY_SERVER_URL, SESSION_REPLAY_EU_URL, SESSION_REPLAY_STAGING_URL, trackUrl];\n this.networkObservers?.start((event: NetworkRequestEvent) => {\n if (ignoredUrls.some((url) => event.url.startsWith(url))) return;\n void this.addCustomRRWebEvent(CustomRRwebEvent.FETCH_REQUEST, event);\n }, networkLoggingConfig);\n const { 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 const crossOriginIframesEnabled = !!config.crossOriginIframes?.enabled;\n const coordinateChildren = config.crossOriginIframes?.coordinateChildren !== false;\n const childMode = crossOriginIframesEnabled && isInIframe();\n\n if (childMode && coordinateChildren) {\n // Child mode: don't self-start; wait for a start signal from the parent.\n // (The previous listener, if any, was already removed by stopRecordingEvents above.)\n this.crossOriginParentSignalCleanup = listenForParentSignals({\n onStart: () => this._recordEventsInChildMode(recordFunction, sessionId, config, hooks),\n onStop: () => {\n try {\n // Only cancel the rrweb recording — do NOT call stopRecordingEvents() here,\n // which would clear crossOriginParentSignalCleanup and make the child deaf\n // to subsequent start/stop cycles from the parent.\n this.recordCancelCallback && this.recordCancelCallback();\n this.recordCancelCallback = null;\n } catch (error) {\n const typedError = error as Error;\n this.loggerProvider.warn(\n `Error occurred while stopping child iframe replay capture: ${typedError.toString()}`,\n );\n }\n },\n });\n return;\n }\n\n this.recordCancelCallback = recordFunction({\n ...this.buildRRWebRecordOptions(\n config,\n hooks,\n (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 'Error while capturing replay: ',\n ),\n plugins: await this.getRecordingPlugins(loggingConfig),\n recordCrossOriginIframes: crossOriginIframesEnabled,\n });\n\n if (crossOriginIframesEnabled && !childMode && coordinateChildren) {\n if (!this.crossOriginIframeCoordinator) {\n this.crossOriginIframeCoordinator = new CrossOriginIframeCoordinator();\n }\n this.crossOriginIframeCoordinator.start();\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 private buildRRWebRecordOptions(\n config: SessionReplayJoinedConfig,\n hooks: { mouseInteraction?: any; scroll?: scrollCallback },\n emit: (event: eventWithTime) => void,\n errorLogPrefix: string,\n ): Parameters<RecordFunction>[0] {\n const { privacyConfig } = config;\n return {\n emit,\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, () => this.currentPageUrl),\n maskTextFn: maskFn('text', privacyConfig, () => this.currentPageUrl),\n maskAttributeFn: maskAttributeFn(privacyConfig, () => this.currentPageUrl),\n maskTextSelector: this.getMaskTextSelectors(),\n recordCanvas: false,\n captureAdoptedStyleSheets: config.captureAdoptedStyleSheets,\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 // 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 // rrweb monkey-patches window functions like CSSStyleSheet.insertRule; errors from external callers\n // (e.g. styled-components) must be re-thrown so they aren't silently swallowed.\n if (typedError._external_) {\n throw typedError;\n }\n this.loggerProvider.warn(errorLogPrefix, typedError.toString());\n // Return true so that we don't clutter user's consoles with internal rrweb errors\n return true;\n },\n };\n }\n\n private _recordEventsInChildMode(\n recordFunction: RecordFunction,\n sessionId: string | number,\n config: SessionReplayJoinedConfig,\n hooks: { mouseInteraction?: any; scroll?: scrollCallback },\n ) {\n // In child mode, rrweb detects window.parent !== window and routes events via\n // postMessage to the parent instead of calling emit. The emit callback is unused.\n // Note: recording plugins (URL tracking, console capture) are intentionally omitted\n // here — the child's events are merged into the parent stream, so URL changes inside\n // the iframe should not be recorded as parent page-view events.\n try {\n // Stop only the previous rrweb recording. Do NOT call stopRecordingEvents() here:\n // that would clear crossOriginParentSignalCleanup — the very listener that invoked\n // this method — making the child permanently deaf to subsequent stop/start cycles.\n this.recordCancelCallback && this.recordCancelCallback();\n this.recordCancelCallback = null;\n this.recordCancelCallback = recordFunction({\n ...this.buildRRWebRecordOptions(\n config,\n hooks,\n () => {\n // no-op: child events are forwarded to parent via postMessage by rrweb\n },\n 'Error while capturing replay (child iframe): ',\n ),\n recordCrossOriginIframes: true, // child mode is only entered when crossOriginIframes.enabled is true\n });\n this.loggerProvider.log(`Session Replay child iframe capture beginning for session ${sessionId}.`);\n } catch (error) {\n this.loggerProvider.warn('Failed to initialize session replay in child iframe mode:', 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 this.crossOriginIframeCoordinator?.stop();\n this.crossOriginIframeCoordinator = null;\n // Remove the child-mode parent signal listener so a later mode change\n // (e.g. crossOriginIframes disabled) does not leave a stale listener.\n this.crossOriginParentSignalCleanup?.();\n this.crossOriginParentSignalCleanup = null;\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.crossOriginParentSignalCleanup?.();\n this.crossOriginParentSignalCleanup = null;\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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"track-destination.d.ts","sourceRoot":"","sources":["../../src/track-destination.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiC,OAAO,EAAE,UAAU,EAAU,MAAM,2BAA2B,CAAC;AASvG,OAAO,EACL,6BAA6B,IAAI,sCAAsC,EACvE,wBAAwB,EACxB,+BAA+B,EAChC,MAAM,0BAA0B,CAAC;AAiBlC,MAAM,MAAM,cAAc,GAAG,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,KAAK;IAC3F,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,EAAE,CAAC;CACnB,CAAC;AAEF,qBAAa,6BAA8B,YAAW,sCAAsC;IAC1F,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,SAAM;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,SAAQ;IACpB,OAAO,CAAC,SAAS,CAA8C;IAC/D,cAAc,EAAE,cAAc,CAAC;IAC/B,KAAK,EAAE,+BAA+B,EAAE,CAAM;IAC9C,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,qBAAqB,CAAwF;gBAEzG,EACV,cAAc,EACd,cAAc,EACd,cAAc,EACd,YAAY,GACb,EAAE;QACD,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,cAAc,EAAE,OAAO,CAAC;QACxB,cAAc,CAAC,EAAE,cAAc,CAAC;QAChC,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB;IAgDD,cAAc,CAAC,eAAe,EAAE,wBAAwB;IAQxD;;;;;;OAMG;IACH,UAAU,CAAC,EACT,MAAM,EACN,SAAS,EACT,QAAQ,EACR,MAAM,EACN,UAAU,GACX,EAAE;QACD,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;QAC3B,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,OAAO,UAAU,CAAC;KACtC;IAgDD,UAAU,CAAC,GAAG,IAAI,EAAE,+BAA+B,EAAE;IAkBrD,QAAQ,CAAC,OAAO,EAAE,MAAM;IAWlB,KAAK,CAAC,QAAQ,UAAQ;IActB,IAAI,CAAC,OAAO,EAAE,+BAA+B,EAAE,QAAQ,UAAO;YA4BtD,aAAa;YAgCb,gBAAgB;
|
|
1
|
+
{"version":3,"file":"track-destination.d.ts","sourceRoot":"","sources":["../../src/track-destination.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiC,OAAO,EAAE,UAAU,EAAU,MAAM,2BAA2B,CAAC;AASvG,OAAO,EACL,6BAA6B,IAAI,sCAAsC,EACvE,wBAAwB,EACxB,+BAA+B,EAChC,MAAM,0BAA0B,CAAC;AAiBlC,MAAM,MAAM,cAAc,GAAG,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,KAAK;IAC3F,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,EAAE,CAAC;CACnB,CAAC;AAEF,qBAAa,6BAA8B,YAAW,sCAAsC;IAC1F,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,SAAM;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,SAAQ;IACpB,OAAO,CAAC,SAAS,CAA8C;IAC/D,cAAc,EAAE,cAAc,CAAC;IAC/B,KAAK,EAAE,+BAA+B,EAAE,CAAM;IAC9C,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,qBAAqB,CAAwF;gBAEzG,EACV,cAAc,EACd,cAAc,EACd,cAAc,EACd,YAAY,GACb,EAAE;QACD,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,cAAc,EAAE,OAAO,CAAC;QACxB,cAAc,CAAC,EAAE,cAAc,CAAC;QAChC,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB;IAgDD,cAAc,CAAC,eAAe,EAAE,wBAAwB;IAQxD;;;;;;OAMG;IACH,UAAU,CAAC,EACT,MAAM,EACN,SAAS,EACT,QAAQ,EACR,MAAM,EACN,UAAU,GACX,EAAE;QACD,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;QAC3B,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,OAAO,UAAU,CAAC;KACtC;IAgDD,UAAU,CAAC,GAAG,IAAI,EAAE,+BAA+B,EAAE;IAkBrD,QAAQ,CAAC,OAAO,EAAE,MAAM;IAWlB,KAAK,CAAC,QAAQ,UAAQ;IActB,IAAI,CAAC,OAAO,EAAE,+BAA+B,EAAE,QAAQ,UAAO;YA4BtD,aAAa;YAgCb,gBAAgB;IAmExB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,+BAA+B;IAqB5E,qBAAqB,CAAC,OAAO,EAAE,+BAA+B;IAQxD,mBAAmB,CAAC,OAAO,EAAE,+BAA+B;IAWlE,eAAe,CAAC,EACd,OAAO,EACP,GAAG,EACH,OAAO,GACR,EAAE;QACD,OAAO,EAAE,+BAA+B,CAAC;QACzC,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB;CAQF"}
|