@multiplayer-app/session-recorder-browser 2.0.85 → 2.0.88
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/dist/config/constants.d.ts +2 -1
- package/dist/config/constants.js +3 -1
- package/dist/config/defaults.js +9 -0
- package/dist/config/session-recorder.js +10 -1
- package/dist/index.js +167 -57
- package/dist/index.umd.js +167 -57
- package/dist/session-recorder.js +83 -38
- package/dist/sessionWidget/UIManager.js +7 -4
- package/dist/sessionWidget/buttonStateConfigs.d.ts +15 -0
- package/dist/sessionWidget/buttonStateConfigs.js +40 -0
- package/dist/sessionWidget/index.js +17 -18
- package/dist/types/session-recorder.d.ts +18 -0
- package/package.json +6 -4
package/dist/index.umd.js
CHANGED
|
@@ -21463,6 +21463,7 @@ module.exports = {
|
|
|
21463
21463
|
/* harmony export */ SESSION_ID_PROP_NAME: () => (/* binding */ SESSION_ID_PROP_NAME),
|
|
21464
21464
|
/* harmony export */ SESSION_PROP_NAME: () => (/* binding */ SESSION_PROP_NAME),
|
|
21465
21465
|
/* harmony export */ SESSION_READY_EVENT: () => (/* binding */ SESSION_READY_EVENT),
|
|
21466
|
+
/* harmony export */ SESSION_READY_EVENT_LEGACY: () => (/* binding */ SESSION_READY_EVENT_LEGACY),
|
|
21466
21467
|
/* harmony export */ SESSION_SAVE_BUFFER_EVENT: () => (/* binding */ SESSION_SAVE_BUFFER_EVENT),
|
|
21467
21468
|
/* harmony export */ SESSION_STARTED_EVENT: () => (/* binding */ SESSION_STARTED_EVENT),
|
|
21468
21469
|
/* harmony export */ SESSION_STATE_PROP_NAME: () => (/* binding */ SESSION_STATE_PROP_NAME),
|
|
@@ -21487,14 +21488,16 @@ const SESSION_AUTO_CREATED = 'debug-session:auto-created';
|
|
|
21487
21488
|
const SESSION_ADD_EVENT = 'debug-session:rrweb:add-event';
|
|
21488
21489
|
// Backend-triggered flush of client-side crash buffer
|
|
21489
21490
|
const SESSION_SAVE_BUFFER_EVENT = 'debug-session:save-buffer';
|
|
21491
|
+
const SESSION_READY_EVENT = 'debug-session:ready';
|
|
21492
|
+
// Deprecated event name for backwards compatibility
|
|
21493
|
+
const SESSION_READY_EVENT_LEGACY = 'debug-session-ready';
|
|
21490
21494
|
const SOCKET_SET_USER_EVENT = 'socket:set-user';
|
|
21491
21495
|
const DEFAULT_MAX_HTTP_CAPTURING_PAYLOAD_SIZE = 100000;
|
|
21492
|
-
const SESSION_READY_EVENT = 'debug-session-ready';
|
|
21493
21496
|
const CONTINUOUS_DEBUGGING_TIMEOUT = 60000; // 1 minutes
|
|
21494
21497
|
const DEBUG_SESSION_MAX_DURATION_SECONDS = 10 * 60 + 30; // TODO: move to shared config otel core
|
|
21495
21498
|
const REMOTE_SESSION_RECORDING_START = 'remote-session-recording:start';
|
|
21496
21499
|
const REMOTE_SESSION_RECORDING_STOP = 'remote-session-recording:stop';
|
|
21497
|
-
const PACKAGE_VERSION_EXPORT = "2.0.
|
|
21500
|
+
const PACKAGE_VERSION_EXPORT = "2.0.88" || 0;
|
|
21498
21501
|
// Regex patterns for OpenTelemetry ignore URLs
|
|
21499
21502
|
const OTEL_IGNORE_URLS = [
|
|
21500
21503
|
// Traces endpoint
|
|
@@ -21566,6 +21569,15 @@ const DEFAULT_WIDGET_TEXT_CONFIG = {
|
|
|
21566
21569
|
submitDialogCommentPlaceholder: 'Add a message...',
|
|
21567
21570
|
submitDialogSubmitText: 'Save',
|
|
21568
21571
|
submitDialogCancelText: 'Cancel',
|
|
21572
|
+
buttonTooltipIdle: 'Record an issue',
|
|
21573
|
+
buttonTooltipRecording: 'The session is recording. Click to end.',
|
|
21574
|
+
buttonTooltipCancel: 'Click to cancel',
|
|
21575
|
+
buttonTooltipSent: 'We\'ve sent it over! Thanks!',
|
|
21576
|
+
buttonTooltipLoading: 'Starting to record...',
|
|
21577
|
+
buttonTooltipContinuousDebugging: 'You’re continuously recording.',
|
|
21578
|
+
saveContinuousRecordingSavingText: 'Saving recording...',
|
|
21579
|
+
saveContinuousRecordingSavedText: 'Saved',
|
|
21580
|
+
saveContinuousRecordingErrorText: 'Error saving the recording',
|
|
21569
21581
|
};
|
|
21570
21582
|
const BASE_CONFIG = {
|
|
21571
21583
|
apiKey: '',
|
|
@@ -21625,6 +21637,7 @@ const BASE_CONFIG = {
|
|
|
21625
21637
|
/* harmony export */ SESSION_ID_PROP_NAME: () => (/* reexport safe */ _constants__WEBPACK_IMPORTED_MODULE_0__.SESSION_ID_PROP_NAME),
|
|
21626
21638
|
/* harmony export */ SESSION_PROP_NAME: () => (/* reexport safe */ _constants__WEBPACK_IMPORTED_MODULE_0__.SESSION_PROP_NAME),
|
|
21627
21639
|
/* harmony export */ SESSION_READY_EVENT: () => (/* reexport safe */ _constants__WEBPACK_IMPORTED_MODULE_0__.SESSION_READY_EVENT),
|
|
21640
|
+
/* harmony export */ SESSION_READY_EVENT_LEGACY: () => (/* reexport safe */ _constants__WEBPACK_IMPORTED_MODULE_0__.SESSION_READY_EVENT_LEGACY),
|
|
21628
21641
|
/* harmony export */ SESSION_SAVE_BUFFER_EVENT: () => (/* reexport safe */ _constants__WEBPACK_IMPORTED_MODULE_0__.SESSION_SAVE_BUFFER_EVENT),
|
|
21629
21642
|
/* harmony export */ SESSION_STARTED_EVENT: () => (/* reexport safe */ _constants__WEBPACK_IMPORTED_MODULE_0__.SESSION_STARTED_EVENT),
|
|
21630
21643
|
/* harmony export */ SESSION_STATE_PROP_NAME: () => (/* reexport safe */ _constants__WEBPACK_IMPORTED_MODULE_0__.SESSION_STATE_PROP_NAME),
|
|
@@ -21739,6 +21752,15 @@ const getWidgetTextOverridesConfig = (config, defaultConfig) => {
|
|
|
21739
21752
|
submitDialogCommentPlaceholder: (0,_validators__WEBPACK_IMPORTED_MODULE_3__.isValidString)(config.submitDialogCommentPlaceholder, defaultConfig.submitDialogCommentPlaceholder),
|
|
21740
21753
|
submitDialogSubmitText: (0,_validators__WEBPACK_IMPORTED_MODULE_3__.isValidString)(config.submitDialogSubmitText, defaultConfig.submitDialogSubmitText),
|
|
21741
21754
|
submitDialogCancelText: (0,_validators__WEBPACK_IMPORTED_MODULE_3__.isValidString)(config.submitDialogCancelText, defaultConfig.submitDialogCancelText),
|
|
21755
|
+
buttonTooltipIdle: (0,_validators__WEBPACK_IMPORTED_MODULE_3__.isValidString)(config.buttonTooltipIdle, defaultConfig.buttonTooltipIdle),
|
|
21756
|
+
buttonTooltipRecording: (0,_validators__WEBPACK_IMPORTED_MODULE_3__.isValidString)(config.buttonTooltipRecording, defaultConfig.buttonTooltipRecording),
|
|
21757
|
+
buttonTooltipCancel: (0,_validators__WEBPACK_IMPORTED_MODULE_3__.isValidString)(config.buttonTooltipCancel, defaultConfig.buttonTooltipCancel),
|
|
21758
|
+
buttonTooltipSent: (0,_validators__WEBPACK_IMPORTED_MODULE_3__.isValidString)(config.buttonTooltipSent, defaultConfig.buttonTooltipSent),
|
|
21759
|
+
buttonTooltipLoading: (0,_validators__WEBPACK_IMPORTED_MODULE_3__.isValidString)(config.buttonTooltipLoading, defaultConfig.buttonTooltipLoading),
|
|
21760
|
+
buttonTooltipContinuousDebugging: (0,_validators__WEBPACK_IMPORTED_MODULE_3__.isValidString)(config.buttonTooltipContinuousDebugging, defaultConfig.buttonTooltipContinuousDebugging),
|
|
21761
|
+
saveContinuousRecordingSavingText: (0,_validators__WEBPACK_IMPORTED_MODULE_3__.isValidString)(config.saveContinuousRecordingSavingText, defaultConfig.saveContinuousRecordingSavingText),
|
|
21762
|
+
saveContinuousRecordingSavedText: (0,_validators__WEBPACK_IMPORTED_MODULE_3__.isValidString)(config.saveContinuousRecordingSavedText, defaultConfig.saveContinuousRecordingSavedText),
|
|
21763
|
+
saveContinuousRecordingErrorText: (0,_validators__WEBPACK_IMPORTED_MODULE_3__.isValidString)(config.saveContinuousRecordingErrorText, defaultConfig.saveContinuousRecordingErrorText),
|
|
21742
21764
|
};
|
|
21743
21765
|
};
|
|
21744
21766
|
const getSessionRecorderConfig = (c) => {
|
|
@@ -24721,7 +24743,10 @@ class SessionRecorder extends _observable__WEBPACK_IMPORTED_MODULE_0__.Observabl
|
|
|
24721
24743
|
_services_messaging_service__WEBPACK_IMPORTED_MODULE_10__["default"].sendMessage('state-change', this._sessionState);
|
|
24722
24744
|
(0,_utils__WEBPACK_IMPORTED_MODULE_4__.setStoredItem)(_config__WEBPACK_IMPORTED_MODULE_6__.SESSION_STATE_PROP_NAME, state);
|
|
24723
24745
|
// Emit observable event to support React wrapper
|
|
24724
|
-
this.emit('state-change', [
|
|
24746
|
+
this.emit('state-change', [
|
|
24747
|
+
this._sessionState || _types__WEBPACK_IMPORTED_MODULE_5__.SessionState.stopped,
|
|
24748
|
+
this.sessionType,
|
|
24749
|
+
]);
|
|
24725
24750
|
}
|
|
24726
24751
|
get session() {
|
|
24727
24752
|
return this._session;
|
|
@@ -24792,10 +24817,18 @@ class SessionRecorder extends _observable__WEBPACK_IMPORTED_MODULE_0__.Observabl
|
|
|
24792
24817
|
this._error = '';
|
|
24793
24818
|
// Safety: avoid accessing storage in SSR/non-browser environments
|
|
24794
24819
|
const isBrowser = typeof window !== 'undefined';
|
|
24795
|
-
const sessionLocal = isBrowser
|
|
24796
|
-
|
|
24797
|
-
|
|
24798
|
-
const
|
|
24820
|
+
const sessionLocal = isBrowser
|
|
24821
|
+
? (0,_utils__WEBPACK_IMPORTED_MODULE_4__.getStoredItem)(_config__WEBPACK_IMPORTED_MODULE_6__.SESSION_PROP_NAME, true)
|
|
24822
|
+
: null;
|
|
24823
|
+
const sessionIdLocal = isBrowser
|
|
24824
|
+
? (0,_utils__WEBPACK_IMPORTED_MODULE_4__.getStoredItem)(_config__WEBPACK_IMPORTED_MODULE_6__.SESSION_ID_PROP_NAME)
|
|
24825
|
+
: null;
|
|
24826
|
+
const sessionStateLocal = isBrowser
|
|
24827
|
+
? (0,_utils__WEBPACK_IMPORTED_MODULE_4__.getStoredItem)(_config__WEBPACK_IMPORTED_MODULE_6__.SESSION_STATE_PROP_NAME)
|
|
24828
|
+
: null;
|
|
24829
|
+
const sessionTypeLocal = isBrowser
|
|
24830
|
+
? (0,_utils__WEBPACK_IMPORTED_MODULE_4__.getStoredItem)(_config__WEBPACK_IMPORTED_MODULE_6__.SESSION_TYPE_PROP_NAME)
|
|
24831
|
+
: null;
|
|
24799
24832
|
if ((0,_utils__WEBPACK_IMPORTED_MODULE_4__.isSessionActive)(sessionLocal, sessionTypeLocal)) {
|
|
24800
24833
|
this.session = sessionLocal;
|
|
24801
24834
|
this.sessionId = sessionIdLocal;
|
|
@@ -24827,7 +24860,8 @@ class SessionRecorder extends _observable__WEBPACK_IMPORTED_MODULE_0__.Observabl
|
|
|
24827
24860
|
// GC: remove orphaned crash buffers from old tabs.
|
|
24828
24861
|
// Keep TTL large to avoid any accidental data loss.
|
|
24829
24862
|
void this._bufferDb.sweepStaleTabs(10 * 60 * 60 * 1000);
|
|
24830
|
-
(0,_patch__WEBPACK_IMPORTED_MODULE_7__.setMaxCapturingHttpPayloadSize)(this._configs.maxCapturingHttpPayloadSize ||
|
|
24863
|
+
(0,_patch__WEBPACK_IMPORTED_MODULE_7__.setMaxCapturingHttpPayloadSize)(this._configs.maxCapturingHttpPayloadSize ||
|
|
24864
|
+
_config__WEBPACK_IMPORTED_MODULE_6__.DEFAULT_MAX_HTTP_CAPTURING_PAYLOAD_SIZE);
|
|
24831
24865
|
(0,_patch__WEBPACK_IMPORTED_MODULE_7__.setShouldRecordHttpData)(this._configs.captureBody, this._configs.captureHeaders);
|
|
24832
24866
|
this._setupCrashBuffer();
|
|
24833
24867
|
this._tracer.init(this._configs);
|
|
@@ -24849,7 +24883,9 @@ class SessionRecorder extends _observable__WEBPACK_IMPORTED_MODULE_0__.Observabl
|
|
|
24849
24883
|
if (this._configs.apiKey) {
|
|
24850
24884
|
this._recorder.init(this._configs, this._socketService);
|
|
24851
24885
|
}
|
|
24852
|
-
if (this.sessionId &&
|
|
24886
|
+
if (this.sessionId &&
|
|
24887
|
+
(this.sessionState === _types__WEBPACK_IMPORTED_MODULE_5__.SessionState.started ||
|
|
24888
|
+
this.sessionState === _types__WEBPACK_IMPORTED_MODULE_5__.SessionState.paused)) {
|
|
24853
24889
|
this._start();
|
|
24854
24890
|
}
|
|
24855
24891
|
else {
|
|
@@ -24903,7 +24939,8 @@ class SessionRecorder extends _observable__WEBPACK_IMPORTED_MODULE_0__.Observabl
|
|
|
24903
24939
|
return;
|
|
24904
24940
|
let hasFocus = true;
|
|
24905
24941
|
try {
|
|
24906
|
-
hasFocus =
|
|
24942
|
+
hasFocus =
|
|
24943
|
+
typeof document.hasFocus === 'function' ? document.hasFocus() : true;
|
|
24907
24944
|
}
|
|
24908
24945
|
catch (_e) {
|
|
24909
24946
|
hasFocus = true;
|
|
@@ -24925,7 +24962,9 @@ class SessionRecorder extends _observable__WEBPACK_IMPORTED_MODULE_0__.Observabl
|
|
|
24925
24962
|
// stop, leaving the buffer with no FullSnapshot and silently breaking
|
|
24926
24963
|
// exception-triggered flushBuffer. `_recorder.restart(null, ...)` passes
|
|
24927
24964
|
// null explicitly, so it's safe regardless of `this.sessionId`.
|
|
24928
|
-
if (!this._crashBuffer ||
|
|
24965
|
+
if (!this._crashBuffer ||
|
|
24966
|
+
!((_b = (_a = this._configs) === null || _a === void 0 ? void 0 : _a.buffering) === null || _b === void 0 ? void 0 : _b.enabled) ||
|
|
24967
|
+
this.sessionState !== _types__WEBPACK_IMPORTED_MODULE_5__.SessionState.stopped) {
|
|
24929
24968
|
return;
|
|
24930
24969
|
}
|
|
24931
24970
|
void this._recorder.restart(null, _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_1__.SessionType.MANUAL);
|
|
@@ -24976,7 +25015,8 @@ class SessionRecorder extends _observable__WEBPACK_IMPORTED_MODULE_0__.Observabl
|
|
|
24976
25015
|
start(type = _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_1__.SessionType.MANUAL, session) {
|
|
24977
25016
|
this._checkOperation('start');
|
|
24978
25017
|
// If continuous recording is disabled, force plain mode
|
|
24979
|
-
if (type === _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_1__.SessionType.CONTINUOUS &&
|
|
25018
|
+
if (type === _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_1__.SessionType.CONTINUOUS &&
|
|
25019
|
+
!this._configs.showContinuousRecording) {
|
|
24980
25020
|
type = _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_1__.SessionType.MANUAL;
|
|
24981
25021
|
}
|
|
24982
25022
|
this.sessionType = type;
|
|
@@ -25007,7 +25047,8 @@ class SessionRecorder extends _observable__WEBPACK_IMPORTED_MODULE_0__.Observabl
|
|
|
25007
25047
|
stoppedAt: this._recorder.stoppedAt,
|
|
25008
25048
|
};
|
|
25009
25049
|
const response = await this._apiService.stopSession(sid, request);
|
|
25010
|
-
_eventBus__WEBPACK_IMPORTED_MODULE_8__.recorderEventBus.emit(_config__WEBPACK_IMPORTED_MODULE_6__.
|
|
25050
|
+
_eventBus__WEBPACK_IMPORTED_MODULE_8__.recorderEventBus.emit(_config__WEBPACK_IMPORTED_MODULE_6__.SESSION_READY_EVENT_LEGACY, response._id);
|
|
25051
|
+
_eventBus__WEBPACK_IMPORTED_MODULE_8__.recorderEventBus.emit(_config__WEBPACK_IMPORTED_MODULE_6__.SESSION_READY_EVENT, response);
|
|
25011
25052
|
}
|
|
25012
25053
|
}
|
|
25013
25054
|
catch (error) {
|
|
@@ -25103,8 +25144,8 @@ class SessionRecorder extends _observable__WEBPACK_IMPORTED_MODULE_0__.Observabl
|
|
|
25103
25144
|
this.error = (e === null || e === void 0 ? void 0 : e.message) || 'Failed to capture exception';
|
|
25104
25145
|
}
|
|
25105
25146
|
}
|
|
25106
|
-
async _flushBuffer(
|
|
25107
|
-
if (!
|
|
25147
|
+
async _flushBuffer(session, force = false) {
|
|
25148
|
+
if (!session || !this._crashBuffer || this._isFlushingBuffer) {
|
|
25108
25149
|
return null;
|
|
25109
25150
|
}
|
|
25110
25151
|
this._isFlushingBuffer = true;
|
|
@@ -25115,8 +25156,10 @@ class SessionRecorder extends _observable__WEBPACK_IMPORTED_MODULE_0__.Observabl
|
|
|
25115
25156
|
}
|
|
25116
25157
|
await Promise.all([
|
|
25117
25158
|
this._tracer.exportTraces(spans.map((s) => s.span)),
|
|
25118
|
-
this._apiService.exportEvents(
|
|
25119
|
-
|
|
25159
|
+
this._apiService.exportEvents(session._id, {
|
|
25160
|
+
events: events.map((e) => e.event),
|
|
25161
|
+
}),
|
|
25162
|
+
this._apiService.updateSessionAttributes(session._id, {
|
|
25120
25163
|
startedAt: this._toCrashBufferSessionIso(startedAt),
|
|
25121
25164
|
stoppedAt: this._toCrashBufferSessionIso(stoppedAt),
|
|
25122
25165
|
sessionAttributes: this.sessionAttributes,
|
|
@@ -25131,7 +25174,8 @@ class SessionRecorder extends _observable__WEBPACK_IMPORTED_MODULE_0__.Observabl
|
|
|
25131
25174
|
finally {
|
|
25132
25175
|
await this._crashBuffer.clear();
|
|
25133
25176
|
this._isFlushingBuffer = false;
|
|
25134
|
-
_eventBus__WEBPACK_IMPORTED_MODULE_8__.recorderEventBus.emit(_config__WEBPACK_IMPORTED_MODULE_6__.
|
|
25177
|
+
_eventBus__WEBPACK_IMPORTED_MODULE_8__.recorderEventBus.emit(_config__WEBPACK_IMPORTED_MODULE_6__.SESSION_READY_EVENT_LEGACY, session._id);
|
|
25178
|
+
_eventBus__WEBPACK_IMPORTED_MODULE_8__.recorderEventBus.emit(_config__WEBPACK_IMPORTED_MODULE_6__.SESSION_READY_EVENT, session);
|
|
25135
25179
|
}
|
|
25136
25180
|
}
|
|
25137
25181
|
_toCrashBufferSessionIso(ts) {
|
|
@@ -25220,7 +25264,8 @@ class SessionRecorder extends _observable__WEBPACK_IMPORTED_MODULE_0__.Observabl
|
|
|
25220
25264
|
* Handle the safe stop event
|
|
25221
25265
|
*/
|
|
25222
25266
|
_handleStop(comment) {
|
|
25223
|
-
if (this.sessionState === _types__WEBPACK_IMPORTED_MODULE_5__.SessionState.started ||
|
|
25267
|
+
if (this.sessionState === _types__WEBPACK_IMPORTED_MODULE_5__.SessionState.started ||
|
|
25268
|
+
this.sessionState === _types__WEBPACK_IMPORTED_MODULE_5__.SessionState.paused) {
|
|
25224
25269
|
this.stop(comment);
|
|
25225
25270
|
}
|
|
25226
25271
|
}
|
|
@@ -25244,7 +25289,8 @@ class SessionRecorder extends _observable__WEBPACK_IMPORTED_MODULE_0__.Observabl
|
|
|
25244
25289
|
* Handle the safe cancel event
|
|
25245
25290
|
*/
|
|
25246
25291
|
_handleCancel() {
|
|
25247
|
-
if (this.sessionState === _types__WEBPACK_IMPORTED_MODULE_5__.SessionState.started ||
|
|
25292
|
+
if (this.sessionState === _types__WEBPACK_IMPORTED_MODULE_5__.SessionState.started ||
|
|
25293
|
+
this.sessionState === _types__WEBPACK_IMPORTED_MODULE_5__.SessionState.paused) {
|
|
25248
25294
|
this.cancel();
|
|
25249
25295
|
}
|
|
25250
25296
|
}
|
|
@@ -25252,7 +25298,8 @@ class SessionRecorder extends _observable__WEBPACK_IMPORTED_MODULE_0__.Observabl
|
|
|
25252
25298
|
* Handle the safe save event
|
|
25253
25299
|
*/
|
|
25254
25300
|
_handleSave() {
|
|
25255
|
-
if (this.sessionState === _types__WEBPACK_IMPORTED_MODULE_5__.SessionState.started &&
|
|
25301
|
+
if (this.sessionState === _types__WEBPACK_IMPORTED_MODULE_5__.SessionState.started &&
|
|
25302
|
+
this.continuousRecording) {
|
|
25256
25303
|
this.save();
|
|
25257
25304
|
}
|
|
25258
25305
|
}
|
|
@@ -25297,12 +25344,12 @@ class SessionRecorder extends _observable__WEBPACK_IMPORTED_MODULE_0__.Observabl
|
|
|
25297
25344
|
}
|
|
25298
25345
|
});
|
|
25299
25346
|
this._socketService.on(_config__WEBPACK_IMPORTED_MODULE_6__.SESSION_SAVE_BUFFER_EVENT, (payload) => {
|
|
25300
|
-
var _a, _b
|
|
25347
|
+
var _a, _b;
|
|
25301
25348
|
if (this.sessionState !== _types__WEBPACK_IMPORTED_MODULE_5__.SessionState.stopped)
|
|
25302
25349
|
return;
|
|
25303
|
-
this._flushBuffer(
|
|
25304
|
-
if ((
|
|
25305
|
-
_eventBus__WEBPACK_IMPORTED_MODULE_8__.recorderEventBus.emit(_config__WEBPACK_IMPORTED_MODULE_6__.SESSION_AUTO_CREATED, (
|
|
25350
|
+
this._flushBuffer(payload === null || payload === void 0 ? void 0 : payload.debugSession, true);
|
|
25351
|
+
if ((_a = payload === null || payload === void 0 ? void 0 : payload.debugSession) === null || _a === void 0 ? void 0 : _a.url) {
|
|
25352
|
+
_eventBus__WEBPACK_IMPORTED_MODULE_8__.recorderEventBus.emit(_config__WEBPACK_IMPORTED_MODULE_6__.SESSION_AUTO_CREATED, (_b = payload === null || payload === void 0 ? void 0 : payload.debugSession) === null || _b === void 0 ? void 0 : _b.url);
|
|
25306
25353
|
}
|
|
25307
25354
|
});
|
|
25308
25355
|
}
|
|
@@ -25310,7 +25357,7 @@ class SessionRecorder extends _observable__WEBPACK_IMPORTED_MODULE_0__.Observabl
|
|
|
25310
25357
|
try {
|
|
25311
25358
|
const session = await this._apiService.createErrorSession({ span });
|
|
25312
25359
|
if (session === null || session === void 0 ? void 0 : session._id) {
|
|
25313
|
-
this._flushBuffer(session
|
|
25360
|
+
this._flushBuffer(session);
|
|
25314
25361
|
}
|
|
25315
25362
|
if (session === null || session === void 0 ? void 0 : session.url) {
|
|
25316
25363
|
_eventBus__WEBPACK_IMPORTED_MODULE_8__.recorderEventBus.emit(_config__WEBPACK_IMPORTED_MODULE_6__.SESSION_AUTO_CREATED, session.url);
|
|
@@ -25330,14 +25377,20 @@ class SessionRecorder extends _observable__WEBPACK_IMPORTED_MODULE_0__.Observabl
|
|
|
25330
25377
|
sessionAttributes: this.sessionAttributes,
|
|
25331
25378
|
resourceAttributes: (0,_utils__WEBPACK_IMPORTED_MODULE_4__.getNavigatorInfo)(),
|
|
25332
25379
|
name: this._getSessionName(),
|
|
25333
|
-
...(this._userAttributes
|
|
25380
|
+
...(this._userAttributes
|
|
25381
|
+
? { userAttributes: this._userAttributes }
|
|
25382
|
+
: {}),
|
|
25334
25383
|
};
|
|
25335
|
-
const request = !this.continuousRecording
|
|
25384
|
+
const request = !this.continuousRecording
|
|
25385
|
+
? payload
|
|
25386
|
+
: { debugSessionData: payload };
|
|
25336
25387
|
const session = this.continuousRecording
|
|
25337
25388
|
? await this._apiService.startContinuousDebugSession(request, signal)
|
|
25338
25389
|
: await this._apiService.startSession(request, signal);
|
|
25339
25390
|
if (session) {
|
|
25340
|
-
session.sessionType = this.continuousRecording
|
|
25391
|
+
session.sessionType = this.continuousRecording
|
|
25392
|
+
? _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_1__.SessionType.CONTINUOUS
|
|
25393
|
+
: _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_1__.SessionType.MANUAL;
|
|
25341
25394
|
this._setupSessionAndStart(session, false);
|
|
25342
25395
|
}
|
|
25343
25396
|
}
|
|
@@ -25360,7 +25413,10 @@ class SessionRecorder extends _observable__WEBPACK_IMPORTED_MODULE_0__.Observabl
|
|
|
25360
25413
|
this._tracer.start(this.sessionId, this.sessionType);
|
|
25361
25414
|
// Ensure we switch from buffer-only recording to session recording cleanly.
|
|
25362
25415
|
void this._recorder.restart(this.sessionId, this.sessionType);
|
|
25363
|
-
this._navigationRecorder.start({
|
|
25416
|
+
this._navigationRecorder.start({
|
|
25417
|
+
sessionId: this.sessionId,
|
|
25418
|
+
sessionType: this.sessionType,
|
|
25419
|
+
});
|
|
25364
25420
|
if (this.session) {
|
|
25365
25421
|
this._socketService.subscribeToSession(this.session);
|
|
25366
25422
|
this._sessionWidget.seconds = (0,_utils__WEBPACK_IMPORTED_MODULE_4__.getTimeDifferenceInSeconds)((_a = this.session) === null || _a === void 0 ? void 0 : _a.startedAt);
|
|
@@ -25388,8 +25444,12 @@ class SessionRecorder extends _observable__WEBPACK_IMPORTED_MODULE_0__.Observabl
|
|
|
25388
25444
|
// rrweb assigns new node IDs on each record() call, so the next buffer
|
|
25389
25445
|
// segment must not carry events from the previous generation. Await the
|
|
25390
25446
|
// clear so its IDB tx can't race past the fresh FullSnapshot.
|
|
25391
|
-
const cleared = this._crashBuffer
|
|
25392
|
-
|
|
25447
|
+
const cleared = this._crashBuffer
|
|
25448
|
+
? this._crashBuffer.clear()
|
|
25449
|
+
: Promise.resolve();
|
|
25450
|
+
void cleared
|
|
25451
|
+
.catch(() => undefined)
|
|
25452
|
+
.then(() => this._startBufferOnlyRecording());
|
|
25393
25453
|
}
|
|
25394
25454
|
/**
|
|
25395
25455
|
* Pause the session tracing and recording
|
|
@@ -25425,7 +25485,10 @@ class SessionRecorder extends _observable__WEBPACK_IMPORTED_MODULE_0__.Observabl
|
|
|
25425
25485
|
* @param sessionId - the session ID to set or clear
|
|
25426
25486
|
*/
|
|
25427
25487
|
_setSession(session) {
|
|
25428
|
-
this.session = {
|
|
25488
|
+
this.session = {
|
|
25489
|
+
...session,
|
|
25490
|
+
startedAt: session.startedAt || new Date().toISOString(),
|
|
25491
|
+
};
|
|
25429
25492
|
this.sessionId = (session === null || session === void 0 ? void 0 : session.shortId) || (session === null || session === void 0 ? void 0 : session._id);
|
|
25430
25493
|
}
|
|
25431
25494
|
_clearSession() {
|
|
@@ -25448,7 +25511,8 @@ class SessionRecorder extends _observable__WEBPACK_IMPORTED_MODULE_0__.Observabl
|
|
|
25448
25511
|
}
|
|
25449
25512
|
break;
|
|
25450
25513
|
case 'stop':
|
|
25451
|
-
if (this.sessionState !== _types__WEBPACK_IMPORTED_MODULE_5__.SessionState.paused &&
|
|
25514
|
+
if (this.sessionState !== _types__WEBPACK_IMPORTED_MODULE_5__.SessionState.paused &&
|
|
25515
|
+
this.sessionState !== _types__WEBPACK_IMPORTED_MODULE_5__.SessionState.started) {
|
|
25452
25516
|
throw new Error('Cannot stop. Session is not currently started.');
|
|
25453
25517
|
}
|
|
25454
25518
|
break;
|
|
@@ -25526,7 +25590,10 @@ class SessionRecorder extends _observable__WEBPACK_IMPORTED_MODULE_0__.Observabl
|
|
|
25526
25590
|
*/
|
|
25527
25591
|
_getSessionName(date = new Date()) {
|
|
25528
25592
|
var _a, _b, _c;
|
|
25529
|
-
const userName = ((_a = this.sessionAttributes) === null || _a === void 0 ? void 0 : _a.userName) ||
|
|
25593
|
+
const userName = ((_a = this.sessionAttributes) === null || _a === void 0 ? void 0 : _a.userName) ||
|
|
25594
|
+
((_b = this._userAttributes) === null || _b === void 0 ? void 0 : _b.userName) ||
|
|
25595
|
+
((_c = this._userAttributes) === null || _c === void 0 ? void 0 : _c.name) ||
|
|
25596
|
+
'';
|
|
25530
25597
|
return userName
|
|
25531
25598
|
? `${userName}'s session on ${(0,_utils__WEBPACK_IMPORTED_MODULE_4__.getFormattedDate)(date, { month: 'short', day: 'numeric' })}`
|
|
25532
25599
|
: `Session on ${(0,_utils__WEBPACK_IMPORTED_MODULE_4__.getFormattedDate)(date)}`;
|
|
@@ -25589,8 +25656,9 @@ class UIManager {
|
|
|
25589
25656
|
* tooltip, and inner HTML content (Record icon)
|
|
25590
25657
|
*/
|
|
25591
25658
|
setRecorderButtonProps() {
|
|
25659
|
+
var _a;
|
|
25592
25660
|
this.recorderButton.className = 'mp-session-debugger-button';
|
|
25593
|
-
this.recorderButton.dataset.tooltip = 'Record an issue';
|
|
25661
|
+
this.recorderButton.dataset.tooltip = (_a = this.widgetTextOverrides.buttonTooltipIdle) !== null && _a !== void 0 ? _a : 'Record an issue';
|
|
25594
25662
|
(0,_utils__WEBPACK_IMPORTED_MODULE_0__.insertTrustedHTML)(this.recorderButton, `${_templates_icons__WEBPACK_IMPORTED_MODULE_1__.RecordIcon}`);
|
|
25595
25663
|
}
|
|
25596
25664
|
/**
|
|
@@ -25615,8 +25683,7 @@ class UIManager {
|
|
|
25615
25683
|
* The popover includes a logo, heading, and start recording button.
|
|
25616
25684
|
*/
|
|
25617
25685
|
setInitialPopoverProps() {
|
|
25618
|
-
this.initialPopover.className =
|
|
25619
|
-
'mp-session-debugger-popover mp-initial-popover hidden';
|
|
25686
|
+
this.initialPopover.className = 'mp-session-debugger-popover mp-initial-popover hidden';
|
|
25620
25687
|
(0,_utils__WEBPACK_IMPORTED_MODULE_0__.insertTrustedHTML)(this.initialPopover, (0,_templates_initialPopover__WEBPACK_IMPORTED_MODULE_3__.initialPopoverTemplate)(this.widgetTextOverrides, this.showContinuousRecording));
|
|
25621
25688
|
}
|
|
25622
25689
|
/**
|
|
@@ -25636,12 +25703,15 @@ class UIManager {
|
|
|
25636
25703
|
* @param isLoading - Whether the popover button should show a loading state.
|
|
25637
25704
|
*/
|
|
25638
25705
|
setPopoverLoadingState(isLoading) {
|
|
25706
|
+
var _a, _b;
|
|
25639
25707
|
const button = this.initialPopover.querySelector('.mp-session-debugger-popover-button');
|
|
25640
25708
|
if (!button) {
|
|
25641
25709
|
return;
|
|
25642
25710
|
}
|
|
25643
25711
|
button.classList.toggle('disabled', isLoading);
|
|
25644
|
-
button.textContent = isLoading
|
|
25712
|
+
button.textContent = isLoading
|
|
25713
|
+
? ((_a = this.widgetTextOverrides.buttonTooltipLoading) !== null && _a !== void 0 ? _a : 'Starting to record...')
|
|
25714
|
+
: ((_b = this.widgetTextOverrides.startRecordingButtonText) !== null && _b !== void 0 ? _b : 'Start recording');
|
|
25645
25715
|
}
|
|
25646
25716
|
setTimerValue(time) {
|
|
25647
25717
|
const timerElement = this.recordingOverlay.querySelector('.timer');
|
|
@@ -25701,9 +25771,10 @@ class UIManager {
|
|
|
25701
25771
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
25702
25772
|
/* harmony export */ ButtonState: () => (/* binding */ ButtonState),
|
|
25703
25773
|
/* harmony export */ ContinuousRecordingSaveButtonState: () => (/* binding */ ContinuousRecordingSaveButtonState),
|
|
25704
|
-
/* harmony export */
|
|
25705
|
-
/* harmony export */
|
|
25774
|
+
/* harmony export */ getButtonStates: () => (/* binding */ getButtonStates),
|
|
25775
|
+
/* harmony export */ getContinuousRecordingSaveButtonStates: () => (/* binding */ getContinuousRecordingSaveButtonStates)
|
|
25706
25776
|
/* harmony export */ });
|
|
25777
|
+
/* unused harmony exports buttonStates, continuousRecordingSaveButtonStates */
|
|
25707
25778
|
/* harmony import */ var _templates_icons__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./templates/icons */ "./src/sessionWidget/templates/icons.ts");
|
|
25708
25779
|
|
|
25709
25780
|
/**
|
|
@@ -25790,6 +25861,46 @@ const continuousRecordingSaveButtonStates = {
|
|
|
25790
25861
|
classes: [],
|
|
25791
25862
|
},
|
|
25792
25863
|
};
|
|
25864
|
+
const buttonTooltipOverrideKeys = {
|
|
25865
|
+
[ButtonState.IDLE]: 'buttonTooltipIdle',
|
|
25866
|
+
[ButtonState.RECORDING]: 'buttonTooltipRecording',
|
|
25867
|
+
[ButtonState.CANCEL]: 'buttonTooltipCancel',
|
|
25868
|
+
[ButtonState.SENT]: 'buttonTooltipSent',
|
|
25869
|
+
[ButtonState.LOADING]: 'buttonTooltipLoading',
|
|
25870
|
+
[ButtonState.CONTINUOUS_DEBUGGING]: 'buttonTooltipContinuousDebugging',
|
|
25871
|
+
};
|
|
25872
|
+
const continuousSaveTextOverrideKeys = {
|
|
25873
|
+
[ContinuousRecordingSaveButtonState.IDLE]: 'saveLastSnapshotButtonText',
|
|
25874
|
+
[ContinuousRecordingSaveButtonState.SAVING]: 'saveContinuousRecordingSavingText',
|
|
25875
|
+
[ContinuousRecordingSaveButtonState.SAVED]: 'saveContinuousRecordingSavedText',
|
|
25876
|
+
[ContinuousRecordingSaveButtonState.ERROR]: 'saveContinuousRecordingErrorText',
|
|
25877
|
+
};
|
|
25878
|
+
function getButtonStates(overrides) {
|
|
25879
|
+
var _a;
|
|
25880
|
+
const resolved = { ...buttonStates };
|
|
25881
|
+
for (const state of Object.keys(buttonStates)) {
|
|
25882
|
+
const overrideKey = buttonTooltipOverrideKeys[state];
|
|
25883
|
+
resolved[state] = {
|
|
25884
|
+
...buttonStates[state],
|
|
25885
|
+
tooltip: (_a = overrides[overrideKey]) !== null && _a !== void 0 ? _a : buttonStates[state].tooltip,
|
|
25886
|
+
};
|
|
25887
|
+
}
|
|
25888
|
+
return resolved;
|
|
25889
|
+
}
|
|
25890
|
+
function getContinuousRecordingSaveButtonStates(overrides) {
|
|
25891
|
+
var _a;
|
|
25892
|
+
const resolved = {
|
|
25893
|
+
...continuousRecordingSaveButtonStates,
|
|
25894
|
+
};
|
|
25895
|
+
for (const state of Object.keys(continuousRecordingSaveButtonStates)) {
|
|
25896
|
+
const overrideKey = continuousSaveTextOverrideKeys[state];
|
|
25897
|
+
resolved[state] = {
|
|
25898
|
+
...continuousRecordingSaveButtonStates[state],
|
|
25899
|
+
textContent: (_a = overrides[overrideKey]) !== null && _a !== void 0 ? _a : continuousRecordingSaveButtonStates[state].textContent,
|
|
25900
|
+
};
|
|
25901
|
+
}
|
|
25902
|
+
return resolved;
|
|
25903
|
+
}
|
|
25793
25904
|
|
|
25794
25905
|
|
|
25795
25906
|
/***/ },
|
|
@@ -25991,7 +26102,7 @@ class SessionWidget extends _observable__WEBPACK_IMPORTED_MODULE_0__.Observable
|
|
|
25991
26102
|
this._buttonState = newState;
|
|
25992
26103
|
if (!this.isBrowser)
|
|
25993
26104
|
return;
|
|
25994
|
-
const { icon, tooltip, classes, excludeClasses } = _buttonStateConfigs__WEBPACK_IMPORTED_MODULE_8__.
|
|
26105
|
+
const { icon, tooltip, classes, excludeClasses } = (0,_buttonStateConfigs__WEBPACK_IMPORTED_MODULE_8__.getButtonStates)(this._widgetTextOverrides)[newState];
|
|
25995
26106
|
if (newState === _buttonStateConfigs__WEBPACK_IMPORTED_MODULE_8__.ButtonState.CANCEL) {
|
|
25996
26107
|
(_a = this.buttonDraggabilityObserver) === null || _a === void 0 ? void 0 : _a.observe(this.recorderButton, {
|
|
25997
26108
|
attributes: true,
|
|
@@ -26029,7 +26140,8 @@ class SessionWidget extends _observable__WEBPACK_IMPORTED_MODULE_0__.Observable
|
|
|
26029
26140
|
type: 'error',
|
|
26030
26141
|
message: this._error,
|
|
26031
26142
|
button: {
|
|
26032
|
-
text: 'Close',
|
|
26143
|
+
text: 'Close',
|
|
26144
|
+
onClick: () => this.hideToast(),
|
|
26033
26145
|
},
|
|
26034
26146
|
});
|
|
26035
26147
|
}
|
|
@@ -26176,7 +26288,7 @@ class SessionWidget extends _observable__WEBPACK_IMPORTED_MODULE_0__.Observable
|
|
|
26176
26288
|
return;
|
|
26177
26289
|
const saveButton = this.initialPopover.querySelector('#mp-save-continuous-debug-session');
|
|
26178
26290
|
if (saveButton) {
|
|
26179
|
-
const { textContent, disabled } = _buttonStateConfigs__WEBPACK_IMPORTED_MODULE_8__.
|
|
26291
|
+
const { textContent, disabled } = (0,_buttonStateConfigs__WEBPACK_IMPORTED_MODULE_8__.getContinuousRecordingSaveButtonStates)(this._widgetTextOverrides)[state];
|
|
26180
26292
|
saveButton.disabled = disabled;
|
|
26181
26293
|
saveButton.textContent = textContent;
|
|
26182
26294
|
}
|
|
@@ -26204,14 +26316,11 @@ class SessionWidget extends _observable__WEBPACK_IMPORTED_MODULE_0__.Observable
|
|
|
26204
26316
|
return;
|
|
26205
26317
|
this.buttonDraggabilityObserver = new MutationObserver((mutationsList) => {
|
|
26206
26318
|
for (const mutation of mutationsList) {
|
|
26207
|
-
if (mutation.type === 'attributes' &&
|
|
26208
|
-
mutation.attributeName === 'class') {
|
|
26319
|
+
if (mutation.type === 'attributes' && mutation.attributeName === 'class') {
|
|
26209
26320
|
const oldClassName = mutation.oldValue;
|
|
26210
26321
|
const newClassName = mutation.target['className'];
|
|
26211
|
-
if (((oldClassName === null || oldClassName === void 0 ? void 0 : oldClassName.includes('no-draggable')) &&
|
|
26212
|
-
|
|
26213
|
-
((newClassName === null || newClassName === void 0 ? void 0 : newClassName.includes('no-draggable')) &&
|
|
26214
|
-
!(oldClassName === null || oldClassName === void 0 ? void 0 : oldClassName.includes('no-draggable')))) {
|
|
26322
|
+
if (((oldClassName === null || oldClassName === void 0 ? void 0 : oldClassName.includes('no-draggable')) && !newClassName.includes('no-draggable')) ||
|
|
26323
|
+
((newClassName === null || newClassName === void 0 ? void 0 : newClassName.includes('no-draggable')) && !(oldClassName === null || oldClassName === void 0 ? void 0 : oldClassName.includes('no-draggable')))) {
|
|
26215
26324
|
// draggable mode was changed
|
|
26216
26325
|
this.initialPopoverVisible = false;
|
|
26217
26326
|
this.finalPopoverVisible = false;
|
|
@@ -26305,7 +26414,12 @@ class SessionWidget extends _observable__WEBPACK_IMPORTED_MODULE_0__.Observable
|
|
|
26305
26414
|
popoverBottom = VIEWPORT_HEIGHT - top + _constants__WEBPACK_IMPORTED_MODULE_3__.POPOVER_DISTANCE_FROM_BUTTON + (isDraggable ? 0 : _constants__WEBPACK_IMPORTED_MODULE_3__.NON_DRAGGABLE_OFFSET);
|
|
26306
26415
|
popoverRight = VIEWPORT_WIDTH - right;
|
|
26307
26416
|
if (popoverBottom + POPOVER_HEIGHT > VIEWPORT_HEIGHT) {
|
|
26308
|
-
popoverBottom =
|
|
26417
|
+
popoverBottom =
|
|
26418
|
+
VIEWPORT_HEIGHT -
|
|
26419
|
+
bottom -
|
|
26420
|
+
POPOVER_HEIGHT -
|
|
26421
|
+
_constants__WEBPACK_IMPORTED_MODULE_3__.POPOVER_DISTANCE_FROM_BUTTON -
|
|
26422
|
+
(isDraggable ? 0 : _constants__WEBPACK_IMPORTED_MODULE_3__.NON_DRAGGABLE_OFFSET);
|
|
26309
26423
|
}
|
|
26310
26424
|
if (popoverRight + _constants__WEBPACK_IMPORTED_MODULE_3__.POPOVER_WIDTH > VIEWPORT_WIDTH) {
|
|
26311
26425
|
popoverRight = VIEWPORT_WIDTH - left - _constants__WEBPACK_IMPORTED_MODULE_3__.POPOVER_WIDTH;
|
|
@@ -26408,9 +26522,7 @@ class SessionWidget extends _observable__WEBPACK_IMPORTED_MODULE_0__.Observable
|
|
|
26408
26522
|
this.onCancel();
|
|
26409
26523
|
}
|
|
26410
26524
|
this.initialPopoverVisible = false;
|
|
26411
|
-
this.buttonState = this._continuousRecording
|
|
26412
|
-
? _buttonStateConfigs__WEBPACK_IMPORTED_MODULE_8__.ButtonState.CONTINUOUS_DEBUGGING
|
|
26413
|
-
: _buttonStateConfigs__WEBPACK_IMPORTED_MODULE_8__.ButtonState.IDLE;
|
|
26525
|
+
this.buttonState = this._continuousRecording ? _buttonStateConfigs__WEBPACK_IMPORTED_MODULE_8__.ButtonState.CONTINUOUS_DEBUGGING : _buttonStateConfigs__WEBPACK_IMPORTED_MODULE_8__.ButtonState.IDLE;
|
|
26414
26526
|
if (typeof document !== 'undefined') {
|
|
26415
26527
|
document.removeEventListener('click', this.handleClickOutside);
|
|
26416
26528
|
}
|
|
@@ -26477,9 +26589,7 @@ class SessionWidget extends _observable__WEBPACK_IMPORTED_MODULE_0__.Observable
|
|
|
26477
26589
|
}
|
|
26478
26590
|
}
|
|
26479
26591
|
else {
|
|
26480
|
-
this.buttonState = this._initialPopoverVisible
|
|
26481
|
-
? _buttonStateConfigs__WEBPACK_IMPORTED_MODULE_8__.ButtonState.IDLE
|
|
26482
|
-
: _buttonStateConfigs__WEBPACK_IMPORTED_MODULE_8__.ButtonState.CANCEL;
|
|
26592
|
+
this.buttonState = this._initialPopoverVisible ? _buttonStateConfigs__WEBPACK_IMPORTED_MODULE_8__.ButtonState.IDLE : _buttonStateConfigs__WEBPACK_IMPORTED_MODULE_8__.ButtonState.CANCEL;
|
|
26483
26593
|
this.initialPopoverVisible = !this._initialPopoverVisible;
|
|
26484
26594
|
}
|
|
26485
26595
|
if (typeof document !== 'undefined') {
|