@amplitude/session-replay-browser 1.2.2 → 1.2.3
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-manager.d.ts +49 -0
- package/lib/cjs/events-manager.d.ts.map +1 -0
- package/lib/cjs/events-manager.js +157 -0
- package/lib/cjs/events-manager.js.map +1 -0
- package/lib/cjs/session-replay.d.ts +2 -21
- package/lib/cjs/session-replay.d.ts.map +1 -1
- package/lib/cjs/session-replay.js +23 -124
- package/lib/cjs/session-replay.js.map +1 -1
- package/lib/cjs/track-destination.d.ts +0 -1
- package/lib/cjs/track-destination.d.ts.map +1 -1
- package/lib/cjs/track-destination.js +0 -3
- package/lib/cjs/track-destination.js.map +1 -1
- package/lib/cjs/typings/session-replay.d.ts +19 -1
- package/lib/cjs/typings/session-replay.d.ts.map +1 -1
- package/lib/cjs/typings/session-replay.js.map +1 -1
- package/lib/esm/events-manager.d.ts +49 -0
- package/lib/esm/events-manager.d.ts.map +1 -0
- package/lib/esm/events-manager.js +155 -0
- package/lib/esm/events-manager.js.map +1 -0
- package/lib/esm/session-replay.d.ts +2 -21
- package/lib/esm/session-replay.d.ts.map +1 -1
- package/lib/esm/session-replay.js +24 -125
- package/lib/esm/session-replay.js.map +1 -1
- package/lib/esm/track-destination.d.ts +0 -1
- package/lib/esm/track-destination.d.ts.map +1 -1
- package/lib/esm/track-destination.js +0 -3
- package/lib/esm/track-destination.js.map +1 -1
- package/lib/esm/typings/session-replay.d.ts +19 -1
- package/lib/esm/typings/session-replay.d.ts.map +1 -1
- package/lib/esm/typings/session-replay.js.map +1 -1
- package/lib/scripts/amplitude-min.js +1 -1
- package/lib/scripts/amplitude-min.js.gz +0 -0
- package/lib/scripts/amplitude-min.umd.js +1 -1
- package/lib/scripts/amplitude-min.umd.js.gz +0 -0
- package/lib/scripts/events-manager.d.ts +49 -0
- package/lib/scripts/events-manager.d.ts.map +1 -0
- package/lib/scripts/session-replay.d.ts +2 -21
- package/lib/scripts/session-replay.d.ts.map +1 -1
- package/lib/scripts/track-destination.d.ts +0 -1
- package/lib/scripts/track-destination.d.ts.map +1 -1
- package/lib/scripts/typings/session-replay.d.ts +19 -1
- package/lib/scripts/typings/session-replay.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -3,49 +3,22 @@ import { getAnalyticsConnector, getGlobalScope } from '@amplitude/analytics-clie
|
|
|
3
3
|
import { Logger, returnWrapper } from '@amplitude/analytics-core';
|
|
4
4
|
import { pack, record } from '@amplitude/rrweb';
|
|
5
5
|
import { SessionReplayConfig } from './config';
|
|
6
|
-
import { BLOCK_CLASS, DEFAULT_SESSION_REPLAY_PROPERTY, MASK_TEXT_CLASS,
|
|
6
|
+
import { BLOCK_CLASS, DEFAULT_SESSION_REPLAY_PROPERTY, MASK_TEXT_CLASS, SESSION_REPLAY_DEBUG_PROPERTY, } from './constants';
|
|
7
|
+
import { SessionReplayEventsManager } from './events-manager';
|
|
7
8
|
import { generateHashCode, generateSessionReplayId, isSessionInSample, maskInputFn } from './helpers';
|
|
8
9
|
import { SessionIdentifiers } from './identifiers';
|
|
9
|
-
import { SessionReplaySessionIDBStore } from './session-idb-store';
|
|
10
|
-
import { SessionReplayTrackDestination } from './track-destination';
|
|
11
|
-
import { RecordingStatus, } from './typings/session-replay';
|
|
12
10
|
var SessionReplay = /** @class */ (function () {
|
|
13
11
|
function SessionReplay() {
|
|
14
12
|
var _this = this;
|
|
15
13
|
this.name = '@amplitude/session-replay-browser';
|
|
16
|
-
this.events = [];
|
|
17
|
-
this.currentSequenceId = 0;
|
|
18
14
|
this.stopRecordingEvents = null;
|
|
19
|
-
this.maxPersistedEventsSize = MAX_EVENT_LIST_SIZE_IN_BYTES;
|
|
20
|
-
this.interval = MIN_INTERVAL;
|
|
21
|
-
this.timeAtLastSend = null;
|
|
22
15
|
this.blurListener = function () {
|
|
23
16
|
_this.stopRecordingAndSendEvents();
|
|
24
17
|
};
|
|
25
18
|
this.focusListener = function () {
|
|
26
19
|
void _this.initialize();
|
|
27
20
|
};
|
|
28
|
-
/**
|
|
29
|
-
* Determines whether to send the events list to the backend and start a new
|
|
30
|
-
* empty events list, based on the size of the list as well as the last time sent
|
|
31
|
-
* @param nextEventString
|
|
32
|
-
* @returns boolean
|
|
33
|
-
*/
|
|
34
|
-
this.shouldSplitEventsList = function (nextEventString) {
|
|
35
|
-
var sizeOfNextEvent = new Blob([nextEventString]).size;
|
|
36
|
-
var sizeOfEventsList = new Blob(_this.events).size;
|
|
37
|
-
if (sizeOfEventsList + sizeOfNextEvent >= _this.maxPersistedEventsSize) {
|
|
38
|
-
return true;
|
|
39
|
-
}
|
|
40
|
-
if (_this.timeAtLastSend !== null && Date.now() - _this.timeAtLastSend > _this.interval && _this.events.length) {
|
|
41
|
-
_this.interval = Math.min(MAX_INTERVAL, _this.interval + MIN_INTERVAL);
|
|
42
|
-
_this.timeAtLastSend = Date.now();
|
|
43
|
-
return true;
|
|
44
|
-
}
|
|
45
|
-
return false;
|
|
46
|
-
};
|
|
47
21
|
this.loggerProvider = new Logger();
|
|
48
|
-
this.trackDestination = new SessionReplayTrackDestination({ loggerProvider: this.loggerProvider });
|
|
49
22
|
}
|
|
50
23
|
SessionReplay.prototype.init = function (apiKey, options) {
|
|
51
24
|
return returnWrapper(this._init(apiKey, options));
|
|
@@ -59,11 +32,8 @@ var SessionReplay = /** @class */ (function () {
|
|
|
59
32
|
this.config = new SessionReplayConfig(apiKey, options);
|
|
60
33
|
this.loggerProvider = this.config.loggerProvider;
|
|
61
34
|
this.identifiers = new SessionIdentifiers(options, this.loggerProvider);
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
this.sessionIDBStore = new SessionReplaySessionIDBStore({
|
|
65
|
-
loggerProvider: this.loggerProvider,
|
|
66
|
-
apiKey: this.config.apiKey,
|
|
35
|
+
this.eventsManager = new SessionReplayEventsManager({
|
|
36
|
+
config: this.config,
|
|
67
37
|
});
|
|
68
38
|
this.loggerProvider.log('Installing @amplitude/session-replay-browser.');
|
|
69
39
|
globalScope = getGlobalScope();
|
|
@@ -100,8 +70,7 @@ var SessionReplay = /** @class */ (function () {
|
|
|
100
70
|
}
|
|
101
71
|
this.stopRecordingAndSendEvents(this.identifiers.sessionId);
|
|
102
72
|
this.identifiers.sessionId = sessionId;
|
|
103
|
-
this.
|
|
104
|
-
this.currentSequenceId = 0;
|
|
73
|
+
this.eventsManager && this.eventsManager.resetSequence();
|
|
105
74
|
this.recordEvents();
|
|
106
75
|
};
|
|
107
76
|
SessionReplay.prototype.getSessionReplayDebugPropertyValue = function () {
|
|
@@ -145,58 +114,38 @@ var SessionReplay = /** @class */ (function () {
|
|
|
145
114
|
this.loggerProvider.warn("Error occurred while stopping recording: ".concat(typedError.toString()));
|
|
146
115
|
}
|
|
147
116
|
var sessionIdToSend = sessionId || ((_a = this.identifiers) === null || _a === void 0 ? void 0 : _a.sessionId);
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
});
|
|
154
|
-
}
|
|
117
|
+
var deviceId = this.getDeviceId();
|
|
118
|
+
this.eventsManager &&
|
|
119
|
+
sessionIdToSend &&
|
|
120
|
+
deviceId &&
|
|
121
|
+
this.eventsManager.sendEvents({ sessionId: sessionIdToSend, deviceId: deviceId });
|
|
155
122
|
};
|
|
156
123
|
SessionReplay.prototype.initialize = function (shouldSendStoredEvents) {
|
|
157
124
|
var _a;
|
|
158
125
|
if (shouldSendStoredEvents === void 0) { shouldSendStoredEvents = false; }
|
|
159
126
|
return __awaiter(this, void 0, void 0, function () {
|
|
160
|
-
var
|
|
127
|
+
var deviceId, _b;
|
|
161
128
|
return __generator(this, function (_c) {
|
|
162
129
|
switch (_c.label) {
|
|
163
130
|
case 0:
|
|
164
|
-
this.timeAtLastSend = Date.now(); // Initialize this so we have a point of comparison when events are recorded
|
|
165
131
|
if (!((_a = this.identifiers) === null || _a === void 0 ? void 0 : _a.sessionId)) {
|
|
166
132
|
this.loggerProvider.warn("Session is not being recorded due to lack of session id.");
|
|
167
133
|
return [2 /*return*/];
|
|
168
134
|
}
|
|
169
|
-
|
|
135
|
+
deviceId = this.getDeviceId();
|
|
136
|
+
_b = this.eventsManager &&
|
|
137
|
+
deviceId;
|
|
170
138
|
if (!_b) return [3 /*break*/, 2];
|
|
171
|
-
return [4 /*yield*/, this.
|
|
139
|
+
return [4 /*yield*/, this.eventsManager.initialize({
|
|
140
|
+
sessionId: this.identifiers.sessionId,
|
|
141
|
+
shouldSendStoredEvents: shouldSendStoredEvents,
|
|
142
|
+
deviceId: deviceId,
|
|
143
|
+
})];
|
|
172
144
|
case 1:
|
|
173
145
|
_b = (_c.sent());
|
|
174
146
|
_c.label = 2;
|
|
175
147
|
case 2:
|
|
176
|
-
|
|
177
|
-
// This resolves a timing issue when focus is fired multiple times in short succession,
|
|
178
|
-
// we only want the rest of this function to run once. We can be sure that initialize has
|
|
179
|
-
// already been called if this.stopRecordingEvents is defined
|
|
180
|
-
if (this.stopRecordingEvents) {
|
|
181
|
-
return [2 /*return*/];
|
|
182
|
-
}
|
|
183
|
-
storedSequencesForSession = storedReplaySessions && storedReplaySessions[this.identifiers.sessionId];
|
|
184
|
-
if (storedReplaySessions && storedSequencesForSession && storedSequencesForSession.sessionSequences) {
|
|
185
|
-
storedSeqId = storedSequencesForSession.currentSequenceId;
|
|
186
|
-
lastSequence = storedSequencesForSession.sessionSequences[storedSeqId];
|
|
187
|
-
if (lastSequence && lastSequence.status !== RecordingStatus.RECORDING) {
|
|
188
|
-
this.currentSequenceId = storedSeqId + 1;
|
|
189
|
-
this.events = [];
|
|
190
|
-
}
|
|
191
|
-
else {
|
|
192
|
-
// Pick up recording where it was left off in another tab or window
|
|
193
|
-
this.currentSequenceId = storedSeqId;
|
|
194
|
-
this.events = (lastSequence === null || lastSequence === void 0 ? void 0 : lastSequence.events) || [];
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
if (shouldSendStoredEvents && storedReplaySessions) {
|
|
198
|
-
this.sendStoredEvents(storedReplaySessions);
|
|
199
|
-
}
|
|
148
|
+
_b;
|
|
200
149
|
this.recordEvents();
|
|
201
150
|
return [2 /*return*/];
|
|
202
151
|
}
|
|
@@ -245,27 +194,6 @@ var SessionReplay = /** @class */ (function () {
|
|
|
245
194
|
var _a, _b;
|
|
246
195
|
return (_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.privacyConfig) === null || _b === void 0 ? void 0 : _b.blockSelector;
|
|
247
196
|
};
|
|
248
|
-
SessionReplay.prototype.sendStoredEvents = function (storedReplaySessions) {
|
|
249
|
-
var _a;
|
|
250
|
-
for (var sessionId in storedReplaySessions) {
|
|
251
|
-
var storedSequences = storedReplaySessions[sessionId].sessionSequences;
|
|
252
|
-
for (var storedSeqId in storedSequences) {
|
|
253
|
-
var seq = storedSequences[storedSeqId];
|
|
254
|
-
var numericSeqId = parseInt(storedSeqId, 10);
|
|
255
|
-
var numericSessionId = parseInt(sessionId, 10);
|
|
256
|
-
if (numericSessionId === ((_a = this.identifiers) === null || _a === void 0 ? void 0 : _a.sessionId) && numericSeqId === this.currentSequenceId) {
|
|
257
|
-
continue;
|
|
258
|
-
}
|
|
259
|
-
if (seq.events && seq.events.length && seq.status === RecordingStatus.RECORDING) {
|
|
260
|
-
this.sendEventsList({
|
|
261
|
-
events: seq.events,
|
|
262
|
-
sequenceId: numericSeqId,
|
|
263
|
-
sessionId: numericSessionId,
|
|
264
|
-
});
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
};
|
|
269
197
|
SessionReplay.prototype.recordEvents = function () {
|
|
270
198
|
var _this = this;
|
|
271
199
|
var _a;
|
|
@@ -282,19 +210,8 @@ var SessionReplay = /** @class */ (function () {
|
|
|
282
210
|
return;
|
|
283
211
|
}
|
|
284
212
|
var eventString = JSON.stringify(event);
|
|
285
|
-
var
|
|
286
|
-
|
|
287
|
-
_this.sendEventsList({
|
|
288
|
-
events: _this.events,
|
|
289
|
-
sequenceId: _this.currentSequenceId,
|
|
290
|
-
sessionId: sessionId,
|
|
291
|
-
});
|
|
292
|
-
_this.events = [];
|
|
293
|
-
_this.currentSequenceId++;
|
|
294
|
-
}
|
|
295
|
-
_this.events.push(eventString);
|
|
296
|
-
_this.sessionIDBStore &&
|
|
297
|
-
void _this.sessionIDBStore.storeEventsForSession(_this.events, _this.currentSequenceId, sessionId);
|
|
213
|
+
var deviceId = _this.getDeviceId();
|
|
214
|
+
deviceId && _this.eventsManager && _this.eventsManager.addEvent({ event: eventString, sessionId: sessionId, deviceId: deviceId });
|
|
298
215
|
},
|
|
299
216
|
packFn: pack,
|
|
300
217
|
maskAllInputs: true,
|
|
@@ -311,24 +228,6 @@ var SessionReplay = /** @class */ (function () {
|
|
|
311
228
|
},
|
|
312
229
|
});
|
|
313
230
|
};
|
|
314
|
-
SessionReplay.prototype.sendEventsList = function (_a) {
|
|
315
|
-
var events = _a.events, sequenceId = _a.sequenceId, sessionId = _a.sessionId;
|
|
316
|
-
if (!this.config || !this.sessionIDBStore) {
|
|
317
|
-
this.loggerProvider.error("Session is not being recorded due to lack of config, please call sessionReplay.init.");
|
|
318
|
-
return;
|
|
319
|
-
}
|
|
320
|
-
this.trackDestination.sendEventsList({
|
|
321
|
-
events: events,
|
|
322
|
-
sequenceId: sequenceId,
|
|
323
|
-
sessionId: sessionId,
|
|
324
|
-
flushMaxRetries: this.config.flushMaxRetries,
|
|
325
|
-
apiKey: this.config.apiKey,
|
|
326
|
-
deviceId: this.getDeviceId(),
|
|
327
|
-
sampleRate: this.config.sampleRate,
|
|
328
|
-
serverZone: this.config.serverZone,
|
|
329
|
-
onComplete: this.sessionIDBStore.cleanUpSessionEventsStore.bind(this.sessionIDBStore),
|
|
330
|
-
});
|
|
331
|
-
};
|
|
332
231
|
SessionReplay.prototype.getDeviceId = function () {
|
|
333
232
|
var _a, _b;
|
|
334
233
|
var identityStoreDeviceId;
|
|
@@ -346,8 +245,8 @@ var SessionReplay = /** @class */ (function () {
|
|
|
346
245
|
if (useRetry === void 0) { useRetry = false; }
|
|
347
246
|
return __awaiter(this, void 0, void 0, function () {
|
|
348
247
|
return __generator(this, function (_a) {
|
|
349
|
-
if (this.
|
|
350
|
-
return [2 /*return*/, this.
|
|
248
|
+
if (this.eventsManager) {
|
|
249
|
+
return [2 /*return*/, this.eventsManager.flush(useRetry)];
|
|
351
250
|
}
|
|
352
251
|
return [2 /*return*/];
|
|
353
252
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-replay.js","sourceRoot":"","sources":["../../src/session-replay.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAnalyticsConnector, getGlobalScope } from '@amplitude/analytics-client-common';\nimport { Logger, returnWrapper } from '@amplitude/analytics-core';\nimport { Logger as ILogger } from '@amplitude/analytics-types';\nimport { pack, record } from '@amplitude/rrweb';\nimport { SessionReplayConfig } from './config';\nimport {\n BLOCK_CLASS,\n DEFAULT_SESSION_REPLAY_PROPERTY,\n MASK_TEXT_CLASS,\n MAX_EVENT_LIST_SIZE_IN_BYTES,\n MAX_INTERVAL,\n MIN_INTERVAL,\n SESSION_REPLAY_DEBUG_PROPERTY,\n} from './constants';\nimport { generateHashCode, generateSessionReplayId, isSessionInSample, maskInputFn } from './helpers';\nimport { SessionIdentifiers } from './identifiers';\nimport { SessionReplaySessionIDBStore } from './session-idb-store';\nimport { SessionReplayTrackDestination } from './track-destination';\nimport {\n AmplitudeSessionReplay,\n SessionReplaySessionIDBStore as AmplitudeSessionReplaySessionIDBStore,\n SessionReplayTrackDestination as AmplitudeSessionReplayTrackDestination,\n Events,\n IDBStore,\n SessionIdentifiers as ISessionIdentifiers,\n SessionReplayConfig as ISessionReplayConfig,\n RecordingStatus,\n SessionReplayOptions,\n} from './typings/session-replay';\n\nexport class SessionReplay implements AmplitudeSessionReplay {\n name = '@amplitude/session-replay-browser';\n config: ISessionReplayConfig | undefined;\n identifiers: ISessionIdentifiers | undefined;\n trackDestination: AmplitudeSessionReplayTrackDestination;\n sessionIDBStore: AmplitudeSessionReplaySessionIDBStore | undefined;\n loggerProvider: ILogger;\n events: Events = [];\n currentSequenceId = 0;\n stopRecordingEvents: ReturnType<typeof record> | null = null;\n maxPersistedEventsSize = MAX_EVENT_LIST_SIZE_IN_BYTES;\n interval = MIN_INTERVAL;\n timeAtLastSend: number | null = null;\n\n constructor() {\n this.loggerProvider = new Logger();\n this.trackDestination = new SessionReplayTrackDestination({ loggerProvider: this.loggerProvider });\n }\n\n init(apiKey: string, options: SessionReplayOptions) {\n return returnWrapper(this._init(apiKey, options));\n }\n\n protected async _init(apiKey: string, options: SessionReplayOptions) {\n this.config = new SessionReplayConfig(apiKey, options);\n this.loggerProvider = this.config.loggerProvider;\n this.identifiers = new SessionIdentifiers(options, this.loggerProvider);\n // Update logger provider in trackDestination\n this.trackDestination.setLoggerProvider(this.loggerProvider);\n\n this.sessionIDBStore = new SessionReplaySessionIDBStore({\n loggerProvider: this.loggerProvider,\n apiKey: this.config.apiKey,\n });\n\n this.loggerProvider.log('Installing @amplitude/session-replay-browser.');\n\n const globalScope = getGlobalScope();\n if (globalScope) {\n globalScope.addEventListener('blur', this.blurListener);\n globalScope.addEventListener('focus', this.focusListener);\n }\n\n if (globalScope && globalScope.document && globalScope.document.hasFocus()) {\n await this.initialize(true);\n }\n }\n\n setSessionId(sessionId: number, deviceId?: string) {\n if (!this.identifiers) {\n this.loggerProvider.error('Session replay init has not been called, cannot set session id.');\n return;\n }\n\n if (deviceId) {\n this.identifiers.deviceId = deviceId;\n }\n // use a consistent device id.\n const deviceIdForReplayId = this.getDeviceId();\n if (sessionId && deviceIdForReplayId) {\n this.identifiers.sessionReplayId = generateSessionReplayId(sessionId, deviceIdForReplayId);\n } else {\n this.loggerProvider.error('Must provide either session replay id or session id when starting a new session.');\n return;\n }\n\n this.stopRecordingAndSendEvents(this.identifiers.sessionId);\n this.identifiers.sessionId = sessionId;\n this.events = [];\n this.currentSequenceId = 0;\n this.recordEvents();\n }\n\n getSessionReplayDebugPropertyValue() {\n let apiKeyHash = '';\n if (this.config) {\n apiKeyHash = generateHashCode(this.config.apiKey).toString();\n }\n return JSON.stringify({\n appHash: apiKeyHash,\n });\n }\n\n getSessionReplayProperties() {\n if (!this.config || !this.identifiers) {\n this.loggerProvider.error('Session replay init has not been called, cannot get session recording properties.');\n return {};\n }\n\n // If the user is in debug mode, ignore the focus handler when tagging events.\n // this is a common mishap when someone is developing locally and not seeing events getting tagged.\n const ignoreFocus = !!this.config.debugMode;\n const shouldRecord = this.getShouldRecord(ignoreFocus);\n\n if (shouldRecord) {\n const eventProperties: { [key: string]: string | null } = {\n [DEFAULT_SESSION_REPLAY_PROPERTY]: this.identifiers.sessionReplayId ? this.identifiers.sessionReplayId : null,\n };\n if (this.config.debugMode) {\n eventProperties[SESSION_REPLAY_DEBUG_PROPERTY] = this.getSessionReplayDebugPropertyValue();\n }\n return eventProperties;\n }\n\n return {};\n }\n\n blurListener = () => {\n this.stopRecordingAndSendEvents();\n };\n\n focusListener = () => {\n void this.initialize();\n };\n\n stopRecordingAndSendEvents(sessionId?: number) {\n try {\n this.stopRecordingEvents && this.stopRecordingEvents();\n this.stopRecordingEvents = null;\n } catch (error) {\n const typedError = error as Error;\n this.loggerProvider.warn(`Error occurred while stopping recording: ${typedError.toString()}`);\n }\n\n const sessionIdToSend = sessionId || this.identifiers?.sessionId;\n if (this.events.length && sessionIdToSend) {\n this.sendEventsList({\n events: this.events,\n sequenceId: this.currentSequenceId,\n sessionId: sessionIdToSend,\n });\n }\n }\n\n async initialize(shouldSendStoredEvents = false) {\n this.timeAtLastSend = Date.now(); // Initialize this so we have a point of comparison when events are recorded\n if (!this.identifiers?.sessionId) {\n this.loggerProvider.warn(`Session is not being recorded due to lack of session id.`);\n return;\n }\n const storedReplaySessions = this.sessionIDBStore && (await this.sessionIDBStore.getAllSessionDataFromStore());\n // This resolves a timing issue when focus is fired multiple times in short succession,\n // we only want the rest of this function to run once. We can be sure that initialize has\n // already been called if this.stopRecordingEvents is defined\n if (this.stopRecordingEvents) {\n return;\n }\n const storedSequencesForSession = storedReplaySessions && storedReplaySessions[this.identifiers.sessionId];\n if (storedReplaySessions && storedSequencesForSession && storedSequencesForSession.sessionSequences) {\n const storedSeqId = storedSequencesForSession.currentSequenceId;\n const lastSequence = storedSequencesForSession.sessionSequences[storedSeqId];\n if (lastSequence && lastSequence.status !== RecordingStatus.RECORDING) {\n this.currentSequenceId = storedSeqId + 1;\n this.events = [];\n } else {\n // Pick up recording where it was left off in another tab or window\n this.currentSequenceId = storedSeqId;\n this.events = lastSequence?.events || [];\n }\n }\n if (shouldSendStoredEvents && storedReplaySessions) {\n this.sendStoredEvents(storedReplaySessions);\n }\n 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(ignoreFocus = false) {\n if (!this.identifiers || !this.config) {\n this.loggerProvider.error(`Session is not being recorded due to lack of config, please call sessionReplay.init.`);\n return false;\n }\n const globalScope = getGlobalScope();\n if (!ignoreFocus && globalScope && globalScope.document && !globalScope.document.hasFocus()) {\n if (this.identifiers.sessionId) {\n this.loggerProvider.log(\n `Session ${this.identifiers.sessionId} temporarily not recording due to lack of browser focus.`,\n );\n }\n return false;\n } else if (this.shouldOptOut()) {\n if (this.identifiers.sessionId) {\n this.loggerProvider.log(`Opting session ${this.identifiers.sessionId} out of recording due to optOut config.`);\n }\n return false;\n } else if (!this.identifiers.sessionId) {\n this.loggerProvider.warn(`Session is not being recorded due to lack of session id.`);\n return false;\n }\n\n const isInSample = isSessionInSample(this.identifiers.sessionId, this.config.sampleRate);\n if (!isInSample) {\n this.loggerProvider.log(`Opting session ${this.identifiers.sessionId} out of recording due to sample rate.`);\n }\n return isInSample;\n }\n\n getBlockSelectors(): string | string[] | undefined {\n return this.config?.privacyConfig?.blockSelector;\n }\n\n sendStoredEvents(storedReplaySessions: IDBStore) {\n for (const sessionId in storedReplaySessions) {\n const storedSequences = storedReplaySessions[sessionId].sessionSequences;\n for (const storedSeqId in storedSequences) {\n const seq = storedSequences[storedSeqId];\n const numericSeqId = parseInt(storedSeqId, 10);\n const numericSessionId = parseInt(sessionId, 10);\n if (numericSessionId === this.identifiers?.sessionId && numericSeqId === this.currentSequenceId) {\n continue;\n }\n\n if (seq.events && seq.events.length && seq.status === RecordingStatus.RECORDING) {\n this.sendEventsList({\n events: seq.events,\n sequenceId: numericSeqId,\n sessionId: numericSessionId,\n });\n }\n }\n }\n }\n\n recordEvents() {\n const shouldRecord = this.getShouldRecord();\n const sessionId = this.identifiers?.sessionId;\n if (!shouldRecord || !sessionId) {\n return;\n }\n this.stopRecordingEvents = record({\n emit: (event) => {\n const globalScope = getGlobalScope();\n if ((globalScope && globalScope.document && !globalScope.document.hasFocus()) || !this.getShouldRecord()) {\n this.stopRecordingAndSendEvents();\n return;\n }\n const eventString = JSON.stringify(event);\n\n const shouldSplit = this.shouldSplitEventsList(eventString);\n if (shouldSplit && this.config) {\n this.sendEventsList({\n events: this.events,\n sequenceId: this.currentSequenceId,\n sessionId: sessionId,\n });\n this.events = [];\n this.currentSequenceId++;\n }\n this.events.push(eventString);\n this.sessionIDBStore &&\n void this.sessionIDBStore.storeEventsForSession(this.events, this.currentSequenceId, sessionId);\n },\n packFn: pack,\n maskAllInputs: true,\n maskTextClass: MASK_TEXT_CLASS,\n blockClass: BLOCK_CLASS,\n // rrweb only exposes array type through its types, but arrays are also be supported. #class, ['#class', 'id']\n blockSelector: this.getBlockSelectors() as string,\n maskInputFn,\n recordCanvas: false,\n errorHandler: (error) => {\n const typedError = error as Error;\n this.loggerProvider.warn('Error while recording: ', typedError.toString());\n\n return true;\n },\n });\n }\n\n /**\n * Determines whether to send the events list to the backend and start a new\n * empty events list, based on the size of the list as well as the last time sent\n * @param nextEventString\n * @returns boolean\n */\n shouldSplitEventsList = (nextEventString: string): boolean => {\n const sizeOfNextEvent = new Blob([nextEventString]).size;\n const sizeOfEventsList = new Blob(this.events).size;\n if (sizeOfEventsList + sizeOfNextEvent >= this.maxPersistedEventsSize) {\n return true;\n }\n if (this.timeAtLastSend !== null && Date.now() - this.timeAtLastSend > this.interval && this.events.length) {\n this.interval = Math.min(MAX_INTERVAL, this.interval + MIN_INTERVAL);\n this.timeAtLastSend = Date.now();\n return true;\n }\n return false;\n };\n\n sendEventsList({ events, sequenceId, sessionId }: { events: string[]; sequenceId: number; sessionId: number }) {\n if (!this.config || !this.sessionIDBStore) {\n this.loggerProvider.error(`Session is not being recorded due to lack of config, please call sessionReplay.init.`);\n return;\n }\n this.trackDestination.sendEventsList({\n events: events,\n sequenceId: sequenceId,\n sessionId: sessionId,\n flushMaxRetries: this.config.flushMaxRetries,\n apiKey: this.config.apiKey,\n deviceId: this.getDeviceId(),\n sampleRate: this.config.sampleRate,\n serverZone: this.config.serverZone,\n onComplete: this.sessionIDBStore.cleanUpSessionEventsStore.bind(this.sessionIDBStore),\n });\n }\n\n getDeviceId() {\n let identityStoreDeviceId: string | undefined;\n if (this.config?.instanceName) {\n const identityStore = getAnalyticsConnector(this.config.instanceName).identityStore;\n identityStoreDeviceId = identityStore.getIdentity().deviceId;\n }\n\n return identityStoreDeviceId || this.identifiers?.deviceId;\n }\n\n getSessionId() {\n return this.identifiers?.sessionId;\n }\n\n async flush(useRetry = false) {\n if (this.trackDestination) {\n return this.trackDestination.flush(useRetry);\n }\n }\n\n shutdown() {\n const globalScope = getGlobalScope();\n if (globalScope) {\n globalScope.removeEventListener('blur', this.blurListener);\n globalScope.removeEventListener('focus', this.focusListener);\n }\n\n this.stopRecordingAndSendEvents();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"session-replay.js","sourceRoot":"","sources":["../../src/session-replay.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAnalyticsConnector, getGlobalScope } from '@amplitude/analytics-client-common';\nimport { Logger, returnWrapper } from '@amplitude/analytics-core';\nimport { Logger as ILogger } from '@amplitude/analytics-types';\nimport { pack, record } from '@amplitude/rrweb';\nimport { SessionReplayConfig } from './config';\nimport {\n BLOCK_CLASS,\n DEFAULT_SESSION_REPLAY_PROPERTY,\n MASK_TEXT_CLASS,\n SESSION_REPLAY_DEBUG_PROPERTY,\n} from './constants';\nimport { SessionReplayEventsManager } from './events-manager';\nimport { generateHashCode, generateSessionReplayId, isSessionInSample, maskInputFn } from './helpers';\nimport { SessionIdentifiers } from './identifiers';\nimport {\n AmplitudeSessionReplay,\n SessionReplayEventsManager as AmplitudeSessionReplayEventsManager,\n SessionIdentifiers as ISessionIdentifiers,\n SessionReplayConfig as ISessionReplayConfig,\n SessionReplayOptions,\n} from './typings/session-replay';\n\nexport class SessionReplay implements AmplitudeSessionReplay {\n name = '@amplitude/session-replay-browser';\n config: ISessionReplayConfig | undefined;\n identifiers: ISessionIdentifiers | undefined;\n eventsManager: AmplitudeSessionReplayEventsManager | undefined;\n loggerProvider: ILogger;\n stopRecordingEvents: ReturnType<typeof record> | null = null;\n\n constructor() {\n this.loggerProvider = new Logger();\n }\n\n init(apiKey: string, options: SessionReplayOptions) {\n return returnWrapper(this._init(apiKey, options));\n }\n\n protected async _init(apiKey: string, options: SessionReplayOptions) {\n this.config = new SessionReplayConfig(apiKey, options);\n this.loggerProvider = this.config.loggerProvider;\n this.identifiers = new SessionIdentifiers(options, this.loggerProvider);\n\n this.eventsManager = new SessionReplayEventsManager({\n config: this.config,\n });\n\n this.loggerProvider.log('Installing @amplitude/session-replay-browser.');\n\n const globalScope = getGlobalScope();\n if (globalScope) {\n globalScope.addEventListener('blur', this.blurListener);\n globalScope.addEventListener('focus', this.focusListener);\n }\n\n if (globalScope && globalScope.document && globalScope.document.hasFocus()) {\n await this.initialize(true);\n }\n }\n\n setSessionId(sessionId: number, deviceId?: string) {\n if (!this.identifiers) {\n this.loggerProvider.error('Session replay init has not been called, cannot set session id.');\n return;\n }\n\n if (deviceId) {\n this.identifiers.deviceId = deviceId;\n }\n // use a consistent device id.\n const deviceIdForReplayId = this.getDeviceId();\n if (sessionId && deviceIdForReplayId) {\n this.identifiers.sessionReplayId = generateSessionReplayId(sessionId, deviceIdForReplayId);\n } else {\n this.loggerProvider.error('Must provide either session replay id or session id when starting a new session.');\n return;\n }\n\n this.stopRecordingAndSendEvents(this.identifiers.sessionId);\n this.identifiers.sessionId = sessionId;\n this.eventsManager && this.eventsManager.resetSequence();\n this.recordEvents();\n }\n\n getSessionReplayDebugPropertyValue() {\n let apiKeyHash = '';\n if (this.config) {\n apiKeyHash = generateHashCode(this.config.apiKey).toString();\n }\n return JSON.stringify({\n appHash: apiKeyHash,\n });\n }\n\n getSessionReplayProperties() {\n if (!this.config || !this.identifiers) {\n this.loggerProvider.error('Session replay init has not been called, cannot get session recording properties.');\n return {};\n }\n\n // If the user is in debug mode, ignore the focus handler when tagging events.\n // this is a common mishap when someone is developing locally and not seeing events getting tagged.\n const ignoreFocus = !!this.config.debugMode;\n const shouldRecord = this.getShouldRecord(ignoreFocus);\n\n if (shouldRecord) {\n const eventProperties: { [key: string]: string | null } = {\n [DEFAULT_SESSION_REPLAY_PROPERTY]: this.identifiers.sessionReplayId ? this.identifiers.sessionReplayId : null,\n };\n if (this.config.debugMode) {\n eventProperties[SESSION_REPLAY_DEBUG_PROPERTY] = this.getSessionReplayDebugPropertyValue();\n }\n return eventProperties;\n }\n\n return {};\n }\n\n blurListener = () => {\n this.stopRecordingAndSendEvents();\n };\n\n focusListener = () => {\n void this.initialize();\n };\n\n stopRecordingAndSendEvents(sessionId?: number) {\n try {\n this.stopRecordingEvents && this.stopRecordingEvents();\n this.stopRecordingEvents = null;\n } catch (error) {\n const typedError = error as Error;\n this.loggerProvider.warn(`Error occurred while stopping recording: ${typedError.toString()}`);\n }\n\n const sessionIdToSend = sessionId || this.identifiers?.sessionId;\n const deviceId = this.getDeviceId();\n this.eventsManager &&\n sessionIdToSend &&\n deviceId &&\n this.eventsManager.sendEvents({ sessionId: sessionIdToSend, deviceId });\n }\n\n async initialize(shouldSendStoredEvents = false) {\n if (!this.identifiers?.sessionId) {\n this.loggerProvider.warn(`Session is not being recorded due to lack of session id.`);\n return;\n }\n\n const deviceId = this.getDeviceId();\n this.eventsManager &&\n deviceId &&\n (await this.eventsManager.initialize({\n sessionId: this.identifiers.sessionId,\n shouldSendStoredEvents,\n deviceId,\n }));\n\n 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(ignoreFocus = false) {\n if (!this.identifiers || !this.config) {\n this.loggerProvider.error(`Session is not being recorded due to lack of config, please call sessionReplay.init.`);\n return false;\n }\n const globalScope = getGlobalScope();\n if (!ignoreFocus && globalScope && globalScope.document && !globalScope.document.hasFocus()) {\n if (this.identifiers.sessionId) {\n this.loggerProvider.log(\n `Session ${this.identifiers.sessionId} temporarily not recording due to lack of browser focus.`,\n );\n }\n return false;\n } else if (this.shouldOptOut()) {\n if (this.identifiers.sessionId) {\n this.loggerProvider.log(`Opting session ${this.identifiers.sessionId} out of recording due to optOut config.`);\n }\n return false;\n } else if (!this.identifiers.sessionId) {\n this.loggerProvider.warn(`Session is not being recorded due to lack of session id.`);\n return false;\n }\n\n const isInSample = isSessionInSample(this.identifiers.sessionId, this.config.sampleRate);\n if (!isInSample) {\n this.loggerProvider.log(`Opting session ${this.identifiers.sessionId} out of recording due to sample rate.`);\n }\n return isInSample;\n }\n\n getBlockSelectors(): string | string[] | undefined {\n return this.config?.privacyConfig?.blockSelector;\n }\n\n recordEvents() {\n const shouldRecord = this.getShouldRecord();\n const sessionId = this.identifiers?.sessionId;\n if (!shouldRecord || !sessionId) {\n return;\n }\n this.stopRecordingEvents = record({\n emit: (event) => {\n const globalScope = getGlobalScope();\n if ((globalScope && globalScope.document && !globalScope.document.hasFocus()) || !this.getShouldRecord()) {\n this.stopRecordingAndSendEvents();\n return;\n }\n const eventString = JSON.stringify(event);\n const deviceId = this.getDeviceId();\n deviceId && this.eventsManager && this.eventsManager.addEvent({ event: eventString, sessionId, deviceId });\n },\n packFn: pack,\n maskAllInputs: true,\n maskTextClass: MASK_TEXT_CLASS,\n blockClass: BLOCK_CLASS,\n // rrweb only exposes array type through its types, but arrays are also be supported. #class, ['#class', 'id']\n blockSelector: this.getBlockSelectors() as string,\n maskInputFn,\n recordCanvas: false,\n errorHandler: (error) => {\n const typedError = error as Error;\n this.loggerProvider.warn('Error while recording: ', typedError.toString());\n\n return true;\n },\n });\n }\n\n getDeviceId() {\n let identityStoreDeviceId: string | undefined;\n if (this.config?.instanceName) {\n const identityStore = getAnalyticsConnector(this.config.instanceName).identityStore;\n identityStoreDeviceId = identityStore.getIdentity().deviceId;\n }\n\n return identityStoreDeviceId || this.identifiers?.deviceId;\n }\n\n getSessionId() {\n return this.identifiers?.sessionId;\n }\n\n async flush(useRetry = false) {\n if (this.eventsManager) {\n return this.eventsManager.flush(useRetry);\n }\n }\n\n shutdown() {\n const globalScope = getGlobalScope();\n if (globalScope) {\n globalScope.removeEventListener('blur', this.blurListener);\n globalScope.removeEventListener('focus', this.focusListener);\n }\n\n this.stopRecordingAndSendEvents();\n }\n}\n"]}
|
|
@@ -9,7 +9,6 @@ export declare class SessionReplayTrackDestination implements AmplitudeSessionRe
|
|
|
9
9
|
constructor({ loggerProvider }: {
|
|
10
10
|
loggerProvider: ILogger;
|
|
11
11
|
});
|
|
12
|
-
setLoggerProvider(loggerProvider: ILogger): void;
|
|
13
12
|
sendEventsList(destinationData: SessionReplayDestination): void;
|
|
14
13
|
getServerUrl(serverZone?: keyof typeof ServerZone): "https://api-sr.amplitude.com/sessions/v2/track" | "https://api-sr.eu.amplitude.com/sessions/v2/track" | "https://api-sr.stag2.amplitude.com//sessions/v2/track";
|
|
15
14
|
addToQueue(...list: SessionReplayDestinationContext[]): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"track-destination.d.ts","sourceRoot":"","sources":["../../src/track-destination.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,UAAU,EAAU,MAAM,4BAA4B,CAAC;AAenF,OAAO,EACL,6BAA6B,IAAI,sCAAsC,EACvE,wBAAwB,EACxB,+BAA+B,EAChC,MAAM,0BAA0B,CAAC;AAGlC,qBAAa,6BAA8B,YAAW,sCAAsC;IAC1F,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,SAAM;IAChB,YAAY,SAAQ;IACpB,OAAO,CAAC,SAAS,CAA8C;IAC/D,KAAK,EAAE,+BAA+B,EAAE,CAAM;gBAElC,EAAE,cAAc,EAAE,EAAE;QAAE,cAAc,EAAE,OAAO,CAAA;KAAE;IAI3D,
|
|
1
|
+
{"version":3,"file":"track-destination.d.ts","sourceRoot":"","sources":["../../src/track-destination.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,UAAU,EAAU,MAAM,4BAA4B,CAAC;AAenF,OAAO,EACL,6BAA6B,IAAI,sCAAsC,EACvE,wBAAwB,EACxB,+BAA+B,EAChC,MAAM,0BAA0B,CAAC;AAGlC,qBAAa,6BAA8B,YAAW,sCAAsC;IAC1F,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,SAAM;IAChB,YAAY,SAAQ;IACpB,OAAO,CAAC,SAAS,CAA8C;IAC/D,KAAK,EAAE,+BAA+B,EAAE,CAAM;gBAElC,EAAE,cAAc,EAAE,EAAE;QAAE,cAAc,EAAE,OAAO,CAAA;KAAE;IAI3D,cAAc,CAAC,eAAe,EAAE,wBAAwB;IAQxD,YAAY,CAAC,UAAU,CAAC,EAAE,MAAM,OAAO,UAAU;IAYjD,UAAU,CAAC,GAAG,IAAI,EAAE,+BAA+B,EAAE;IA0BrD,QAAQ,CAAC,OAAO,EAAE,MAAM;IAWlB,KAAK,CAAC,QAAQ,UAAQ;IActB,IAAI,CAAC,OAAO,EAAE,+BAA+B,EAAE,QAAQ,UAAO;IA0DpE,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,+BAA+B;IActE,qBAAqB,CAAC,OAAO,EAAE,+BAA+B;IAI9D,mBAAmB,CAAC,OAAO,EAAE,+BAA+B;IAO5D,eAAe,CAAC,EACd,OAAO,EACP,GAAG,EACH,OAAO,GACR,EAAE;QACD,OAAO,EAAE,+BAA+B,CAAC;QACzC,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB;CAQF"}
|
|
@@ -14,9 +14,6 @@ var SessionReplayTrackDestination = /** @class */ (function () {
|
|
|
14
14
|
this.queue = [];
|
|
15
15
|
this.loggerProvider = loggerProvider;
|
|
16
16
|
}
|
|
17
|
-
SessionReplayTrackDestination.prototype.setLoggerProvider = function (loggerProvider) {
|
|
18
|
-
this.loggerProvider = loggerProvider;
|
|
19
|
-
};
|
|
20
17
|
SessionReplayTrackDestination.prototype.sendEventsList = function (destinationData) {
|
|
21
18
|
this.addToQueue(__assign(__assign({}, destinationData), { attempts: 0, timeout: 0 }));
|
|
22
19
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"track-destination.js","sourceRoot":"","sources":["../../src/track-destination.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseTransport } from '@amplitude/analytics-core';\nimport { Logger as ILogger, ServerZone, Status } from '@amplitude/analytics-types';\nimport {\n SESSION_REPLAY_EU_URL as SESSION_REPLAY_EU_SERVER_URL,\n SESSION_REPLAY_SERVER_URL,\n SESSION_REPLAY_STAGING_URL as SESSION_REPLAY_STAGING_SERVER_URL,\n} from './constants';\nimport { getCurrentUrl } from './helpers';\nimport {\n MAX_RETRIES_EXCEEDED_MESSAGE,\n MISSING_API_KEY_MESSAGE,\n MISSING_DEVICE_ID_MESSAGE,\n UNEXPECTED_ERROR_MESSAGE,\n UNEXPECTED_NETWORK_ERROR_MESSAGE,\n getSuccessMessage,\n} from './messages';\nimport {\n SessionReplayTrackDestination as AmplitudeSessionReplayTrackDestination,\n SessionReplayDestination,\n SessionReplayDestinationContext,\n} from './typings/session-replay';\nimport { VERSION } from './version';\n\nexport class SessionReplayTrackDestination implements AmplitudeSessionReplayTrackDestination {\n loggerProvider: ILogger;\n storageKey = '';\n retryTimeout = 1000;\n private scheduled: ReturnType<typeof setTimeout> | null = null;\n queue: SessionReplayDestinationContext[] = [];\n\n constructor({ loggerProvider }: { loggerProvider: ILogger }) {\n this.loggerProvider = loggerProvider;\n }\n\n setLoggerProvider(loggerProvider: ILogger) {\n this.loggerProvider = loggerProvider;\n }\n\n sendEventsList(destinationData: SessionReplayDestination) {\n this.addToQueue({\n ...destinationData,\n attempts: 0,\n timeout: 0,\n });\n }\n\n getServerUrl(serverZone?: keyof typeof ServerZone) {\n if (serverZone === ServerZone.STAGING) {\n return SESSION_REPLAY_STAGING_SERVER_URL;\n }\n\n if (serverZone === ServerZone.EU) {\n return SESSION_REPLAY_EU_SERVER_URL;\n }\n\n return SESSION_REPLAY_SERVER_URL;\n }\n\n addToQueue(...list: SessionReplayDestinationContext[]) {\n const tryable = list.filter((context) => {\n if (context.attempts < (context.flushMaxRetries || 0)) {\n context.attempts += 1;\n return true;\n }\n this.completeRequest({\n context,\n err: `${MAX_RETRIES_EXCEEDED_MESSAGE}, batch sequence id, ${context.sequenceId}`,\n });\n return false;\n });\n tryable.forEach((context) => {\n this.queue = this.queue.concat(context);\n if (context.timeout === 0) {\n this.schedule(0);\n return;\n }\n\n setTimeout(() => {\n context.timeout = 0;\n this.schedule(0);\n }, context.timeout);\n });\n }\n\n schedule(timeout: number) {\n if (this.scheduled) return;\n this.scheduled = setTimeout(() => {\n void this.flush(true).then(() => {\n if (this.queue.length > 0) {\n this.schedule(timeout);\n }\n });\n }, timeout);\n }\n\n async flush(useRetry = false) {\n const list: SessionReplayDestinationContext[] = [];\n const later: SessionReplayDestinationContext[] = [];\n this.queue.forEach((context) => (context.timeout === 0 ? list.push(context) : later.push(context)));\n this.queue = later;\n\n if (this.scheduled) {\n clearTimeout(this.scheduled);\n this.scheduled = null;\n }\n\n await Promise.all(list.map((context) => this.send(context, useRetry)));\n }\n\n async send(context: SessionReplayDestinationContext, useRetry = true) {\n const apiKey = context.apiKey;\n if (!apiKey) {\n return this.completeRequest({ context, err: MISSING_API_KEY_MESSAGE });\n }\n const deviceId = context.deviceId;\n if (!deviceId) {\n return this.completeRequest({ context, err: MISSING_DEVICE_ID_MESSAGE });\n }\n const url = getCurrentUrl();\n const version = VERSION;\n const sampleRate = context.sampleRate;\n const urlParams = new URLSearchParams({\n device_id: deviceId,\n session_id: `${context.sessionId}`,\n seq_number: `${context.sequenceId}`,\n });\n\n const payload = {\n version: 1,\n events: context.events,\n };\n\n try {\n const options: RequestInit = {\n headers: {\n 'Content-Type': 'application/json',\n Accept: '*/*',\n Authorization: `Bearer ${apiKey}`,\n 'X-Client-Version': version,\n 'X-Client-Url': url,\n 'X-Client-Sample-Rate': `${sampleRate}`,\n },\n body: JSON.stringify(payload),\n method: 'POST',\n };\n const server_url = `${this.getServerUrl(context.serverZone)}?${urlParams.toString()}`;\n const res = await fetch(server_url, options);\n if (res === null) {\n this.completeRequest({ context, err: UNEXPECTED_ERROR_MESSAGE });\n return;\n }\n if (!useRetry) {\n let responseBody = '';\n try {\n responseBody = JSON.stringify(res.body, null, 2);\n } catch {\n // to avoid crash, but don't care about the error, add comment to avoid empty block lint error\n }\n this.completeRequest({ context, success: `${res.status}: ${responseBody}` });\n } else {\n this.handleReponse(res.status, context);\n }\n } catch (e) {\n this.completeRequest({ context, err: e as string });\n }\n }\n\n handleReponse(status: number, context: SessionReplayDestinationContext) {\n const parsedStatus = new BaseTransport().buildStatus(status);\n switch (parsedStatus) {\n case Status.Success:\n this.handleSuccessResponse(context);\n break;\n case Status.Failed:\n this.handleOtherResponse(context);\n break;\n default:\n this.completeRequest({ context, err: UNEXPECTED_NETWORK_ERROR_MESSAGE });\n }\n }\n\n handleSuccessResponse(context: SessionReplayDestinationContext) {\n this.completeRequest({ context, success: getSuccessMessage(context.sessionId) });\n }\n\n handleOtherResponse(context: SessionReplayDestinationContext) {\n this.addToQueue({\n ...context,\n timeout: context.attempts * this.retryTimeout,\n });\n }\n\n completeRequest({\n context,\n err,\n success,\n }: {\n context: SessionReplayDestinationContext;\n err?: string;\n success?: string;\n }) {\n void context.onComplete(context.sessionId, context.sequenceId);\n if (err) {\n this.loggerProvider.warn(err);\n } else if (success) {\n this.loggerProvider.log(success);\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"track-destination.js","sourceRoot":"","sources":["../../src/track-destination.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseTransport } from '@amplitude/analytics-core';\nimport { Logger as ILogger, ServerZone, Status } from '@amplitude/analytics-types';\nimport {\n SESSION_REPLAY_EU_URL as SESSION_REPLAY_EU_SERVER_URL,\n SESSION_REPLAY_SERVER_URL,\n SESSION_REPLAY_STAGING_URL as SESSION_REPLAY_STAGING_SERVER_URL,\n} from './constants';\nimport { getCurrentUrl } from './helpers';\nimport {\n MAX_RETRIES_EXCEEDED_MESSAGE,\n MISSING_API_KEY_MESSAGE,\n MISSING_DEVICE_ID_MESSAGE,\n UNEXPECTED_ERROR_MESSAGE,\n UNEXPECTED_NETWORK_ERROR_MESSAGE,\n getSuccessMessage,\n} from './messages';\nimport {\n SessionReplayTrackDestination as AmplitudeSessionReplayTrackDestination,\n SessionReplayDestination,\n SessionReplayDestinationContext,\n} from './typings/session-replay';\nimport { VERSION } from './version';\n\nexport class SessionReplayTrackDestination implements AmplitudeSessionReplayTrackDestination {\n loggerProvider: ILogger;\n storageKey = '';\n retryTimeout = 1000;\n private scheduled: ReturnType<typeof setTimeout> | null = null;\n queue: SessionReplayDestinationContext[] = [];\n\n constructor({ loggerProvider }: { loggerProvider: ILogger }) {\n this.loggerProvider = loggerProvider;\n }\n\n sendEventsList(destinationData: SessionReplayDestination) {\n this.addToQueue({\n ...destinationData,\n attempts: 0,\n timeout: 0,\n });\n }\n\n getServerUrl(serverZone?: keyof typeof ServerZone) {\n if (serverZone === ServerZone.STAGING) {\n return SESSION_REPLAY_STAGING_SERVER_URL;\n }\n\n if (serverZone === ServerZone.EU) {\n return SESSION_REPLAY_EU_SERVER_URL;\n }\n\n return SESSION_REPLAY_SERVER_URL;\n }\n\n addToQueue(...list: SessionReplayDestinationContext[]) {\n const tryable = list.filter((context) => {\n if (context.attempts < (context.flushMaxRetries || 0)) {\n context.attempts += 1;\n return true;\n }\n this.completeRequest({\n context,\n err: `${MAX_RETRIES_EXCEEDED_MESSAGE}, batch sequence id, ${context.sequenceId}`,\n });\n return false;\n });\n tryable.forEach((context) => {\n this.queue = this.queue.concat(context);\n if (context.timeout === 0) {\n this.schedule(0);\n return;\n }\n\n setTimeout(() => {\n context.timeout = 0;\n this.schedule(0);\n }, context.timeout);\n });\n }\n\n schedule(timeout: number) {\n if (this.scheduled) return;\n this.scheduled = setTimeout(() => {\n void this.flush(true).then(() => {\n if (this.queue.length > 0) {\n this.schedule(timeout);\n }\n });\n }, timeout);\n }\n\n async flush(useRetry = false) {\n const list: SessionReplayDestinationContext[] = [];\n const later: SessionReplayDestinationContext[] = [];\n this.queue.forEach((context) => (context.timeout === 0 ? list.push(context) : later.push(context)));\n this.queue = later;\n\n if (this.scheduled) {\n clearTimeout(this.scheduled);\n this.scheduled = null;\n }\n\n await Promise.all(list.map((context) => this.send(context, useRetry)));\n }\n\n async send(context: SessionReplayDestinationContext, useRetry = true) {\n const apiKey = context.apiKey;\n if (!apiKey) {\n return this.completeRequest({ context, err: MISSING_API_KEY_MESSAGE });\n }\n const deviceId = context.deviceId;\n if (!deviceId) {\n return this.completeRequest({ context, err: MISSING_DEVICE_ID_MESSAGE });\n }\n const url = getCurrentUrl();\n const version = VERSION;\n const sampleRate = context.sampleRate;\n const urlParams = new URLSearchParams({\n device_id: deviceId,\n session_id: `${context.sessionId}`,\n seq_number: `${context.sequenceId}`,\n });\n\n const payload = {\n version: 1,\n events: context.events,\n };\n\n try {\n const options: RequestInit = {\n headers: {\n 'Content-Type': 'application/json',\n Accept: '*/*',\n Authorization: `Bearer ${apiKey}`,\n 'X-Client-Version': version,\n 'X-Client-Url': url,\n 'X-Client-Sample-Rate': `${sampleRate}`,\n },\n body: JSON.stringify(payload),\n method: 'POST',\n };\n const server_url = `${this.getServerUrl(context.serverZone)}?${urlParams.toString()}`;\n const res = await fetch(server_url, options);\n if (res === null) {\n this.completeRequest({ context, err: UNEXPECTED_ERROR_MESSAGE });\n return;\n }\n if (!useRetry) {\n let responseBody = '';\n try {\n responseBody = JSON.stringify(res.body, null, 2);\n } catch {\n // to avoid crash, but don't care about the error, add comment to avoid empty block lint error\n }\n this.completeRequest({ context, success: `${res.status}: ${responseBody}` });\n } else {\n this.handleReponse(res.status, context);\n }\n } catch (e) {\n this.completeRequest({ context, err: e as string });\n }\n }\n\n handleReponse(status: number, context: SessionReplayDestinationContext) {\n const parsedStatus = new BaseTransport().buildStatus(status);\n switch (parsedStatus) {\n case Status.Success:\n this.handleSuccessResponse(context);\n break;\n case Status.Failed:\n this.handleOtherResponse(context);\n break;\n default:\n this.completeRequest({ context, err: UNEXPECTED_NETWORK_ERROR_MESSAGE });\n }\n }\n\n handleSuccessResponse(context: SessionReplayDestinationContext) {\n this.completeRequest({ context, success: getSuccessMessage(context.sessionId) });\n }\n\n handleOtherResponse(context: SessionReplayDestinationContext) {\n this.addToQueue({\n ...context,\n timeout: context.attempts * this.retryTimeout,\n });\n }\n\n completeRequest({\n context,\n err,\n success,\n }: {\n context: SessionReplayDestinationContext;\n err?: string;\n success?: string;\n }) {\n void context.onComplete(context.sessionId, context.sequenceId);\n if (err) {\n this.loggerProvider.warn(err);\n } else if (success) {\n this.loggerProvider.log(success);\n }\n }\n}\n"]}
|
|
@@ -67,7 +67,25 @@ export interface AmplitudeSessionReplay {
|
|
|
67
67
|
}
|
|
68
68
|
export interface SessionReplayTrackDestination {
|
|
69
69
|
sendEventsList: (destinationData: SessionReplayDestination) => void;
|
|
70
|
-
setLoggerProvider: (loggerProvider: Logger) => void;
|
|
71
70
|
flush: (useRetry: boolean) => Promise<void>;
|
|
72
71
|
}
|
|
72
|
+
export interface SessionReplayEventsManager {
|
|
73
|
+
initialize({ sessionId, shouldSendStoredEvents, deviceId, }: {
|
|
74
|
+
sessionId: number;
|
|
75
|
+
shouldSendStoredEvents: boolean;
|
|
76
|
+
deviceId: string;
|
|
77
|
+
}): Promise<void>;
|
|
78
|
+
addEvent({ sessionId, event, deviceId }: {
|
|
79
|
+
sessionId: number;
|
|
80
|
+
event: string;
|
|
81
|
+
deviceId: string;
|
|
82
|
+
}): void;
|
|
83
|
+
sendEvents({ sessionId, deviceId }: {
|
|
84
|
+
sessionId: number;
|
|
85
|
+
deviceId: string;
|
|
86
|
+
}): void;
|
|
87
|
+
resetSequence(): void;
|
|
88
|
+
flush(useRetry?: boolean): Promise<void>;
|
|
89
|
+
events: Events;
|
|
90
|
+
}
|
|
73
91
|
//# sourceMappingURL=session-replay.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-replay.d.ts","sourceRoot":"","sources":["../../../src/typings/session-replay.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"session-replay.d.ts","sourceRoot":"","sources":["../../../src/typings/session-replay.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-replay.js","sourceRoot":"","sources":["../../../src/typings/session-replay.ts"],"names":[],"mappings":"AAqBA,MAAM,CAAN,IAAY,eAGX;AAHD,WAAY,eAAe;IACzB,0CAAuB,CAAA;IACvB,gCAAa,CAAA;AACf,CAAC,EAHW,eAAe,KAAf,eAAe,QAG1B","sourcesContent":["import { AmplitudeReturn, Config, LogLevel, Logger, ServerZone } from '@amplitude/analytics-types';\n\nexport type Events = string[];\n\nexport interface SessionReplayDestination {\n events: Events;\n sequenceId: number;\n sessionId: number;\n flushMaxRetries?: number;\n apiKey?: string;\n deviceId?: string;\n sampleRate: number;\n serverZone?: keyof typeof ServerZone;\n onComplete: (sessionId: number, sequenceId: number) => Promise<void>;\n}\n\nexport interface SessionReplayDestinationContext extends SessionReplayDestination {\n attempts: number;\n timeout: number;\n}\n\nexport enum RecordingStatus {\n RECORDING = 'recording',\n SENT = 'sent',\n}\n\nexport interface IDBStoreSequence {\n events: Events;\n status: RecordingStatus;\n}\n\nexport interface IDBStoreSession {\n currentSequenceId: number;\n sessionSequences: {\n [sequenceId: number]: IDBStoreSequence;\n };\n}\n\nexport interface IDBStore {\n [sessionId: number]: IDBStoreSession;\n}\n\nexport interface SessionReplaySessionIDBStore {\n getAllSessionDataFromStore(): Promise<IDBStore | undefined>;\n storeEventsForSession(events: Events, sequenceId: number, sessionId: number): Promise<void>;\n cleanUpSessionEventsStore(sessionId: number, sequenceId: number): Promise<void>;\n}\n\nexport interface SessionReplayPrivacyConfig {\n blockSelector?: string | string[];\n}\n\nexport interface SessionReplayConfig extends Config {\n apiKey: string;\n loggerProvider: Logger;\n logLevel: LogLevel;\n flushMaxRetries: number;\n sampleRate: number;\n privacyConfig?: SessionReplayPrivacyConfig;\n debugMode?: boolean;\n}\n\nexport interface SessionIdentifiers {\n deviceId?: string;\n sessionId?: number;\n sessionReplayId?: string;\n}\n\nexport type SessionReplayOptions = Omit<Partial<SessionReplayConfig & SessionIdentifiers>, 'apiKey'>;\n\nexport interface AmplitudeSessionReplay {\n init: (apiKey: string, options: SessionReplayOptions) => AmplitudeReturn<void>;\n setSessionId: (sessionId: number, deviceId?: string) => void;\n getSessionId: () => number | undefined;\n getSessionReplayProperties: () => { [key: string]: boolean | string | null };\n flush: (useRetry: boolean) => Promise<void>;\n shutdown: () => void;\n}\n\nexport interface SessionReplayTrackDestination {\n sendEventsList: (destinationData: SessionReplayDestination) => void;\n
|
|
1
|
+
{"version":3,"file":"session-replay.js","sourceRoot":"","sources":["../../../src/typings/session-replay.ts"],"names":[],"mappings":"AAqBA,MAAM,CAAN,IAAY,eAGX;AAHD,WAAY,eAAe;IACzB,0CAAuB,CAAA;IACvB,gCAAa,CAAA;AACf,CAAC,EAHW,eAAe,KAAf,eAAe,QAG1B","sourcesContent":["import { AmplitudeReturn, Config, LogLevel, Logger, ServerZone } from '@amplitude/analytics-types';\n\nexport type Events = string[];\n\nexport interface SessionReplayDestination {\n events: Events;\n sequenceId: number;\n sessionId: number;\n flushMaxRetries?: number;\n apiKey?: string;\n deviceId?: string;\n sampleRate: number;\n serverZone?: keyof typeof ServerZone;\n onComplete: (sessionId: number, sequenceId: number) => Promise<void>;\n}\n\nexport interface SessionReplayDestinationContext extends SessionReplayDestination {\n attempts: number;\n timeout: number;\n}\n\nexport enum RecordingStatus {\n RECORDING = 'recording',\n SENT = 'sent',\n}\n\nexport interface IDBStoreSequence {\n events: Events;\n status: RecordingStatus;\n}\n\nexport interface IDBStoreSession {\n currentSequenceId: number;\n sessionSequences: {\n [sequenceId: number]: IDBStoreSequence;\n };\n}\n\nexport interface IDBStore {\n [sessionId: number]: IDBStoreSession;\n}\n\nexport interface SessionReplaySessionIDBStore {\n getAllSessionDataFromStore(): Promise<IDBStore | undefined>;\n storeEventsForSession(events: Events, sequenceId: number, sessionId: number): Promise<void>;\n cleanUpSessionEventsStore(sessionId: number, sequenceId: number): Promise<void>;\n}\n\nexport interface SessionReplayPrivacyConfig {\n blockSelector?: string | string[];\n}\n\nexport interface SessionReplayConfig extends Config {\n apiKey: string;\n loggerProvider: Logger;\n logLevel: LogLevel;\n flushMaxRetries: number;\n sampleRate: number;\n privacyConfig?: SessionReplayPrivacyConfig;\n debugMode?: boolean;\n}\n\nexport interface SessionIdentifiers {\n deviceId?: string;\n sessionId?: number;\n sessionReplayId?: string;\n}\n\nexport type SessionReplayOptions = Omit<Partial<SessionReplayConfig & SessionIdentifiers>, 'apiKey'>;\n\nexport interface AmplitudeSessionReplay {\n init: (apiKey: string, options: SessionReplayOptions) => AmplitudeReturn<void>;\n setSessionId: (sessionId: number, deviceId?: string) => void;\n getSessionId: () => number | undefined;\n getSessionReplayProperties: () => { [key: string]: boolean | string | null };\n flush: (useRetry: boolean) => Promise<void>;\n shutdown: () => void;\n}\n\nexport interface SessionReplayTrackDestination {\n sendEventsList: (destinationData: SessionReplayDestination) => void;\n flush: (useRetry: boolean) => Promise<void>;\n}\n\nexport interface SessionReplayEventsManager {\n initialize({\n sessionId,\n shouldSendStoredEvents,\n deviceId,\n }: {\n sessionId: number;\n shouldSendStoredEvents: boolean;\n deviceId: string;\n }): Promise<void>;\n addEvent({ sessionId, event, deviceId }: { sessionId: number; event: string; deviceId: string }): void;\n sendEvents({ sessionId, deviceId }: { sessionId: number; deviceId: string }): void;\n resetSequence(): void;\n flush(useRetry?: boolean): Promise<void>;\n events: Events;\n}\n"]}
|