@amplitude/session-replay-browser 1.28.12 → 1.29.0-fixwebworkerscript.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/lib/cjs/events/event-compressor.d.ts +1 -1
- package/lib/cjs/events/event-compressor.d.ts.map +1 -1
- package/lib/cjs/events/event-compressor.js +16 -9
- package/lib/cjs/events/event-compressor.js.map +1 -1
- package/lib/cjs/session-replay.d.ts.map +1 -1
- package/lib/cjs/session-replay.js +36 -45
- package/lib/cjs/session-replay.js.map +1 -1
- package/lib/cjs/version.d.ts +1 -1
- package/lib/cjs/version.d.ts.map +1 -1
- package/lib/cjs/version.js +1 -1
- package/lib/cjs/version.js.map +1 -1
- package/lib/cjs/worker/index.d.ts +2 -0
- package/lib/cjs/worker/index.d.ts.map +1 -0
- package/lib/cjs/worker/index.js +5 -0
- package/lib/cjs/worker/index.js.map +1 -0
- package/lib/esm/events/event-compressor.d.ts +1 -1
- package/lib/esm/events/event-compressor.d.ts.map +1 -1
- package/lib/esm/events/event-compressor.js +16 -9
- package/lib/esm/events/event-compressor.js.map +1 -1
- package/lib/esm/session-replay.d.ts.map +1 -1
- package/lib/esm/session-replay.js +36 -45
- package/lib/esm/session-replay.js.map +1 -1
- package/lib/esm/version.d.ts +1 -1
- package/lib/esm/version.d.ts.map +1 -1
- package/lib/esm/version.js +1 -1
- package/lib/esm/version.js.map +1 -1
- package/lib/esm/worker/index.d.ts +2 -0
- package/lib/esm/worker/index.d.ts.map +1 -0
- package/lib/esm/worker/index.js +3 -0
- package/lib/esm/worker/index.js.map +1 -0
- package/lib/scripts/observers-min.js +1 -1
- package/lib/scripts/observers-min.js.gz +0 -0
- package/lib/scripts/observers-min.js.map +1 -1
- package/lib/scripts/session-replay-browser-esm.js +1 -1
- package/lib/scripts/session-replay-browser-esm.js.gz +0 -0
- 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/session-replay-min.js +2 -0
- package/lib/scripts/session-replay-min.js.gz +0 -0
- package/lib/scripts/session-replay-min.js.map +1 -0
- package/lib/scripts/worker-min.js +2 -0
- package/lib/scripts/worker-min.js.gz +0 -0
- package/lib/scripts/worker-min.js.map +1 -0
- package/package.json +5 -5
- package/lib/cjs/worker/compression.d.ts +0 -2
- package/lib/cjs/worker/compression.d.ts.map +0 -1
- package/lib/cjs/worker/compression.js +0 -15
- package/lib/cjs/worker/compression.js.map +0 -1
- package/lib/esm/worker/compression.d.ts +0 -2
- package/lib/esm/worker/compression.d.ts.map +0 -1
- package/lib/esm/worker/compression.js +0 -12
- package/lib/esm/worker/compression.js.map +0 -1
- package/lib/scripts/index-min.js +0 -2
- package/lib/scripts/index-min.js.gz +0 -0
- package/lib/scripts/index-min.js.map +0 -1
|
@@ -2,9 +2,9 @@ import { getGlobalScope } from '@amplitude/analytics-core';
|
|
|
2
2
|
import { pack } from '@amplitude/rrweb-packer';
|
|
3
3
|
var DEFAULT_TIMEOUT = 2000;
|
|
4
4
|
var EventCompressor = /** @class */ (function () {
|
|
5
|
-
function EventCompressor(eventsManager, config, deviceId,
|
|
5
|
+
function EventCompressor(eventsManager, config, deviceId, workerScript) {
|
|
6
6
|
var _this = this;
|
|
7
|
-
var _a
|
|
7
|
+
var _a;
|
|
8
8
|
this.taskQueue = [];
|
|
9
9
|
this.isProcessing = false;
|
|
10
10
|
this.compressEvent = function (event) {
|
|
@@ -23,7 +23,19 @@ var EventCompressor = /** @class */ (function () {
|
|
|
23
23
|
this.addCompressedEvent = function (event, sessionId) {
|
|
24
24
|
if (_this.worker) {
|
|
25
25
|
// This indirectly compresses the event.
|
|
26
|
-
|
|
26
|
+
try {
|
|
27
|
+
_this.worker.postMessage({ event: event, sessionId: sessionId });
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
31
|
+
if (err.name === 'DataCloneError') {
|
|
32
|
+
// fallback: serialize
|
|
33
|
+
_this.worker.postMessage(JSON.stringify({ event: event, sessionId: sessionId }));
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
throw err; // rethrow unexpected
|
|
37
|
+
}
|
|
38
|
+
}
|
|
27
39
|
}
|
|
28
40
|
else {
|
|
29
41
|
var compressedEvent = _this.compressEvent(event);
|
|
@@ -40,12 +52,7 @@ var EventCompressor = /** @class */ (function () {
|
|
|
40
52
|
this.config = config;
|
|
41
53
|
this.deviceId = deviceId;
|
|
42
54
|
this.timeout = ((_a = config.performanceConfig) === null || _a === void 0 ? void 0 : _a.timeout) || DEFAULT_TIMEOUT;
|
|
43
|
-
|
|
44
|
-
var replace = {};
|
|
45
|
-
// This next line is going to be ridiculously hard to cover in unit tests, ignoring.
|
|
46
|
-
/* istanbul ignore next */
|
|
47
|
-
var workerScript = (_b = replace.COMPRESSION_WEBWORKER_BODY) !== null && _b !== void 0 ? _b : workerScriptInternal;
|
|
48
|
-
if (((_c = this.config.experimental) === null || _c === void 0 ? void 0 : _c.useWebWorker) && globalScope && globalScope.Worker && workerScript) {
|
|
55
|
+
if (workerScript) {
|
|
49
56
|
config.loggerProvider.log('[Experimental] Enabling web worker for compression');
|
|
50
57
|
var worker = new Worker(URL.createObjectURL(new Blob([workerScript], { type: 'application/javascript' })));
|
|
51
58
|
worker.onerror = function (e) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-compressor.js","sourceRoot":"","sources":["../../../src/events/event-compressor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAU/C,IAAM,eAAe,GAAG,IAAI,CAAC;AAC7B;IAUE,yBACE,aAA2E,EAC3E,MAAiC,EACjC,QAA4B,EAC5B,
|
|
1
|
+
{"version":3,"file":"event-compressor.js","sourceRoot":"","sources":["../../../src/events/event-compressor.ts"],"names":[],"mappings":"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","sourcesContent":["import { getGlobalScope } from '@amplitude/analytics-core';\nimport { pack } from '@amplitude/rrweb-packer';\nimport type { eventWithTime } from '@amplitude/rrweb-types';\nimport { SessionReplayJoinedConfig } from '../config/types';\nimport { SessionReplayEventsManager } from '../typings/session-replay';\n\ninterface TaskQueue {\n event: eventWithTime;\n sessionId: string | number;\n}\n\nconst DEFAULT_TIMEOUT = 2000;\nexport class EventCompressor {\n taskQueue: TaskQueue[] = [];\n isProcessing = false;\n eventsManager?: SessionReplayEventsManager<'replay' | 'interaction', string>;\n config: SessionReplayJoinedConfig;\n deviceId: string | undefined;\n canUseIdleCallback: boolean | undefined;\n timeout: number;\n worker?: Worker;\n\n constructor(\n eventsManager: SessionReplayEventsManager<'replay' | 'interaction', string>,\n config: SessionReplayJoinedConfig,\n deviceId: string | undefined,\n workerScript?: string,\n ) {\n const globalScope = getGlobalScope();\n this.canUseIdleCallback = globalScope && 'requestIdleCallback' in globalScope;\n this.eventsManager = eventsManager;\n this.config = config;\n this.deviceId = deviceId;\n this.timeout = config.performanceConfig?.timeout || DEFAULT_TIMEOUT;\n\n if (workerScript) {\n config.loggerProvider.log('[Experimental] Enabling web worker for compression');\n\n const worker = new Worker(URL.createObjectURL(new Blob([workerScript], { type: 'application/javascript' })));\n worker.onerror = (e) => {\n config.loggerProvider.error(e);\n };\n worker.onmessage = (e) => {\n const { compressedEvent, sessionId } = e.data as Record<string, string>;\n this.addCompressedEventToManager(compressedEvent, sessionId);\n };\n\n this.worker = worker;\n }\n }\n\n // Schedule processing during idle time\n public scheduleIdleProcessing(): void {\n if (!this.isProcessing) {\n this.isProcessing = true;\n requestIdleCallback(\n (idleDeadline) => {\n this.processQueue(idleDeadline);\n },\n { timeout: this.timeout },\n );\n }\n }\n\n // Add an event to the task queue if idle callback is supported or compress the event directly\n public enqueueEvent(event: eventWithTime, sessionId: string | number): void {\n if (this.canUseIdleCallback && this.config.performanceConfig?.enabled) {\n this.config.loggerProvider.debug('Enqueuing event for processing during idle time.');\n this.taskQueue.push({ event, sessionId });\n this.scheduleIdleProcessing();\n } else {\n this.config.loggerProvider.debug('Processing event without idle callback.');\n this.addCompressedEvent(event, sessionId);\n }\n }\n\n // Process the task queue during idle time\n public processQueue(idleDeadline: IdleDeadline): void {\n // Process tasks while there's idle time or until the max number of tasks is reached\n while (this.taskQueue.length > 0 && (idleDeadline.timeRemaining() > 0 || idleDeadline.didTimeout)) {\n const task = this.taskQueue.shift();\n if (task) {\n const { event, sessionId } = task;\n this.addCompressedEvent(event, sessionId);\n }\n }\n\n // If there are still tasks in the queue, schedule the next idle callback\n if (this.taskQueue.length > 0) {\n requestIdleCallback(\n (idleDeadline) => {\n this.processQueue(idleDeadline);\n },\n { timeout: this.timeout },\n );\n } else {\n this.isProcessing = false;\n }\n }\n\n compressEvent = (event: eventWithTime) => {\n const packedEvent = pack(event);\n return JSON.stringify(packedEvent);\n };\n\n private addCompressedEventToManager = (compressedEvent: string, sessionId: string | number) => {\n if (this.eventsManager && this.deviceId) {\n this.eventsManager.addEvent({\n event: { type: 'replay', data: compressedEvent },\n sessionId,\n deviceId: this.deviceId,\n });\n }\n };\n\n public addCompressedEvent = (event: eventWithTime, sessionId: string | number) => {\n if (this.worker) {\n // This indirectly compresses the event.\n try {\n this.worker.postMessage({ event, sessionId });\n } catch (err: any) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (err.name === 'DataCloneError') {\n // fallback: serialize\n this.worker.postMessage(JSON.stringify({ event, sessionId }));\n } else {\n throw err; // rethrow unexpected\n }\n }\n } else {\n const compressedEvent = this.compressEvent(event);\n this.addCompressedEventToManager(compressedEvent, sessionId);\n }\n };\n\n public terminate = () => {\n this.worker?.terminate();\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-replay.d.ts","sourceRoot":"","sources":["../../src/session-replay.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,OAAO,EAKR,MAAM,2BAA2B,CAAC;AAInC,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE3D,OAAO,EACL,aAAa,EACb,yBAAyB,EACzB,kCAAkC,EAInC,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAEL,gBAAgB,EAMjB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAS5D,OAAO,EACL,sBAAsB,EACtB,0BAA0B,IAAI,mCAAmC,EAIjE,kBAAkB,IAAI,mBAAmB,EACzC,oBAAoB,EACrB,MAAM,0BAA0B,CAAC;AAMlC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,KAAK,WAAW,GAAG,CAAC,CAAC,EAAE,mBAAmB,GAAG,KAAK,KAAK,IAAI,CAAC;AAE5D,qBAAa,aAAc,YAAW,sBAAsB;IAC1D,IAAI,SAAuC;IAC3C,MAAM,EAAE,yBAAyB,GAAG,SAAS,CAAC;IAC9C,qBAAqB,EAAE,kCAAkC,GAAG,SAAS,CAAC;IACtE,WAAW,EAAE,mBAAmB,GAAG,SAAS,CAAC;IAC7C,aAAa,CAAC,EAAE,mCAAmC,CAAC,QAAQ,GAAG,aAAa,EAAE,MAAM,CAAC,CAAC;IACtF,cAAc,EAAE,OAAO,CAAC;IACxB,oBAAoB,EAAE,UAAU,CAAC,cAAc,CAAC,GAAG,IAAI,CAAQ;IAC/D,UAAU,SAAK;IACf,eAAe,EAAE,eAAe,GAAG,SAAS,CAAC;IAC7C,qBAAqB,UAAS;IAC9B,OAAO,CAAC,mBAAmB,CAAC,CAAwD;IACpF,OAAO,CAAC,wBAAwB,CAAC,CAAU;IAG3C,YAAY,EAAE,WAAW,EAAE,CAAM;IACjC,OAAO,CAAC,UAAU,CAAC,CAAiB;IACpC,OAAO,CAAC,gBAAgB,CAAC,CAAmB;IAC5C,OAAO,CAAC,QAAQ,CAAoC;IAGpD,OAAO,CAAC,cAAc,CAA+B;;IAMrD,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB;IAIlD,OAAO,CAAC,sBAAsB,CAmB5B;cAEc,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB;
|
|
1
|
+
{"version":3,"file":"session-replay.d.ts","sourceRoot":"","sources":["../../src/session-replay.ts"],"names":[],"mappings":"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"}
|
|
@@ -81,16 +81,6 @@ var SessionReplay = /** @class */ (function () {
|
|
|
81
81
|
}
|
|
82
82
|
return [2 /*return*/];
|
|
83
83
|
}
|
|
84
|
-
// Handle cases where there's no targeting config
|
|
85
|
-
if (!this.config.targetingConfig) {
|
|
86
|
-
if (isInit) {
|
|
87
|
-
this.loggerProvider.log('Targeting config has not been set yet, cannot evaluate targeting.');
|
|
88
|
-
}
|
|
89
|
-
else {
|
|
90
|
-
this.loggerProvider.log('No targeting config set, skipping initialization/recording for event.');
|
|
91
|
-
return [2 /*return*/];
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
84
|
// Store targeting parameters for use in getShouldRecord
|
|
95
85
|
this.lastTargetingParams = targetingParams;
|
|
96
86
|
if (!(this.config.targetingConfig && !this.sessionTargetingMatch)) return [3 /*break*/, 2];
|
|
@@ -195,23 +185,23 @@ var SessionReplay = /** @class */ (function () {
|
|
|
195
185
|
return returnWrapper(this._init(apiKey, options));
|
|
196
186
|
};
|
|
197
187
|
SessionReplay.prototype._init = function (apiKey, options) {
|
|
198
|
-
var _a, _b, _c, _d, _e, _f;
|
|
188
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
199
189
|
return __awaiter(this, void 0, void 0, function () {
|
|
200
|
-
var
|
|
201
|
-
return __generator(this, function (
|
|
202
|
-
switch (
|
|
190
|
+
var _h, _j, joinedConfig, localConfig, remoteConfig, scrollWatcher, managers, storeType, rrwebEventManager, error_1, typedError, payloadBatcher, interactionEventManager, error_2, typedError, workerScript, globalScope, compressionScript;
|
|
191
|
+
return __generator(this, function (_k) {
|
|
192
|
+
switch (_k.label) {
|
|
203
193
|
case 0:
|
|
204
194
|
this.loggerProvider = new SafeLoggerProvider(options.loggerProvider || new Logger());
|
|
205
195
|
Object.prototype.hasOwnProperty.call(options, 'logLevel') &&
|
|
206
196
|
this.loggerProvider.enable(options.logLevel);
|
|
207
197
|
this.identifiers = new SessionIdentifiers({ sessionId: options.sessionId, deviceId: options.deviceId });
|
|
208
|
-
|
|
198
|
+
_h = this;
|
|
209
199
|
return [4 /*yield*/, createSessionReplayJoinedConfigGenerator(apiKey, options)];
|
|
210
200
|
case 1:
|
|
211
|
-
|
|
201
|
+
_h.joinedConfigGenerator = _k.sent();
|
|
212
202
|
return [4 /*yield*/, this.joinedConfigGenerator.generateJoinedConfig(this.identifiers.sessionId)];
|
|
213
203
|
case 2:
|
|
214
|
-
|
|
204
|
+
_j = _k.sent(), joinedConfig = _j.joinedConfig, localConfig = _j.localConfig, remoteConfig = _j.remoteConfig;
|
|
215
205
|
this.config = joinedConfig;
|
|
216
206
|
this.setMetadata(options.sessionId, joinedConfig, localConfig, remoteConfig, (_a = options.version) === null || _a === void 0 ? void 0 : _a.version, VERSION, (_b = options.version) === null || _b === void 0 ? void 0 : _b.type);
|
|
217
207
|
if (options.sessionId && ((_c = this.config.interactionConfig) === null || _c === void 0 ? void 0 : _c.enabled)) {
|
|
@@ -229,9 +219,9 @@ var SessionReplay = /** @class */ (function () {
|
|
|
229
219
|
this.loggerProvider.warn('Could not use preferred indexedDB storage, reverting to in memory option.');
|
|
230
220
|
}
|
|
231
221
|
this.loggerProvider.log("Using ".concat(storeType, " for event storage."));
|
|
232
|
-
|
|
222
|
+
_k.label = 3;
|
|
233
223
|
case 3:
|
|
234
|
-
|
|
224
|
+
_k.trys.push([3, 5, , 6]);
|
|
235
225
|
return [4 /*yield*/, createEventsManager({
|
|
236
226
|
config: this.config,
|
|
237
227
|
sessionId: this.identifiers.sessionId,
|
|
@@ -239,20 +229,20 @@ var SessionReplay = /** @class */ (function () {
|
|
|
239
229
|
storeType: storeType,
|
|
240
230
|
})];
|
|
241
231
|
case 4:
|
|
242
|
-
rrwebEventManager =
|
|
232
|
+
rrwebEventManager = _k.sent();
|
|
243
233
|
managers.push({ name: 'replay', manager: rrwebEventManager });
|
|
244
234
|
return [3 /*break*/, 6];
|
|
245
235
|
case 5:
|
|
246
|
-
error_1 =
|
|
236
|
+
error_1 = _k.sent();
|
|
247
237
|
typedError = error_1;
|
|
248
238
|
this.loggerProvider.warn("Error occurred while creating replay events manager: ".concat(typedError.toString()));
|
|
249
239
|
return [3 /*break*/, 6];
|
|
250
240
|
case 6:
|
|
251
241
|
if (!((_e = this.config.interactionConfig) === null || _e === void 0 ? void 0 : _e.enabled)) return [3 /*break*/, 10];
|
|
252
242
|
payloadBatcher = this.config.interactionConfig.batch ? clickBatcher : clickNonBatcher;
|
|
253
|
-
|
|
243
|
+
_k.label = 7;
|
|
254
244
|
case 7:
|
|
255
|
-
|
|
245
|
+
_k.trys.push([7, 9, , 10]);
|
|
256
246
|
return [4 /*yield*/, createEventsManager({
|
|
257
247
|
config: this.config,
|
|
258
248
|
sessionId: this.identifiers.sessionId,
|
|
@@ -263,11 +253,11 @@ var SessionReplay = /** @class */ (function () {
|
|
|
263
253
|
storeType: storeType,
|
|
264
254
|
})];
|
|
265
255
|
case 8:
|
|
266
|
-
interactionEventManager =
|
|
256
|
+
interactionEventManager = _k.sent();
|
|
267
257
|
managers.push({ name: 'interaction', manager: interactionEventManager });
|
|
268
258
|
return [3 /*break*/, 10];
|
|
269
259
|
case 9:
|
|
270
|
-
error_2 =
|
|
260
|
+
error_2 = _k.sent();
|
|
271
261
|
typedError = error_2;
|
|
272
262
|
this.loggerProvider.warn("Error occurred while creating interaction events manager: ".concat(typedError.toString()));
|
|
273
263
|
return [3 /*break*/, 10];
|
|
@@ -277,15 +267,24 @@ var SessionReplay = /** @class */ (function () {
|
|
|
277
267
|
if (this.eventCompressor) {
|
|
278
268
|
this.eventCompressor.terminate();
|
|
279
269
|
}
|
|
280
|
-
|
|
281
|
-
|
|
270
|
+
workerScript = undefined;
|
|
271
|
+
globalScope = getGlobalScope();
|
|
272
|
+
if (!(((_g = this.config.experimental) === null || _g === void 0 ? void 0 : _g.useWebWorker) && globalScope && globalScope.Worker)) return [3 /*break*/, 12];
|
|
273
|
+
return [4 /*yield*/, import('./worker')];
|
|
282
274
|
case 11:
|
|
283
|
-
|
|
275
|
+
compressionScript = (_k.sent()).compressionScript;
|
|
276
|
+
workerScript = compressionScript;
|
|
277
|
+
_k.label = 12;
|
|
278
|
+
case 12:
|
|
279
|
+
this.eventCompressor = new EventCompressor(this.eventsManager, this.config, this.getDeviceId(), workerScript);
|
|
280
|
+
return [4 /*yield*/, this.initializeNetworkObservers()];
|
|
281
|
+
case 13:
|
|
282
|
+
_k.sent();
|
|
284
283
|
this.loggerProvider.log('Installing @amplitude/session-replay-browser.');
|
|
285
284
|
this.teardownEventListeners(false);
|
|
286
285
|
return [4 /*yield*/, this.evaluateTargetingAndCapture({ userProperties: options.userProperties }, true)];
|
|
287
|
-
case
|
|
288
|
-
|
|
286
|
+
case 14:
|
|
287
|
+
_k.sent();
|
|
289
288
|
return [2 /*return*/];
|
|
290
289
|
}
|
|
291
290
|
});
|
|
@@ -295,11 +294,10 @@ var SessionReplay = /** @class */ (function () {
|
|
|
295
294
|
return returnWrapper(this.asyncSetSessionId(sessionId, deviceId));
|
|
296
295
|
};
|
|
297
296
|
SessionReplay.prototype.asyncSetSessionId = function (sessionId, deviceId, options) {
|
|
298
|
-
var _a;
|
|
299
297
|
return __awaiter(this, void 0, void 0, function () {
|
|
300
298
|
var previousSessionId, deviceIdForReplayId, joinedConfig;
|
|
301
|
-
return __generator(this, function (
|
|
302
|
-
switch (
|
|
299
|
+
return __generator(this, function (_a) {
|
|
300
|
+
switch (_a.label) {
|
|
303
301
|
case 0:
|
|
304
302
|
this.sessionTargetingMatch = false;
|
|
305
303
|
this.lastShouldRecordDecision = undefined; // Reset targeting decision for new session
|
|
@@ -315,20 +313,13 @@ var SessionReplay = /** @class */ (function () {
|
|
|
315
313
|
if (!(this.joinedConfigGenerator && previousSessionId)) return [3 /*break*/, 2];
|
|
316
314
|
return [4 /*yield*/, this.joinedConfigGenerator.generateJoinedConfig(this.identifiers.sessionId)];
|
|
317
315
|
case 1:
|
|
318
|
-
joinedConfig = (
|
|
316
|
+
joinedConfig = (_a.sent()).joinedConfig;
|
|
319
317
|
this.config = joinedConfig;
|
|
320
|
-
|
|
321
|
-
case 2:
|
|
322
|
-
if (!((_a = this.config) === null || _a === void 0 ? void 0 : _a.targetingConfig)) return [3 /*break*/, 4];
|
|
323
|
-
return [4 /*yield*/, this.evaluateTargetingAndCapture({ userProperties: options === null || options === void 0 ? void 0 : options.userProperties })];
|
|
318
|
+
_a.label = 2;
|
|
319
|
+
case 2: return [4 /*yield*/, this.evaluateTargetingAndCapture({ userProperties: options === null || options === void 0 ? void 0 : options.userProperties })];
|
|
324
320
|
case 3:
|
|
325
|
-
|
|
326
|
-
return [
|
|
327
|
-
case 4: return [4 /*yield*/, this.recordEvents()];
|
|
328
|
-
case 5:
|
|
329
|
-
_b.sent();
|
|
330
|
-
_b.label = 6;
|
|
331
|
-
case 6: return [2 /*return*/];
|
|
321
|
+
_a.sent();
|
|
322
|
+
return [2 /*return*/];
|
|
332
323
|
}
|
|
333
324
|
});
|
|
334
325
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-replay.js","sourceRoot":"","sources":["../../src/session-replay.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,qBAAqB,EACrB,cAAc,EAEd,MAAM,EAEN,aAAa,EACb,gBAAgB,GACjB,MAAM,2BAA2B,CAAC;AAEnC,gFAAgF;AAChF,OAAO,EAAiB,SAAS,IAAI,cAAc,EAAkB,MAAM,wBAAwB,CAAC;AAEpG,OAAO,EAAE,wCAAwC,EAAE,MAAM,wBAAwB,CAAC;AASlF,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,+BAA+B,EAC/B,wBAAwB,EACxB,wBAAwB,EACxB,eAAe,EACf,6BAA6B,GAC9B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACpH,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAU1E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAKxE;IAuBE;QAAA,iBAEC;QAxBD,SAAI,GAAG,mCAAmC,CAAC;QAM3C,yBAAoB,GAAsC,IAAI,CAAC;QAC/D,eAAU,GAAG,CAAC,CAAC;QAEf,0BAAqB,GAAG,KAAK,CAAC;QAI9B,2BAA2B;QAC3B,iBAAY,GAAkB,EAAE,CAAC;QAKjC,iDAAiD;QACzC,mBAAc,GAA0B,IAAI,CAAC;QAU7C,2BAAsB,GAAG,UAAC,QAAiB;YACjD,IAAM,WAAW,GAAG,cAAc,EAAE,CAAC;YACrC,IAAI,WAAW,EAAE;gBACf,WAAW,CAAC,mBAAmB,CAAC,MAAM,EAAE,KAAI,CAAC,YAAY,CAAC,CAAC;gBAC3D,WAAW,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAI,CAAC,aAAa,CAAC,CAAC;gBAC7D,CAAC,QAAQ,IAAI,WAAW,CAAC,gBAAgB,CAAC,MAAM,EAAE,KAAI,CAAC,YAAY,CAAC,CAAC;gBACrE,CAAC,QAAQ,IAAI,WAAW,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAI,CAAC,aAAa,CAAC,CAAC;gBACvE,kFAAkF;gBAClF,4CAA4C;gBAC5C,IAAI,WAAW,CAAC,IAAI,IAAI,YAAY,IAAI,WAAW,CAAC,IAAI,EAAE;oBACxD,WAAW,CAAC,mBAAmB,CAAC,UAAU,EAAE,KAAI,CAAC,iBAAiB,CAAC,CAAC;oBACpE,CAAC,QAAQ,IAAI,WAAW,CAAC,gBAAgB,CAAC,UAAU,EAAE,KAAI,CAAC,iBAAiB,CAAC,CAAC;iBAC/E;qBAAM;oBACL,qFAAqF;oBACrF,0CAA0C;oBAC1C,WAAW,CAAC,mBAAmB,CAAC,cAAc,EAAE,KAAI,CAAC,iBAAiB,CAAC,CAAC;oBACxE,CAAC,QAAQ,IAAI,WAAW,CAAC,gBAAgB,CAAC,cAAc,EAAE,KAAI,CAAC,iBAAiB,CAAC,CAAC;iBACnF;aACF;QACH,CAAC,CAAC;QAqKF,iBAAY,GAAG;YACb,KAAI,CAAC,UAAU,EAAE,CAAC;QACpB,CAAC,CAAC;QAEF,kBAAa,GAAG;YACd,sDAAsD;YACtD,yCAAyC;YACzC,KAAK,KAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC,CAAC;QAEF;;;;WAIG;QACK,sBAAiB,GAAG,UAAC,CAA8B;YACzD,KAAI,CAAC,YAAY,CAAC,OAAO,CAAC,UAAC,EAAE;gBAC3B,EAAE,CAAC,CAAC,CAAC,CAAC;YACR,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,gCAA2B,GAAG,UAC5B,eAAsE,EACtE,MAAc;YAAd,uBAAA,EAAA,cAAc;;;;;;4BAEd,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;gCACpE,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE;oCACnD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,gFAAgF,CAAC,CAAC;iCAC3G;qCAAM;oCACL,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC;iCACjG;gCACD,sBAAO;6BACR;4BAED,iDAAiD;4BACjD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE;gCAChC,IAAI,MAAM,EAAE;oCACV,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC;iCAC9F;qCAAM;oCACL,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAC;oCACjG,sBAAO;iCACR;6BACF;4BAED,wDAAwD;4BACxD,IAAI,CAAC,mBAAmB,GAAG,eAAe,CAAC;iCAEvC,CAAA,IAAI,CAAC,MAAM,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAA,EAA1D,wBAA0D;4BACxD,iBAAiB,GAAG,eAAe,CAAC,KAAK,CAAC;4BAC9C,IACE,iBAAiB;gCACjB,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC,UAA8B,CAAC,EAC1F;gCACA,iBAAiB,GAAG,SAAS,CAAC;6BAC/B;4BAED,uEAAuE;4BACvE,mEAAmE;4BACnE,6DAA6D;4BAC7D,KAAA,IAAI,CAAA;4BAAyB,qBAAM,yBAAyB,CAAC;oCAC3D,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,SAAS;oCACrC,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe;oCAC5C,cAAc,EAAE,IAAI,CAAC,cAAc;oCACnC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;oCAC1B,eAAe,EAAE,EAAE,cAAc,EAAE,eAAe,CAAC,cAAc,EAAE,KAAK,EAAE,iBAAiB,EAAE;iCAC9F,CAAC,EAAA;;4BATF,uEAAuE;4BACvE,mEAAmE;4BACnE,6DAA6D;4BAC7D,GAAK,qBAAqB,GAAG,SAM3B,CAAC;4BAEH,oCAAoC;4BACpC,IAAI,CAAC,cAAc,CAAC,KAAK,CACvB,IAAI,CAAC,SAAS,CACZ;gCACE,IAAI,EAAE,gCAAgC;gCACtC,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;gCACjD,KAAK,EAAE,iBAAiB;gCACxB,eAAe,EAAE,eAAe;6BACjC,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;;;iCAGA,MAAM,EAAN,wBAAM;4BACR,KAAK,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;;gCAE3B,qBAAM,IAAI,CAAC,YAAY,EAAE,EAAA;;4BAAzB,SAAyB,CAAC;;;;;;SAE7B,CAAC;QA+RF,wBAAmB,GAAG,UACpB,SAA2B,EAC3B,SAAsC,EACtC,cAAqB;YADrB,0BAAA,EAAA,cAAsC;YACtC,+BAAA,EAAA,qBAAqB;;;;;;;4BAGf,SAAS,GAA0B,SAAS,CAAC;4BAC3C,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;iCAEvB,CAAA,MAAM,IAAI,SAAS,KAAK,gBAAgB,CAAC,QAAQ,CAAA,EAAjD,wBAAiD;4BACnD,SAAS,GAAG;gCACV,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC;gCAC9B,OAAO,EAAE,OAAO;6BACjB,CAAC;iCACE,cAAc,EAAd,wBAAc;4BACQ,qBAAM,cAAc,EAAE,EAAA;;4BAAxC,eAAe,GAAG,SAAsB;4BAC9C,SAAS,yBACJ,eAAe,GACf,SAAS,CACb,CAAC;;;4BAGN,yCAAyC;4BACzC,IAAI,IAAI,CAAC,oBAAoB,IAAI,IAAI,CAAC,cAAc,EAAE;gCACpD,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,SAAS,wBACvC,SAAS,GACT,SAAS,EACZ,CAAC;6BACJ;iCAAM;gCACL,IAAI,CAAC,cAAc,CAAC,KAAK,CACvB,sDAA+C,SAAS,kCAA+B,CACxF,CAAC;6BACH;;;;4BAED,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,kDAAkD,EAAE,GAAC,CAAC,CAAC;;;;;;SAEpF,CAAC;QAEF,wBAAmB,GAAG;;YACpB,IAAI;gBACF,KAAI,CAAC,cAAc,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;gBAC5D,KAAI,CAAC,oBAAoB,IAAI,KAAI,CAAC,oBAAoB,EAAE,CAAC;gBACzD,KAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;gBACjC,MAAA,KAAI,CAAC,gBAAgB,0CAAE,IAAI,EAAE,CAAC;aAC/B;YAAC,OAAO,KAAK,EAAE;gBACd,IAAM,UAAU,GAAG,KAAc,CAAC;gBAClC,KAAI,CAAC,cAAc,CAAC,IAAI,CAAC,wDAAiD,UAAU,CAAC,QAAQ,EAAE,CAAE,CAAC,CAAC;aACpG;QACH,CAAC,CAAC;QArmBA,IAAI,CAAC,cAAc,GAAG,IAAI,kBAAkB,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,4BAAI,GAAJ,UAAK,MAAc,EAAE,OAA6B;QAChD,OAAO,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACpD,CAAC;IAuBe,6BAAK,GAArB,UAAsB,MAAc,EAAE,OAA6B;;;;;;;wBACjE,IAAI,CAAC,cAAc,GAAG,IAAI,kBAAkB,CAAC,OAAO,CAAC,cAAc,IAAI,IAAI,MAAM,EAAE,CAAC,CAAC;wBACrF,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC;4BACvD,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,QAAoB,CAAC,CAAC;wBAC3D,IAAI,CAAC,WAAW,GAAG,IAAI,kBAAkB,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;wBACxG,KAAA,IAAI,CAAA;wBAAyB,qBAAM,wCAAwC,CAAC,MAAM,EAAE,OAAO,CAAC,EAAA;;wBAA5F,GAAK,qBAAqB,GAAG,SAA+D,CAAC;wBACzC,qBAAM,IAAI,CAAC,qBAAqB,CAAC,oBAAoB,CACvG,IAAI,CAAC,WAAW,CAAC,SAAS,CAC3B,EAAA;;wBAFK,KAA8C,SAEnD,EAFO,YAAY,kBAAA,EAAE,WAAW,iBAAA,EAAE,YAAY,kBAAA;wBAG/C,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC;wBAE3B,IAAI,CAAC,WAAW,CACd,OAAO,CAAC,SAAS,EACjB,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,MAAA,OAAO,CAAC,OAAO,0CAAE,OAAO,EACxB,OAAO,EACP,MAAA,OAAO,CAAC,OAAO,0CAAE,IAAI,CACtB,CAAC;wBAEF,IAAI,OAAO,CAAC,SAAS,KAAI,MAAA,IAAI,CAAC,MAAM,CAAC,iBAAiB,0CAAE,OAAO,CAAA,EAAE;4BACzD,aAAa,GAAG,aAAa,CAAC,OAAO,CACzC;gCACE,SAAS,EAAE,OAAO,CAAC,SAAS;gCAC5B,IAAI,EAAE,aAAa;6BACpB,EACD,IAAI,CAAC,MAAM,CACZ,CAAC;4BACF,IAAI,CAAC,YAAY,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;4BAC1F,IAAI,CAAC,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;yBAC1D;wBAEK,QAAQ,GAA+C,EAAE,CAAC;wBAC1D,SAAS,GAAK,IAAI,CAAC,MAAM,UAAhB,CAAiB;wBAChC,IAAI,SAAS,KAAK,KAAK,IAAI,CAAC,CAAA,MAAA,cAAc,EAAE,0CAAE,SAAS,CAAA,EAAE;4BACvD,SAAS,GAAG,QAAQ,CAAC;4BACrB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,2EAA2E,CAAC,CAAC;yBACvG;wBACD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,gBAAS,SAAS,wBAAqB,CAAC,CAAC;;;;wBAErC,qBAAM,mBAAmB,CAAW;gCAC5D,MAAM,EAAE,IAAI,CAAC,MAAM;gCACnB,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,SAAS;gCACrC,IAAI,EAAE,QAAQ;gCACd,SAAS,WAAA;6BACV,CAAC,EAAA;;wBALI,iBAAiB,GAAG,SAKxB;wBACF,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAC;;;;wBAExD,UAAU,GAAG,OAAc,CAAC;wBAClC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,+DAAwD,UAAU,CAAC,QAAQ,EAAE,CAAE,CAAC,CAAC;;;6BAGxG,CAAA,MAAA,IAAI,CAAC,MAAM,CAAC,iBAAiB,0CAAE,OAAO,CAAA,EAAtC,yBAAsC;wBAClC,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,eAAe,CAAC;;;;wBAE1D,qBAAM,mBAAmB,CAAgB;gCACvE,MAAM,EAAE,IAAI,CAAC,MAAM;gCACnB,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,SAAS;gCACrC,IAAI,EAAE,aAAa;gCACnB,WAAW,EAAE,MAAA,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,aAAa,mCAAI,wBAAwB;gCACpF,WAAW,EAAE,wBAAwB;gCACrC,cAAc,gBAAA;gCACd,SAAS,WAAA;6BACV,CAAC,EAAA;;wBARI,uBAAuB,GAAG,SAQ9B;wBACF,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC,CAAC;;;;wBAEnE,UAAU,GAAG,OAAc,CAAC;wBAClC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,oEAA6D,UAAU,CAAC,QAAQ,EAAE,CAAE,CAAC,CAAC;;;wBAInH,IAAI,CAAC,aAAa,QAAO,iBAAiB,YAAjB,iBAAiB,iCAAsC,QAAQ,aAAC,CAAC;wBAC1F,+BAA+B;wBAC/B,IAAI,IAAI,CAAC,eAAe,EAAE;4BACxB,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC;yBAClC;wBACD,IAAI,CAAC,eAAe,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;wBAEhG,qBAAM,IAAI,CAAC,0BAA0B,EAAE,EAAA;;wBAAvC,SAAuC,CAAC;wBAExC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;wBAEzE,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;wBAEnC,qBAAM,IAAI,CAAC,2BAA2B,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,EAAE,IAAI,CAAC,EAAA;;wBAAxF,SAAwF,CAAC;;;;;KAC1F;IAED,oCAAY,GAAZ,UAAa,SAA0B,EAAE,QAAiB;QACxD,OAAO,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;IACpE,CAAC;IAEK,yCAAiB,GAAvB,UACE,SAA0B,EAC1B,QAAiB,EACjB,OAAqD;;;;;;;wBAErD,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC;wBACnC,IAAI,CAAC,wBAAwB,GAAG,SAAS,CAAC,CAAC,2CAA2C;wBAEhF,iBAAiB,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;wBACzE,IAAI,iBAAiB,EAAE;4BACrB,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;yBACpC;wBAEK,mBAAmB,GAAG,QAAQ,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;wBAC3D,IAAI,CAAC,WAAW,GAAG,IAAI,kBAAkB,CAAC;4BACxC,SAAS,EAAE,SAAS;4BACpB,QAAQ,EAAE,mBAAmB;yBAC9B,CAAC,CAAC;6BAIC,CAAA,IAAI,CAAC,qBAAqB,IAAI,iBAAiB,CAAA,EAA/C,wBAA+C;wBACxB,qBAAM,IAAI,CAAC,qBAAqB,CAAC,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAA;;wBAAlG,YAAY,GAAK,CAAA,SAAiF,CAAA,aAAtF;wBACpB,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC;;;6BAGzB,CAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,eAAe,CAAA,EAA5B,wBAA4B;wBAC9B,qBAAM,IAAI,CAAC,2BAA2B,CAAC,EAAE,cAAc,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,cAAc,EAAE,CAAC,EAAA;;wBAAnF,SAAmF,CAAC;;4BAEpF,qBAAM,IAAI,CAAC,YAAY,EAAE,EAAA;;wBAAzB,SAAyB,CAAC;;;;;;KAE7B;IAED,kDAA0B,GAA1B;;QACE,IAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACrC,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE;YAC3B,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,gFAAgF,CAAC,CAAC;YAC3G,OAAO,EAAE,CAAC;SACX;QAED,IAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAC5C,IAAI,eAAe,GAAqC,EAAE,CAAC;QAE3D,IAAI,YAAY,EAAE;YAChB,eAAe;gBACb,GAAC,+BAA+B,IAAG,WAAW,CAAC,eAAe,CAAC,CAAC,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI;mBACpG,CAAC;YACF,IAAI,MAAM,CAAC,SAAS,EAAE;gBACpB,eAAe,CAAC,6BAA6B,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;oBAC9D,OAAO,EAAE,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE;iBACpD,CAAC,CAAC;aACJ;SACF;QAED,KAAK,IAAI,CAAC,mBAAmB,CAC3B,gBAAgB,CAAC,YAAY,EAC7B;YACE,YAAY,cAAA;YACZ,eAAe,EAAE,eAAe;SACjC,EACD,IAAI,CAAC,UAAU,KAAK,EAAE,CACvB,CAAC;QACF,IAAI,IAAI,CAAC,UAAU,KAAK,EAAE,EAAE;YAC1B,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;SACrB;QACD,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,OAAO,eAAe,CAAC;IACzB,CAAC;IA2FD,kCAAU,GAAV,UAAW,SAA2B;;QACpC,IAAM,eAAe,GAAG,SAAS,KAAI,MAAA,IAAI,CAAC,WAAW,0CAAE,SAAS,CAAA,CAAC;QACjE,IAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACpC,IAAI,CAAC,aAAa;YAChB,eAAe;YACf,QAAQ;YACR,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,QAAQ,UAAA,EAAE,CAAC,CAAC;IAC3F,CAAC;IAEK,kCAAU,GAAhB,UAAiB,sBAA8B;;QAA9B,uCAAA,EAAA,8BAA8B;;;;gBAC7C,IAAI,CAAC,CAAA,MAAA,IAAI,CAAC,WAAW,0CAAE,SAAS,CAAA,EAAE;oBAChC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;oBACpF,sBAAO,OAAO,CAAC,OAAO,EAAE,EAAC;iBAC1B;gBAEK,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;gBACpC,IAAI,CAAC,QAAQ,EAAE;oBACb,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;oBACnF,sBAAO,OAAO,CAAC,OAAO,EAAE,EAAC;iBAC1B;gBACD,IAAI,CAAC,aAAa,IAAI,sBAAsB,IAAI,KAAK,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,EAAE,QAAQ,UAAA,EAAE,CAAC,CAAC;gBAEvG,sBAAO,IAAI,CAAC,YAAY,EAAE,EAAC;;;KAC5B;IAED,oCAAY,GAAZ;;QACE,IAAI,mBAAwC,CAAC;QAC7C,IAAI,MAAA,IAAI,CAAC,MAAM,0CAAE,YAAY,EAAE;YAC7B,IAAM,aAAa,GAAG,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,aAAa,CAAC;YACpF,mBAAmB,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC;SAC1D;QAED,OAAO,mBAAmB,KAAK,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,MAAA,IAAI,CAAC,MAAM,0CAAE,MAAM,CAAC;IACvF,CAAC;IAED,uCAAe,GAAf;QACE,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE;YACpE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,sFAAsF,CAAC,CAAC;YACjH,OAAO,KAAK,CAAC;SACd;QACD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE;YAC/B,IAAI,CAAC,cAAc,CAAC,GAAG,CACrB,kBAAW,IAAI,CAAC,WAAW,CAAC,SAAS,qHAAkH,CACxJ,CAAC;YACF,OAAO,KAAK,CAAC;SACd;QAED,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE;YACvB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,yBAAkB,IAAI,CAAC,WAAW,CAAC,SAAS,4CAAyC,CAAC,CAAC;YAC/G,OAAO,KAAK,CAAC;SACd;QAED,IAAI,YAAY,GAAG,KAAK,CAAC;QACzB,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,gGAAgG;QAChG,wEAAwE;QACxE,IAAI,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE;YAC/B,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE;gBAC/B,OAAO,GAAG,4CAAqC,IAAI,CAAC,WAAW,CAAC,SAAS,+CAA4C,CAAC;gBACtH,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACjC,YAAY,GAAG,KAAK,CAAC;gBACrB,OAAO,GAAG,KAAK,CAAC;aACjB;iBAAM;gBACL,OAAO,GAAG,wCAAiC,IAAI,CAAC,WAAW,CAAC,SAAS,2CAAwC,CAAC;gBAC9G,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACjC,YAAY,GAAG,IAAI,CAAC;gBACpB,OAAO,GAAG,IAAI,CAAC;aAChB;SACF;aAAM;YACL,IAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACzF,IAAI,CAAC,UAAU,EAAE;gBACf,OAAO,GAAG,yBAAkB,IAAI,CAAC,WAAW,CAAC,SAAS,0CAAuC,CAAC;gBAC9F,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACjC,YAAY,GAAG,KAAK,CAAC;gBACrB,OAAO,GAAG,KAAK,CAAC;aACjB;iBAAM;gBACL,YAAY,GAAG,IAAI,CAAC;gBACpB,OAAO,GAAG,IAAI,CAAC;aAChB;SACF;QAED,gFAAgF;QAChF,IAAI,IAAI,CAAC,wBAAwB,KAAK,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE;YACjF,KAAK,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,kBAAkB,EAAE;gBACjE,OAAO,SAAA;gBACP,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,SAAS;gBACrC,OAAO,SAAA;gBACP,eAAe,EAAE,IAAI,CAAC,mBAAmB;aAC1C,CAAC,CAAC;YACH,IAAI,CAAC,wBAAwB,GAAG,YAAY,CAAC;SAC9C;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,yCAAiB,GAAjB;;QACE,0FAA0F;QAC1F,4DAA4D;QAC5D,6DAA6D;QAC7D,IAAM,aAAa,GAAG,MAAA,MAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,aAAa,0CAAE,aAAa,mCAAI,EAAE,CAAC;QACtE,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE;YAC9B,OAAO,SAAS,CAAC;SAClB;QACD,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,4CAAoB,GAApB;;QACE,IAAI,CAAA,MAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,aAAa,0CAAE,gBAAgB,MAAK,cAAc,EAAE;YACnE,OAAO,GAAG,CAAC;SACZ;QAED,IAAM,YAAY,GAAG,MAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,aAAa,0CAAE,YAAY,CAAC;QAC9D,IAAI,CAAC,YAAY,EAAE;YACjB,OAAO;SACR;QAED,OAAO,YAAiC,CAAC;IAC3C,CAAC;IAEK,2CAAmB,GAAzB,UAA0B,aAAwC;;;;;;;wBAC1D,OAAO,GAAG,EAAE,CAAC;wBAEnB,0BAA0B;wBAC1B,IAAI;4BACI,iBAAiB,GAAG,uBAAuB,CAAC;gCAChD,cAAc,EAAE,CAAA,MAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,iBAAiB,0CAAE,cAAc,KAAI,EAAE;gCACpE,aAAa,EAAE,CAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,sBAAsB,KAAI,KAAK;gCAC3D,eAAe,EAAE,MAAA,IAAI,CAAC,MAAM,0CAAE,wBAAwB;gCACtD,oBAAoB,EAAE,MAAA,IAAI,CAAC,MAAM,0CAAE,oBAAoB;6BACxD,CAAC,CAAC;4BAEH,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;yBACjC;wBAAC,OAAO,KAAK,EAAE;4BACd,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAC;yBAC1E;6BAaG,CAAA,MAAA,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,OAAO,0CAAE,OAAO,CAAA,EAA/B,wBAA+B;;;;wBAGI,qBAAM,MAAM,CAAC,wCAAwC,CAAC,EAAA;;wBAAjF,sBAAsB,GAAK,CAAA,SAAsD,CAAA,uBAA3D;wBAC9B,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC,EAAE,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;;;;wBAE9E,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,gCAAgC,EAAE,OAAK,CAAC,CAAC;;4BAItE,sBAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAC;;;;KACjD;IAEa,yCAAiB,GAA/B;;;;;;wBACE,IAAI,IAAI,CAAC,cAAc,EAAE;4BACvB,sBAAO,IAAI,CAAC,cAAc,EAAC;yBAC5B;;;;wBAGoB,qBAAM,MAAM,CAAC,yBAAyB,CAAC,EAAA;;wBAAlD,MAAM,GAAK,CAAA,SAAuC,CAAA,OAA5C;wBACd,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC;wBAC7B,sBAAO,MAAM,EAAC;;;wBAEd,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,qCAAqC,EAAE,OAAK,CAAC,CAAC;wBACvE,sBAAO,IAAI,EAAC;;;;;KAEf;IAEK,oCAAY,GAAlB,UAAmB,iBAAwB;;QAAxB,kCAAA,EAAA,wBAAwB;;;;;;;;wBACnC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;wBACrB,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;wBACtC,SAAS,GAAG,MAAA,IAAI,CAAC,WAAW,0CAAE,SAAS,CAAC;wBAC9C,IAAI,CAAC,YAAY,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,EAAE;4BAC1C,sBAAO;yBACR;wBACD,IAAI,CAAC,mBAAmB,EAAE,CAAC;wBAEJ,qBAAM,IAAI,CAAC,iBAAiB,EAAE,EAAA;;wBAA/C,cAAc,GAAG,SAA8B;wBAErD,iDAAiD;wBACjD,IAAI,CAAC,cAAc,EAAE;4BACnB,sBAAO;yBACR;wBAED,qBAAM,IAAI,CAAC,0BAA0B,EAAE,EAAA;;wBAAvC,SAAuC,CAAC;wBAExC,MAAA,IAAI,CAAC,gBAAgB,0CAAE,KAAK,CAAC,UAAC,KAA0B;4BACtD,KAAK,KAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;wBACvE,CAAC,CAAC,CAAC;wBACK,aAAa,GAAuC,MAAM,cAA7C,EAAE,iBAAiB,GAAoB,MAAM,kBAA1B,EAAE,aAAa,GAAK,MAAM,cAAX,CAAY;wBAE7D,KAAK,GAAG,CAAA,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,OAAO;4BACtC,CAAC,CAAC;gCACE,gBAAgB,EACd,IAAI,CAAC,aAAa;oCAClB,SAAS,CAAC,IAAI,CAAC,cAAc,EAAE;wCAC7B,aAAa,EAAE,IAAI,CAAC,aAAa;wCACjC,SAAS,WAAA;wCACT,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;wCACvC,MAAM,EAAE,cAAc,CAAC,MAAM;wCAC7B,cAAc,EAAE,MAAA,iBAAiB,CAAC,cAAc,mCAAI,EAAE;qCACvD,CAAC;gCACJ,MAAM,EAAE,IAAI,CAAC,UAAU;6BACxB;4BACH,CAAC,CAAC,EAAE,CAAC;wBAED,cAAc,GAClB,CAAA,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,OAAO,KAAI,iBAAiB,CAAC,cAAc,CAAC,CAAC,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;wBAEzG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,+CAAwC,SAAS,MAAG,CAAC,CAAC;;;;wBAG5E,KAAA,IAAI,CAAA;wBAAwB,KAAA,cAAc,CAAA;;4BACxC,IAAI,EAAE,UAAC,KAAoB;gCACzB,IAAI,KAAI,CAAC,YAAY,EAAE,EAAE;oCACvB,KAAI,CAAC,cAAc,CAAC,GAAG,CAAC,yBAAkB,SAAS,4CAAyC,CAAC,CAAC;oCAC9F,KAAI,CAAC,mBAAmB,EAAE,CAAC;oCAC3B,KAAI,CAAC,UAAU,EAAE,CAAC;oCAClB,OAAO;iCACR;gCAED,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC,IAAI,EAAE;oCACtC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;iCAC/D;gCAED,IAAI,KAAI,CAAC,eAAe,EAAE;oCACxB,mFAAmF;oCACnF,KAAI,CAAC,eAAe,CAAC,YAAY,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;iCACrD;4BACH,CAAC;4BACD,gBAAgB,EAAE,MAAM,CAAC,sBAAsB;4BAC/C,KAAK,OAAA;4BACL,aAAa,EAAE,IAAI;4BACnB,aAAa,EAAE,eAAe;4BAC9B,UAAU,EAAE,WAAW;4BACvB,aAAa,EAAE,IAAI,CAAC,iBAAiB,EAAwB;4BAC7D,qCAAqC,EAAE,MAAM,CAAC,qCAAqC;4BACnF,WAAW,EAAE,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC;4BAC3C,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;4BACzC,gBAAgB,EAAE,IAAI,CAAC,oBAAoB,EAAE;4BAC7C,YAAY,EAAE,KAAK;4BACnB,cAAc,EAAE;gCACd,MAAM,EAAE,MAAA,MAAM,CAAC,eAAe,0CAAE,MAAM;gCACtC,OAAO,EAAE,MAAA,MAAM,CAAC,eAAe,0CAAE,OAAO;6BACzC;4BACD,YAAY,EAAE,UAAC,KAAc;gCAC3B,IAAM,UAAU,GAAG,KAAyC,CAAC;gCAE7D,wGAAwG;gCACxG,IAAI,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE;oCAC7F,MAAM,UAAU,CAAC;iCAClB;gCAED,oGAAoG;gCACpG,wGAAwG;gCACxG,mCAAmC;gCACnC,IAAI,UAAU,CAAC,UAAU,EAAE;oCACzB,MAAM,UAAU,CAAC;iCAClB;gCAED,KAAI,CAAC,cAAc,CAAC,IAAI,CAAC,gCAAgC,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;gCAClF,kFAAkF;gCAClF,OAAO,IAAI,CAAC;4BACd,CAAC;;wBACQ,qBAAM,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,EAAA;;wBApDxD,GAAK,oBAAoB,GAAG,mBAoD1B,UAAO,GAAE,SAA6C;qCACtD,CAAC;wBAEH,KAAK,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;wBAC3D,IAAI,iBAAiB,EAAE;4BACrB,KAAK,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;yBACzE;;;;wBAED,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,sCAAsC,EAAE,OAAK,CAAC,CAAC;;;;;;KAE3E;IAoDD,mCAAW,GAAX;;QACE,OAAO,MAAA,IAAI,CAAC,WAAW,0CAAE,QAAQ,CAAC;IACpC,CAAC;IAED,oCAAY,GAAZ;;QACE,OAAO,MAAA,IAAI,CAAC,WAAW,0CAAE,SAAS,CAAC;IACrC,CAAC;IAEK,6BAAK,GAAX,UAAY,QAAgB;;QAAhB,yBAAA,EAAA,gBAAgB;;;gBAC1B,sBAAO,MAAA,IAAI,CAAC,aAAa,0CAAE,KAAK,CAAC,QAAQ,CAAC,EAAC;;;KAC5C;IAED,gCAAQ,GAAR;QACE,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAEO,kCAAU,GAAlB,UAAmB,OAA2B;QAC5C,IAAI,OAAO,KAAK,QAAQ,EAAE;YACxB,OAAO,0CAA0C,CAAC;SACnD;QAED,IAAI,OAAO,KAAK,SAAS,EAAE;YACzB,OAAO,0CAA0C,CAAC;SACnD;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,mCAAW,GAAnB,UACE,SAAsC,EACtC,YAAuC,EACvC,WAAqC,EACrC,YAAmD,EACnD,gBAAoC,EACpC,oBAAwC,EACxC,OAA2B;QAE3B,IAAM,SAAS,GAAG,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,QAAQ,EAAE,EAAC,CAAC,CAAC,gBAAgB,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAE7F,IAAI,CAAC,QAAQ,GAAG;YACd,YAAY,cAAA;YACZ,WAAW,aAAA;YACX,YAAY,cAAA;YACZ,SAAS,WAAA;YACT,SAAS,WAAA;YACT,UAAU,EAAE,YAAY,CAAC,UAAU;YACnC,aAAa,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;YACvC,gBAAgB,kBAAA;YAChB,iBAAiB,EAAE,mCAAmC;YACtD,oBAAoB,sBAAA;SACrB,CAAC;IACJ,CAAC;IAEa,kDAA0B,GAAxC;;;;;;;6BACM,CAAA,CAAA,MAAA,MAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,aAAa,0CAAE,OAAO,0CAAE,OAAO,KAAI,CAAC,IAAI,CAAC,gBAAgB,CAAA,EAAtE,wBAAsE;;;;wBAElB,qBAAM,MAAM,CAAC,aAAa,CAAC,EAAA;;wBAArD,qBAAqB,GAAK,CAAA,SAA2B,CAAA,iBAAhC;wBAC/C,IAAI,CAAC,gBAAgB,GAAG,IAAI,qBAAqB,EAAE,CAAC;;;;wBAEpD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,mDAAmD,EAAE,OAAK,CAAC,CAAC;;;;;;KAG1F;IACH,oBAAC;AAAD,CAAC,AAhsBD,IAgsBC","sourcesContent":["import {\n getAnalyticsConnector,\n getGlobalScope,\n ILogger,\n Logger,\n LogLevel,\n returnWrapper,\n SpecialEventType,\n} from '@amplitude/analytics-core';\n\n// Import only specific types to avoid pulling in the entire rrweb-types package\nimport { eventWithTime, EventType as RRWebEventType, scrollCallback } from '@amplitude/rrweb-types';\nimport { TargetingParameters } from '@amplitude/targeting';\nimport { createSessionReplayJoinedConfigGenerator } from './config/joined-config';\nimport {\n LoggingConfig,\n SessionReplayJoinedConfig,\n SessionReplayJoinedConfigGenerator,\n SessionReplayLocalConfig,\n SessionReplayMetadata,\n SessionReplayRemoteConfig,\n} from './config/types';\nimport {\n BLOCK_CLASS,\n CustomRRwebEvent,\n DEFAULT_SESSION_REPLAY_PROPERTY,\n INTERACTION_MAX_INTERVAL,\n INTERACTION_MIN_INTERVAL,\n MASK_TEXT_CLASS,\n SESSION_REPLAY_DEBUG_PROPERTY,\n} from './constants';\nimport { EventCompressor } from './events/event-compressor';\nimport { createEventsManager } from './events/events-manager';\nimport { MultiEventManager } from './events/multi-manager';\nimport { generateHashCode, getDebugConfig, getPageUrl, getStorageSize, isSessionInSample, maskFn } from './helpers';\nimport { clickBatcher, clickHook, clickNonBatcher } from './hooks/click';\nimport { ScrollWatcher } from './hooks/scroll';\nimport { SessionIdentifiers } from './identifiers';\nimport { SafeLoggerProvider } from './logger';\nimport { evaluateTargetingAndStore } from './targeting/targeting-manager';\nimport {\n AmplitudeSessionReplay,\n SessionReplayEventsManager as AmplitudeSessionReplayEventsManager,\n DebugInfo,\n EventsManagerWithType,\n EventType,\n SessionIdentifiers as ISessionIdentifiers,\n SessionReplayOptions,\n} from './typings/session-replay';\nimport { VERSION } from './version';\n\n// Import only the type for NetworkRequestEvent to keep type safety\nimport type { NetworkObservers, NetworkRequestEvent } from './observers';\nimport { createUrlTrackingPlugin } from './plugins/url-tracking-plugin';\nimport type { RecordFunction } from './utils/rrweb';\n\ntype PageLeaveFn = (e: PageTransitionEvent | Event) => void;\n\nexport class SessionReplay implements AmplitudeSessionReplay {\n name = '@amplitude/session-replay-browser';\n config: SessionReplayJoinedConfig | undefined;\n joinedConfigGenerator: SessionReplayJoinedConfigGenerator | undefined;\n identifiers: ISessionIdentifiers | undefined;\n eventsManager?: AmplitudeSessionReplayEventsManager<'replay' | 'interaction', string>;\n loggerProvider: ILogger;\n recordCancelCallback: ReturnType<RecordFunction> | null = null;\n eventCount = 0;\n eventCompressor: EventCompressor | undefined;\n sessionTargetingMatch = false;\n private lastTargetingParams?: Pick<TargetingParameters, 'event' | 'userProperties'>;\n private lastShouldRecordDecision?: boolean;\n\n // Visible for testing only\n pageLeaveFns: PageLeaveFn[] = [];\n private scrollHook?: scrollCallback;\n private networkObservers?: NetworkObservers;\n private metadata: SessionReplayMetadata | undefined;\n\n // Cache the dynamically imported record function\n private recordFunction: RecordFunction | null = null;\n\n constructor() {\n this.loggerProvider = new SafeLoggerProvider(new Logger());\n }\n\n init(apiKey: string, options: SessionReplayOptions) {\n return returnWrapper(this._init(apiKey, options));\n }\n\n private teardownEventListeners = (teardown: boolean) => {\n const globalScope = getGlobalScope();\n if (globalScope) {\n globalScope.removeEventListener('blur', this.blurListener);\n globalScope.removeEventListener('focus', this.focusListener);\n !teardown && globalScope.addEventListener('blur', this.blurListener);\n !teardown && globalScope.addEventListener('focus', this.focusListener);\n // prefer pagehide to unload events, this is the standard going forward. it is not\n // 100% reliable, but is bfcache-compatible.\n if (globalScope.self && 'onpagehide' in globalScope.self) {\n globalScope.removeEventListener('pagehide', this.pageLeaveListener);\n !teardown && globalScope.addEventListener('pagehide', this.pageLeaveListener);\n } else {\n // this has performance implications, but is the only way we can reliably send events\n // in browser that don't support pagehide.\n globalScope.removeEventListener('beforeunload', this.pageLeaveListener);\n !teardown && globalScope.addEventListener('beforeunload', this.pageLeaveListener);\n }\n }\n };\n\n protected async _init(apiKey: string, options: SessionReplayOptions) {\n this.loggerProvider = new SafeLoggerProvider(options.loggerProvider || new Logger());\n Object.prototype.hasOwnProperty.call(options, 'logLevel') &&\n this.loggerProvider.enable(options.logLevel as LogLevel);\n this.identifiers = new SessionIdentifiers({ sessionId: options.sessionId, deviceId: options.deviceId });\n this.joinedConfigGenerator = await createSessionReplayJoinedConfigGenerator(apiKey, options);\n const { joinedConfig, localConfig, remoteConfig } = await this.joinedConfigGenerator.generateJoinedConfig(\n this.identifiers.sessionId,\n );\n this.config = joinedConfig;\n\n this.setMetadata(\n options.sessionId,\n joinedConfig,\n localConfig,\n remoteConfig,\n options.version?.version,\n VERSION,\n options.version?.type,\n );\n\n if (options.sessionId && this.config.interactionConfig?.enabled) {\n const scrollWatcher = ScrollWatcher.default(\n {\n sessionId: options.sessionId,\n type: 'interaction',\n },\n this.config,\n );\n this.pageLeaveFns = [scrollWatcher.send(this.getDeviceId.bind(this)).bind(scrollWatcher)];\n this.scrollHook = scrollWatcher.hook.bind(scrollWatcher);\n }\n\n const managers: EventsManagerWithType<EventType, string>[] = [];\n let { storeType } = this.config;\n if (storeType === 'idb' && !getGlobalScope()?.indexedDB) {\n storeType = 'memory';\n this.loggerProvider.warn('Could not use preferred indexedDB storage, reverting to in memory option.');\n }\n this.loggerProvider.log(`Using ${storeType} for event storage.`);\n try {\n const rrwebEventManager = await createEventsManager<'replay'>({\n config: this.config,\n sessionId: this.identifiers.sessionId,\n type: 'replay',\n storeType,\n });\n managers.push({ name: 'replay', manager: rrwebEventManager });\n } catch (error) {\n const typedError = error as Error;\n this.loggerProvider.warn(`Error occurred while creating replay events manager: ${typedError.toString()}`);\n }\n\n if (this.config.interactionConfig?.enabled) {\n const payloadBatcher = this.config.interactionConfig.batch ? clickBatcher : clickNonBatcher;\n try {\n const interactionEventManager = await createEventsManager<'interaction'>({\n config: this.config,\n sessionId: this.identifiers.sessionId,\n type: 'interaction',\n minInterval: this.config.interactionConfig.trackEveryNms ?? INTERACTION_MIN_INTERVAL,\n maxInterval: INTERACTION_MAX_INTERVAL,\n payloadBatcher,\n storeType,\n });\n managers.push({ name: 'interaction', manager: interactionEventManager });\n } catch (error) {\n const typedError = error as Error;\n this.loggerProvider.warn(`Error occurred while creating interaction events manager: ${typedError.toString()}`);\n }\n }\n\n this.eventsManager = new MultiEventManager<'replay' | 'interaction', string>(...managers);\n // To prevent too many threads.\n if (this.eventCompressor) {\n this.eventCompressor.terminate();\n }\n this.eventCompressor = new EventCompressor(this.eventsManager, this.config, this.getDeviceId());\n\n await this.initializeNetworkObservers();\n\n this.loggerProvider.log('Installing @amplitude/session-replay-browser.');\n\n this.teardownEventListeners(false);\n\n await this.evaluateTargetingAndCapture({ userProperties: options.userProperties }, true);\n }\n\n setSessionId(sessionId: string | number, deviceId?: string) {\n return returnWrapper(this.asyncSetSessionId(sessionId, deviceId));\n }\n\n async asyncSetSessionId(\n sessionId: string | number,\n deviceId?: string,\n options?: { userProperties?: { [key: string]: any } },\n ) {\n this.sessionTargetingMatch = false;\n this.lastShouldRecordDecision = undefined; // Reset targeting decision for new session\n\n const previousSessionId = this.identifiers && this.identifiers.sessionId;\n if (previousSessionId) {\n this.sendEvents(previousSessionId);\n }\n\n const deviceIdForReplayId = deviceId || this.getDeviceId();\n this.identifiers = new SessionIdentifiers({\n sessionId: sessionId,\n deviceId: deviceIdForReplayId,\n });\n\n // If there is no previous session id, SDK is being initialized for the first time,\n // and config was just fetched in initialization, so no need to fetch it a second time\n if (this.joinedConfigGenerator && previousSessionId) {\n const { joinedConfig } = await this.joinedConfigGenerator.generateJoinedConfig(this.identifiers.sessionId);\n this.config = joinedConfig;\n }\n\n if (this.config?.targetingConfig) {\n await this.evaluateTargetingAndCapture({ userProperties: options?.userProperties });\n } else {\n await this.recordEvents();\n }\n }\n\n getSessionReplayProperties() {\n const config = this.config;\n const identifiers = this.identifiers;\n if (!config || !identifiers) {\n this.loggerProvider.warn('Session replay init has not been called, cannot get session replay properties.');\n return {};\n }\n\n const shouldRecord = this.getShouldRecord();\n let eventProperties: { [key: string]: string | null } = {};\n\n if (shouldRecord) {\n eventProperties = {\n [DEFAULT_SESSION_REPLAY_PROPERTY]: identifiers.sessionReplayId ? identifiers.sessionReplayId : null,\n };\n if (config.debugMode) {\n eventProperties[SESSION_REPLAY_DEBUG_PROPERTY] = JSON.stringify({\n appHash: generateHashCode(config.apiKey).toString(),\n });\n }\n }\n\n void this.addCustomRRWebEvent(\n CustomRRwebEvent.GET_SR_PROPS,\n {\n shouldRecord,\n eventProperties: eventProperties,\n },\n this.eventCount === 10,\n );\n if (this.eventCount === 10) {\n this.eventCount = 0;\n }\n this.eventCount++;\n\n return eventProperties;\n }\n\n blurListener = () => {\n this.sendEvents();\n };\n\n focusListener = () => {\n // Restart recording on focus to ensure that when user\n // switches tabs, we take a full snapshot\n void this.recordEvents(false);\n };\n\n /**\n * This is an instance member so that if init is called multiple times\n * it doesn't add another listener to the page leave event. This is to\n * prevent duplicate listener actions from firing.\n */\n private pageLeaveListener = (e: PageTransitionEvent | Event) => {\n this.pageLeaveFns.forEach((fn) => {\n fn(e);\n });\n };\n\n evaluateTargetingAndCapture = async (\n targetingParams: Pick<TargetingParameters, 'event' | 'userProperties'>,\n isInit = false,\n ) => {\n if (!this.identifiers || !this.identifiers.sessionId || !this.config) {\n if (this.identifiers && !this.identifiers.sessionId) {\n this.loggerProvider.log('Session ID has not been set yet, cannot evaluate targeting for Session Replay.');\n } else {\n this.loggerProvider.warn('Session replay init has not been called, cannot evaluate targeting.');\n }\n return;\n }\n\n // Handle cases where there's no targeting config\n if (!this.config.targetingConfig) {\n if (isInit) {\n this.loggerProvider.log('Targeting config has not been set yet, cannot evaluate targeting.');\n } else {\n this.loggerProvider.log('No targeting config set, skipping initialization/recording for event.');\n return;\n }\n }\n\n // Store targeting parameters for use in getShouldRecord\n this.lastTargetingParams = targetingParams;\n\n if (this.config.targetingConfig && !this.sessionTargetingMatch) {\n let eventForTargeting = targetingParams.event;\n if (\n eventForTargeting &&\n Object.values(SpecialEventType).includes(eventForTargeting.event_type as SpecialEventType)\n ) {\n eventForTargeting = undefined;\n }\n\n // We're setting this on this class because fetching the value from idb\n // is async, we need to access this value synchronously (for record\n // and for getSessionReplayProperties - both synchronous fns)\n this.sessionTargetingMatch = await evaluateTargetingAndStore({\n sessionId: this.identifiers.sessionId,\n targetingConfig: this.config.targetingConfig,\n loggerProvider: this.loggerProvider,\n apiKey: this.config.apiKey,\n targetingParams: { userProperties: targetingParams.userProperties, event: eventForTargeting },\n });\n\n // Log the targeting config to debug\n this.loggerProvider.debug(\n JSON.stringify(\n {\n name: 'targeted replay capture config',\n sessionTargetingMatch: this.sessionTargetingMatch,\n event: eventForTargeting,\n targetingParams: targetingParams,\n },\n null,\n 2,\n ),\n );\n }\n\n if (isInit) {\n void this.initialize(true);\n } else {\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 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 if (this.config?.privacyConfig?.defaultMaskLevel === 'conservative') {\n return '*';\n }\n\n const maskSelector = this.config?.privacyConfig?.maskSelector;\n if (!maskSelector) {\n return;\n }\n\n return maskSelector as unknown as string;\n }\n\n async getRecordingPlugins(loggingConfig: LoggingConfig | undefined) {\n const plugins = [];\n\n // Add URL tracking plugin\n try {\n const urlTrackingPlugin = createUrlTrackingPlugin({\n ugcFilterRules: this.config?.interactionConfig?.ugcFilterRules || [],\n enablePolling: this.config?.enableUrlChangePolling || false,\n pollingInterval: this.config?.urlChangePollingInterval,\n captureDocumentTitle: this.config?.captureDocumentTitle,\n });\n\n plugins.push(urlTrackingPlugin);\n } catch (error) {\n this.loggerProvider.warn('Failed to create URL tracking plugin:', error);\n }\n\n // Default plugin settings -\n // {\n // level: ['info', 'log', 'warn', 'error'],\n // lengthThreshold: 10000,\n // stringifyOptions: {\n // stringLengthLimit: undefined,\n // numOfKeysLimit: 50,\n // depthOfLimit: 4,\n // },\n // logger: window.console,\n // }\n if (loggingConfig?.console?.enabled) {\n try {\n // Dynamic import keeps console plugin separate and only loads when needed\n const { getRecordConsolePlugin } = await import('@amplitude/rrweb-plugin-console-record');\n plugins.push(getRecordConsolePlugin({ level: loggingConfig.console.levels }));\n } catch (error) {\n this.loggerProvider.warn('Failed to load console plugin:', error);\n }\n }\n\n return plugins.length > 0 ? plugins : undefined;\n }\n\n private async getRecordFunction(): Promise<RecordFunction | null> {\n if (this.recordFunction) {\n return this.recordFunction;\n }\n\n try {\n const { record } = await import('@amplitude/rrweb-record');\n this.recordFunction = record;\n return record;\n } catch (error) {\n this.loggerProvider.warn('Failed to load rrweb-record module:', error);\n return null;\n }\n }\n\n async recordEvents(shouldLogMetadata = true) {\n const config = this.config;\n const shouldRecord = this.getShouldRecord();\n const sessionId = this.identifiers?.sessionId;\n if (!shouldRecord || !sessionId || !config) {\n return;\n }\n this.stopRecordingEvents();\n\n const recordFunction = await this.getRecordFunction();\n\n // May be undefined if cannot import rrweb-record\n if (!recordFunction) {\n return;\n }\n\n await this.initializeNetworkObservers();\n\n this.networkObservers?.start((event: NetworkRequestEvent) => {\n void this.addCustomRRWebEvent(CustomRRwebEvent.FETCH_REQUEST, event);\n });\n const { privacyConfig, interactionConfig, loggingConfig } = config;\n\n const hooks = interactionConfig?.enabled\n ? {\n mouseInteraction:\n this.eventsManager &&\n clickHook(this.loggerProvider, {\n eventsManager: this.eventsManager,\n sessionId,\n deviceIdFn: this.getDeviceId.bind(this),\n mirror: recordFunction.mirror,\n ugcFilterRules: interactionConfig.ugcFilterRules ?? [],\n }),\n scroll: this.scrollHook,\n }\n : {};\n\n const ugcFilterRules =\n interactionConfig?.enabled && interactionConfig.ugcFilterRules ? interactionConfig.ugcFilterRules : [];\n\n this.loggerProvider.log(`Session Replay capture beginning for ${sessionId}.`);\n\n try {\n this.recordCancelCallback = recordFunction({\n emit: (event: eventWithTime) => {\n if (this.shouldOptOut()) {\n this.loggerProvider.log(`Opting session ${sessionId} out of recording due to optOut config.`);\n this.stopRecordingEvents();\n this.sendEvents();\n return;\n }\n\n if (event.type === RRWebEventType.Meta) {\n event.data.href = getPageUrl(event.data.href, ugcFilterRules);\n }\n\n if (this.eventCompressor) {\n // Schedule processing during idle time if the browser supports requestIdleCallback\n this.eventCompressor.enqueueEvent(event, sessionId);\n }\n },\n inlineStylesheet: config.shouldInlineStylesheet,\n hooks,\n maskAllInputs: true,\n maskTextClass: MASK_TEXT_CLASS,\n blockClass: BLOCK_CLASS,\n blockSelector: this.getBlockSelectors() as string | undefined,\n applyBackgroundColorToBlockedElements: config.applyBackgroundColorToBlockedElements,\n maskInputFn: maskFn('input', privacyConfig),\n maskTextFn: maskFn('text', privacyConfig),\n maskTextSelector: this.getMaskTextSelectors(),\n recordCanvas: false,\n slimDOMOptions: {\n script: config.omitElementTags?.script,\n comment: config.omitElementTags?.comment,\n },\n errorHandler: (error: unknown) => {\n const typedError = error as Error & { _external_?: boolean };\n\n // styled-components relies on this error being thrown and bubbled up, rrweb is otherwise suppressing it\n if (typedError.message.includes('insertRule') && typedError.message.includes('CSSStyleSheet')) {\n throw typedError;\n }\n\n // rrweb does monkey patching on certain window functions such as CSSStyleSheet.proptype.insertRule,\n // and errors from external clients calling these functions can get suppressed. Styled components depend\n // on these errors being re-thrown.\n if (typedError._external_) {\n throw typedError;\n }\n\n this.loggerProvider.warn('Error while capturing replay: ', typedError.toString());\n // Return true so that we don't clutter user's consoles with internal rrweb errors\n return true;\n },\n plugins: await this.getRecordingPlugins(loggingConfig),\n });\n\n void this.addCustomRRWebEvent(CustomRRwebEvent.DEBUG_INFO);\n if (shouldLogMetadata) {\n void this.addCustomRRWebEvent(CustomRRwebEvent.METADATA, this.metadata);\n }\n } catch (error) {\n this.loggerProvider.warn('Failed to initialize session replay:', error);\n }\n }\n\n addCustomRRWebEvent = async (\n eventName: CustomRRwebEvent,\n eventData: { [key: string]: any } = {},\n addStorageInfo = true,\n ) => {\n try {\n let debugInfo: DebugInfo | undefined = undefined;\n const config = this.config;\n // Only add debug info for non-metadata events\n if (config && eventName !== CustomRRwebEvent.METADATA) {\n debugInfo = {\n config: getDebugConfig(config),\n version: VERSION,\n };\n if (addStorageInfo) {\n const storageSizeData = await getStorageSize();\n debugInfo = {\n ...storageSizeData,\n ...debugInfo,\n };\n }\n }\n // Check first to ensure we are recording\n if (this.recordCancelCallback && this.recordFunction) {\n this.recordFunction.addCustomEvent(eventName, {\n ...eventData,\n ...debugInfo,\n });\n } else {\n this.loggerProvider.debug(\n `Not able to add custom replay capture event ${eventName} due to no ongoing recording.`,\n );\n }\n } catch (e) {\n this.loggerProvider.debug('Error while adding custom replay capture event: ', e);\n }\n };\n\n stopRecordingEvents = () => {\n try {\n this.loggerProvider.log('Session Replay capture stopping.');\n this.recordCancelCallback && this.recordCancelCallback();\n this.recordCancelCallback = null;\n this.networkObservers?.stop();\n } catch (error) {\n const typedError = error as Error;\n this.loggerProvider.warn(`Error occurred while stopping replay capture: ${typedError.toString()}`);\n }\n };\n\n getDeviceId() {\n return this.identifiers?.deviceId;\n }\n\n getSessionId() {\n return this.identifiers?.sessionId;\n }\n\n async flush(useRetry = false) {\n return this.eventsManager?.flush(useRetry);\n }\n\n shutdown() {\n this.teardownEventListeners(true);\n this.stopRecordingEvents();\n this.sendEvents();\n }\n\n private mapSDKType(sdkType: string | undefined) {\n if (sdkType === 'plugin') {\n return '@amplitude/plugin-session-replay-browser';\n }\n\n if (sdkType === 'segment') {\n return '@amplitude/segment-session-replay-plugin';\n }\n\n return null;\n }\n\n private setMetadata(\n sessionId: string | number | undefined,\n joinedConfig: SessionReplayJoinedConfig,\n localConfig: SessionReplayLocalConfig,\n remoteConfig: SessionReplayRemoteConfig | undefined,\n replaySDKVersion: string | undefined,\n standaloneSDKVersion: string | undefined,\n sdkType: string | undefined,\n ) {\n const hashValue = sessionId?.toString() ? generateHashCode(sessionId.toString()) : undefined;\n\n this.metadata = {\n joinedConfig,\n localConfig,\n remoteConfig,\n sessionId,\n hashValue,\n sampleRate: joinedConfig.sampleRate,\n replaySDKType: this.mapSDKType(sdkType),\n replaySDKVersion,\n standaloneSDKType: '@amplitude/session-replay-browser',\n standaloneSDKVersion,\n };\n }\n\n private async initializeNetworkObservers(): Promise<void> {\n if (this.config?.loggingConfig?.network?.enabled && !this.networkObservers) {\n try {\n const { NetworkObservers: NetworkObserversClass } = await import('./observers');\n this.networkObservers = new NetworkObserversClass();\n } catch (error) {\n this.loggerProvider.warn('Failed to import or instantiate NetworkObservers:', error);\n }\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"session-replay.js","sourceRoot":"","sources":["../../src/session-replay.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,qBAAqB,EACrB,cAAc,EAEd,MAAM,EAEN,aAAa,EACb,gBAAgB,GACjB,MAAM,2BAA2B,CAAC;AAEnC,gFAAgF;AAChF,OAAO,EAAiB,SAAS,IAAI,cAAc,EAAkB,MAAM,wBAAwB,CAAC;AAEpG,OAAO,EAAE,wCAAwC,EAAE,MAAM,wBAAwB,CAAC;AASlF,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,+BAA+B,EAC/B,wBAAwB,EACxB,wBAAwB,EACxB,eAAe,EACf,6BAA6B,GAC9B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACpH,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAU1E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAKxE;IAuBE;QAAA,iBAEC;QAxBD,SAAI,GAAG,mCAAmC,CAAC;QAM3C,yBAAoB,GAAsC,IAAI,CAAC;QAC/D,eAAU,GAAG,CAAC,CAAC;QAEf,0BAAqB,GAAG,KAAK,CAAC;QAI9B,2BAA2B;QAC3B,iBAAY,GAAkB,EAAE,CAAC;QAKjC,iDAAiD;QACzC,mBAAc,GAA0B,IAAI,CAAC;QAU7C,2BAAsB,GAAG,UAAC,QAAiB;YACjD,IAAM,WAAW,GAAG,cAAc,EAAE,CAAC;YACrC,IAAI,WAAW,EAAE;gBACf,WAAW,CAAC,mBAAmB,CAAC,MAAM,EAAE,KAAI,CAAC,YAAY,CAAC,CAAC;gBAC3D,WAAW,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAI,CAAC,aAAa,CAAC,CAAC;gBAC7D,CAAC,QAAQ,IAAI,WAAW,CAAC,gBAAgB,CAAC,MAAM,EAAE,KAAI,CAAC,YAAY,CAAC,CAAC;gBACrE,CAAC,QAAQ,IAAI,WAAW,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAI,CAAC,aAAa,CAAC,CAAC;gBACvE,kFAAkF;gBAClF,4CAA4C;gBAC5C,IAAI,WAAW,CAAC,IAAI,IAAI,YAAY,IAAI,WAAW,CAAC,IAAI,EAAE;oBACxD,WAAW,CAAC,mBAAmB,CAAC,UAAU,EAAE,KAAI,CAAC,iBAAiB,CAAC,CAAC;oBACpE,CAAC,QAAQ,IAAI,WAAW,CAAC,gBAAgB,CAAC,UAAU,EAAE,KAAI,CAAC,iBAAiB,CAAC,CAAC;iBAC/E;qBAAM;oBACL,qFAAqF;oBACrF,0CAA0C;oBAC1C,WAAW,CAAC,mBAAmB,CAAC,cAAc,EAAE,KAAI,CAAC,iBAAiB,CAAC,CAAC;oBACxE,CAAC,QAAQ,IAAI,WAAW,CAAC,gBAAgB,CAAC,cAAc,EAAE,KAAI,CAAC,iBAAiB,CAAC,CAAC;iBACnF;aACF;QACH,CAAC,CAAC;QAyKF,iBAAY,GAAG;YACb,KAAI,CAAC,UAAU,EAAE,CAAC;QACpB,CAAC,CAAC;QAEF,kBAAa,GAAG;YACd,sDAAsD;YACtD,yCAAyC;YACzC,KAAK,KAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC,CAAC;QAEF;;;;WAIG;QACK,sBAAiB,GAAG,UAAC,CAA8B;YACzD,KAAI,CAAC,YAAY,CAAC,OAAO,CAAC,UAAC,EAAE;gBAC3B,EAAE,CAAC,CAAC,CAAC,CAAC;YACR,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,gCAA2B,GAAG,UAC5B,eAAsE,EACtE,MAAc;YAAd,uBAAA,EAAA,cAAc;;;;;;4BAEd,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;gCACpE,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE;oCACnD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,gFAAgF,CAAC,CAAC;iCAC3G;qCAAM;oCACL,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC;iCACjG;gCACD,sBAAO;6BACR;4BAED,wDAAwD;4BACxD,IAAI,CAAC,mBAAmB,GAAG,eAAe,CAAC;iCAEvC,CAAA,IAAI,CAAC,MAAM,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAA,EAA1D,wBAA0D;4BACxD,iBAAiB,GAAG,eAAe,CAAC,KAAK,CAAC;4BAC9C,IACE,iBAAiB;gCACjB,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC,UAA8B,CAAC,EAC1F;gCACA,iBAAiB,GAAG,SAAS,CAAC;6BAC/B;4BAED,uEAAuE;4BACvE,mEAAmE;4BACnE,6DAA6D;4BAC7D,KAAA,IAAI,CAAA;4BAAyB,qBAAM,yBAAyB,CAAC;oCAC3D,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,SAAS;oCACrC,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe;oCAC5C,cAAc,EAAE,IAAI,CAAC,cAAc;oCACnC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;oCAC1B,eAAe,EAAE,EAAE,cAAc,EAAE,eAAe,CAAC,cAAc,EAAE,KAAK,EAAE,iBAAiB,EAAE;iCAC9F,CAAC,EAAA;;4BATF,uEAAuE;4BACvE,mEAAmE;4BACnE,6DAA6D;4BAC7D,GAAK,qBAAqB,GAAG,SAM3B,CAAC;4BAEH,oCAAoC;4BACpC,IAAI,CAAC,cAAc,CAAC,KAAK,CACvB,IAAI,CAAC,SAAS,CACZ;gCACE,IAAI,EAAE,gCAAgC;gCACtC,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;gCACjD,KAAK,EAAE,iBAAiB;gCACxB,eAAe,EAAE,eAAe;6BACjC,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;;;iCAGA,MAAM,EAAN,wBAAM;4BACR,KAAK,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;;gCAE3B,qBAAM,IAAI,CAAC,YAAY,EAAE,EAAA;;4BAAzB,SAAyB,CAAC;;;;;;SAE7B,CAAC;QA+RF,wBAAmB,GAAG,UACpB,SAA2B,EAC3B,SAAsC,EACtC,cAAqB;YADrB,0BAAA,EAAA,cAAsC;YACtC,+BAAA,EAAA,qBAAqB;;;;;;;4BAGf,SAAS,GAA0B,SAAS,CAAC;4BAC3C,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;iCAEvB,CAAA,MAAM,IAAI,SAAS,KAAK,gBAAgB,CAAC,QAAQ,CAAA,EAAjD,wBAAiD;4BACnD,SAAS,GAAG;gCACV,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC;gCAC9B,OAAO,EAAE,OAAO;6BACjB,CAAC;iCACE,cAAc,EAAd,wBAAc;4BACQ,qBAAM,cAAc,EAAE,EAAA;;4BAAxC,eAAe,GAAG,SAAsB;4BAC9C,SAAS,yBACJ,eAAe,GACf,SAAS,CACb,CAAC;;;4BAGN,yCAAyC;4BACzC,IAAI,IAAI,CAAC,oBAAoB,IAAI,IAAI,CAAC,cAAc,EAAE;gCACpD,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,SAAS,wBACvC,SAAS,GACT,SAAS,EACZ,CAAC;6BACJ;iCAAM;gCACL,IAAI,CAAC,cAAc,CAAC,KAAK,CACvB,sDAA+C,SAAS,kCAA+B,CACxF,CAAC;6BACH;;;;4BAED,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,kDAAkD,EAAE,GAAC,CAAC,CAAC;;;;;;SAEpF,CAAC;QAEF,wBAAmB,GAAG;;YACpB,IAAI;gBACF,KAAI,CAAC,cAAc,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;gBAC5D,KAAI,CAAC,oBAAoB,IAAI,KAAI,CAAC,oBAAoB,EAAE,CAAC;gBACzD,KAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;gBACjC,MAAA,KAAI,CAAC,gBAAgB,0CAAE,IAAI,EAAE,CAAC;aAC/B;YAAC,OAAO,KAAK,EAAE;gBACd,IAAM,UAAU,GAAG,KAAc,CAAC;gBAClC,KAAI,CAAC,cAAc,CAAC,IAAI,CAAC,wDAAiD,UAAU,CAAC,QAAQ,EAAE,CAAE,CAAC,CAAC;aACpG;QACH,CAAC,CAAC;QA/lBA,IAAI,CAAC,cAAc,GAAG,IAAI,kBAAkB,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,4BAAI,GAAJ,UAAK,MAAc,EAAE,OAA6B;QAChD,OAAO,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACpD,CAAC;IAuBe,6BAAK,GAArB,UAAsB,MAAc,EAAE,OAA6B;;;;;;;wBACjE,IAAI,CAAC,cAAc,GAAG,IAAI,kBAAkB,CAAC,OAAO,CAAC,cAAc,IAAI,IAAI,MAAM,EAAE,CAAC,CAAC;wBACrF,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC;4BACvD,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,QAAoB,CAAC,CAAC;wBAC3D,IAAI,CAAC,WAAW,GAAG,IAAI,kBAAkB,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;wBACxG,KAAA,IAAI,CAAA;wBAAyB,qBAAM,wCAAwC,CAAC,MAAM,EAAE,OAAO,CAAC,EAAA;;wBAA5F,GAAK,qBAAqB,GAAG,SAA+D,CAAC;wBACzC,qBAAM,IAAI,CAAC,qBAAqB,CAAC,oBAAoB,CACvG,IAAI,CAAC,WAAW,CAAC,SAAS,CAC3B,EAAA;;wBAFK,KAA8C,SAEnD,EAFO,YAAY,kBAAA,EAAE,WAAW,iBAAA,EAAE,YAAY,kBAAA;wBAG/C,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC;wBAE3B,IAAI,CAAC,WAAW,CACd,OAAO,CAAC,SAAS,EACjB,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,MAAA,OAAO,CAAC,OAAO,0CAAE,OAAO,EACxB,OAAO,EACP,MAAA,OAAO,CAAC,OAAO,0CAAE,IAAI,CACtB,CAAC;wBAEF,IAAI,OAAO,CAAC,SAAS,KAAI,MAAA,IAAI,CAAC,MAAM,CAAC,iBAAiB,0CAAE,OAAO,CAAA,EAAE;4BACzD,aAAa,GAAG,aAAa,CAAC,OAAO,CACzC;gCACE,SAAS,EAAE,OAAO,CAAC,SAAS;gCAC5B,IAAI,EAAE,aAAa;6BACpB,EACD,IAAI,CAAC,MAAM,CACZ,CAAC;4BACF,IAAI,CAAC,YAAY,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;4BAC1F,IAAI,CAAC,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;yBAC1D;wBAEK,QAAQ,GAA+C,EAAE,CAAC;wBAC1D,SAAS,GAAK,IAAI,CAAC,MAAM,UAAhB,CAAiB;wBAChC,IAAI,SAAS,KAAK,KAAK,IAAI,CAAC,CAAA,MAAA,cAAc,EAAE,0CAAE,SAAS,CAAA,EAAE;4BACvD,SAAS,GAAG,QAAQ,CAAC;4BACrB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,2EAA2E,CAAC,CAAC;yBACvG;wBACD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,gBAAS,SAAS,wBAAqB,CAAC,CAAC;;;;wBAErC,qBAAM,mBAAmB,CAAW;gCAC5D,MAAM,EAAE,IAAI,CAAC,MAAM;gCACnB,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,SAAS;gCACrC,IAAI,EAAE,QAAQ;gCACd,SAAS,WAAA;6BACV,CAAC,EAAA;;wBALI,iBAAiB,GAAG,SAKxB;wBACF,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAC;;;;wBAExD,UAAU,GAAG,OAAc,CAAC;wBAClC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,+DAAwD,UAAU,CAAC,QAAQ,EAAE,CAAE,CAAC,CAAC;;;6BAGxG,CAAA,MAAA,IAAI,CAAC,MAAM,CAAC,iBAAiB,0CAAE,OAAO,CAAA,EAAtC,yBAAsC;wBAClC,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,eAAe,CAAC;;;;wBAE1D,qBAAM,mBAAmB,CAAgB;gCACvE,MAAM,EAAE,IAAI,CAAC,MAAM;gCACnB,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,SAAS;gCACrC,IAAI,EAAE,aAAa;gCACnB,WAAW,EAAE,MAAA,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,aAAa,mCAAI,wBAAwB;gCACpF,WAAW,EAAE,wBAAwB;gCACrC,cAAc,gBAAA;gCACd,SAAS,WAAA;6BACV,CAAC,EAAA;;wBARI,uBAAuB,GAAG,SAQ9B;wBACF,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC,CAAC;;;;wBAEnE,UAAU,GAAG,OAAc,CAAC;wBAClC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,oEAA6D,UAAU,CAAC,QAAQ,EAAE,CAAE,CAAC,CAAC;;;wBAInH,IAAI,CAAC,aAAa,QAAO,iBAAiB,YAAjB,iBAAiB,iCAAsC,QAAQ,aAAC,CAAC;wBAC1F,+BAA+B;wBAC/B,IAAI,IAAI,CAAC,eAAe,EAAE;4BACxB,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC;yBAClC;wBAEG,YAAY,GAAG,SAAS,CAAC;wBACvB,WAAW,GAAG,cAAc,EAAE,CAAC;6BACjC,CAAA,CAAA,MAAA,IAAI,CAAC,MAAM,CAAC,YAAY,0CAAE,YAAY,KAAI,WAAW,IAAI,WAAW,CAAC,MAAM,CAAA,EAA3E,yBAA2E;wBAC/C,qBAAM,MAAM,CAAC,UAAU,CAAC,EAAA;;wBAA9C,iBAAiB,GAAK,CAAA,SAAwB,CAAA,kBAA7B;wBAEzB,YAAY,GAAG,iBAAiB,CAAC;;;wBAGnC,IAAI,CAAC,eAAe,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,YAAY,CAAC,CAAC;wBAE9G,qBAAM,IAAI,CAAC,0BAA0B,EAAE,EAAA;;wBAAvC,SAAuC,CAAC;wBAExC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;wBAEzE,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;wBAEnC,qBAAM,IAAI,CAAC,2BAA2B,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,EAAE,IAAI,CAAC,EAAA;;wBAAxF,SAAwF,CAAC;;;;;KAC1F;IAED,oCAAY,GAAZ,UAAa,SAA0B,EAAE,QAAiB;QACxD,OAAO,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;IACpE,CAAC;IAEK,yCAAiB,GAAvB,UACE,SAA0B,EAC1B,QAAiB,EACjB,OAAqD;;;;;;wBAErD,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC;wBACnC,IAAI,CAAC,wBAAwB,GAAG,SAAS,CAAC,CAAC,2CAA2C;wBAEhF,iBAAiB,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;wBACzE,IAAI,iBAAiB,EAAE;4BACrB,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;yBACpC;wBAEK,mBAAmB,GAAG,QAAQ,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;wBAC3D,IAAI,CAAC,WAAW,GAAG,IAAI,kBAAkB,CAAC;4BACxC,SAAS,EAAE,SAAS;4BACpB,QAAQ,EAAE,mBAAmB;yBAC9B,CAAC,CAAC;6BAIC,CAAA,IAAI,CAAC,qBAAqB,IAAI,iBAAiB,CAAA,EAA/C,wBAA+C;wBACxB,qBAAM,IAAI,CAAC,qBAAqB,CAAC,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAA;;wBAAlG,YAAY,GAAK,CAAA,SAAiF,CAAA,aAAtF;wBACpB,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC;;4BAE7B,qBAAM,IAAI,CAAC,2BAA2B,CAAC,EAAE,cAAc,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,cAAc,EAAE,CAAC,EAAA;;wBAAnF,SAAmF,CAAC;;;;;KACrF;IAED,kDAA0B,GAA1B;;QACE,IAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACrC,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE;YAC3B,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,gFAAgF,CAAC,CAAC;YAC3G,OAAO,EAAE,CAAC;SACX;QAED,IAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAC5C,IAAI,eAAe,GAAqC,EAAE,CAAC;QAE3D,IAAI,YAAY,EAAE;YAChB,eAAe;gBACb,GAAC,+BAA+B,IAAG,WAAW,CAAC,eAAe,CAAC,CAAC,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI;mBACpG,CAAC;YACF,IAAI,MAAM,CAAC,SAAS,EAAE;gBACpB,eAAe,CAAC,6BAA6B,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;oBAC9D,OAAO,EAAE,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE;iBACpD,CAAC,CAAC;aACJ;SACF;QAED,KAAK,IAAI,CAAC,mBAAmB,CAC3B,gBAAgB,CAAC,YAAY,EAC7B;YACE,YAAY,cAAA;YACZ,eAAe,EAAE,eAAe;SACjC,EACD,IAAI,CAAC,UAAU,KAAK,EAAE,CACvB,CAAC;QACF,IAAI,IAAI,CAAC,UAAU,KAAK,EAAE,EAAE;YAC1B,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;SACrB;QACD,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,OAAO,eAAe,CAAC;IACzB,CAAC;IAiFD,kCAAU,GAAV,UAAW,SAA2B;;QACpC,IAAM,eAAe,GAAG,SAAS,KAAI,MAAA,IAAI,CAAC,WAAW,0CAAE,SAAS,CAAA,CAAC;QACjE,IAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACpC,IAAI,CAAC,aAAa;YAChB,eAAe;YACf,QAAQ;YACR,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,QAAQ,UAAA,EAAE,CAAC,CAAC;IAC3F,CAAC;IAEK,kCAAU,GAAhB,UAAiB,sBAA8B;;QAA9B,uCAAA,EAAA,8BAA8B;;;;gBAC7C,IAAI,CAAC,CAAA,MAAA,IAAI,CAAC,WAAW,0CAAE,SAAS,CAAA,EAAE;oBAChC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;oBACpF,sBAAO,OAAO,CAAC,OAAO,EAAE,EAAC;iBAC1B;gBAEK,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;gBACpC,IAAI,CAAC,QAAQ,EAAE;oBACb,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;oBACnF,sBAAO,OAAO,CAAC,OAAO,EAAE,EAAC;iBAC1B;gBACD,IAAI,CAAC,aAAa,IAAI,sBAAsB,IAAI,KAAK,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,EAAE,QAAQ,UAAA,EAAE,CAAC,CAAC;gBAEvG,sBAAO,IAAI,CAAC,YAAY,EAAE,EAAC;;;KAC5B;IAED,oCAAY,GAAZ;;QACE,IAAI,mBAAwC,CAAC;QAC7C,IAAI,MAAA,IAAI,CAAC,MAAM,0CAAE,YAAY,EAAE;YAC7B,IAAM,aAAa,GAAG,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,aAAa,CAAC;YACpF,mBAAmB,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC;SAC1D;QAED,OAAO,mBAAmB,KAAK,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,MAAA,IAAI,CAAC,MAAM,0CAAE,MAAM,CAAC;IACvF,CAAC;IAED,uCAAe,GAAf;QACE,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE;YACpE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,sFAAsF,CAAC,CAAC;YACjH,OAAO,KAAK,CAAC;SACd;QACD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE;YAC/B,IAAI,CAAC,cAAc,CAAC,GAAG,CACrB,kBAAW,IAAI,CAAC,WAAW,CAAC,SAAS,qHAAkH,CACxJ,CAAC;YACF,OAAO,KAAK,CAAC;SACd;QAED,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE;YACvB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,yBAAkB,IAAI,CAAC,WAAW,CAAC,SAAS,4CAAyC,CAAC,CAAC;YAC/G,OAAO,KAAK,CAAC;SACd;QAED,IAAI,YAAY,GAAG,KAAK,CAAC;QACzB,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,gGAAgG;QAChG,wEAAwE;QACxE,IAAI,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE;YAC/B,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE;gBAC/B,OAAO,GAAG,4CAAqC,IAAI,CAAC,WAAW,CAAC,SAAS,+CAA4C,CAAC;gBACtH,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACjC,YAAY,GAAG,KAAK,CAAC;gBACrB,OAAO,GAAG,KAAK,CAAC;aACjB;iBAAM;gBACL,OAAO,GAAG,wCAAiC,IAAI,CAAC,WAAW,CAAC,SAAS,2CAAwC,CAAC;gBAC9G,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACjC,YAAY,GAAG,IAAI,CAAC;gBACpB,OAAO,GAAG,IAAI,CAAC;aAChB;SACF;aAAM;YACL,IAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACzF,IAAI,CAAC,UAAU,EAAE;gBACf,OAAO,GAAG,yBAAkB,IAAI,CAAC,WAAW,CAAC,SAAS,0CAAuC,CAAC;gBAC9F,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACjC,YAAY,GAAG,KAAK,CAAC;gBACrB,OAAO,GAAG,KAAK,CAAC;aACjB;iBAAM;gBACL,YAAY,GAAG,IAAI,CAAC;gBACpB,OAAO,GAAG,IAAI,CAAC;aAChB;SACF;QAED,gFAAgF;QAChF,IAAI,IAAI,CAAC,wBAAwB,KAAK,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE;YACjF,KAAK,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,kBAAkB,EAAE;gBACjE,OAAO,SAAA;gBACP,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,SAAS;gBACrC,OAAO,SAAA;gBACP,eAAe,EAAE,IAAI,CAAC,mBAAmB;aAC1C,CAAC,CAAC;YACH,IAAI,CAAC,wBAAwB,GAAG,YAAY,CAAC;SAC9C;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,yCAAiB,GAAjB;;QACE,0FAA0F;QAC1F,4DAA4D;QAC5D,6DAA6D;QAC7D,IAAM,aAAa,GAAG,MAAA,MAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,aAAa,0CAAE,aAAa,mCAAI,EAAE,CAAC;QACtE,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE;YAC9B,OAAO,SAAS,CAAC;SAClB;QACD,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,4CAAoB,GAApB;;QACE,IAAI,CAAA,MAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,aAAa,0CAAE,gBAAgB,MAAK,cAAc,EAAE;YACnE,OAAO,GAAG,CAAC;SACZ;QAED,IAAM,YAAY,GAAG,MAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,aAAa,0CAAE,YAAY,CAAC;QAC9D,IAAI,CAAC,YAAY,EAAE;YACjB,OAAO;SACR;QAED,OAAO,YAAiC,CAAC;IAC3C,CAAC;IAEK,2CAAmB,GAAzB,UAA0B,aAAwC;;;;;;;wBAC1D,OAAO,GAAG,EAAE,CAAC;wBAEnB,0BAA0B;wBAC1B,IAAI;4BACI,iBAAiB,GAAG,uBAAuB,CAAC;gCAChD,cAAc,EAAE,CAAA,MAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,iBAAiB,0CAAE,cAAc,KAAI,EAAE;gCACpE,aAAa,EAAE,CAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,sBAAsB,KAAI,KAAK;gCAC3D,eAAe,EAAE,MAAA,IAAI,CAAC,MAAM,0CAAE,wBAAwB;gCACtD,oBAAoB,EAAE,MAAA,IAAI,CAAC,MAAM,0CAAE,oBAAoB;6BACxD,CAAC,CAAC;4BAEH,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;yBACjC;wBAAC,OAAO,KAAK,EAAE;4BACd,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAC;yBAC1E;6BAaG,CAAA,MAAA,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,OAAO,0CAAE,OAAO,CAAA,EAA/B,wBAA+B;;;;wBAGI,qBAAM,MAAM,CAAC,wCAAwC,CAAC,EAAA;;wBAAjF,sBAAsB,GAAK,CAAA,SAAsD,CAAA,uBAA3D;wBAC9B,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC,EAAE,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;;;;wBAE9E,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,gCAAgC,EAAE,OAAK,CAAC,CAAC;;4BAItE,sBAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAC;;;;KACjD;IAEa,yCAAiB,GAA/B;;;;;;wBACE,IAAI,IAAI,CAAC,cAAc,EAAE;4BACvB,sBAAO,IAAI,CAAC,cAAc,EAAC;yBAC5B;;;;wBAGoB,qBAAM,MAAM,CAAC,yBAAyB,CAAC,EAAA;;wBAAlD,MAAM,GAAK,CAAA,SAAuC,CAAA,OAA5C;wBACd,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC;wBAC7B,sBAAO,MAAM,EAAC;;;wBAEd,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,qCAAqC,EAAE,OAAK,CAAC,CAAC;wBACvE,sBAAO,IAAI,EAAC;;;;;KAEf;IAEK,oCAAY,GAAlB,UAAmB,iBAAwB;;QAAxB,kCAAA,EAAA,wBAAwB;;;;;;;;wBACnC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;wBACrB,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;wBACtC,SAAS,GAAG,MAAA,IAAI,CAAC,WAAW,0CAAE,SAAS,CAAC;wBAC9C,IAAI,CAAC,YAAY,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,EAAE;4BAC1C,sBAAO;yBACR;wBACD,IAAI,CAAC,mBAAmB,EAAE,CAAC;wBAEJ,qBAAM,IAAI,CAAC,iBAAiB,EAAE,EAAA;;wBAA/C,cAAc,GAAG,SAA8B;wBAErD,iDAAiD;wBACjD,IAAI,CAAC,cAAc,EAAE;4BACnB,sBAAO;yBACR;wBAED,qBAAM,IAAI,CAAC,0BAA0B,EAAE,EAAA;;wBAAvC,SAAuC,CAAC;wBAExC,MAAA,IAAI,CAAC,gBAAgB,0CAAE,KAAK,CAAC,UAAC,KAA0B;4BACtD,KAAK,KAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;wBACvE,CAAC,CAAC,CAAC;wBACK,aAAa,GAAuC,MAAM,cAA7C,EAAE,iBAAiB,GAAoB,MAAM,kBAA1B,EAAE,aAAa,GAAK,MAAM,cAAX,CAAY;wBAE7D,KAAK,GAAG,CAAA,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,OAAO;4BACtC,CAAC,CAAC;gCACE,gBAAgB,EACd,IAAI,CAAC,aAAa;oCAClB,SAAS,CAAC,IAAI,CAAC,cAAc,EAAE;wCAC7B,aAAa,EAAE,IAAI,CAAC,aAAa;wCACjC,SAAS,WAAA;wCACT,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;wCACvC,MAAM,EAAE,cAAc,CAAC,MAAM;wCAC7B,cAAc,EAAE,MAAA,iBAAiB,CAAC,cAAc,mCAAI,EAAE;qCACvD,CAAC;gCACJ,MAAM,EAAE,IAAI,CAAC,UAAU;6BACxB;4BACH,CAAC,CAAC,EAAE,CAAC;wBAED,cAAc,GAClB,CAAA,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,OAAO,KAAI,iBAAiB,CAAC,cAAc,CAAC,CAAC,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;wBAEzG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,+CAAwC,SAAS,MAAG,CAAC,CAAC;;;;wBAG5E,KAAA,IAAI,CAAA;wBAAwB,KAAA,cAAc,CAAA;;4BACxC,IAAI,EAAE,UAAC,KAAoB;gCACzB,IAAI,KAAI,CAAC,YAAY,EAAE,EAAE;oCACvB,KAAI,CAAC,cAAc,CAAC,GAAG,CAAC,yBAAkB,SAAS,4CAAyC,CAAC,CAAC;oCAC9F,KAAI,CAAC,mBAAmB,EAAE,CAAC;oCAC3B,KAAI,CAAC,UAAU,EAAE,CAAC;oCAClB,OAAO;iCACR;gCAED,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC,IAAI,EAAE;oCACtC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;iCAC/D;gCAED,IAAI,KAAI,CAAC,eAAe,EAAE;oCACxB,mFAAmF;oCACnF,KAAI,CAAC,eAAe,CAAC,YAAY,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;iCACrD;4BACH,CAAC;4BACD,gBAAgB,EAAE,MAAM,CAAC,sBAAsB;4BAC/C,KAAK,OAAA;4BACL,aAAa,EAAE,IAAI;4BACnB,aAAa,EAAE,eAAe;4BAC9B,UAAU,EAAE,WAAW;4BACvB,aAAa,EAAE,IAAI,CAAC,iBAAiB,EAAwB;4BAC7D,qCAAqC,EAAE,MAAM,CAAC,qCAAqC;4BACnF,WAAW,EAAE,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC;4BAC3C,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;4BACzC,gBAAgB,EAAE,IAAI,CAAC,oBAAoB,EAAE;4BAC7C,YAAY,EAAE,KAAK;4BACnB,cAAc,EAAE;gCACd,MAAM,EAAE,MAAA,MAAM,CAAC,eAAe,0CAAE,MAAM;gCACtC,OAAO,EAAE,MAAA,MAAM,CAAC,eAAe,0CAAE,OAAO;6BACzC;4BACD,YAAY,EAAE,UAAC,KAAc;gCAC3B,IAAM,UAAU,GAAG,KAAyC,CAAC;gCAE7D,wGAAwG;gCACxG,IAAI,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE;oCAC7F,MAAM,UAAU,CAAC;iCAClB;gCAED,oGAAoG;gCACpG,wGAAwG;gCACxG,mCAAmC;gCACnC,IAAI,UAAU,CAAC,UAAU,EAAE;oCACzB,MAAM,UAAU,CAAC;iCAClB;gCAED,KAAI,CAAC,cAAc,CAAC,IAAI,CAAC,gCAAgC,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;gCAClF,kFAAkF;gCAClF,OAAO,IAAI,CAAC;4BACd,CAAC;;wBACQ,qBAAM,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,EAAA;;wBApDxD,GAAK,oBAAoB,GAAG,mBAoD1B,UAAO,GAAE,SAA6C;qCACtD,CAAC;wBAEH,KAAK,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;wBAC3D,IAAI,iBAAiB,EAAE;4BACrB,KAAK,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;yBACzE;;;;wBAED,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,sCAAsC,EAAE,OAAK,CAAC,CAAC;;;;;;KAE3E;IAoDD,mCAAW,GAAX;;QACE,OAAO,MAAA,IAAI,CAAC,WAAW,0CAAE,QAAQ,CAAC;IACpC,CAAC;IAED,oCAAY,GAAZ;;QACE,OAAO,MAAA,IAAI,CAAC,WAAW,0CAAE,SAAS,CAAC;IACrC,CAAC;IAEK,6BAAK,GAAX,UAAY,QAAgB;;QAAhB,yBAAA,EAAA,gBAAgB;;;gBAC1B,sBAAO,MAAA,IAAI,CAAC,aAAa,0CAAE,KAAK,CAAC,QAAQ,CAAC,EAAC;;;KAC5C;IAED,gCAAQ,GAAR;QACE,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAEO,kCAAU,GAAlB,UAAmB,OAA2B;QAC5C,IAAI,OAAO,KAAK,QAAQ,EAAE;YACxB,OAAO,0CAA0C,CAAC;SACnD;QAED,IAAI,OAAO,KAAK,SAAS,EAAE;YACzB,OAAO,0CAA0C,CAAC;SACnD;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,mCAAW,GAAnB,UACE,SAAsC,EACtC,YAAuC,EACvC,WAAqC,EACrC,YAAmD,EACnD,gBAAoC,EACpC,oBAAwC,EACxC,OAA2B;QAE3B,IAAM,SAAS,GAAG,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,QAAQ,EAAE,EAAC,CAAC,CAAC,gBAAgB,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAE7F,IAAI,CAAC,QAAQ,GAAG;YACd,YAAY,cAAA;YACZ,WAAW,aAAA;YACX,YAAY,cAAA;YACZ,SAAS,WAAA;YACT,SAAS,WAAA;YACT,UAAU,EAAE,YAAY,CAAC,UAAU;YACnC,aAAa,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;YACvC,gBAAgB,kBAAA;YAChB,iBAAiB,EAAE,mCAAmC;YACtD,oBAAoB,sBAAA;SACrB,CAAC;IACJ,CAAC;IAEa,kDAA0B,GAAxC;;;;;;;6BACM,CAAA,CAAA,MAAA,MAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,aAAa,0CAAE,OAAO,0CAAE,OAAO,KAAI,CAAC,IAAI,CAAC,gBAAgB,CAAA,EAAtE,wBAAsE;;;;wBAElB,qBAAM,MAAM,CAAC,aAAa,CAAC,EAAA;;wBAArD,qBAAqB,GAAK,CAAA,SAA2B,CAAA,iBAAhC;wBAC/C,IAAI,CAAC,gBAAgB,GAAG,IAAI,qBAAqB,EAAE,CAAC;;;;wBAEpD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,mDAAmD,EAAE,OAAK,CAAC,CAAC;;;;;;KAG1F;IACH,oBAAC;AAAD,CAAC,AA1rBD,IA0rBC","sourcesContent":["import {\n getAnalyticsConnector,\n getGlobalScope,\n ILogger,\n Logger,\n LogLevel,\n returnWrapper,\n SpecialEventType,\n} from '@amplitude/analytics-core';\n\n// Import only specific types to avoid pulling in the entire rrweb-types package\nimport { eventWithTime, EventType as RRWebEventType, scrollCallback } from '@amplitude/rrweb-types';\nimport { TargetingParameters } from '@amplitude/targeting';\nimport { createSessionReplayJoinedConfigGenerator } from './config/joined-config';\nimport {\n LoggingConfig,\n SessionReplayJoinedConfig,\n SessionReplayJoinedConfigGenerator,\n SessionReplayLocalConfig,\n SessionReplayMetadata,\n SessionReplayRemoteConfig,\n} from './config/types';\nimport {\n BLOCK_CLASS,\n CustomRRwebEvent,\n DEFAULT_SESSION_REPLAY_PROPERTY,\n INTERACTION_MAX_INTERVAL,\n INTERACTION_MIN_INTERVAL,\n MASK_TEXT_CLASS,\n SESSION_REPLAY_DEBUG_PROPERTY,\n} from './constants';\nimport { EventCompressor } from './events/event-compressor';\nimport { createEventsManager } from './events/events-manager';\nimport { MultiEventManager } from './events/multi-manager';\nimport { generateHashCode, getDebugConfig, getPageUrl, getStorageSize, isSessionInSample, maskFn } from './helpers';\nimport { clickBatcher, clickHook, clickNonBatcher } from './hooks/click';\nimport { ScrollWatcher } from './hooks/scroll';\nimport { SessionIdentifiers } from './identifiers';\nimport { SafeLoggerProvider } from './logger';\nimport { evaluateTargetingAndStore } from './targeting/targeting-manager';\nimport {\n AmplitudeSessionReplay,\n SessionReplayEventsManager as AmplitudeSessionReplayEventsManager,\n DebugInfo,\n EventsManagerWithType,\n EventType,\n SessionIdentifiers as ISessionIdentifiers,\n SessionReplayOptions,\n} from './typings/session-replay';\nimport { VERSION } from './version';\n\n// Import only the type for NetworkRequestEvent to keep type safety\nimport type { NetworkObservers, NetworkRequestEvent } from './observers';\nimport { createUrlTrackingPlugin } from './plugins/url-tracking-plugin';\nimport type { RecordFunction } from './utils/rrweb';\n\ntype PageLeaveFn = (e: PageTransitionEvent | Event) => void;\n\nexport class SessionReplay implements AmplitudeSessionReplay {\n name = '@amplitude/session-replay-browser';\n config: SessionReplayJoinedConfig | undefined;\n joinedConfigGenerator: SessionReplayJoinedConfigGenerator | undefined;\n identifiers: ISessionIdentifiers | undefined;\n eventsManager?: AmplitudeSessionReplayEventsManager<'replay' | 'interaction', string>;\n loggerProvider: ILogger;\n recordCancelCallback: ReturnType<RecordFunction> | null = null;\n eventCount = 0;\n eventCompressor: EventCompressor | undefined;\n sessionTargetingMatch = false;\n private lastTargetingParams?: Pick<TargetingParameters, 'event' | 'userProperties'>;\n private lastShouldRecordDecision?: boolean;\n\n // Visible for testing only\n pageLeaveFns: PageLeaveFn[] = [];\n private scrollHook?: scrollCallback;\n private networkObservers?: NetworkObservers;\n private metadata: SessionReplayMetadata | undefined;\n\n // Cache the dynamically imported record function\n private recordFunction: RecordFunction | null = null;\n\n constructor() {\n this.loggerProvider = new SafeLoggerProvider(new Logger());\n }\n\n init(apiKey: string, options: SessionReplayOptions) {\n return returnWrapper(this._init(apiKey, options));\n }\n\n private teardownEventListeners = (teardown: boolean) => {\n const globalScope = getGlobalScope();\n if (globalScope) {\n globalScope.removeEventListener('blur', this.blurListener);\n globalScope.removeEventListener('focus', this.focusListener);\n !teardown && globalScope.addEventListener('blur', this.blurListener);\n !teardown && globalScope.addEventListener('focus', this.focusListener);\n // prefer pagehide to unload events, this is the standard going forward. it is not\n // 100% reliable, but is bfcache-compatible.\n if (globalScope.self && 'onpagehide' in globalScope.self) {\n globalScope.removeEventListener('pagehide', this.pageLeaveListener);\n !teardown && globalScope.addEventListener('pagehide', this.pageLeaveListener);\n } else {\n // this has performance implications, but is the only way we can reliably send events\n // in browser that don't support pagehide.\n globalScope.removeEventListener('beforeunload', this.pageLeaveListener);\n !teardown && globalScope.addEventListener('beforeunload', this.pageLeaveListener);\n }\n }\n };\n\n protected async _init(apiKey: string, options: SessionReplayOptions) {\n this.loggerProvider = new SafeLoggerProvider(options.loggerProvider || new Logger());\n Object.prototype.hasOwnProperty.call(options, 'logLevel') &&\n this.loggerProvider.enable(options.logLevel as LogLevel);\n this.identifiers = new SessionIdentifiers({ sessionId: options.sessionId, deviceId: options.deviceId });\n this.joinedConfigGenerator = await createSessionReplayJoinedConfigGenerator(apiKey, options);\n const { joinedConfig, localConfig, remoteConfig } = await this.joinedConfigGenerator.generateJoinedConfig(\n this.identifiers.sessionId,\n );\n this.config = joinedConfig;\n\n this.setMetadata(\n options.sessionId,\n joinedConfig,\n localConfig,\n remoteConfig,\n options.version?.version,\n VERSION,\n options.version?.type,\n );\n\n if (options.sessionId && this.config.interactionConfig?.enabled) {\n const scrollWatcher = ScrollWatcher.default(\n {\n sessionId: options.sessionId,\n type: 'interaction',\n },\n this.config,\n );\n this.pageLeaveFns = [scrollWatcher.send(this.getDeviceId.bind(this)).bind(scrollWatcher)];\n this.scrollHook = scrollWatcher.hook.bind(scrollWatcher);\n }\n\n const managers: EventsManagerWithType<EventType, string>[] = [];\n let { storeType } = this.config;\n if (storeType === 'idb' && !getGlobalScope()?.indexedDB) {\n storeType = 'memory';\n this.loggerProvider.warn('Could not use preferred indexedDB storage, reverting to in memory option.');\n }\n this.loggerProvider.log(`Using ${storeType} for event storage.`);\n try {\n const rrwebEventManager = await createEventsManager<'replay'>({\n config: this.config,\n sessionId: this.identifiers.sessionId,\n type: 'replay',\n storeType,\n });\n managers.push({ name: 'replay', manager: rrwebEventManager });\n } catch (error) {\n const typedError = error as Error;\n this.loggerProvider.warn(`Error occurred while creating replay events manager: ${typedError.toString()}`);\n }\n\n if (this.config.interactionConfig?.enabled) {\n const payloadBatcher = this.config.interactionConfig.batch ? clickBatcher : clickNonBatcher;\n try {\n const interactionEventManager = await createEventsManager<'interaction'>({\n config: this.config,\n sessionId: this.identifiers.sessionId,\n type: 'interaction',\n minInterval: this.config.interactionConfig.trackEveryNms ?? INTERACTION_MIN_INTERVAL,\n maxInterval: INTERACTION_MAX_INTERVAL,\n payloadBatcher,\n storeType,\n });\n managers.push({ name: 'interaction', manager: interactionEventManager });\n } catch (error) {\n const typedError = error as Error;\n this.loggerProvider.warn(`Error occurred while creating interaction events manager: ${typedError.toString()}`);\n }\n }\n\n this.eventsManager = new MultiEventManager<'replay' | 'interaction', string>(...managers);\n // To prevent too many threads.\n if (this.eventCompressor) {\n this.eventCompressor.terminate();\n }\n\n let workerScript = undefined;\n const globalScope = getGlobalScope();\n if (this.config.experimental?.useWebWorker && globalScope && globalScope.Worker) {\n const { compressionScript } = await import('./worker');\n\n workerScript = compressionScript;\n }\n\n this.eventCompressor = new EventCompressor(this.eventsManager, this.config, this.getDeviceId(), workerScript);\n\n await this.initializeNetworkObservers();\n\n this.loggerProvider.log('Installing @amplitude/session-replay-browser.');\n\n this.teardownEventListeners(false);\n\n await this.evaluateTargetingAndCapture({ userProperties: options.userProperties }, true);\n }\n\n setSessionId(sessionId: string | number, deviceId?: string) {\n return returnWrapper(this.asyncSetSessionId(sessionId, deviceId));\n }\n\n async asyncSetSessionId(\n sessionId: string | number,\n deviceId?: string,\n options?: { userProperties?: { [key: string]: any } },\n ) {\n this.sessionTargetingMatch = false;\n this.lastShouldRecordDecision = undefined; // Reset targeting decision for new session\n\n const previousSessionId = this.identifiers && this.identifiers.sessionId;\n if (previousSessionId) {\n this.sendEvents(previousSessionId);\n }\n\n const deviceIdForReplayId = deviceId || this.getDeviceId();\n this.identifiers = new SessionIdentifiers({\n sessionId: sessionId,\n deviceId: deviceIdForReplayId,\n });\n\n // If there is no previous session id, SDK is being initialized for the first time,\n // and config was just fetched in initialization, so no need to fetch it a second time\n if (this.joinedConfigGenerator && previousSessionId) {\n const { joinedConfig } = await this.joinedConfigGenerator.generateJoinedConfig(this.identifiers.sessionId);\n this.config = joinedConfig;\n }\n await this.evaluateTargetingAndCapture({ userProperties: options?.userProperties });\n }\n\n getSessionReplayProperties() {\n const config = this.config;\n const identifiers = this.identifiers;\n if (!config || !identifiers) {\n this.loggerProvider.warn('Session replay init has not been called, cannot get session replay properties.');\n return {};\n }\n\n const shouldRecord = this.getShouldRecord();\n let eventProperties: { [key: string]: string | null } = {};\n\n if (shouldRecord) {\n eventProperties = {\n [DEFAULT_SESSION_REPLAY_PROPERTY]: identifiers.sessionReplayId ? identifiers.sessionReplayId : null,\n };\n if (config.debugMode) {\n eventProperties[SESSION_REPLAY_DEBUG_PROPERTY] = JSON.stringify({\n appHash: generateHashCode(config.apiKey).toString(),\n });\n }\n }\n\n void this.addCustomRRWebEvent(\n CustomRRwebEvent.GET_SR_PROPS,\n {\n shouldRecord,\n eventProperties: eventProperties,\n },\n this.eventCount === 10,\n );\n if (this.eventCount === 10) {\n this.eventCount = 0;\n }\n this.eventCount++;\n\n return eventProperties;\n }\n\n blurListener = () => {\n this.sendEvents();\n };\n\n focusListener = () => {\n // Restart recording on focus to ensure that when user\n // switches tabs, we take a full snapshot\n void this.recordEvents(false);\n };\n\n /**\n * This is an instance member so that if init is called multiple times\n * it doesn't add another listener to the page leave event. This is to\n * prevent duplicate listener actions from firing.\n */\n private pageLeaveListener = (e: PageTransitionEvent | Event) => {\n this.pageLeaveFns.forEach((fn) => {\n fn(e);\n });\n };\n\n evaluateTargetingAndCapture = async (\n targetingParams: Pick<TargetingParameters, 'event' | 'userProperties'>,\n isInit = false,\n ) => {\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 // Store targeting parameters for use in getShouldRecord\n this.lastTargetingParams = targetingParams;\n\n if (this.config.targetingConfig && !this.sessionTargetingMatch) {\n let eventForTargeting = targetingParams.event;\n if (\n eventForTargeting &&\n Object.values(SpecialEventType).includes(eventForTargeting.event_type as SpecialEventType)\n ) {\n eventForTargeting = undefined;\n }\n\n // We're setting this on this class because fetching the value from idb\n // is async, we need to access this value synchronously (for record\n // and for getSessionReplayProperties - both synchronous fns)\n this.sessionTargetingMatch = await evaluateTargetingAndStore({\n sessionId: this.identifiers.sessionId,\n targetingConfig: this.config.targetingConfig,\n loggerProvider: this.loggerProvider,\n apiKey: this.config.apiKey,\n targetingParams: { userProperties: targetingParams.userProperties, event: eventForTargeting },\n });\n\n // Log the targeting config to debug\n this.loggerProvider.debug(\n JSON.stringify(\n {\n name: 'targeted replay capture config',\n sessionTargetingMatch: this.sessionTargetingMatch,\n event: eventForTargeting,\n targetingParams: targetingParams,\n },\n null,\n 2,\n ),\n );\n }\n\n if (isInit) {\n void this.initialize(true);\n } else {\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 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 if (this.config?.privacyConfig?.defaultMaskLevel === 'conservative') {\n return '*';\n }\n\n const maskSelector = this.config?.privacyConfig?.maskSelector;\n if (!maskSelector) {\n return;\n }\n\n return maskSelector as unknown as string;\n }\n\n async getRecordingPlugins(loggingConfig: LoggingConfig | undefined) {\n const plugins = [];\n\n // Add URL tracking plugin\n try {\n const urlTrackingPlugin = createUrlTrackingPlugin({\n ugcFilterRules: this.config?.interactionConfig?.ugcFilterRules || [],\n enablePolling: this.config?.enableUrlChangePolling || false,\n pollingInterval: this.config?.urlChangePollingInterval,\n captureDocumentTitle: this.config?.captureDocumentTitle,\n });\n\n plugins.push(urlTrackingPlugin);\n } catch (error) {\n this.loggerProvider.warn('Failed to create URL tracking plugin:', error);\n }\n\n // Default plugin settings -\n // {\n // level: ['info', 'log', 'warn', 'error'],\n // lengthThreshold: 10000,\n // stringifyOptions: {\n // stringLengthLimit: undefined,\n // numOfKeysLimit: 50,\n // depthOfLimit: 4,\n // },\n // logger: window.console,\n // }\n if (loggingConfig?.console?.enabled) {\n try {\n // Dynamic import keeps console plugin separate and only loads when needed\n const { getRecordConsolePlugin } = await import('@amplitude/rrweb-plugin-console-record');\n plugins.push(getRecordConsolePlugin({ level: loggingConfig.console.levels }));\n } catch (error) {\n this.loggerProvider.warn('Failed to load console plugin:', error);\n }\n }\n\n return plugins.length > 0 ? plugins : undefined;\n }\n\n private async getRecordFunction(): Promise<RecordFunction | null> {\n if (this.recordFunction) {\n return this.recordFunction;\n }\n\n try {\n const { record } = await import('@amplitude/rrweb-record');\n this.recordFunction = record;\n return record;\n } catch (error) {\n this.loggerProvider.warn('Failed to load rrweb-record module:', error);\n return null;\n }\n }\n\n async recordEvents(shouldLogMetadata = true) {\n const config = this.config;\n const shouldRecord = this.getShouldRecord();\n const sessionId = this.identifiers?.sessionId;\n if (!shouldRecord || !sessionId || !config) {\n return;\n }\n this.stopRecordingEvents();\n\n const recordFunction = await this.getRecordFunction();\n\n // May be undefined if cannot import rrweb-record\n if (!recordFunction) {\n return;\n }\n\n await this.initializeNetworkObservers();\n\n this.networkObservers?.start((event: NetworkRequestEvent) => {\n void this.addCustomRRWebEvent(CustomRRwebEvent.FETCH_REQUEST, event);\n });\n const { privacyConfig, interactionConfig, loggingConfig } = config;\n\n const hooks = interactionConfig?.enabled\n ? {\n mouseInteraction:\n this.eventsManager &&\n clickHook(this.loggerProvider, {\n eventsManager: this.eventsManager,\n sessionId,\n deviceIdFn: this.getDeviceId.bind(this),\n mirror: recordFunction.mirror,\n ugcFilterRules: interactionConfig.ugcFilterRules ?? [],\n }),\n scroll: this.scrollHook,\n }\n : {};\n\n const ugcFilterRules =\n interactionConfig?.enabled && interactionConfig.ugcFilterRules ? interactionConfig.ugcFilterRules : [];\n\n this.loggerProvider.log(`Session Replay capture beginning for ${sessionId}.`);\n\n try {\n this.recordCancelCallback = recordFunction({\n emit: (event: eventWithTime) => {\n if (this.shouldOptOut()) {\n this.loggerProvider.log(`Opting session ${sessionId} out of recording due to optOut config.`);\n this.stopRecordingEvents();\n this.sendEvents();\n return;\n }\n\n if (event.type === RRWebEventType.Meta) {\n event.data.href = getPageUrl(event.data.href, ugcFilterRules);\n }\n\n if (this.eventCompressor) {\n // Schedule processing during idle time if the browser supports requestIdleCallback\n this.eventCompressor.enqueueEvent(event, sessionId);\n }\n },\n inlineStylesheet: config.shouldInlineStylesheet,\n hooks,\n maskAllInputs: true,\n maskTextClass: MASK_TEXT_CLASS,\n blockClass: BLOCK_CLASS,\n blockSelector: this.getBlockSelectors() as string | undefined,\n applyBackgroundColorToBlockedElements: config.applyBackgroundColorToBlockedElements,\n maskInputFn: maskFn('input', privacyConfig),\n maskTextFn: maskFn('text', privacyConfig),\n maskTextSelector: this.getMaskTextSelectors(),\n recordCanvas: false,\n slimDOMOptions: {\n script: config.omitElementTags?.script,\n comment: config.omitElementTags?.comment,\n },\n errorHandler: (error: unknown) => {\n const typedError = error as Error & { _external_?: boolean };\n\n // styled-components relies on this error being thrown and bubbled up, rrweb is otherwise suppressing it\n if (typedError.message.includes('insertRule') && typedError.message.includes('CSSStyleSheet')) {\n throw typedError;\n }\n\n // rrweb does monkey patching on certain window functions such as CSSStyleSheet.proptype.insertRule,\n // and errors from external clients calling these functions can get suppressed. Styled components depend\n // on these errors being re-thrown.\n if (typedError._external_) {\n throw typedError;\n }\n\n this.loggerProvider.warn('Error while capturing replay: ', typedError.toString());\n // Return true so that we don't clutter user's consoles with internal rrweb errors\n return true;\n },\n plugins: await this.getRecordingPlugins(loggingConfig),\n });\n\n void this.addCustomRRWebEvent(CustomRRwebEvent.DEBUG_INFO);\n if (shouldLogMetadata) {\n void this.addCustomRRWebEvent(CustomRRwebEvent.METADATA, this.metadata);\n }\n } catch (error) {\n this.loggerProvider.warn('Failed to initialize session replay:', error);\n }\n }\n\n addCustomRRWebEvent = async (\n eventName: CustomRRwebEvent,\n eventData: { [key: string]: any } = {},\n addStorageInfo = true,\n ) => {\n try {\n let debugInfo: DebugInfo | undefined = undefined;\n const config = this.config;\n // Only add debug info for non-metadata events\n if (config && eventName !== CustomRRwebEvent.METADATA) {\n debugInfo = {\n config: getDebugConfig(config),\n version: VERSION,\n };\n if (addStorageInfo) {\n const storageSizeData = await getStorageSize();\n debugInfo = {\n ...storageSizeData,\n ...debugInfo,\n };\n }\n }\n // Check first to ensure we are recording\n if (this.recordCancelCallback && this.recordFunction) {\n this.recordFunction.addCustomEvent(eventName, {\n ...eventData,\n ...debugInfo,\n });\n } else {\n this.loggerProvider.debug(\n `Not able to add custom replay capture event ${eventName} due to no ongoing recording.`,\n );\n }\n } catch (e) {\n this.loggerProvider.debug('Error while adding custom replay capture event: ', e);\n }\n };\n\n stopRecordingEvents = () => {\n try {\n this.loggerProvider.log('Session Replay capture stopping.');\n this.recordCancelCallback && this.recordCancelCallback();\n this.recordCancelCallback = null;\n this.networkObservers?.stop();\n } catch (error) {\n const typedError = error as Error;\n this.loggerProvider.warn(`Error occurred while stopping replay capture: ${typedError.toString()}`);\n }\n };\n\n getDeviceId() {\n return this.identifiers?.deviceId;\n }\n\n getSessionId() {\n return this.identifiers?.sessionId;\n }\n\n async flush(useRetry = false) {\n return this.eventsManager?.flush(useRetry);\n }\n\n shutdown() {\n this.teardownEventListeners(true);\n this.stopRecordingEvents();\n this.sendEvents();\n }\n\n private mapSDKType(sdkType: string | undefined) {\n if (sdkType === 'plugin') {\n return '@amplitude/plugin-session-replay-browser';\n }\n\n if (sdkType === 'segment') {\n return '@amplitude/segment-session-replay-plugin';\n }\n\n return null;\n }\n\n private setMetadata(\n sessionId: string | number | undefined,\n joinedConfig: SessionReplayJoinedConfig,\n localConfig: SessionReplayLocalConfig,\n remoteConfig: SessionReplayRemoteConfig | undefined,\n replaySDKVersion: string | undefined,\n standaloneSDKVersion: string | undefined,\n sdkType: string | undefined,\n ) {\n const hashValue = sessionId?.toString() ? generateHashCode(sessionId.toString()) : undefined;\n\n this.metadata = {\n joinedConfig,\n localConfig,\n remoteConfig,\n sessionId,\n hashValue,\n sampleRate: joinedConfig.sampleRate,\n replaySDKType: this.mapSDKType(sdkType),\n replaySDKVersion,\n standaloneSDKType: '@amplitude/session-replay-browser',\n standaloneSDKVersion,\n };\n }\n\n private async initializeNetworkObservers(): Promise<void> {\n if (this.config?.loggingConfig?.network?.enabled && !this.networkObservers) {\n try {\n const { NetworkObservers: NetworkObserversClass } = await import('./observers');\n this.networkObservers = new NetworkObserversClass();\n } catch (error) {\n this.loggerProvider.warn('Failed to import or instantiate NetworkObservers:', error);\n }\n }\n }\n}\n"]}
|
package/lib/esm/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const VERSION = "1.
|
|
1
|
+
export declare const VERSION = "1.29.0-fixwebworkerscript.0";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/lib/esm/version.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,OAAO,
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,OAAO,gCAAgC,CAAC"}
|
package/lib/esm/version.js
CHANGED
package/lib/esm/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,MAAM,CAAC,IAAM,OAAO,GAAG,
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,MAAM,CAAC,IAAM,OAAO,GAAG,6BAA6B,CAAC","sourcesContent":["// Autogenerated by `yarn version-file`. DO NOT EDIT\nexport const VERSION = '1.29.0-fixwebworkerscript.0';\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/worker/index.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,iBAAiB,QAAqC,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
var compressionScript = "var WebWorker=function(r){\"use strict\";var n=Uint8Array,e=Uint16Array,f=Uint32Array,t=new n([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),a=new n([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),o=new n([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),i=function(r,n){for(var t=new e(31),a=0;a<31;++a)t[a]=n+=1<<r[a-1];var o=new f(t[30]);for(a=1;a<30;++a)for(var i=t[a];i<t[a+1];++i)o[i]=i-t[a]<<5|a;return[t,o]},v=i(t,2),u=v[0],s=v[1];u[28]=258,s[258]=28;for(var l=i(a,0)[1],c=new e(32768),h=0;h<32768;++h){var g=(43690&h)>>>1|(21845&h)<<1;g=(61680&(g=(52428&g)>>>2|(13107&g)<<2))>>>4|(3855&g)<<4,c[h]=((65280&g)>>>8|(255&g)<<8)>>>1}var w=function(r,n,f){for(var t=r.length,a=0,o=new e(n);a<t;++a)++o[r[a]-1];var i,v=new e(n);for(a=0;a<n;++a)v[a]=v[a-1]+o[a-1]<<1;if(f){i=new e(1<<n);var u=15-n;for(a=0;a<t;++a)if(r[a])for(var s=a<<4|r[a],l=n-r[a],h=v[r[a]-1]++<<l,g=h|(1<<l)-1;h<=g;++h)i[c[h]>>>u]=s}else for(i=new e(t),a=0;a<t;++a)i[a]=c[v[r[a]-1]++]>>>15-r[a];return i},d=new n(288);for(h=0;h<144;++h)d[h]=8;for(h=144;h<256;++h)d[h]=9;for(h=256;h<280;++h)d[h]=7;for(h=280;h<288;++h)d[h]=8;var m=new n(32);for(h=0;h<32;++h)m[h]=5;var y=w(d,9,0),M=w(m,5,0),p=function(r){return(r/8|0)+(7&r&&1)},b=function(r,t,a){(null==a||a>r.length)&&(a=r.length);var o=new(r instanceof e?e:r instanceof f?f:n)(a-t);return o.set(r.subarray(t,a)),o},C=function(r,n,e){e<<=7&n;var f=n/8|0;r[f]|=e,r[f+1]|=e>>>8},S=function(r,n,e){e<<=7&n;var f=n/8|0;r[f]|=e,r[f+1]|=e>>>8,r[f+2]|=e>>>16},x=function(r,f){for(var t=[],a=0;a<r.length;++a)r[a]&&t.push({s:a,f:r[a]});var o=t.length,i=t.slice();if(!o)return[new n(0),0];if(1==o){var v=new n(t[0].s+1);return v[t[0].s]=1,[v,1]}t.sort((function(r,n){return r.f-n.f})),t.push({s:-1,f:25001});var u=t[0],s=t[1],l=0,c=1,h=2;for(t[0]={s:-1,f:u.f+s.f,l:u,r:s};c!=o-1;)u=t[t[l].f<t[h].f?l++:h++],s=t[l!=c&&t[l].f<t[h].f?l++:h++],t[c++]={s:-1,f:u.f+s.f,l:u,r:s};var g=i[0].s;for(a=1;a<o;++a)i[a].s>g&&(g=i[a].s);var w=new e(g+1),d=A(t[c-1],w,0);if(d>f){a=0;var m=0,y=d-f,M=1<<y;for(i.sort((function(r,n){return w[n.s]-w[r.s]||r.f-n.f}));a<o;++a){var p=i[a].s;if(!(w[p]>f))break;m+=M-(1<<d-w[p]),w[p]=f}for(m>>>=y;m>0;){var b=i[a].s;w[b]<f?m-=1<<f-w[b]++-1:++a}for(;a>=0&&m;--a){var C=i[a].s;w[C]==f&&(--w[C],++m)}d=f}return[new n(w),d]},A=function(r,n,e){return-1==r.s?Math.max(A(r.l,n,e+1),A(r.r,n,e+1)):n[r.s]=e},O=function(r){for(var n=r.length;n&&!r[--n];);for(var f=new e(++n),t=0,a=r[0],o=1,i=function(r){f[t++]=r},v=1;v<=n;++v)if(r[v]==a&&v!=n)++o;else{if(!a&&o>2){for(;o>138;o-=138)i(32754);o>2&&(i(o>10?o-11<<5|28690:o-3<<5|12305),o=0)}else if(o>3){for(i(a),--o;o>6;o-=6)i(8304);o>2&&(i(o-3<<5|8208),o=0)}for(;o--;)i(a);o=1,a=r[v]}return[f.subarray(0,t),n]},T=function(r,n){for(var e=0,f=0;f<n.length;++f)e+=r[f]*n[f];return e},k=function(r,n,e){var f=e.length,t=p(n+2);r[t]=255&f,r[t+1]=f>>>8,r[t+2]=255^r[t],r[t+3]=255^r[t+1];for(var a=0;a<f;++a)r[t+a+4]=e[a];return 8*(t+4+f)},E=function(r,n,f,i,v,u,s,l,c,h,g){C(n,g++,f),++v[256];for(var p=x(v,15),b=p[0],A=p[1],E=x(u,15),J=E[0],N=E[1],U=O(b),D=U[0],I=U[1],W=O(J),_=W[0],j=W[1],P=new e(19),q=0;q<D.length;++q)P[31&D[q]]++;for(q=0;q<_.length;++q)P[31&_[q]]++;for(var z=x(P,7),B=z[0],F=z[1],G=19;G>4&&!B[o[G-1]];--G);var H,K,L,Q,R=h+5<<3,V=T(v,d)+T(u,m)+s,X=T(v,b)+T(u,J)+s+14+3*G+T(P,B)+(2*P[16]+3*P[17]+7*P[18]);if(R<=V&&R<=X)return k(n,g,r.subarray(c,c+h));if(C(n,g,1+(X<V)),g+=2,X<V){H=w(b,A,0),K=b,L=w(J,N,0),Q=J;var Y=w(B,F,0);C(n,g,I-257),C(n,g+5,j-1),C(n,g+10,G-4),g+=14;for(q=0;q<G;++q)C(n,g+3*q,B[o[q]]);g+=3*G;for(var Z=[D,_],$=0;$<2;++$){var rr=Z[$];for(q=0;q<rr.length;++q){var nr=31&rr[q];C(n,g,Y[nr]),g+=B[nr],nr>15&&(C(n,g,rr[q]>>>5&127),g+=rr[q]>>>12)}}}else H=y,K=d,L=M,Q=m;for(q=0;q<l;++q)if(i[q]>255){nr=i[q]>>>18&31;S(n,g,H[nr+257]),g+=K[nr+257],nr>7&&(C(n,g,i[q]>>>23&31),g+=t[nr]);var er=31&i[q];S(n,g,L[er]),g+=Q[er],er>3&&(S(n,g,i[q]>>>5&8191),g+=a[er])}else S(n,g,H[i[q]]),g+=K[i[q]];return S(n,g,H[256]),g+K[256]},J=new f([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),N=function(r,o,i,v,u){return function(r,o,i,v,u,c){var h=r.length,g=new n(v+h+5*(1+Math.floor(h/7e3))+u),w=g.subarray(v,g.length-u),d=0;if(!o||h<8)for(var m=0;m<=h;m+=65535){var y=m+65535;y<h?d=k(w,d,r.subarray(m,y)):(w[m]=c,d=k(w,d,r.subarray(m,h)))}else{for(var M=J[o-1],C=M>>>13,S=8191&M,x=(1<<i)-1,A=new e(32768),O=new e(x+1),T=Math.ceil(i/3),N=2*T,U=function(n){return(r[n]^r[n+1]<<T^r[n+2]<<N)&x},D=new f(25e3),I=new e(288),W=new e(32),_=0,j=0,P=(m=0,0),q=0,z=0;m<h;++m){var B=U(m),F=32767&m,G=O[B];if(A[F]=G,O[B]=F,q<=m){var H=h-m;if((_>7e3||P>24576)&&H>423){d=E(r,w,0,D,I,W,j,P,z,m-z,d),P=_=j=0,z=m;for(var K=0;K<286;++K)I[K]=0;for(K=0;K<30;++K)W[K]=0}var L=2,Q=0,R=S,V=F-G&32767;if(H>2&&B==U(m-V))for(var X=Math.min(C,H)-1,Y=Math.min(32767,m),Z=Math.min(258,H);V<=Y&&--R&&F!=G;){if(r[m+L]==r[m+L-V]){for(var $=0;$<Z&&r[m+$]==r[m+$-V];++$);if($>L){if(L=$,Q=V,$>X)break;var rr=Math.min(V,$-2),nr=0;for(K=0;K<rr;++K){var er=m-V+K+32768&32767,fr=er-A[er]+32768&32767;fr>nr&&(nr=fr,G=er)}}}V+=(F=G)-(G=A[F])+32768&32767}if(Q){D[P++]=268435456|s[L]<<18|l[Q];var tr=31&s[L],ar=31&l[Q];j+=t[tr]+a[ar],++I[257+tr],++W[ar],q=m+L,++_}else D[P++]=r[m],++I[r[m]]}}d=E(r,w,c,D,I,W,j,P,z,m-z,d)}return b(g,0,v+p(d)+u)}(r,null==o.level?6:o.level,null==o.mem?Math.ceil(1.5*Math.max(8,Math.min(13,Math.log(r.length)))):12+o.mem,i,v,!u)};function U(r,n){void 0===n&&(n={});var e=function(){var r=1,n=0;return{p:function(e){for(var f=r,t=n,a=e.length,o=0;o!=a;){for(var i=Math.min(o+5552,a);o<i;++o)t+=f+=e[o];f%=65521,t%=65521}r=f,n=t},d:function(){return(r>>>8<<16|(255&n)<<8|n>>>8)+2*((255&r)<<23)}}}();e.p(r);var f,t,a,o=N(r,n,2,4);return f=o,t=n.level,a=0==t?0:t<6?1:9==t?3:2,f[0]=120,f[1]=a<<6|(a?32-2*a:1),function(r,n,e){for(;e;++n)r[n]=e,e>>>=8}(o,o.length-4,e.d()),o}const D=r=>{const e={...r,v:\"v1\"};return function(r,n){var e=\"\";if(!n&&\"undefined\"!=typeof TextDecoder)return(new TextDecoder).decode(r);for(var f=0;f<r.length;){var t=r[f++];t<128||n?e+=String.fromCharCode(t):t<224?e+=String.fromCharCode((31&t)<<6|63&r[f++]):t<240?e+=String.fromCharCode((15&t)<<12|(63&r[f++])<<6|63&r[f++]):(t=((15&t)<<18|(63&r[f++])<<12|(63&r[f++])<<6|63&r[f++])-65536,e+=String.fromCharCode(55296|t>>10,56320|1023&t))}return e}(U(function(r,e){var f=r.length;if(!e&&\"undefined\"!=typeof TextEncoder)return(new TextEncoder).encode(r);for(var t=new n(r.length+(r.length>>>1)),a=0,o=function(r){t[a++]=r},i=0;i<f;++i){if(a+5>t.length){var v=new n(a+8+(f-i<<1));v.set(t),t=v}var u=r.charCodeAt(i);u<128||e?o(u):u<2048?(o(192|u>>>6),o(128|63&u)):u>55295&&u<57344?(o(240|(u=65536+(1047552&u)|1023&r.charCodeAt(++i))>>>18),o(128|u>>>12&63),o(128|u>>>6&63),o(128|63&u)):(o(224|u>>>12),o(128|u>>>6&63),o(128|63&u))}return b(t,0,a)}(JSON.stringify(e))),!0)};onmessage=r=>{const{event:n,sessionId:e}=\"string\"==typeof r.data?JSON.parse(r.data):r.data,f=JSON.stringify(D(n));postMessage({compressedEvent:f,sessionId:e})};const I=onmessage;return r.compressionOnMessage=I,Object.defineProperty(r,\"__esModule\",{value:!0}),r}({});\n";
|
|
2
|
+
|
|
3
|
+
export { compressionScript };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/worker/index.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,IAAM,OAAO,GAA2B,EAAE,CAAC;AAC3C,oFAAoF;AACpF,0BAA0B;AAC1B,MAAM,CAAC,IAAM,iBAAiB,GAAG,OAAO,CAAC,0BAA0B,CAAC","sourcesContent":["// These two lines will be changed at compile time.\nconst replace: Record<string, string> = {};\n// This next line is going to be ridiculously hard to cover in unit tests, ignoring.\n/* istanbul ignore next */\nexport const compressionScript = replace.COMPRESSION_WEBWORKER_BODY;\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as t}from"./targeting-min.js";import{g as e}from"./
|
|
1
|
+
import{a as t}from"./targeting-min.js";import{g as e}from"./session-replay-min.js";class s{constructor(){this.fetchObserver=null}start(t){this.eventCallback=t,this.observeFetch()}stop(){var t;null===(t=this.fetchObserver)||void 0===t||t.call(this),this.fetchObserver=null,this.eventCallback=void 0}notifyEvent(t){var e;null===(e=this.eventCallback)||void 0===e||e.call(this,t)}observeFetch(){const s=e();if(!s)return;const r=s.fetch;r&&(s.fetch=(e,s)=>t(this,void 0,void 0,(function*(){const t=Date.now(),n={timestamp:t,type:"fetch",method:(null==s?void 0:s.method)||"GET",url:e.toString(),requestHeaders:null==s?void 0:s.headers};try{const o=yield r(e,s),i=Date.now();n.status=o.status,n.duration=i-t;const a={};return o.headers.forEach(((t,e)=>{a[e]=t})),n.responseHeaders=a,this.notifyEvent(n),o}catch(e){const s=Date.now();n.duration=s-t;const r=e;throw n.error={name:r.name||"UnknownError",message:r.message||"An unknown error occurred"},this.notifyEvent(n),e}})),this.fetchObserver=()=>{s.fetch=r})}}export{s as NetworkObservers};
|
|
2
2
|
//# sourceMappingURL=observers-min.js.map
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observers-min.js","sources":["
|
|
1
|
+
{"version":3,"file":"observers-min.js","sources":["../../../src/observers.ts"],"sourcesContent":["import { getGlobalScope } from '@amplitude/analytics-core';\n\nexport interface NetworkRequestEvent {\n timestamp: number;\n type: 'fetch';\n method: string;\n url: string;\n status?: number;\n duration?: number;\n requestHeaders?: Record<string, string>;\n responseHeaders?: Record<string, string>;\n error?: {\n name: string;\n message: string;\n };\n}\n\nexport type NetworkEventCallback = (event: NetworkRequestEvent) => void;\n\nexport class NetworkObservers {\n private fetchObserver: (() => void) | null = null;\n private eventCallback?: NetworkEventCallback;\n\n start(eventCallback: NetworkEventCallback) {\n this.eventCallback = eventCallback;\n this.observeFetch();\n }\n\n stop() {\n this.fetchObserver?.();\n this.fetchObserver = null;\n this.eventCallback = undefined;\n }\n\n protected notifyEvent(event: NetworkRequestEvent) {\n this.eventCallback?.(event);\n }\n\n private observeFetch() {\n const globalScope = getGlobalScope();\n if (!globalScope) return;\n\n const originalFetch = globalScope.fetch;\n if (!originalFetch) return;\n\n globalScope.fetch = async (input: RequestInfo | URL, init?: RequestInit) => {\n const startTime = Date.now();\n const requestEvent: NetworkRequestEvent = {\n timestamp: startTime,\n type: 'fetch',\n method: init?.method || 'GET', // Fetch API defaulted to GET when no method is provided\n url: input.toString(),\n requestHeaders: init?.headers as Record<string, string>,\n };\n\n try {\n const response = await originalFetch(input, init);\n const endTime = Date.now();\n\n requestEvent.status = response.status;\n requestEvent.duration = endTime - startTime;\n\n // Convert Headers\n const headers: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n headers[key] = value;\n });\n requestEvent.responseHeaders = headers;\n\n this.notifyEvent(requestEvent);\n return response;\n } catch (error) {\n const endTime = Date.now();\n requestEvent.duration = endTime - startTime;\n\n // Capture error information\n const typedError = error as Error;\n requestEvent.error = {\n name: typedError.name || 'UnknownError',\n message: typedError.message || 'An unknown error occurred',\n };\n\n this.notifyEvent(requestEvent);\n throw error;\n }\n };\n\n this.fetchObserver = () => {\n globalScope.fetch = originalFetch;\n };\n }\n}\n"],"names":["NetworkObservers","constructor","this","fetchObserver","start","eventCallback","observeFetch","stop","_a","call","undefined","notifyEvent","event","globalScope","getGlobalScope","originalFetch","fetch","input","init","__awaiter","startTime","Date","now","requestEvent","timestamp","type","method","url","toString","requestHeaders","headers","response","endTime","status","duration","forEach","value","key","responseHeaders","error","typedError","name","message"],"mappings":"yFAmBaA,EAAb,WAAAC,GACUC,KAAaC,cAAwB,IAuE9C,CApEC,KAAAC,CAAMC,GACJH,KAAKG,cAAgBA,EACrBH,KAAKI,cACN,CAED,IAAAC,SACoB,QAAlBC,EAAAN,KAAKC,qBAAa,IAAAK,GAAAA,EAAAC,KAAAP,MAClBA,KAAKC,cAAgB,KACrBD,KAAKG,mBAAgBK,CACtB,CAES,WAAAC,CAAYC,SACC,QAArBJ,EAAAN,KAAKG,qBAAgB,IAAAG,GAAAA,EAAAC,KAAAP,KAAAU,EACtB,CAEO,YAAAN,GACN,MAAMO,EAAcC,IACpB,IAAKD,EAAa,OAElB,MAAME,EAAgBF,EAAYG,MAC7BD,IAELF,EAAYG,MAAQ,CAAOC,EAA0BC,IAAsBC,EAAAjB,UAAA,OAAA,GAAA,YACzE,MAAMkB,EAAYC,KAAKC,MACjBC,EAAoC,CACxCC,UAAWJ,EACXK,KAAM,QACNC,QAAQR,eAAAA,EAAMQ,SAAU,MACxBC,IAAKV,EAAMW,WACXC,eAAgBX,aAAA,EAAAA,EAAMY,SAGxB,IACE,MAAMC,QAAiBhB,EAAcE,EAAOC,GACtCc,EAAUX,KAAKC,MAErBC,EAAaU,OAASF,EAASE,OAC/BV,EAAaW,SAAWF,EAAUZ,EAGlC,MAAMU,EAAkC,CAAA,EAOxC,OANAC,EAASD,QAAQK,SAAQ,CAACC,EAAOC,KAC/BP,EAAQO,GAAOD,CAAK,IAEtBb,EAAae,gBAAkBR,EAE/B5B,KAAKS,YAAYY,GACVQ,CACR,CAAC,MAAOQ,GACP,MAAMP,EAAUX,KAAKC,MACrBC,EAAaW,SAAWF,EAAUZ,EAGlC,MAAMoB,EAAaD,EAOnB,MANAhB,EAAagB,MAAQ,CACnBE,KAAMD,EAAWC,MAAQ,eACzBC,QAASF,EAAWE,SAAW,6BAGjCxC,KAAKS,YAAYY,GACXgB,CACP,CACH,IAEArC,KAAKC,cAAgB,KACnBU,EAAYG,MAAQD,CAAa,EAEpC"}
|