@multiplayer-app/session-recorder-browser 1.3.16 → 1.3.17-session-buffering.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/dist/browser/index.js +1224 -174
  2. package/dist/config/constants.d.ts +1 -0
  3. package/dist/config/constants.d.ts.map +1 -1
  4. package/dist/config/constants.js +2 -0
  5. package/dist/config/constants.js.map +1 -1
  6. package/dist/config/defaults.d.ts.map +1 -1
  7. package/dist/config/defaults.js +5 -0
  8. package/dist/config/defaults.js.map +1 -1
  9. package/dist/config/session-recorder.d.ts.map +1 -1
  10. package/dist/config/session-recorder.js +6 -1
  11. package/dist/config/session-recorder.js.map +1 -1
  12. package/dist/exporters/index.js +1 -1
  13. package/dist/exporters/index.js.LICENSE.txt +2 -0
  14. package/dist/exporters/index.js.map +1 -1
  15. package/dist/index.js +1216 -175
  16. package/dist/index.js.map +1 -1
  17. package/dist/index.umd.js +1214 -174
  18. package/dist/index.umd.js.map +1 -1
  19. package/dist/otel/index.d.ts +7 -1
  20. package/dist/otel/index.d.ts.map +1 -1
  21. package/dist/otel/index.js +63 -3
  22. package/dist/otel/index.js.map +1 -1
  23. package/dist/patch/fetch.js +2 -2
  24. package/dist/patch/fetch.js.map +1 -1
  25. package/dist/rrweb/index.d.ts +50 -17
  26. package/dist/rrweb/index.d.ts.map +1 -1
  27. package/dist/rrweb/index.js +158 -84
  28. package/dist/rrweb/index.js.map +1 -1
  29. package/dist/services/crashBuffer.service.d.ts +60 -0
  30. package/dist/services/crashBuffer.service.d.ts.map +1 -0
  31. package/dist/services/crashBuffer.service.js +161 -0
  32. package/dist/services/crashBuffer.service.js.map +1 -0
  33. package/dist/services/indexedDb.service.d.ts +72 -0
  34. package/dist/services/indexedDb.service.d.ts.map +1 -0
  35. package/dist/services/indexedDb.service.js +335 -0
  36. package/dist/services/indexedDb.service.js.map +1 -0
  37. package/dist/services/socket.service.d.ts +3 -2
  38. package/dist/services/socket.service.d.ts.map +1 -1
  39. package/dist/services/socket.service.js +8 -1
  40. package/dist/services/socket.service.js.map +1 -1
  41. package/dist/session-recorder.d.ts +12 -1
  42. package/dist/session-recorder.d.ts.map +1 -1
  43. package/dist/session-recorder.js +155 -7
  44. package/dist/session-recorder.js.map +1 -1
  45. package/dist/types/session-recorder.d.ts +20 -0
  46. package/dist/types/session-recorder.d.ts.map +1 -1
  47. package/dist/types/session-recorder.js.map +1 -1
  48. package/dist/utils/index.d.ts +1 -0
  49. package/dist/utils/index.d.ts.map +1 -1
  50. package/dist/utils/index.js +1 -0
  51. package/dist/utils/index.js.map +1 -1
  52. package/dist/utils/storage.d.ts +4 -1
  53. package/dist/utils/storage.d.ts.map +1 -1
  54. package/dist/utils/storage.js +35 -13
  55. package/dist/utils/storage.js.map +1 -1
  56. package/dist/utils/tabId.d.ts +2 -0
  57. package/dist/utils/tabId.d.ts.map +1 -0
  58. package/dist/utils/tabId.js +22 -0
  59. package/dist/utils/tabId.js.map +1 -0
  60. package/package.json +2 -2
  61. package/dist/rrweb/indexedDbService.d.ts +0 -9
  62. package/dist/rrweb/indexedDbService.d.ts.map +0 -1
  63. package/dist/rrweb/indexedDbService.js +0 -54
  64. package/dist/rrweb/indexedDbService.js.map +0 -1
package/dist/index.js CHANGED
@@ -24121,6 +24121,7 @@ module.exports = {
24121
24121
  /* harmony export */ SESSION_ID_PROP_NAME: () => (/* binding */ SESSION_ID_PROP_NAME),
24122
24122
  /* harmony export */ SESSION_PROP_NAME: () => (/* binding */ SESSION_PROP_NAME),
24123
24123
  /* harmony export */ SESSION_RESPONSE: () => (/* binding */ SESSION_RESPONSE),
24124
+ /* harmony export */ SESSION_SAVE_BUFFER_EVENT: () => (/* binding */ SESSION_SAVE_BUFFER_EVENT),
24124
24125
  /* harmony export */ SESSION_STARTED_EVENT: () => (/* binding */ SESSION_STARTED_EVENT),
24125
24126
  /* harmony export */ SESSION_STATE_PROP_NAME: () => (/* binding */ SESSION_STATE_PROP_NAME),
24126
24127
  /* harmony export */ SESSION_STOPPED_EVENT: () => (/* binding */ SESSION_STOPPED_EVENT),
@@ -24142,6 +24143,8 @@ const SESSION_SUBSCRIBE_EVENT = 'debug-session:subscribe';
24142
24143
  const SESSION_UNSUBSCRIBE_EVENT = 'debug-session:unsubscribe';
24143
24144
  const SESSION_AUTO_CREATED = 'debug-session:auto-created';
24144
24145
  const SESSION_ADD_EVENT = 'debug-session:rrweb:add-event';
24146
+ // Backend-triggered flush of client-side crash buffer
24147
+ const SESSION_SAVE_BUFFER_EVENT = 'debug-session:save-buffer';
24145
24148
  const SOCKET_SET_USER_EVENT = 'socket:set-user';
24146
24149
  const DEFAULT_MAX_HTTP_CAPTURING_PAYLOAD_SIZE = 100000;
24147
24150
  const SESSION_RESPONSE = 'multiplayer-debug-session-response';
@@ -24149,7 +24152,7 @@ const CONTINUOUS_DEBUGGING_TIMEOUT = 60000; // 1 minutes
24149
24152
  const DEBUG_SESSION_MAX_DURATION_SECONDS = 10 * 60 + 30; // TODO: move to shared config otel core
24150
24153
  const REMOTE_SESSION_RECORDING_START = 'remote-session-recording:start';
24151
24154
  const REMOTE_SESSION_RECORDING_STOP = 'remote-session-recording:stop';
24152
- const PACKAGE_VERSION_EXPORT = "1.3.16" || 0;
24155
+ const PACKAGE_VERSION_EXPORT = "1.3.17-session-buffering.0" || 0;
24153
24156
  // Regex patterns for OpenTelemetry ignore URLs
24154
24157
  const OTEL_IGNORE_URLS = [
24155
24158
  // Traces endpoint
@@ -24244,6 +24247,11 @@ const BASE_CONFIG = {
24244
24247
  masking: DEFAULT_MASKING_CONFIG,
24245
24248
  widgetTextOverrides: DEFAULT_WIDGET_TEXT_CONFIG,
24246
24249
  useWebsocket: true,
24250
+ buffering: {
24251
+ enabled: true,
24252
+ windowMinutes: 1,
24253
+ snapshotIntervalMs: 30000,
24254
+ },
24247
24255
  };
24248
24256
 
24249
24257
 
@@ -24268,6 +24276,7 @@ const BASE_CONFIG = {
24268
24276
  /* harmony export */ SESSION_ID_PROP_NAME: () => (/* reexport safe */ _constants__WEBPACK_IMPORTED_MODULE_0__.SESSION_ID_PROP_NAME),
24269
24277
  /* harmony export */ SESSION_PROP_NAME: () => (/* reexport safe */ _constants__WEBPACK_IMPORTED_MODULE_0__.SESSION_PROP_NAME),
24270
24278
  /* harmony export */ SESSION_RESPONSE: () => (/* reexport safe */ _constants__WEBPACK_IMPORTED_MODULE_0__.SESSION_RESPONSE),
24279
+ /* harmony export */ SESSION_SAVE_BUFFER_EVENT: () => (/* reexport safe */ _constants__WEBPACK_IMPORTED_MODULE_0__.SESSION_SAVE_BUFFER_EVENT),
24271
24280
  /* harmony export */ SESSION_STARTED_EVENT: () => (/* reexport safe */ _constants__WEBPACK_IMPORTED_MODULE_0__.SESSION_STARTED_EVENT),
24272
24281
  /* harmony export */ SESSION_STATE_PROP_NAME: () => (/* reexport safe */ _constants__WEBPACK_IMPORTED_MODULE_0__.SESSION_STATE_PROP_NAME),
24273
24282
  /* harmony export */ SESSION_STOPPED_EVENT: () => (/* reexport safe */ _constants__WEBPACK_IMPORTED_MODULE_0__.SESSION_STOPPED_EVENT),
@@ -24382,7 +24391,7 @@ const getWidgetTextOverridesConfig = (config, defaultConfig) => {
24382
24391
  };
24383
24392
  };
24384
24393
  const getSessionRecorderConfig = (c) => {
24385
- var _a;
24394
+ var _a, _b, _c, _d, _e, _f, _g;
24386
24395
  if (!c) {
24387
24396
  return _defaults__WEBPACK_IMPORTED_MODULE_1__.BASE_CONFIG;
24388
24397
  }
@@ -24409,6 +24418,11 @@ const getSessionRecorderConfig = (c) => {
24409
24418
  masking: (0,_masking__WEBPACK_IMPORTED_MODULE_2__.getMaskingConfig)(c.masking),
24410
24419
  widgetTextOverrides: getWidgetTextOverridesConfig(c.widgetTextOverrides, _defaults__WEBPACK_IMPORTED_MODULE_1__.BASE_CONFIG.widgetTextOverrides),
24411
24420
  useWebsocket: (0,_validators__WEBPACK_IMPORTED_MODULE_3__.isValidBoolean)(c.useWebsocket, (_a = _defaults__WEBPACK_IMPORTED_MODULE_1__.BASE_CONFIG.useWebsocket) !== null && _a !== void 0 ? _a : false),
24421
+ buffering: {
24422
+ enabled: (_c = (_b = c.buffering) === null || _b === void 0 ? void 0 : _b.enabled) !== null && _c !== void 0 ? _c : _defaults__WEBPACK_IMPORTED_MODULE_1__.BASE_CONFIG.buffering.enabled,
24423
+ windowMinutes: (_e = (_d = c.buffering) === null || _d === void 0 ? void 0 : _d.windowMinutes) !== null && _e !== void 0 ? _e : _defaults__WEBPACK_IMPORTED_MODULE_1__.BASE_CONFIG.buffering.windowMinutes,
24424
+ snapshotIntervalMs: (_g = (_f = c.buffering) === null || _f === void 0 ? void 0 : _f.snapshotIntervalMs) !== null && _g !== void 0 ? _g : _defaults__WEBPACK_IMPORTED_MODULE_1__.BASE_CONFIG.buffering.snapshotIntervalMs,
24425
+ },
24412
24426
  };
24413
24427
  };
24414
24428
 
@@ -25049,14 +25063,19 @@ const getElementTextContent = (element) => {
25049
25063
  class TracerBrowserSDK {
25050
25064
  constructor() {
25051
25065
  this.sessionId = '';
25066
+ this.clientId = '';
25052
25067
  this.globalErrorListenersRegistered = false;
25053
25068
  }
25054
- setSessionId(sessionId, sessionType = _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_1__.SessionType.PLAIN) {
25069
+ setSessionId(sessionId, sessionType = _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_1__.SessionType.MANUAL) {
25055
25070
  this.sessionId = sessionId;
25056
- this.idGenerator.setSessionId(sessionId, sessionType);
25071
+ if (!this.idGenerator) {
25072
+ throw new Error('Id generator not initialized');
25073
+ }
25074
+ this.idGenerator.setSessionId(sessionId, sessionType, this.clientId);
25057
25075
  }
25058
25076
  init(options) {
25059
25077
  this.config = options;
25078
+ this.clientId = _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_1__.SessionRecorderSdk.getIdGenerator(_multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_1__.MULTIPLAYER_TRACE_CLIENT_ID_LENGTH)();
25060
25079
  const { application, version, environment } = this.config;
25061
25080
  this.idGenerator = new _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_1__.SessionRecorderIdGenerator();
25062
25081
  this.exporter = new _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_1__.SessionRecorderBrowserTraceExporter({
@@ -25074,6 +25093,7 @@ class TracerBrowserSDK {
25074
25093
  sampler: new _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_1__.SessionRecorderTraceIdRatioBasedSampler(this.config.sampleTraceRatio),
25075
25094
  spanProcessors: [
25076
25095
  this._getSpanSessionIdProcessor(),
25096
+ this._getCrashBufferSpanProcessor(),
25077
25097
  new _opentelemetry_sdk_trace_base__WEBPACK_IMPORTED_MODULE_7__.BatchSpanProcessor(this.exporter),
25078
25098
  ],
25079
25099
  });
@@ -25190,6 +25210,60 @@ class TracerBrowserSDK {
25190
25210
  });
25191
25211
  this._registerGlobalErrorListeners();
25192
25212
  }
25213
+ setCrashBuffer(crashBuffer) {
25214
+ this.crashBuffer = crashBuffer;
25215
+ }
25216
+ _getCrashBufferSpanProcessor() {
25217
+ return {
25218
+ onStart: () => { },
25219
+ onEnd: (span) => {
25220
+ // Only buffer spans when we don't have an active debug session.
25221
+ if (this.sessionId)
25222
+ return;
25223
+ if (!this.crashBuffer)
25224
+ return;
25225
+ try {
25226
+ const now = Date.now();
25227
+ this.crashBuffer.appendOtelSpan({
25228
+ ts: now,
25229
+ span: this._serializeSpan(span),
25230
+ });
25231
+ }
25232
+ catch (_e) {
25233
+ // ignore
25234
+ }
25235
+ },
25236
+ shutdown: () => Promise.resolve(),
25237
+ forceFlush: () => Promise.resolve(),
25238
+ };
25239
+ }
25240
+ _serializeSpan(span) {
25241
+ var _a, _b;
25242
+ const spanContext = ((_a = span === null || span === void 0 ? void 0 : span.spanContext) === null || _a === void 0 ? void 0 : _a.call(span))
25243
+ ? span.spanContext()
25244
+ : span === null || span === void 0 ? void 0 : span._spanContext;
25245
+ return {
25246
+ _spanContext: spanContext,
25247
+ name: span === null || span === void 0 ? void 0 : span.name,
25248
+ kind: span === null || span === void 0 ? void 0 : span.kind,
25249
+ links: span === null || span === void 0 ? void 0 : span.links,
25250
+ ended: span === null || span === void 0 ? void 0 : span.ended,
25251
+ events: span === null || span === void 0 ? void 0 : span.events,
25252
+ status: span === null || span === void 0 ? void 0 : span.status,
25253
+ endTime: span === null || span === void 0 ? void 0 : span.endTime,
25254
+ startTime: span === null || span === void 0 ? void 0 : span.startTime,
25255
+ duration: span === null || span === void 0 ? void 0 : span.duration,
25256
+ attributes: span === null || span === void 0 ? void 0 : span.attributes,
25257
+ parentSpanId: (_b = span === null || span === void 0 ? void 0 : span.parentSpanContext) === null || _b === void 0 ? void 0 : _b.spanId,
25258
+ droppedAttributesCount: span === null || span === void 0 ? void 0 : span.droppedAttributesCount,
25259
+ droppedEventsCount: span === null || span === void 0 ? void 0 : span.droppedEventsCount,
25260
+ droppedLinksCount: span === null || span === void 0 ? void 0 : span.droppedLinksCount,
25261
+ resource: (span === null || span === void 0 ? void 0 : span.resource) ? {
25262
+ attributes: span.resource.attributes,
25263
+ asyncAttributesPending: span.resource.asyncAttributesPending,
25264
+ } : undefined,
25265
+ };
25266
+ }
25193
25267
  start(sessionId, sessionType) {
25194
25268
  if (!this.tracerProvider) {
25195
25269
  throw new Error('Configuration not initialized. Call init() before start().');
@@ -25333,7 +25407,7 @@ const setShouldRecordHttpData = (shouldRecordBody, shouldRecordHeaders) => {
25333
25407
 
25334
25408
 
25335
25409
 
25336
- function _tryReadFetchBody({ body, url }) {
25410
+ function _tryReadFetchBody({ body, url, }) {
25337
25411
  if ((0,_utils_type_utils__WEBPACK_IMPORTED_MODULE_0__.isNullish)(body)) {
25338
25412
  return null;
25339
25413
  }
@@ -25506,7 +25580,7 @@ if (typeof window !== 'undefined' && typeof window.fetch !== 'undefined') {
25506
25580
  if (!(0,_utils_type_utils__WEBPACK_IMPORTED_MODULE_0__.isNullish)(candidateBody)) {
25507
25581
  const requestBody = _tryReadFetchBody({
25508
25582
  body: candidateBody,
25509
- url: urlStr
25583
+ url: urlStr,
25510
25584
  });
25511
25585
  if ((requestBody === null || requestBody === void 0 ? void 0 : requestBody.length) && new Blob([requestBody]).size <= _configs__WEBPACK_IMPORTED_MODULE_2__.configs.maxCapturingHttpPayloadSize) {
25512
25586
  networkRequest.requestBody = requestBody;
@@ -25701,11 +25775,13 @@ if (typeof XMLHttpRequest !== 'undefined') {
25701
25775
  /* harmony export */ RecorderBrowserSDK: () => (/* binding */ RecorderBrowserSDK)
25702
25776
  /* harmony export */ });
25703
25777
  /* harmony import */ var _rrweb_packer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @rrweb/packer */ "../../node_modules/@rrweb/packer/dist/packer.js");
25704
- /* harmony import */ var rrweb__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! rrweb */ "../../node_modules/rrweb/dist/rrweb.js");
25705
- /* harmony import */ var _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @multiplayer-app/session-recorder-common */ "../session-recorder-common/dist/esm/index-browser.js");
25706
- /* harmony import */ var _rrweb_rrweb_plugin_console_record__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @rrweb/rrweb-plugin-console-record */ "../../node_modules/@rrweb/rrweb-plugin-console-record/dist/rrweb-plugin-console-record.js");
25707
- /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils */ "./src/utils/index.ts");
25708
- /* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../config */ "./src/config/index.ts");
25778
+ /* harmony import */ var _rrweb_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @rrweb/types */ "../../node_modules/@rrweb/types/dist/types.js");
25779
+ /* harmony import */ var rrweb__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! rrweb */ "../../node_modules/rrweb/dist/rrweb.js");
25780
+ /* harmony import */ var _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @multiplayer-app/session-recorder-common */ "../session-recorder-common/dist/esm/index-browser.js");
25781
+ /* harmony import */ var _rrweb_rrweb_plugin_console_record__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @rrweb/rrweb-plugin-console-record */ "../../node_modules/@rrweb/rrweb-plugin-console-record/dist/rrweb-plugin-console-record.js");
25782
+ /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils */ "./src/utils/index.ts");
25783
+ /* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../config */ "./src/config/index.ts");
25784
+
25709
25785
 
25710
25786
 
25711
25787
 
@@ -25713,129 +25789,202 @@ if (typeof XMLHttpRequest !== 'undefined') {
25713
25789
 
25714
25790
 
25715
25791
  class RecorderBrowserSDK {
25716
- get startedAt() {
25717
- return this._startedAt;
25718
- }
25719
- set startedAt(v) {
25720
- this._startedAt = v;
25721
- }
25722
- get stoppedAt() {
25723
- return this._stoppedAt;
25724
- }
25725
- set stoppedAt(v) {
25726
- this._stoppedAt = v;
25727
- }
25728
25792
  constructor() {
25729
- this.restartInterval = null;
25730
- this._startedAt = '';
25731
- this._stoppedAt = '';
25793
+ this.intervals = {
25794
+ restart: null,
25795
+ bufferSnapshot: null,
25796
+ };
25797
+ this.startedAt = '';
25798
+ this.stoppedAt = '';
25799
+ }
25800
+ /**
25801
+ * Full snapshot.
25802
+ */
25803
+ takeFullSnapshot() {
25804
+ rrweb__WEBPACK_IMPORTED_MODULE_6__.record.takeFullSnapshot();
25732
25805
  }
25733
25806
  /**
25734
- * Initializes the recorder SDK with configuration settings.
25735
- * @param config - Configuration settings for the session debugger.
25736
- * @param socketService - Optional socket service instance for sending events.
25807
+ * Initializes the recorder SDK.
25808
+ * @param config - Configuration settings.
25809
+ * @param socketService - Optional socket service.
25737
25810
  */
25738
25811
  init(config, socketService) {
25739
25812
  this.config = config;
25740
25813
  this.socketService = socketService;
25741
25814
  }
25742
25815
  /**
25743
- * Starts recording events for a given session ID.
25744
- * @param sessionId - The ID of the session to record events for.
25816
+ * Starts recording.
25817
+ * @param sessionId - Session ID or null for buffer-only mode.
25818
+ * @param sessionType - Session type.
25745
25819
  */
25746
25820
  start(sessionId, sessionType) {
25747
- var _a;
25748
25821
  if (!this.config) {
25749
25822
  throw new Error('Configuration not initialized. Call init() before start().');
25750
25823
  }
25751
- const restartInterval = sessionType === _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_1__.SessionType.CONTINUOUS ? _config__WEBPACK_IMPORTED_MODULE_4__.CONTINUOUS_DEBUGGING_TIMEOUT : 0;
25752
25824
  this.startedAt = new Date().toISOString();
25753
- // Build masking configuration
25754
- const maskingConfig = this.config.masking || {};
25825
+ this.stopFn = (0,rrweb__WEBPACK_IMPORTED_MODULE_6__.record)({
25826
+ ...this._buildRecordOptions(),
25827
+ emit: async (event) => {
25828
+ const ts = event.timestamp;
25829
+ if (!sessionId) {
25830
+ await this._handleBufferOnlyEvent(event, ts);
25831
+ return;
25832
+ }
25833
+ this._handleLiveSessionEvent(event, ts, sessionId, sessionType);
25834
+ },
25835
+ });
25836
+ this.takeFullSnapshot();
25837
+ this._setupPeriodicSnapshots(sessionId, sessionType);
25838
+ }
25839
+ /**
25840
+ * Restarts recording. Never throws - library mode constraint.
25841
+ */
25842
+ async restart(sessionId, sessionType) {
25843
+ var _a;
25844
+ try {
25845
+ (_a = this.stopFn) === null || _a === void 0 ? void 0 : _a.call(this);
25846
+ this.start(sessionId, sessionType);
25847
+ }
25848
+ catch (_e) {
25849
+ // Silent failure
25850
+ }
25851
+ }
25852
+ /**
25853
+ * Stops recording and cleans up resources.
25854
+ */
25855
+ stop() {
25856
+ var _a, _b, _c;
25857
+ (_a = this.stopFn) === null || _a === void 0 ? void 0 : _a.call(this);
25858
+ if (!((_b = this.config) === null || _b === void 0 ? void 0 : _b.useWebsocket)) {
25859
+ (_c = this.socketService) === null || _c === void 0 ? void 0 : _c.close();
25860
+ }
25861
+ this._clearAllIntervals();
25862
+ }
25863
+ _clearAllIntervals() {
25864
+ if (this.intervals.restart) {
25865
+ clearInterval(this.intervals.restart);
25866
+ this.intervals.restart = null;
25867
+ }
25868
+ if (this.intervals.bufferSnapshot) {
25869
+ clearInterval(this.intervals.bufferSnapshot);
25870
+ this.intervals.bufferSnapshot = null;
25871
+ }
25872
+ }
25873
+ /**
25874
+ * Sets the crash buffer.
25875
+ * @param crashBuffer - Crash buffer service.
25876
+ */
25877
+ setCrashBuffer(crashBuffer) {
25878
+ this.crashBuffer = crashBuffer;
25879
+ }
25880
+ /**
25881
+ * Mutates event in-place for performance.
25882
+ */
25883
+ _applyConsoleMasking(event) {
25884
+ var _a, _b;
25885
+ const maskFn = (_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.masking) === null || _b === void 0 ? void 0 : _b.maskConsoleEvent;
25886
+ if (typeof maskFn === 'function' && (0,_utils__WEBPACK_IMPORTED_MODULE_4__.isConsoleEvent)(event)) {
25887
+ const pluginEvt = event;
25888
+ const maskedPayload = maskFn(pluginEvt.data.payload);
25889
+ pluginEvt.data = { ...pluginEvt.data, payload: maskedPayload };
25890
+ }
25891
+ }
25892
+ /**
25893
+ * Handles buffer-only event.
25894
+ * @param event - Event.
25895
+ * @param ts - Timestamp.
25896
+ */
25897
+ async _handleBufferOnlyEvent(event, ts) {
25898
+ if (!this.crashBuffer)
25899
+ return;
25900
+ try {
25901
+ this._applyConsoleMasking(event);
25902
+ const packedEvent = (0,_rrweb_packer__WEBPACK_IMPORTED_MODULE_0__.pack)(event);
25903
+ this.stoppedAt = new Date(ts).toISOString();
25904
+ await this.crashBuffer.appendRrwebEvent({
25905
+ ts,
25906
+ isFullSnapshot: event.type === _rrweb_types__WEBPACK_IMPORTED_MODULE_1__.EventType.FullSnapshot,
25907
+ event: {
25908
+ event: packedEvent,
25909
+ eventType: event.type,
25910
+ timestamp: ts,
25911
+ },
25912
+ });
25913
+ }
25914
+ catch (error) {
25915
+ // Silent failure - library constraint
25916
+ }
25917
+ }
25918
+ /**
25919
+ * Handles live session event.
25920
+ * @param event - Event.
25921
+ * @param ts - Timestamp.
25922
+ * @param sessionId - Session ID.
25923
+ * @param sessionType - Session type.
25924
+ */
25925
+ _handleLiveSessionEvent(event, ts, sessionId, sessionType) {
25926
+ if (!this.socketService)
25927
+ return;
25928
+ this._applyConsoleMasking(event);
25929
+ const packedEvent = (0,_rrweb_packer__WEBPACK_IMPORTED_MODULE_0__.pack)(event);
25930
+ this.stoppedAt = new Date(ts).toISOString();
25931
+ this.socketService.send({
25932
+ event: packedEvent,
25933
+ eventType: event.type,
25934
+ timestamp: ts,
25935
+ debugSessionId: sessionId,
25936
+ debugSessionType: sessionType,
25937
+ });
25938
+ }
25939
+ /**
25940
+ * Builds record options.
25941
+ */
25942
+ _buildRecordOptions() {
25943
+ var _a, _b, _c;
25944
+ const maskingConfig = ((_a = this.config) === null || _a === void 0 ? void 0 : _a.masking) || {};
25755
25945
  const options = {
25756
- maskAllInputs: (_a = maskingConfig.maskAllInputs) !== null && _a !== void 0 ? _a : true,
25946
+ maskAllInputs: (_b = maskingConfig.maskAllInputs) !== null && _b !== void 0 ? _b : true,
25757
25947
  sampling: { canvas: 5 },
25758
- recordCanvas: this.config.recordCanvas,
25948
+ recordCanvas: (_c = this.config) === null || _c === void 0 ? void 0 : _c.recordCanvas,
25759
25949
  dataURLOptions: { type: 'image/webp', quality: 0.1 },
25760
- plugins: [
25761
- (0,_rrweb_rrweb_plugin_console_record__WEBPACK_IMPORTED_MODULE_2__.getRecordConsolePlugin)({ level: ['log', 'error'] }),
25762
- ],
25950
+ plugins: [(0,_rrweb_rrweb_plugin_console_record__WEBPACK_IMPORTED_MODULE_3__.getRecordConsolePlugin)({ level: ['log', 'error'] })],
25763
25951
  };
25764
- // Add mask input options if provided
25765
25952
  if (maskingConfig.maskInputOptions) {
25766
25953
  options.maskInputOptions = maskingConfig.maskInputOptions;
25767
25954
  }
25768
- // Add mask text class if provided
25769
25955
  if (maskingConfig.maskTextClass) {
25770
25956
  options.maskTextClass = maskingConfig.maskTextClass;
25771
25957
  }
25772
- // Add mask text selector if provided
25773
25958
  if (maskingConfig.maskTextSelector) {
25774
25959
  options.maskTextSelector = maskingConfig.maskTextSelector;
25775
25960
  }
25776
- // Add custom masking functions if provided
25777
25961
  if (typeof maskingConfig.maskInput === 'function') {
25778
25962
  options.maskInputFn = maskingConfig.maskInput;
25779
25963
  }
25780
25964
  if (typeof maskingConfig.maskText === 'function') {
25781
25965
  options.maskTextFn = maskingConfig.maskText;
25782
25966
  }
25783
- this.stopFn = (0,rrweb__WEBPACK_IMPORTED_MODULE_5__.record)({
25784
- ...options,
25785
- emit: async (event) => {
25786
- if (this.socketService) {
25787
- if (typeof maskingConfig.maskConsoleEvent === 'function' && (0,_utils__WEBPACK_IMPORTED_MODULE_3__.isConsoleEvent)(event)) {
25788
- const { data } = event;
25789
- const maskedPayload = maskingConfig.maskConsoleEvent(data.payload);
25790
- event.data = { ...data, payload: maskedPayload };
25791
- }
25792
- const packedEvent = (0,_rrweb_packer__WEBPACK_IMPORTED_MODULE_0__.pack)(event);
25793
- this.stoppedAt = new Date(event.timestamp).toISOString();
25794
- this.socketService.send({
25795
- event: packedEvent,
25796
- eventType: event.type,
25797
- timestamp: event.timestamp,
25798
- debugSessionId: sessionId,
25799
- debugSessionType: sessionType,
25800
- });
25801
- }
25802
- },
25803
- });
25804
- // It will sent full snapshot again but it will fix missing first snapshot issue
25805
- rrweb__WEBPACK_IMPORTED_MODULE_5__.record.takeFullSnapshot();
25806
- if (restartInterval > 0) {
25807
- this.restartInterval = setInterval(() => {
25808
- rrweb__WEBPACK_IMPORTED_MODULE_5__.record.takeFullSnapshot();
25809
- }, restartInterval);
25810
- }
25811
- }
25812
- /**
25813
- * Restarts the recording of events.
25814
- */
25815
- async restart(sessionId, sessionType) {
25816
- var _a;
25817
- (_a = this.stopFn) === null || _a === void 0 ? void 0 : _a.call(this);
25818
- this.start(sessionId, sessionType);
25967
+ return options;
25819
25968
  }
25820
25969
  /**
25821
- * Clears the restart timeout.
25970
+ * Sets up periodic snapshots.
25971
+ * @param sessionId - Session ID.
25972
+ * @param sessionType - Session type.
25822
25973
  */
25823
- clearRestartInterval() {
25824
- if (this.restartInterval) {
25825
- clearInterval(this.restartInterval);
25826
- this.restartInterval = null;
25974
+ _setupPeriodicSnapshots(sessionId, sessionType) {
25975
+ var _a, _b;
25976
+ this._clearAllIntervals();
25977
+ if (sessionType === _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_2__.SessionType.CONTINUOUS) {
25978
+ this.intervals.restart = setInterval(() => {
25979
+ this.takeFullSnapshot();
25980
+ }, _config__WEBPACK_IMPORTED_MODULE_5__.CONTINUOUS_DEBUGGING_TIMEOUT);
25827
25981
  }
25828
- }
25829
- /**
25830
- * Stops the recording of events.
25831
- */
25832
- stop() {
25833
- var _a, _b, _c;
25834
- (_a = this.stopFn) === null || _a === void 0 ? void 0 : _a.call(this);
25835
- if (!((_b = this.config) === null || _b === void 0 ? void 0 : _b.useWebsocket)) {
25836
- (_c = this.socketService) === null || _c === void 0 ? void 0 : _c.close();
25982
+ if (!sessionId && ((_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.buffering) === null || _b === void 0 ? void 0 : _b.enabled)) {
25983
+ const interval = this.config.buffering.snapshotIntervalMs || 30000;
25984
+ this.intervals.bufferSnapshot = setInterval(() => {
25985
+ this.takeFullSnapshot();
25986
+ }, interval);
25837
25987
  }
25838
- this.clearRestartInterval();
25839
25988
  }
25840
25989
  }
25841
25990
 
@@ -25986,6 +26135,526 @@ class ApiService {
25986
26135
  }
25987
26136
 
25988
26137
 
26138
+ /***/ }),
26139
+
26140
+ /***/ "./src/services/crashBuffer.service.ts":
26141
+ /*!*********************************************!*\
26142
+ !*** ./src/services/crashBuffer.service.ts ***!
26143
+ \*********************************************/
26144
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
26145
+
26146
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
26147
+ /* harmony export */ CrashBufferService: () => (/* binding */ CrashBufferService)
26148
+ /* harmony export */ });
26149
+ class CrashBufferService {
26150
+ constructor(db, tabId, windowMs) {
26151
+ this.db = db;
26152
+ this.tabId = tabId;
26153
+ this.windowMs = windowMs;
26154
+ this.lastPruneAt = 0;
26155
+ this.pruneInFlight = null;
26156
+ this.isActive = true;
26157
+ this.frozenAtTs = null;
26158
+ this.lastSeenEventTs = 0;
26159
+ this.requiresFullSnapshot = true;
26160
+ this.lastTouchAt = 0;
26161
+ }
26162
+ async _safe(fn, fallback) {
26163
+ try {
26164
+ return await fn();
26165
+ }
26166
+ catch (_e) {
26167
+ return fallback;
26168
+ }
26169
+ }
26170
+ async setAttrs(attrs) {
26171
+ await this._safe(async () => {
26172
+ await this.db.setAttrs({
26173
+ tabId: this.tabId,
26174
+ ...attrs,
26175
+ });
26176
+ }, undefined);
26177
+ }
26178
+ async appendRrwebEvent(payload) {
26179
+ this.lastSeenEventTs = Math.max(this.lastSeenEventTs, payload.ts || 0);
26180
+ if (!this.isActive)
26181
+ return;
26182
+ const isFullSnapshot = Boolean(payload.isFullSnapshot);
26183
+ if (this.requiresFullSnapshot && !isFullSnapshot) {
26184
+ // Buffer must always start with a full snapshot; drop incrementals until we see one.
26185
+ return;
26186
+ }
26187
+ await this._safe(async () => {
26188
+ await this.db.appendRrwebEvent({
26189
+ tabId: this.tabId,
26190
+ ts: payload.ts,
26191
+ isFullSnapshot: payload.isFullSnapshot,
26192
+ event: payload.event,
26193
+ });
26194
+ }, undefined);
26195
+ if (isFullSnapshot && this.requiresFullSnapshot) {
26196
+ // Ensure this snapshot becomes the first replayable event.
26197
+ // We keep the snapshot itself and prune everything older.
26198
+ await this._safe(() => this.db.pruneOlderThan(this.tabId, Math.max(0, payload.ts - 1)), undefined);
26199
+ this.requiresFullSnapshot = false;
26200
+ }
26201
+ else if (isFullSnapshot) {
26202
+ this.requiresFullSnapshot = false;
26203
+ }
26204
+ this.pruneSoon();
26205
+ }
26206
+ async appendOtelSpan(payload) {
26207
+ this.lastSeenEventTs = Math.max(this.lastSeenEventTs, payload.ts || 0);
26208
+ if (!this.isActive)
26209
+ return;
26210
+ await this._safe(async () => {
26211
+ await this.db.appendOtelSpan({
26212
+ tabId: this.tabId,
26213
+ ts: payload.ts,
26214
+ span: payload.span,
26215
+ });
26216
+ }, undefined);
26217
+ this.pruneSoon();
26218
+ }
26219
+ async snapshot(now = Date.now()) {
26220
+ const toTs = now;
26221
+ const fromTs = Math.max(0, toTs - this.windowMs);
26222
+ // Always include a full snapshot "anchor" if one exists at/before the window start.
26223
+ const rrwebFromTs = await this._safe(async () => {
26224
+ const anchor = await this.db.getLastRrwebFullSnapshotBefore(this.tabId, fromTs);
26225
+ return typeof (anchor === null || anchor === void 0 ? void 0 : anchor.ts) === 'number' ? anchor.ts : fromTs;
26226
+ }, fromTs);
26227
+ const [rrweb, spans, attrs] = await Promise.all([
26228
+ this._safe(() => this.db.getRrwebEventsWindow(this.tabId, rrwebFromTs, toTs), []),
26229
+ this._safe(() => this.db.getOtelSpansWindow(this.tabId, fromTs, toTs), []),
26230
+ this._safe(() => this.db.getAttrs(this.tabId), null),
26231
+ ]);
26232
+ const rrwebSorted = rrweb
26233
+ .sort((a, b) => a.ts - b.ts)
26234
+ .map((r) => ({ ts: r.ts, isFullSnapshot: r.isFullSnapshot, event: r.event }));
26235
+ // Hard guarantee: snapshot payload starts with a FullSnapshot (or is empty).
26236
+ const firstFullSnapshotIdx = rrwebSorted.findIndex((e) => Boolean(e.isFullSnapshot));
26237
+ const rrwebEvents = firstFullSnapshotIdx >= 0 ? rrwebSorted.slice(firstFullSnapshotIdx) : [];
26238
+ // Align spans with the rrweb replay start: spans must start from the FullSnapshot timestamp.
26239
+ const replayStartTs = rrwebEvents.length > 0 ? rrwebEvents[0].ts : fromTs;
26240
+ const otelSpans = spans
26241
+ .filter((s) => typeof (s === null || s === void 0 ? void 0 : s.ts) === 'number' && s.ts >= replayStartTs)
26242
+ .sort((a, b) => a.ts - b.ts)
26243
+ .map((r) => ({ ts: r.ts, span: r.span }));
26244
+ return {
26245
+ rrwebEvents,
26246
+ otelSpans,
26247
+ attrs: attrs ? {
26248
+ sessionAttributes: attrs.sessionAttributes,
26249
+ resourceAttributes: attrs.resourceAttributes,
26250
+ userAttributes: attrs.userAttributes,
26251
+ } : null,
26252
+ windowMs: this.windowMs,
26253
+ fromTs: replayStartTs,
26254
+ toTs,
26255
+ };
26256
+ }
26257
+ async clear() {
26258
+ await this._safe(() => this.db.clearTab(this.tabId), undefined);
26259
+ this.requiresFullSnapshot = true;
26260
+ }
26261
+ needsFullSnapshot() {
26262
+ return this.requiresFullSnapshot;
26263
+ }
26264
+ /**
26265
+ * Mark the tab as active/inactive.
26266
+ *
26267
+ * - When inactive, we freeze the buffer and keep the last active `windowMs` indefinitely.
26268
+ * - When re-activated, we resume buffering but require a new FullSnapshot to start a replayable segment.
26269
+ */
26270
+ setActive(active) {
26271
+ if (this.isActive === active)
26272
+ return;
26273
+ this.isActive = active;
26274
+ if (!active) {
26275
+ const freezeAt = this.lastSeenEventTs || Date.now();
26276
+ this.frozenAtTs = freezeAt;
26277
+ // Keep the last active window, but preserve rrweb replayability via snapshot anchor.
26278
+ const cutoff = Math.max(0, freezeAt - this.windowMs);
26279
+ void this._safe(() => this.db.pruneOlderThanWithRrwebSnapshotAnchor(this.tabId, cutoff), undefined);
26280
+ return;
26281
+ }
26282
+ const wasFrozen = this.frozenAtTs !== null;
26283
+ this.frozenAtTs = null;
26284
+ // New active segment must start with a full snapshot (don’t stitch segments together).
26285
+ if (wasFrozen)
26286
+ this.requiresFullSnapshot = true;
26287
+ this.pruneSoon();
26288
+ }
26289
+ pruneSoon() {
26290
+ if (!this.isActive)
26291
+ return;
26292
+ const now = Date.now();
26293
+ // Throttle pruning to avoid hammering IDB on high event rates
26294
+ if (now - this.lastPruneAt < 2000)
26295
+ return;
26296
+ if (this.pruneInFlight)
26297
+ return;
26298
+ this.lastPruneAt = now;
26299
+ const cutoff = Math.max(0, now - this.windowMs);
26300
+ // Heartbeat so the stale-tab sweeper never deletes active tabs.
26301
+ if (now - this.lastTouchAt > 30000) {
26302
+ this.lastTouchAt = now;
26303
+ void this._safe(() => this.db.touchTab(this.tabId, now), undefined);
26304
+ }
26305
+ this.pruneInFlight = this._safe(() => this.db.pruneOlderThanWithRrwebSnapshotAnchor(this.tabId, cutoff), undefined)
26306
+ .finally(() => { this.pruneInFlight = null; });
26307
+ }
26308
+ }
26309
+
26310
+
26311
+ /***/ }),
26312
+
26313
+ /***/ "./src/services/indexedDb.service.ts":
26314
+ /*!*******************************************!*\
26315
+ !*** ./src/services/indexedDb.service.ts ***!
26316
+ \*******************************************/
26317
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
26318
+
26319
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
26320
+ /* harmony export */ IndexedDBService: () => (/* binding */ IndexedDBService)
26321
+ /* harmony export */ });
26322
+ const dbName = 'mpEventsDB';
26323
+ const dbVersion = 2;
26324
+ const legacyStoreName = 'mpEventsStore';
26325
+ const rrwebEventsStore = 'rrwebEvents';
26326
+ const otelSpansStore = 'otelSpans';
26327
+ const attrsStore = 'crashBufferAttrs';
26328
+ class IndexedDBService {
26329
+ constructor() {
26330
+ this.dbPromise = this.openDB();
26331
+ }
26332
+ openDB() {
26333
+ return new Promise((resolve, reject) => {
26334
+ const request = indexedDB.open(dbName, dbVersion);
26335
+ request.onupgradeneeded = () => {
26336
+ const db = request.result;
26337
+ // Keep the legacy store if it exists to avoid breaking older versions.
26338
+ if (!db.objectStoreNames.contains(legacyStoreName)) {
26339
+ db.createObjectStore(legacyStoreName, { keyPath: 'id', autoIncrement: true });
26340
+ }
26341
+ if (!db.objectStoreNames.contains(rrwebEventsStore)) {
26342
+ const store = db.createObjectStore(rrwebEventsStore, { keyPath: 'id', autoIncrement: true });
26343
+ store.createIndex('tabId_ts', ['tabId', 'ts'], { unique: false });
26344
+ }
26345
+ if (!db.objectStoreNames.contains(otelSpansStore)) {
26346
+ const store = db.createObjectStore(otelSpansStore, { keyPath: 'id', autoIncrement: true });
26347
+ store.createIndex('tabId_ts', ['tabId', 'ts'], { unique: false });
26348
+ }
26349
+ if (!db.objectStoreNames.contains(attrsStore)) {
26350
+ db.createObjectStore(attrsStore, { keyPath: 'tabId' });
26351
+ }
26352
+ };
26353
+ request.onsuccess = () => resolve(request.result);
26354
+ request.onerror = () => reject(request.error);
26355
+ });
26356
+ }
26357
+ /**
26358
+ * @deprecated Prefer `appendRrwebEvent(tabId, ...)` and `getRrwebEventsWindow(...)`.
26359
+ * This writes into the legacy store with no pruning semantics.
26360
+ */
26361
+ async saveEvent(event) {
26362
+ const db = await this.dbPromise;
26363
+ return new Promise((resolve, reject) => {
26364
+ const tx = db.transaction(legacyStoreName, 'readwrite');
26365
+ const store = tx.objectStore(legacyStoreName);
26366
+ store.add({ event });
26367
+ tx.oncomplete = () => resolve();
26368
+ tx.onerror = () => reject(tx.error);
26369
+ });
26370
+ }
26371
+ /**
26372
+ * @deprecated Prefer `getRrwebEventsWindow(...)`.
26373
+ */
26374
+ async getAllEvents() {
26375
+ const db = await this.dbPromise;
26376
+ return new Promise((resolve, reject) => {
26377
+ const tx = db.transaction(legacyStoreName, 'readonly');
26378
+ const store = tx.objectStore(legacyStoreName);
26379
+ const request = store.getAll();
26380
+ request.onsuccess = () => {
26381
+ const events = request.result.map((record) => record.event);
26382
+ resolve(events);
26383
+ };
26384
+ request.onerror = () => reject(request.error);
26385
+ });
26386
+ }
26387
+ /**
26388
+ * @deprecated Prefer `clearTab(tabId)`.
26389
+ */
26390
+ async clearEvents() {
26391
+ const db = await this.dbPromise;
26392
+ return new Promise((resolve, reject) => {
26393
+ const tx = db.transaction(legacyStoreName, 'readwrite');
26394
+ const store = tx.objectStore(legacyStoreName);
26395
+ store.clear();
26396
+ tx.oncomplete = () => resolve();
26397
+ tx.onerror = () => reject(tx.error);
26398
+ });
26399
+ }
26400
+ async setAttrs(attrs) {
26401
+ var _a;
26402
+ const db = await this.dbPromise;
26403
+ const payload = {
26404
+ ...attrs,
26405
+ updatedAt: (_a = attrs.updatedAt) !== null && _a !== void 0 ? _a : Date.now(),
26406
+ };
26407
+ return new Promise((resolve, reject) => {
26408
+ const tx = db.transaction(attrsStore, 'readwrite');
26409
+ tx.objectStore(attrsStore).put(payload);
26410
+ tx.oncomplete = () => resolve();
26411
+ tx.onerror = () => reject(tx.error);
26412
+ });
26413
+ }
26414
+ async getAttrs(tabId) {
26415
+ const db = await this.dbPromise;
26416
+ return new Promise((resolve, reject) => {
26417
+ const tx = db.transaction(attrsStore, 'readonly');
26418
+ const request = tx.objectStore(attrsStore).get(tabId);
26419
+ request.onsuccess = () => resolve(request.result || null);
26420
+ request.onerror = () => reject(request.error);
26421
+ });
26422
+ }
26423
+ async getAllAttrs() {
26424
+ const db = await this.dbPromise;
26425
+ return new Promise((resolve, reject) => {
26426
+ const tx = db.transaction(attrsStore, 'readonly');
26427
+ const request = tx.objectStore(attrsStore).getAll();
26428
+ request.onsuccess = () => resolve(request.result || []);
26429
+ request.onerror = () => reject(request.error);
26430
+ });
26431
+ }
26432
+ /**
26433
+ * Updates `updatedAt` for the tab without clobbering existing attributes.
26434
+ */
26435
+ async touchTab(tabId, updatedAt = Date.now()) {
26436
+ const db = await this.dbPromise;
26437
+ return new Promise((resolve, reject) => {
26438
+ const tx = db.transaction(attrsStore, 'readwrite');
26439
+ const store = tx.objectStore(attrsStore);
26440
+ const getReq = store.get(tabId);
26441
+ getReq.onsuccess = () => {
26442
+ const existing = (getReq.result || null);
26443
+ const next = existing
26444
+ ? { ...existing, updatedAt }
26445
+ : { tabId, updatedAt };
26446
+ store.put(next);
26447
+ };
26448
+ getReq.onerror = () => reject(getReq.error);
26449
+ tx.oncomplete = () => resolve();
26450
+ tx.onerror = () => reject(tx.error);
26451
+ });
26452
+ }
26453
+ /**
26454
+ * Best-effort garbage collection for orphaned tabs.
26455
+ * Deletes all data for tabs whose `attrs.updatedAt` is older than `maxAgeMs`.
26456
+ */
26457
+ async sweepStaleTabs(maxAgeMs, now = Date.now()) {
26458
+ const attrs = await this.getAllAttrs().catch(() => []);
26459
+ if (!attrs.length)
26460
+ return 0;
26461
+ const stale = attrs
26462
+ .filter((a) => typeof (a === null || a === void 0 ? void 0 : a.updatedAt) === 'number' && now - a.updatedAt > maxAgeMs)
26463
+ .map((a) => a.tabId);
26464
+ let cleared = 0;
26465
+ for (const tabId of stale) {
26466
+ try {
26467
+ await this.clearTab(tabId);
26468
+ cleared += 1;
26469
+ }
26470
+ catch (_e) {
26471
+ // best effort
26472
+ }
26473
+ }
26474
+ return cleared;
26475
+ }
26476
+ async appendRrwebEvent(record) {
26477
+ const db = await this.dbPromise;
26478
+ return new Promise((resolve, reject) => {
26479
+ const tx = db.transaction(rrwebEventsStore, 'readwrite');
26480
+ tx.objectStore(rrwebEventsStore).add(record);
26481
+ tx.oncomplete = () => resolve();
26482
+ tx.onerror = () => reject(tx.error);
26483
+ });
26484
+ }
26485
+ async appendOtelSpan(record) {
26486
+ const db = await this.dbPromise;
26487
+ return new Promise((resolve, reject) => {
26488
+ const tx = db.transaction(otelSpansStore, 'readwrite');
26489
+ tx.objectStore(otelSpansStore).add(record);
26490
+ tx.oncomplete = () => resolve();
26491
+ tx.onerror = () => reject(tx.error);
26492
+ });
26493
+ }
26494
+ async getRrwebEventsWindow(tabId, fromTs, toTs) {
26495
+ const db = await this.dbPromise;
26496
+ const range = IDBKeyRange.bound([tabId, fromTs], [tabId, toTs]);
26497
+ return new Promise((resolve, reject) => {
26498
+ const tx = db.transaction(rrwebEventsStore, 'readonly');
26499
+ const idx = tx.objectStore(rrwebEventsStore).index('tabId_ts');
26500
+ const req = idx.getAll(range);
26501
+ req.onsuccess = () => resolve(req.result || []);
26502
+ req.onerror = () => reject(req.error);
26503
+ });
26504
+ }
26505
+ /**
26506
+ * Returns the last (highest-ts) FullSnapshot record at/before `cutoffTs`.
26507
+ * Used to keep a replayable anchor when pruning.
26508
+ */
26509
+ async getLastRrwebFullSnapshotBefore(tabId, cutoffTs) {
26510
+ const db = await this.dbPromise;
26511
+ const range = IDBKeyRange.bound([tabId, 0], [tabId, cutoffTs]);
26512
+ return new Promise((resolve, reject) => {
26513
+ const tx = db.transaction(rrwebEventsStore, 'readonly');
26514
+ const idx = tx.objectStore(rrwebEventsStore).index('tabId_ts');
26515
+ const req = idx.openCursor(range, 'prev');
26516
+ req.onsuccess = () => {
26517
+ const cursor = req.result;
26518
+ if (!cursor) {
26519
+ resolve(null);
26520
+ return;
26521
+ }
26522
+ const value = cursor.value;
26523
+ if (value === null || value === void 0 ? void 0 : value.isFullSnapshot) {
26524
+ resolve(value);
26525
+ return;
26526
+ }
26527
+ cursor.continue();
26528
+ };
26529
+ req.onerror = () => reject(req.error);
26530
+ });
26531
+ }
26532
+ async getOtelSpansWindow(tabId, fromTs, toTs) {
26533
+ const db = await this.dbPromise;
26534
+ const range = IDBKeyRange.bound([tabId, fromTs], [tabId, toTs]);
26535
+ return new Promise((resolve, reject) => {
26536
+ const tx = db.transaction(otelSpansStore, 'readonly');
26537
+ const idx = tx.objectStore(otelSpansStore).index('tabId_ts');
26538
+ const req = idx.getAll(range);
26539
+ req.onsuccess = () => resolve(req.result || []);
26540
+ req.onerror = () => reject(req.error);
26541
+ });
26542
+ }
26543
+ async pruneOlderThan(tabId, cutoffTs) {
26544
+ const db = await this.dbPromise;
26545
+ const rrwebRange = IDBKeyRange.bound([tabId, 0], [tabId, cutoffTs]);
26546
+ const spansRange = IDBKeyRange.bound([tabId, 0], [tabId, cutoffTs]);
26547
+ const pruneStore = (store, range) => new Promise((resolve, reject) => {
26548
+ const idx = store.index('tabId_ts');
26549
+ const req = idx.openCursor(range);
26550
+ req.onsuccess = () => {
26551
+ const cursor = req.result;
26552
+ if (!cursor) {
26553
+ resolve();
26554
+ return;
26555
+ }
26556
+ cursor.delete();
26557
+ cursor.continue();
26558
+ };
26559
+ req.onerror = () => reject(req.error);
26560
+ });
26561
+ return new Promise((resolve, reject) => {
26562
+ const tx = db.transaction([rrwebEventsStore, otelSpansStore], 'readwrite');
26563
+ const rrwebStore = tx.objectStore(rrwebEventsStore);
26564
+ const spanStore = tx.objectStore(otelSpansStore);
26565
+ Promise.all([
26566
+ pruneStore(rrwebStore, rrwebRange),
26567
+ pruneStore(spanStore, spansRange),
26568
+ ]).then(() => {
26569
+ // noop; completion is signaled by tx.oncomplete
26570
+ }).catch((e) => {
26571
+ reject(e);
26572
+ });
26573
+ tx.oncomplete = () => resolve();
26574
+ tx.onerror = () => reject(tx.error);
26575
+ });
26576
+ }
26577
+ /**
26578
+ * Prune older data while keeping rrweb replayability:
26579
+ * - rrweb: keep the last FullSnapshot at/before cutoff as an "anchor"
26580
+ * - spans: prune strictly by cutoff
26581
+ */
26582
+ async pruneOlderThanWithRrwebSnapshotAnchor(tabId, cutoffTs) {
26583
+ const db = await this.dbPromise;
26584
+ const anchor = await this.getLastRrwebFullSnapshotBefore(tabId, cutoffTs);
26585
+ // rrweb: delete everything strictly older than the anchor snapshot (keep the anchor itself)
26586
+ // spans: delete everything older than cutoffTs
26587
+ const rrwebCutoffTs = typeof (anchor === null || anchor === void 0 ? void 0 : anchor.ts) === 'number' ? Math.max(0, anchor.ts - 1) : cutoffTs;
26588
+ const rrwebRange = IDBKeyRange.bound([tabId, 0], [tabId, rrwebCutoffTs]);
26589
+ const spansRange = IDBKeyRange.bound([tabId, 0], [tabId, cutoffTs]);
26590
+ const pruneStore = (store, range) => new Promise((resolve, reject) => {
26591
+ const idx = store.index('tabId_ts');
26592
+ const req = idx.openCursor(range);
26593
+ req.onsuccess = () => {
26594
+ const cursor = req.result;
26595
+ if (!cursor) {
26596
+ resolve();
26597
+ return;
26598
+ }
26599
+ cursor.delete();
26600
+ cursor.continue();
26601
+ };
26602
+ req.onerror = () => reject(req.error);
26603
+ });
26604
+ return new Promise((resolve, reject) => {
26605
+ const tx = db.transaction([rrwebEventsStore, otelSpansStore], 'readwrite');
26606
+ const rrwebStore = tx.objectStore(rrwebEventsStore);
26607
+ const spanStore = tx.objectStore(otelSpansStore);
26608
+ Promise.all([
26609
+ pruneStore(rrwebStore, rrwebRange),
26610
+ pruneStore(spanStore, spansRange),
26611
+ ]).then(() => {
26612
+ // noop
26613
+ }).catch((e) => reject(e));
26614
+ tx.oncomplete = () => resolve();
26615
+ tx.onerror = () => reject(tx.error);
26616
+ });
26617
+ }
26618
+ async clearTab(tabId) {
26619
+ const db = await this.dbPromise;
26620
+ const allRange = IDBKeyRange.bound([tabId, 0], [tabId, Number.MAX_SAFE_INTEGER]);
26621
+ const clearByTab = (store) => new Promise((resolve, reject) => {
26622
+ const idx = store.index('tabId_ts');
26623
+ const req = idx.openCursor(allRange);
26624
+ req.onsuccess = () => {
26625
+ const cursor = req.result;
26626
+ if (!cursor) {
26627
+ resolve();
26628
+ return;
26629
+ }
26630
+ cursor.delete();
26631
+ cursor.continue();
26632
+ };
26633
+ req.onerror = () => reject(req.error);
26634
+ });
26635
+ return new Promise((resolve, reject) => {
26636
+ const tx = db.transaction([rrwebEventsStore, otelSpansStore, attrsStore], 'readwrite');
26637
+ const rrwebStore = tx.objectStore(rrwebEventsStore);
26638
+ const spanStore = tx.objectStore(otelSpansStore);
26639
+ const attr = tx.objectStore(attrsStore);
26640
+ Promise.all([
26641
+ clearByTab(rrwebStore),
26642
+ clearByTab(spanStore),
26643
+ new Promise((res, rej) => {
26644
+ const r = attr.delete(tabId);
26645
+ r.onsuccess = () => res();
26646
+ r.onerror = () => rej(r.error);
26647
+ }),
26648
+ ]).then(() => {
26649
+ // noop
26650
+ }).catch((e) => reject(e));
26651
+ tx.oncomplete = () => resolve();
26652
+ tx.onerror = () => reject(tx.error);
26653
+ });
26654
+ }
26655
+ }
26656
+
26657
+
25989
26658
  /***/ }),
25990
26659
 
25991
26660
  /***/ "./src/services/messaging.service.ts":
@@ -26104,15 +26773,17 @@ const messagingService = new MessagingService();
26104
26773
  /* harmony export */ SocketService: () => (/* binding */ SocketService)
26105
26774
  /* harmony export */ });
26106
26775
  /* harmony import */ var socket_io_client__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! socket.io-client */ "../../node_modules/socket.io-client/build/esm/index.js");
26107
- /* harmony import */ var lib0_observable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lib0/observable */ "../../node_modules/lib0/observable.js");
26776
+ /* harmony import */ var lib0_observable__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lib0/observable */ "../../node_modules/lib0/observable.js");
26108
26777
  /* harmony import */ var _services_messaging_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../services/messaging.service */ "./src/services/messaging.service.ts");
26109
26778
  /* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../config */ "./src/config/index.ts");
26779
+ /* harmony import */ var _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @multiplayer-app/session-recorder-common */ "../session-recorder-common/dist/esm/index-browser.js");
26780
+
26110
26781
 
26111
26782
 
26112
26783
 
26113
26784
 
26114
26785
  const MAX_RECONNECTION_ATTEMPTS = 2;
26115
- class SocketService extends lib0_observable__WEBPACK_IMPORTED_MODULE_3__.Observable {
26786
+ class SocketService extends lib0_observable__WEBPACK_IMPORTED_MODULE_4__.Observable {
26116
26787
  constructor() {
26117
26788
  super();
26118
26789
  this.socket = null;
@@ -26179,6 +26850,9 @@ class SocketService extends lib0_observable__WEBPACK_IMPORTED_MODULE_3__.Observa
26179
26850
  path: '/v0/radar/ws',
26180
26851
  auth: {
26181
26852
  'x-api-key': this.options.apiKey,
26853
+ ...this.options.clientId
26854
+ ? { [_multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_3__.ATTR_MULTIPLAYER_SESSION_CLIENT_ID]: this.options.clientId }
26855
+ : {},
26182
26856
  },
26183
26857
  reconnectionAttempts: 2,
26184
26858
  transports: ['websocket'],
@@ -26210,6 +26884,9 @@ class SocketService extends lib0_observable__WEBPACK_IMPORTED_MODULE_3__.Observa
26210
26884
  this.socket.on(_config__WEBPACK_IMPORTED_MODULE_2__.REMOTE_SESSION_RECORDING_STOP, (data) => {
26211
26885
  this.emit(_config__WEBPACK_IMPORTED_MODULE_2__.REMOTE_SESSION_RECORDING_STOP, [data]);
26212
26886
  });
26887
+ this.socket.on(_config__WEBPACK_IMPORTED_MODULE_2__.SESSION_SAVE_BUFFER_EVENT, (data) => {
26888
+ this.emit(_config__WEBPACK_IMPORTED_MODULE_2__.SESSION_SAVE_BUFFER_EVENT, [data]);
26889
+ });
26213
26890
  }
26214
26891
  checkReconnectionAttempts() {
26215
26892
  if (this.attempts >= MAX_RECONNECTION_ATTEMPTS) {
@@ -26309,21 +26986,23 @@ class SocketService extends lib0_observable__WEBPACK_IMPORTED_MODULE_3__.Observa
26309
26986
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
26310
26987
  /* harmony export */ SessionRecorder: () => (/* binding */ SessionRecorder)
26311
26988
  /* harmony export */ });
26312
- /* harmony import */ var lib0_observable__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! lib0/observable */ "../../node_modules/lib0/observable.js");
26989
+ /* harmony import */ var lib0_observable__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! lib0/observable */ "../../node_modules/lib0/observable.js");
26313
26990
  /* harmony import */ var _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @multiplayer-app/session-recorder-common */ "../session-recorder-common/dist/esm/index-browser.js");
26314
26991
  /* harmony import */ var _otel__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./otel */ "./src/otel/index.ts");
26315
26992
  /* harmony import */ var _rrweb__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./rrweb */ "./src/rrweb/index.ts");
26316
26993
  /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ "./src/utils/index.ts");
26317
26994
  /* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./types */ "./src/types/index.ts");
26318
- /* harmony import */ var _services_socket_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./services/socket.service */ "./src/services/socket.service.ts");
26319
- /* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./config */ "./src/config/index.ts");
26320
- /* harmony import */ var _patch__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./patch */ "./src/patch/index.ts");
26321
- /* harmony import */ var _eventBus__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./eventBus */ "./src/eventBus.ts");
26322
- /* harmony import */ var _sessionWidget__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./sessionWidget */ "./src/sessionWidget/index.ts");
26323
- /* harmony import */ var _services_messaging_service__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./services/messaging.service */ "./src/services/messaging.service.ts");
26324
- /* harmony import */ var _services_api_service__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./services/api.service */ "./src/services/api.service.ts");
26325
- /* harmony import */ var _sessionWidget_buttonStateConfigs__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./sessionWidget/buttonStateConfigs */ "./src/sessionWidget/buttonStateConfigs.ts");
26326
- /* harmony import */ var _navigation__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./navigation */ "./src/navigation/index.ts");
26995
+ /* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./config */ "./src/config/index.ts");
26996
+ /* harmony import */ var _patch__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./patch */ "./src/patch/index.ts");
26997
+ /* harmony import */ var _eventBus__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./eventBus */ "./src/eventBus.ts");
26998
+ /* harmony import */ var _sessionWidget__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./sessionWidget */ "./src/sessionWidget/index.ts");
26999
+ /* harmony import */ var _services_messaging_service__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./services/messaging.service */ "./src/services/messaging.service.ts");
27000
+ /* harmony import */ var _services_api_service__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./services/api.service */ "./src/services/api.service.ts");
27001
+ /* harmony import */ var _services_socket_service__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./services/socket.service */ "./src/services/socket.service.ts");
27002
+ /* harmony import */ var _services_indexedDb_service__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./services/indexedDb.service */ "./src/services/indexedDb.service.ts");
27003
+ /* harmony import */ var _services_crashBuffer_service__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./services/crashBuffer.service */ "./src/services/crashBuffer.service.ts");
27004
+ /* harmony import */ var _sessionWidget_buttonStateConfigs__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./sessionWidget/buttonStateConfigs */ "./src/sessionWidget/buttonStateConfigs.ts");
27005
+ /* harmony import */ var _navigation__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./navigation */ "./src/navigation/index.ts");
26327
27006
 
26328
27007
 
26329
27008
 
@@ -26339,7 +27018,9 @@ class SocketService extends lib0_observable__WEBPACK_IMPORTED_MODULE_3__.Observa
26339
27018
 
26340
27019
 
26341
27020
 
26342
- class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_14__.Observable {
27021
+
27022
+
27023
+ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_16__.Observable {
26343
27024
  get navigation() {
26344
27025
  return this._navigationRecorder.api;
26345
27026
  }
@@ -26351,7 +27032,7 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_14__.Obse
26351
27032
  }
26352
27033
  set sessionId(sessionId) {
26353
27034
  this._sessionId = sessionId;
26354
- (0,_utils__WEBPACK_IMPORTED_MODULE_3__.setStoredItem)(_config__WEBPACK_IMPORTED_MODULE_6__.SESSION_ID_PROP_NAME, sessionId);
27035
+ (0,_utils__WEBPACK_IMPORTED_MODULE_3__.setStoredItem)(_config__WEBPACK_IMPORTED_MODULE_5__.SESSION_ID_PROP_NAME, sessionId);
26355
27036
  }
26356
27037
  get sessionType() {
26357
27038
  return this._sessionType;
@@ -26360,8 +27041,8 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_14__.Obse
26360
27041
  this._sessionType = sessionType;
26361
27042
  const continuousRecording = sessionType === _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_0__.SessionType.CONTINUOUS;
26362
27043
  this._sessionWidget.updateContinuousRecordingState(continuousRecording);
26363
- _services_messaging_service__WEBPACK_IMPORTED_MODULE_10__["default"].sendMessage('continuous-debugging', continuousRecording);
26364
- (0,_utils__WEBPACK_IMPORTED_MODULE_3__.setStoredItem)(_config__WEBPACK_IMPORTED_MODULE_6__.SESSION_TYPE_PROP_NAME, sessionType);
27044
+ _services_messaging_service__WEBPACK_IMPORTED_MODULE_9__["default"].sendMessage('continuous-debugging', continuousRecording);
27045
+ (0,_utils__WEBPACK_IMPORTED_MODULE_3__.setStoredItem)(_config__WEBPACK_IMPORTED_MODULE_5__.SESSION_TYPE_PROP_NAME, sessionType);
26365
27046
  }
26366
27047
  get continuousRecording() {
26367
27048
  return this.sessionType === _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_0__.SessionType.CONTINUOUS;
@@ -26372,8 +27053,8 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_14__.Obse
26372
27053
  set sessionState(state) {
26373
27054
  this._sessionState = state;
26374
27055
  this._sessionWidget.updateState(this._sessionState, this.continuousRecording);
26375
- _services_messaging_service__WEBPACK_IMPORTED_MODULE_10__["default"].sendMessage('state-change', this._sessionState);
26376
- (0,_utils__WEBPACK_IMPORTED_MODULE_3__.setStoredItem)(_config__WEBPACK_IMPORTED_MODULE_6__.SESSION_STATE_PROP_NAME, state);
27056
+ _services_messaging_service__WEBPACK_IMPORTED_MODULE_9__["default"].sendMessage('state-change', this._sessionState);
27057
+ (0,_utils__WEBPACK_IMPORTED_MODULE_3__.setStoredItem)(_config__WEBPACK_IMPORTED_MODULE_5__.SESSION_STATE_PROP_NAME, state);
26377
27058
  // Emit observable event to support React wrapper
26378
27059
  this.emit('state-change', [this._sessionState || _types__WEBPACK_IMPORTED_MODULE_4__.SessionState.stopped, this.sessionType]);
26379
27060
  }
@@ -26382,19 +27063,23 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_14__.Obse
26382
27063
  }
26383
27064
  set session(session) {
26384
27065
  this._session = session;
26385
- (0,_utils__WEBPACK_IMPORTED_MODULE_3__.setStoredItem)(_config__WEBPACK_IMPORTED_MODULE_6__.SESSION_PROP_NAME, this._session);
27066
+ (0,_utils__WEBPACK_IMPORTED_MODULE_3__.setStoredItem)(_config__WEBPACK_IMPORTED_MODULE_5__.SESSION_PROP_NAME, this._session);
26386
27067
  }
26387
27068
  get sessionAttributes() {
26388
27069
  return this._sessionAttributes || {};
26389
27070
  }
26390
27071
  set sessionAttributes(attributes) {
27072
+ var _a;
26391
27073
  this._sessionAttributes = attributes;
27074
+ (_a = this._crashBuffer) === null || _a === void 0 ? void 0 : _a.setAttrs({ sessionAttributes: this.sessionAttributes });
26392
27075
  }
26393
27076
  get userAttributes() {
26394
27077
  return this._userAttributes;
26395
27078
  }
26396
27079
  set userAttributes(userAttributes) {
27080
+ var _a;
26397
27081
  this._userAttributes = userAttributes;
27082
+ (_a = this._crashBuffer) === null || _a === void 0 ? void 0 : _a.setAttrs({ userAttributes: this._userAttributes });
26398
27083
  }
26399
27084
  get error() {
26400
27085
  return this._error;
@@ -26420,15 +27105,20 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_14__.Obse
26420
27105
  constructor() {
26421
27106
  var _a;
26422
27107
  super();
26423
- this._apiService = new _services_api_service__WEBPACK_IMPORTED_MODULE_11__.ApiService();
26424
- this._socketService = new _services_socket_service__WEBPACK_IMPORTED_MODULE_5__.SocketService();
27108
+ this._apiService = new _services_api_service__WEBPACK_IMPORTED_MODULE_10__.ApiService();
27109
+ this._socketService = new _services_socket_service__WEBPACK_IMPORTED_MODULE_11__.SocketService();
26425
27110
  this._tracer = new _otel__WEBPACK_IMPORTED_MODULE_1__.TracerBrowserSDK();
26426
27111
  this._recorder = new _rrweb__WEBPACK_IMPORTED_MODULE_2__.RecorderBrowserSDK();
26427
- this._sessionWidget = new _sessionWidget__WEBPACK_IMPORTED_MODULE_9__.SessionWidget();
26428
- this._navigationRecorder = new _navigation__WEBPACK_IMPORTED_MODULE_13__.NavigationRecorder();
27112
+ this._sessionWidget = new _sessionWidget__WEBPACK_IMPORTED_MODULE_8__.SessionWidget();
27113
+ this._navigationRecorder = new _navigation__WEBPACK_IMPORTED_MODULE_15__.NavigationRecorder();
26429
27114
  this._startRequestController = null;
27115
+ this._tabId = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.getOrCreateTabId)();
27116
+ this._bufferDb = new _services_indexedDb_service__WEBPACK_IMPORTED_MODULE_12__.IndexedDBService();
27117
+ this._crashBuffer = null;
27118
+ this._isFlushingBuffer = false;
27119
+ this._bufferLifecycleHandlersRegistered = false;
26430
27120
  this._isInitialized = false;
26431
- // Session ID and state are stored in localStorage
27121
+ // Session ID and state are stored in sessionStorage (with fallback) to avoid multi-tab conflicts
26432
27122
  this._sessionId = null;
26433
27123
  this._sessionType = _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_0__.SessionType.MANUAL;
26434
27124
  this._sessionState = null;
@@ -26441,10 +27131,10 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_14__.Obse
26441
27131
  this._error = '';
26442
27132
  // Safety: avoid accessing storage in SSR/non-browser environments
26443
27133
  const isBrowser = typeof window !== 'undefined';
26444
- const sessionLocal = isBrowser ? (0,_utils__WEBPACK_IMPORTED_MODULE_3__.getStoredItem)(_config__WEBPACK_IMPORTED_MODULE_6__.SESSION_PROP_NAME, true) : null;
26445
- const sessionIdLocal = isBrowser ? (0,_utils__WEBPACK_IMPORTED_MODULE_3__.getStoredItem)(_config__WEBPACK_IMPORTED_MODULE_6__.SESSION_ID_PROP_NAME) : null;
26446
- const sessionStateLocal = isBrowser ? (0,_utils__WEBPACK_IMPORTED_MODULE_3__.getStoredItem)(_config__WEBPACK_IMPORTED_MODULE_6__.SESSION_STATE_PROP_NAME) : null;
26447
- const sessionTypeLocal = isBrowser ? (0,_utils__WEBPACK_IMPORTED_MODULE_3__.getStoredItem)(_config__WEBPACK_IMPORTED_MODULE_6__.SESSION_TYPE_PROP_NAME) : null;
27134
+ const sessionLocal = isBrowser ? (0,_utils__WEBPACK_IMPORTED_MODULE_3__.getStoredItem)(_config__WEBPACK_IMPORTED_MODULE_5__.SESSION_PROP_NAME, true) : null;
27135
+ const sessionIdLocal = isBrowser ? (0,_utils__WEBPACK_IMPORTED_MODULE_3__.getStoredItem)(_config__WEBPACK_IMPORTED_MODULE_5__.SESSION_ID_PROP_NAME) : null;
27136
+ const sessionStateLocal = isBrowser ? (0,_utils__WEBPACK_IMPORTED_MODULE_3__.getStoredItem)(_config__WEBPACK_IMPORTED_MODULE_5__.SESSION_STATE_PROP_NAME) : null;
27137
+ const sessionTypeLocal = isBrowser ? (0,_utils__WEBPACK_IMPORTED_MODULE_3__.getStoredItem)(_config__WEBPACK_IMPORTED_MODULE_5__.SESSION_TYPE_PROP_NAME) : null;
26448
27138
  if ((0,_utils__WEBPACK_IMPORTED_MODULE_3__.isSessionActive)(sessionLocal, sessionTypeLocal)) {
26449
27139
  this.session = sessionLocal;
26450
27140
  this.sessionId = sessionIdLocal;
@@ -26458,7 +27148,7 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_14__.Obse
26458
27148
  this.sessionType = _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_0__.SessionType.MANUAL;
26459
27149
  }
26460
27150
  this._configs = {
26461
- ..._config__WEBPACK_IMPORTED_MODULE_6__.BASE_CONFIG,
27151
+ ..._config__WEBPACK_IMPORTED_MODULE_5__.BASE_CONFIG,
26462
27152
  apiKey: ((_a = this.session) === null || _a === void 0 ? void 0 : _a.tempApiKey) || '',
26463
27153
  };
26464
27154
  }
@@ -26467,18 +27157,23 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_14__.Obse
26467
27157
  * @param configs - custom configurations for session debugger
26468
27158
  */
26469
27159
  init(configs) {
27160
+ var _a;
26470
27161
  if (typeof window === 'undefined') {
26471
27162
  return;
26472
27163
  }
26473
- this._configs = (0,_config__WEBPACK_IMPORTED_MODULE_6__.getSessionRecorderConfig)({ ...this._configs, ...configs });
27164
+ this._configs = (0,_config__WEBPACK_IMPORTED_MODULE_5__.getSessionRecorderConfig)({ ...this._configs, ...configs });
26474
27165
  this._isInitialized = true;
26475
27166
  this._checkOperation('init');
26476
- (0,_patch__WEBPACK_IMPORTED_MODULE_7__.setMaxCapturingHttpPayloadSize)(this._configs.maxCapturingHttpPayloadSize || _config__WEBPACK_IMPORTED_MODULE_6__.DEFAULT_MAX_HTTP_CAPTURING_PAYLOAD_SIZE);
26477
- (0,_patch__WEBPACK_IMPORTED_MODULE_7__.setShouldRecordHttpData)(this._configs.captureBody, this._configs.captureHeaders);
27167
+ // GC: remove orphaned crash buffers from old tabs.
27168
+ // Keep TTL large to avoid any accidental data loss.
27169
+ void this._bufferDb.sweepStaleTabs(24 * 60 * 60 * 1000);
27170
+ (0,_patch__WEBPACK_IMPORTED_MODULE_6__.setMaxCapturingHttpPayloadSize)(this._configs.maxCapturingHttpPayloadSize || _config__WEBPACK_IMPORTED_MODULE_5__.DEFAULT_MAX_HTTP_CAPTURING_PAYLOAD_SIZE);
27171
+ (0,_patch__WEBPACK_IMPORTED_MODULE_6__.setShouldRecordHttpData)(this._configs.captureBody, this._configs.captureHeaders);
26478
27172
  this._tracer.init(this._configs);
26479
27173
  this._apiService.init(this._configs);
26480
27174
  this._sessionWidget.init(this._configs);
26481
27175
  this._socketService.init({
27176
+ clientId: this._tracer.clientId,
26482
27177
  apiKey: this._configs.apiKey,
26483
27178
  socketUrl: this._configs.apiBaseUrl || '',
26484
27179
  keepAlive: Boolean(this._configs.useWebsocket),
@@ -26493,17 +27188,83 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_14__.Obse
26493
27188
  if (this._configs.apiKey) {
26494
27189
  this._recorder.init(this._configs, this._socketService);
26495
27190
  }
27191
+ // Crash buffer (browser): keep a short rolling window when not actively recording.
27192
+ if ((_a = this._configs.buffering) === null || _a === void 0 ? void 0 : _a.enabled) {
27193
+ const windowMinutes = this._configs.buffering.windowMinutes || 1;
27194
+ const windowMs = Math.max(10000, windowMinutes * 60 * 1000);
27195
+ this._crashBuffer = new _services_crashBuffer_service__WEBPACK_IMPORTED_MODULE_13__.CrashBufferService(this._bufferDb, this._tabId, windowMs);
27196
+ this._recorder.setCrashBuffer(this._crashBuffer);
27197
+ this._tracer.setCrashBuffer(this._crashBuffer);
27198
+ this._crashBuffer.setAttrs({
27199
+ sessionAttributes: this.sessionAttributes,
27200
+ resourceAttributes: (0,_utils__WEBPACK_IMPORTED_MODULE_3__.getNavigatorInfo)(),
27201
+ userAttributes: this._userAttributes,
27202
+ });
27203
+ this._registerCrashBufferLifecycleHandlers();
27204
+ }
26496
27205
  if (this.sessionId
26497
27206
  && (this.sessionState === _types__WEBPACK_IMPORTED_MODULE_4__.SessionState.started
26498
27207
  || this.sessionState === _types__WEBPACK_IMPORTED_MODULE_4__.SessionState.paused)) {
26499
27208
  this._start();
26500
27209
  }
27210
+ else {
27211
+ // Buffer-only recording when there is no active debug session.
27212
+ this._startBufferOnlyRecording();
27213
+ }
26501
27214
  this._registerWidgetEvents();
26502
27215
  this._registerSocketServiceListeners();
26503
- _services_messaging_service__WEBPACK_IMPORTED_MODULE_10__["default"].sendMessage('state-change', this.sessionState);
27216
+ _services_messaging_service__WEBPACK_IMPORTED_MODULE_9__["default"].sendMessage('state-change', this.sessionState);
26504
27217
  // Emit init observable event
26505
27218
  this.emit('init', [this]);
26506
27219
  }
27220
+ _registerCrashBufferLifecycleHandlers() {
27221
+ if (this._bufferLifecycleHandlersRegistered)
27222
+ return;
27223
+ if (typeof window === 'undefined')
27224
+ return;
27225
+ if (typeof document === 'undefined')
27226
+ return;
27227
+ if (!this._crashBuffer)
27228
+ return;
27229
+ this._bufferLifecycleHandlersRegistered = true;
27230
+ const update = () => this._updateCrashBufferActiveState();
27231
+ window.addEventListener('focus', update, { passive: true });
27232
+ window.addEventListener('blur', update, { passive: true });
27233
+ document.addEventListener('visibilitychange', update, { passive: true });
27234
+ // Set initial state.
27235
+ update();
27236
+ }
27237
+ _updateCrashBufferActiveState() {
27238
+ if (!this._crashBuffer)
27239
+ return;
27240
+ if (typeof document === 'undefined')
27241
+ return;
27242
+ let hasFocus = true;
27243
+ try {
27244
+ hasFocus = typeof document.hasFocus === 'function' ? document.hasFocus() : true;
27245
+ }
27246
+ catch (_e) {
27247
+ hasFocus = true;
27248
+ }
27249
+ const isVisible = document.visibilityState === 'visible' && !document.hidden;
27250
+ const active = isVisible && hasFocus;
27251
+ this._crashBuffer.setActive(active);
27252
+ if (active && this._crashBuffer.needsFullSnapshot()) {
27253
+ // If the buffer was cleared while inactive, the next stored rrweb event must be a FullSnapshot.
27254
+ this._recorder.takeFullSnapshot();
27255
+ }
27256
+ }
27257
+ _startBufferOnlyRecording() {
27258
+ var _a, _b;
27259
+ if (!((_b = (_a = this._configs) === null || _a === void 0 ? void 0 : _a.buffering) === null || _b === void 0 ? void 0 : _b.enabled))
27260
+ return;
27261
+ if (!this._crashBuffer)
27262
+ return;
27263
+ // Don’t start if a session is active.
27264
+ if (this.sessionState !== _types__WEBPACK_IMPORTED_MODULE_4__.SessionState.stopped || this.sessionId)
27265
+ return;
27266
+ void this._recorder.restart(null, _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_0__.SessionType.MANUAL);
27267
+ }
26507
27268
  /**
26508
27269
  * Save the continuous recording session
26509
27270
  */
@@ -26513,14 +27274,14 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_14__.Obse
26513
27274
  if (!this.continuousRecording || !this._configs.showContinuousRecording) {
26514
27275
  return;
26515
27276
  }
26516
- this._sessionWidget.updateSaveContinuousDebugSessionState(_sessionWidget_buttonStateConfigs__WEBPACK_IMPORTED_MODULE_12__.ContinuousRecordingSaveButtonState.SAVING);
27277
+ this._sessionWidget.updateSaveContinuousDebugSessionState(_sessionWidget_buttonStateConfigs__WEBPACK_IMPORTED_MODULE_14__.ContinuousRecordingSaveButtonState.SAVING);
26517
27278
  const res = await this._apiService.saveContinuousDebugSession(this.sessionId, {
26518
27279
  sessionAttributes: this.sessionAttributes,
26519
27280
  resourceAttributes: (0,_utils__WEBPACK_IMPORTED_MODULE_3__.getNavigatorInfo)(),
26520
27281
  stoppedAt: this._recorder.stoppedAt,
26521
27282
  name: this._getSessionName()
26522
27283
  });
26523
- this._sessionWidget.updateSaveContinuousDebugSessionState(_sessionWidget_buttonStateConfigs__WEBPACK_IMPORTED_MODULE_12__.ContinuousRecordingSaveButtonState.SAVED);
27284
+ this._sessionWidget.updateSaveContinuousDebugSessionState(_sessionWidget_buttonStateConfigs__WEBPACK_IMPORTED_MODULE_14__.ContinuousRecordingSaveButtonState.SAVED);
26524
27285
  const sessionUrl = res === null || res === void 0 ? void 0 : res.url;
26525
27286
  this._sessionWidget.showToast({
26526
27287
  type: 'success',
@@ -26533,11 +27294,11 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_14__.Obse
26533
27294
  }
26534
27295
  catch (error) {
26535
27296
  this.error = error.message;
26536
- this._sessionWidget.updateSaveContinuousDebugSessionState(_sessionWidget_buttonStateConfigs__WEBPACK_IMPORTED_MODULE_12__.ContinuousRecordingSaveButtonState.ERROR);
27297
+ this._sessionWidget.updateSaveContinuousDebugSessionState(_sessionWidget_buttonStateConfigs__WEBPACK_IMPORTED_MODULE_14__.ContinuousRecordingSaveButtonState.ERROR);
26537
27298
  }
26538
27299
  finally {
26539
27300
  setTimeout(() => {
26540
- this._sessionWidget.updateSaveContinuousDebugSessionState(_sessionWidget_buttonStateConfigs__WEBPACK_IMPORTED_MODULE_12__.ContinuousRecordingSaveButtonState.IDLE);
27301
+ this._sessionWidget.updateSaveContinuousDebugSessionState(_sessionWidget_buttonStateConfigs__WEBPACK_IMPORTED_MODULE_14__.ContinuousRecordingSaveButtonState.IDLE);
26541
27302
  }, 3000);
26542
27303
  }
26543
27304
  }
@@ -26579,7 +27340,7 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_14__.Obse
26579
27340
  stoppedAt: this._recorder.stoppedAt,
26580
27341
  };
26581
27342
  const response = await this._apiService.stopSession(this.sessionId, request);
26582
- _eventBus__WEBPACK_IMPORTED_MODULE_8__.recorderEventBus.emit(_config__WEBPACK_IMPORTED_MODULE_6__.SESSION_RESPONSE, response);
27343
+ _eventBus__WEBPACK_IMPORTED_MODULE_7__.recorderEventBus.emit(_config__WEBPACK_IMPORTED_MODULE_5__.SESSION_RESPONSE, response);
26583
27344
  }
26584
27345
  this._clearSession();
26585
27346
  }
@@ -26667,11 +27428,70 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_14__.Obse
26667
27428
  const normalizedError = this._normalizeError(error);
26668
27429
  const normalizedErrorInfo = this._normalizeErrorInfo(errorInfo);
26669
27430
  this._tracer.captureException(normalizedError, normalizedErrorInfo);
27431
+ // If user isn't actively recording, auto-flush the crash buffer.
27432
+ if (this.sessionState === _types__WEBPACK_IMPORTED_MODULE_4__.SessionState.stopped && !this.sessionId) {
27433
+ void this.flushBuffer({ reason: 'exception' });
27434
+ }
26670
27435
  }
26671
27436
  catch (e) {
26672
27437
  this.error = (e === null || e === void 0 ? void 0 : e.message) || 'Failed to capture exception';
26673
27438
  }
26674
27439
  }
27440
+ async flushBuffer(payload) {
27441
+ var _a, _b;
27442
+ if (!((_b = (_a = this._configs) === null || _a === void 0 ? void 0 : _a.buffering) === null || _b === void 0 ? void 0 : _b.enabled))
27443
+ return null;
27444
+ if (!this._crashBuffer)
27445
+ return null;
27446
+ if (this._isFlushingBuffer)
27447
+ return null;
27448
+ // Don’t flush while a live recording is active.
27449
+ if (this.sessionState !== _types__WEBPACK_IMPORTED_MODULE_4__.SessionState.stopped || this.sessionId)
27450
+ return null;
27451
+ this._isFlushingBuffer = true;
27452
+ try {
27453
+ const reason = (payload === null || payload === void 0 ? void 0 : payload.reason) || 'manual';
27454
+ await this._crashBuffer.setAttrs({
27455
+ sessionAttributes: this.sessionAttributes,
27456
+ resourceAttributes: (0,_utils__WEBPACK_IMPORTED_MODULE_3__.getNavigatorInfo)(),
27457
+ userAttributes: this._userAttributes,
27458
+ });
27459
+ const snapshot = await this._crashBuffer.snapshot();
27460
+ if (snapshot.rrwebEvents.length === 0 && snapshot.otelSpans.length === 0) {
27461
+ return null;
27462
+ }
27463
+ const request = {
27464
+ name: this._getSessionName(),
27465
+ stoppedAt: new Date().toISOString(),
27466
+ sessionAttributes: this.sessionAttributes,
27467
+ resourceAttributes: (0,_utils__WEBPACK_IMPORTED_MODULE_3__.getNavigatorInfo)(),
27468
+ ...(this._userAttributes ? { userAttributes: this._userAttributes } : {}),
27469
+ debugSessionData: {
27470
+ meta: {
27471
+ reason,
27472
+ windowMs: snapshot.windowMs,
27473
+ fromTs: snapshot.fromTs,
27474
+ toTs: snapshot.toTs,
27475
+ },
27476
+ events: snapshot.rrwebEvents.map((e) => e.event),
27477
+ spans: snapshot.otelSpans.map((s) => s.span),
27478
+ attrs: snapshot.attrs,
27479
+ },
27480
+ };
27481
+ try {
27482
+ const res = await this._apiService.startSession(request);
27483
+ await this._crashBuffer.clear();
27484
+ return res;
27485
+ }
27486
+ catch (_e) {
27487
+ // swallow: flush is best-effort; never throw into app code
27488
+ return null;
27489
+ }
27490
+ }
27491
+ finally {
27492
+ this._isFlushingBuffer = false;
27493
+ }
27494
+ }
26675
27495
  /**
26676
27496
  * @description Check if session should be started/stopped automatically
26677
27497
  * @param {ISession} [sessionPayload]
@@ -26803,12 +27623,12 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_14__.Obse
26803
27623
  * Register socket service event listeners
26804
27624
  */
26805
27625
  _registerSocketServiceListeners() {
26806
- this._socketService.on(_config__WEBPACK_IMPORTED_MODULE_6__.SESSION_STOPPED_EVENT, () => {
27626
+ this._socketService.on(_config__WEBPACK_IMPORTED_MODULE_5__.SESSION_STOPPED_EVENT, () => {
26807
27627
  this._stop();
26808
27628
  this._clearSession();
26809
27629
  this._sessionWidget.handleUIReseting();
26810
27630
  });
26811
- this._socketService.on(_config__WEBPACK_IMPORTED_MODULE_6__.SESSION_AUTO_CREATED, (payload) => {
27631
+ this._socketService.on(_config__WEBPACK_IMPORTED_MODULE_5__.SESSION_AUTO_CREATED, (payload) => {
26812
27632
  var _a;
26813
27633
  if (!(payload === null || payload === void 0 ? void 0 : payload.data))
26814
27634
  return;
@@ -26821,18 +27641,23 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_14__.Obse
26821
27641
  },
26822
27642
  }, 5000);
26823
27643
  });
26824
- this._socketService.on(_config__WEBPACK_IMPORTED_MODULE_6__.REMOTE_SESSION_RECORDING_START, (payload) => {
27644
+ this._socketService.on(_config__WEBPACK_IMPORTED_MODULE_5__.REMOTE_SESSION_RECORDING_START, (payload) => {
26825
27645
  console.log('REMOTE_SESSION_RECORDING_START', payload);
26826
27646
  if (this.sessionState === _types__WEBPACK_IMPORTED_MODULE_4__.SessionState.stopped) {
26827
27647
  this.start();
26828
27648
  }
26829
27649
  });
26830
- this._socketService.on(_config__WEBPACK_IMPORTED_MODULE_6__.REMOTE_SESSION_RECORDING_STOP, (payload) => {
27650
+ this._socketService.on(_config__WEBPACK_IMPORTED_MODULE_5__.REMOTE_SESSION_RECORDING_STOP, (payload) => {
26831
27651
  console.log('REMOTE_SESSION_RECORDING_STOP', payload);
26832
27652
  if (this.sessionState !== _types__WEBPACK_IMPORTED_MODULE_4__.SessionState.stopped) {
26833
27653
  this.stop();
26834
27654
  }
26835
27655
  });
27656
+ this._socketService.on(_config__WEBPACK_IMPORTED_MODULE_5__.SESSION_SAVE_BUFFER_EVENT, (payload) => {
27657
+ // Backend asks the client to flush its crash buffer as a debug session.
27658
+ const reason = (payload === null || payload === void 0 ? void 0 : payload.reason) || 'remote';
27659
+ void this.flushBuffer({ reason });
27660
+ });
26836
27661
  }
26837
27662
  /**
26838
27663
  * Create a new session and start it
@@ -26875,10 +27700,11 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_14__.Obse
26875
27700
  this.sessionState = _types__WEBPACK_IMPORTED_MODULE_4__.SessionState.started;
26876
27701
  this.sessionType = this.sessionType;
26877
27702
  this._tracer.start(this.sessionId, this.sessionType);
26878
- this._recorder.start(this.sessionId, this.sessionType);
27703
+ // Ensure we switch from buffer-only recording to session recording cleanly.
27704
+ void this._recorder.restart(this.sessionId, this.sessionType);
26879
27705
  this._navigationRecorder.start({ sessionId: this.sessionId, sessionType: this.sessionType, });
26880
27706
  if (this.session) {
26881
- _eventBus__WEBPACK_IMPORTED_MODULE_8__.recorderEventBus.emit(_config__WEBPACK_IMPORTED_MODULE_6__.SESSION_STARTED_EVENT, this.session);
27707
+ _eventBus__WEBPACK_IMPORTED_MODULE_7__.recorderEventBus.emit(_config__WEBPACK_IMPORTED_MODULE_5__.SESSION_STARTED_EVENT, this.session);
26882
27708
  this._socketService.subscribeToSession(this.session);
26883
27709
  this._sessionWidget.seconds = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.getTimeDifferenceInSeconds)((_a = this.session) === null || _a === void 0 ? void 0 : _a.startedAt);
26884
27710
  }
@@ -26892,6 +27718,7 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_14__.Obse
26892
27718
  this._tracer.stop();
26893
27719
  this._recorder.stop();
26894
27720
  this._navigationRecorder.stop();
27721
+ this._startBufferOnlyRecording();
26895
27722
  }
26896
27723
  /**
26897
27724
  * Pause the session tracing and recording
@@ -26907,7 +27734,7 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_14__.Obse
26907
27734
  */
26908
27735
  _resume() {
26909
27736
  this._tracer.start(this.sessionId, this.sessionType);
26910
- this._recorder.start(this.sessionId, this.sessionType);
27737
+ void this._recorder.restart(this.sessionId, this.sessionType);
26911
27738
  this._navigationRecorder.resume();
26912
27739
  this.sessionState = _types__WEBPACK_IMPORTED_MODULE_4__.SessionState.started;
26913
27740
  }
@@ -26923,7 +27750,7 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_14__.Obse
26923
27750
  this._start();
26924
27751
  }
26925
27752
  /**
26926
- * Set the session ID in localStorage
27753
+ * Set the session ID in sessionStorage (with fallback)
26927
27754
  * @param sessionId - the session ID to set or clear
26928
27755
  */
26929
27756
  _setSession(session) {
@@ -28566,6 +29393,7 @@ const userAgent = navigator === null || navigator === void 0 ? void 0 : navigato
28566
29393
  /* harmony export */ formatTimeForSessionTimer: () => (/* reexport safe */ _time__WEBPACK_IMPORTED_MODULE_2__.formatTimeForSessionTimer),
28567
29394
  /* harmony export */ getFormattedDate: () => (/* reexport safe */ _time__WEBPACK_IMPORTED_MODULE_2__.getFormattedDate),
28568
29395
  /* harmony export */ getNavigatorInfo: () => (/* reexport safe */ _navigator__WEBPACK_IMPORTED_MODULE_0__.getNavigatorInfo),
29396
+ /* harmony export */ getOrCreateTabId: () => (/* reexport safe */ _tabId__WEBPACK_IMPORTED_MODULE_8__.getOrCreateTabId),
28569
29397
  /* harmony export */ getStoredItem: () => (/* reexport safe */ _storage__WEBPACK_IMPORTED_MODULE_1__.getStoredItem),
28570
29398
  /* harmony export */ getTimeDifferenceInSeconds: () => (/* reexport safe */ _time__WEBPACK_IMPORTED_MODULE_2__.getTimeDifferenceInSeconds),
28571
29399
  /* harmony export */ injectStylesIntoShadowRoot: () => (/* reexport safe */ _dom__WEBPACK_IMPORTED_MODULE_4__.injectStylesIntoShadowRoot),
@@ -28583,6 +29411,7 @@ const userAgent = navigator === null || navigator === void 0 ? void 0 : navigato
28583
29411
  /* harmony import */ var _array__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./array */ "./src/utils/array.ts");
28584
29412
  /* harmony import */ var _type_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./type-utils */ "./src/utils/type-utils.ts");
28585
29413
  /* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./globals */ "./src/utils/globals.ts");
29414
+ /* harmony import */ var _tabId__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./tabId */ "./src/utils/tabId.ts");
28586
29415
  // Export all utility functions
28587
29416
 
28588
29417
 
@@ -28594,6 +29423,7 @@ const userAgent = navigator === null || navigator === void 0 ? void 0 : navigato
28594
29423
 
28595
29424
 
28596
29425
 
29426
+
28597
29427
  /***/ }),
28598
29428
 
28599
29429
  /***/ "./src/utils/navigator.ts":
@@ -28826,32 +29656,88 @@ const isConsoleEvent = (event) => {
28826
29656
  /* harmony export */ });
28827
29657
  /* unused harmony export removeStoredItem */
28828
29658
  /**
28829
- * LocalStorage utility functions
29659
+ * Storage utility functions.
29660
+ *
29661
+ * Session state must be isolated per-tab to avoid conflicts across multiple tabs.
29662
+ * We therefore prefer `sessionStorage` and fall back to `localStorage` if needed.
28830
29663
  */
28831
- const hasLocalStorage = typeof window !== 'undefined' && !!window.localStorage;
28832
- const getStoredItem = (key, parse) => {
28833
- if (!hasLocalStorage) {
28834
- return parse ? null : null;
29664
+ const hasWindow = typeof window !== 'undefined';
29665
+ const getStorage = () => {
29666
+ if (!hasWindow)
29667
+ return null;
29668
+ try {
29669
+ if (window.sessionStorage)
29670
+ return window.sessionStorage;
29671
+ }
29672
+ catch (_e) {
29673
+ // sessionStorage can throw (e.g. blocked in some environments)
29674
+ }
29675
+ try {
29676
+ if (window.localStorage)
29677
+ return window.localStorage;
28835
29678
  }
28836
- const item = window.localStorage.getItem(key);
29679
+ catch (_e) {
29680
+ // localStorage can throw (e.g. blocked in some environments)
29681
+ }
29682
+ return null;
29683
+ };
29684
+ const getStoredItem = (key, parse) => {
29685
+ const storage = getStorage();
29686
+ if (!storage)
29687
+ return null;
29688
+ const item = storage.getItem(key);
28837
29689
  return parse ? (item ? JSON.parse(item) : null) : item;
28838
29690
  };
28839
29691
  const setStoredItem = (key, value) => {
28840
- if (!hasLocalStorage) {
29692
+ const storage = getStorage();
29693
+ if (!storage)
28841
29694
  return;
28842
- }
28843
29695
  if (value === null || value === undefined) {
28844
- window.localStorage.removeItem(key);
29696
+ storage.removeItem(key);
28845
29697
  }
28846
29698
  else {
28847
- window.localStorage.setItem(key, typeof value === 'string' ? value : JSON.stringify(value));
29699
+ storage.setItem(key, typeof value === 'string' ? value : JSON.stringify(value));
28848
29700
  }
28849
29701
  };
28850
29702
  const removeStoredItem = (key) => {
28851
- if (!hasLocalStorage) {
29703
+ const storage = getStorage();
29704
+ if (!storage)
28852
29705
  return;
29706
+ storage.removeItem(key);
29707
+ };
29708
+
29709
+
29710
+ /***/ }),
29711
+
29712
+ /***/ "./src/utils/tabId.ts":
29713
+ /*!****************************!*\
29714
+ !*** ./src/utils/tabId.ts ***!
29715
+ \****************************/
29716
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
29717
+
29718
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
29719
+ /* harmony export */ getOrCreateTabId: () => (/* binding */ getOrCreateTabId)
29720
+ /* harmony export */ });
29721
+ const TAB_ID_KEY = 'multiplayer-tab-id';
29722
+ const randomId = () => {
29723
+ // Avoid crypto dependency for older browsers; good enough for per-tab isolation
29724
+ return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
29725
+ };
29726
+ const getOrCreateTabId = () => {
29727
+ if (typeof window === 'undefined')
29728
+ return 'ssr';
29729
+ try {
29730
+ const existing = window.sessionStorage.getItem(TAB_ID_KEY);
29731
+ if (existing)
29732
+ return existing;
29733
+ const id = randomId();
29734
+ window.sessionStorage.setItem(TAB_ID_KEY, id);
29735
+ return id;
29736
+ }
29737
+ catch (_e) {
29738
+ // If sessionStorage is blocked, fall back to a runtime-only id.
29739
+ return randomId();
28853
29740
  }
28854
- window.localStorage.removeItem(key);
28855
29741
  };
28856
29742
 
28857
29743
 
@@ -28997,42 +29883,48 @@ const isFile = (x) => {
28997
29883
  /* harmony export */ SessionRecorderIdGenerator: () => (/* binding */ SessionRecorderIdGenerator)
28998
29884
  /* harmony export */ });
28999
29885
  /* harmony import */ var _type__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./type */ "../session-recorder-common/dist/esm/type/index.js");
29000
- /* harmony import */ var _constants_constants_base__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./constants/constants.base */ "../session-recorder-common/dist/esm/constants/constants.base.js");
29001
- /* harmony import */ var _sdk__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./sdk */ "../session-recorder-common/dist/esm/sdk/index.js");
29886
+ /* harmony import */ var _sdk__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdk */ "../session-recorder-common/dist/esm/sdk/index.js");
29887
+ /* harmony import */ var _constants_constants_base__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./constants/constants.base */ "../session-recorder-common/dist/esm/constants/constants.base.js");
29002
29888
 
29003
29889
 
29004
29890
 
29005
29891
  var SessionRecorderIdGenerator = /** @class */ (function () {
29006
29892
  function SessionRecorderIdGenerator() {
29007
- this.generateLongId = (0,_sdk__WEBPACK_IMPORTED_MODULE_2__.getIdGenerator)(16);
29008
- this.generateShortId = (0,_sdk__WEBPACK_IMPORTED_MODULE_2__.getIdGenerator)(8);
29893
+ this.generateLongId = (0,_sdk__WEBPACK_IMPORTED_MODULE_1__.getIdGenerator)(16);
29894
+ this.generateShortId = (0,_sdk__WEBPACK_IMPORTED_MODULE_1__.getIdGenerator)(8);
29009
29895
  this.sessionShortId = '';
29896
+ this.clientId = '';
29010
29897
  this.sessionType = _type__WEBPACK_IMPORTED_MODULE_0__.SessionType.MANUAL;
29011
29898
  }
29012
29899
  SessionRecorderIdGenerator.prototype.generateTraceId = function () {
29013
29900
  var traceId = this.generateLongId();
29014
- if (this.sessionShortId) {
29015
- var sessionTypePrefix = '';
29016
- switch (this.sessionType) {
29017
- case _type__WEBPACK_IMPORTED_MODULE_0__.SessionType.CONTINUOUS:
29018
- sessionTypePrefix = _constants_constants_base__WEBPACK_IMPORTED_MODULE_1__.MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX;
29019
- break;
29020
- default:
29021
- sessionTypePrefix = _constants_constants_base__WEBPACK_IMPORTED_MODULE_1__.MULTIPLAYER_TRACE_DEBUG_PREFIX;
29022
- }
29023
- var prefix = "".concat(sessionTypePrefix).concat(this.sessionShortId);
29024
- var sessionTraceId = "".concat(prefix).concat(traceId.substring(prefix.length, traceId.length));
29025
- return sessionTraceId;
29901
+ if (!this.sessionShortId && !this.sessionType) {
29902
+ return traceId;
29026
29903
  }
29027
- return traceId;
29904
+ var sessionTypePrefix = _constants_constants_base__WEBPACK_IMPORTED_MODULE_2__.MULTIPLAYER_TRACE_PREFIX_MAP[this.sessionType];
29905
+ var prefix = "".concat(sessionTypePrefix).concat([_type__WEBPACK_IMPORTED_MODULE_0__.SessionType.CONTINUOUS_SESSION_CACHE, _type__WEBPACK_IMPORTED_MODULE_0__.SessionType.SESSION_CACHE].includes(this.sessionType) ? this.clientId : '').concat(this.sessionShortId);
29906
+ var sessionTraceId = "".concat(prefix).concat(traceId.substring(prefix.length, traceId.length));
29907
+ return sessionTraceId;
29028
29908
  };
29029
29909
  SessionRecorderIdGenerator.prototype.generateSpanId = function () {
29030
29910
  return this.generateShortId();
29031
29911
  };
29032
- SessionRecorderIdGenerator.prototype.setSessionId = function (sessionShortId, sessionType) {
29912
+ SessionRecorderIdGenerator.prototype.setSessionId = function (sessionShortId, sessionType, clientId) {
29033
29913
  if (sessionType === void 0) { sessionType = _type__WEBPACK_IMPORTED_MODULE_0__.SessionType.MANUAL; }
29914
+ if (clientId === void 0) { clientId = ''; }
29915
+ if (!clientId &&
29916
+ [
29917
+ _type__WEBPACK_IMPORTED_MODULE_0__.SessionType.SESSION_CACHE,
29918
+ _type__WEBPACK_IMPORTED_MODULE_0__.SessionType.CONTINUOUS_SESSION_CACHE,
29919
+ ].includes(sessionType)) {
29920
+ throw new Error("Client ID is required for ".concat([
29921
+ _type__WEBPACK_IMPORTED_MODULE_0__.SessionType.SESSION_CACHE,
29922
+ _type__WEBPACK_IMPORTED_MODULE_0__.SessionType.CONTINUOUS_SESSION_CACHE,
29923
+ ].join(', '), " session types"));
29924
+ }
29034
29925
  this.sessionShortId = sessionShortId;
29035
29926
  this.sessionType = sessionType;
29927
+ this.clientId = clientId;
29036
29928
  };
29037
29929
  return SessionRecorderIdGenerator;
29038
29930
  }());
@@ -29133,6 +30025,7 @@ var SessionRecorderTraceIdRatioBasedSampler = /** @class */ (function () {
29133
30025
  /* harmony export */ ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE: () => (/* binding */ ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE),
29134
30026
  /* harmony export */ ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE_ENCODING: () => (/* binding */ ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE_ENCODING),
29135
30027
  /* harmony export */ ATTR_MULTIPLAYER_RPC_RESPONSE_MESSAGE: () => (/* binding */ ATTR_MULTIPLAYER_RPC_RESPONSE_MESSAGE),
30028
+ /* harmony export */ ATTR_MULTIPLAYER_SESSION_CLIENT_ID: () => (/* binding */ ATTR_MULTIPLAYER_SESSION_CLIENT_ID),
29136
30029
  /* harmony export */ ATTR_MULTIPLAYER_SESSION_ID: () => (/* binding */ ATTR_MULTIPLAYER_SESSION_ID),
29137
30030
  /* harmony export */ ATTR_MULTIPLAYER_SESSION_RECORDER_VERSION: () => (/* binding */ ATTR_MULTIPLAYER_SESSION_RECORDER_VERSION),
29138
30031
  /* harmony export */ ATTR_MULTIPLAYER_USER_HASH: () => (/* binding */ ATTR_MULTIPLAYER_USER_HASH),
@@ -29146,18 +30039,34 @@ var SessionRecorderTraceIdRatioBasedSampler = /** @class */ (function () {
29146
30039
  /* harmony export */ MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_GRPC_URL: () => (/* binding */ MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_GRPC_URL),
29147
30040
  /* harmony export */ MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_HTTP_URL: () => (/* binding */ MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_HTTP_URL),
29148
30041
  /* harmony export */ MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_URL: () => (/* binding */ MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_URL),
30042
+ /* harmony export */ MULTIPLAYER_TRACE_CLIENT_ID_LENGTH: () => (/* binding */ MULTIPLAYER_TRACE_CLIENT_ID_LENGTH),
29149
30043
  /* harmony export */ MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX: () => (/* binding */ MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX),
30044
+ /* harmony export */ MULTIPLAYER_TRACE_CONTINUOUS_SESSION_DEBUG_PREFIX: () => (/* binding */ MULTIPLAYER_TRACE_CONTINUOUS_SESSION_DEBUG_PREFIX),
29150
30045
  /* harmony export */ MULTIPLAYER_TRACE_DEBUG_PREFIX: () => (/* binding */ MULTIPLAYER_TRACE_DEBUG_PREFIX),
29151
30046
  /* harmony export */ MULTIPLAYER_TRACE_DEBUG_SESSION_SHORT_ID_LENGTH: () => (/* binding */ MULTIPLAYER_TRACE_DEBUG_SESSION_SHORT_ID_LENGTH),
29152
- /* harmony export */ MULTIPLAYER_TRACE_DOC_PREFIX: () => (/* binding */ MULTIPLAYER_TRACE_DOC_PREFIX)
30047
+ /* harmony export */ MULTIPLAYER_TRACE_DOC_PREFIX: () => (/* binding */ MULTIPLAYER_TRACE_DOC_PREFIX),
30048
+ /* harmony export */ MULTIPLAYER_TRACE_PREFIX_MAP: () => (/* binding */ MULTIPLAYER_TRACE_PREFIX_MAP),
30049
+ /* harmony export */ MULTIPLAYER_TRACE_SESSION_CACHE_PREFIX: () => (/* binding */ MULTIPLAYER_TRACE_SESSION_CACHE_PREFIX)
29153
30050
  /* harmony export */ });
30051
+ /* harmony import */ var _type__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../type */ "../session-recorder-common/dist/esm/type/index.js");
30052
+ var _a;
30053
+
29154
30054
  /**
29155
30055
  * @deprecated
29156
30056
  */
29157
30057
  var MULTIPLAYER_TRACE_DOC_PREFIX = 'd0cd0c';
29158
30058
  var MULTIPLAYER_TRACE_DEBUG_PREFIX = 'debdeb';
29159
30059
  var MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX = 'cdbcdb';
29160
- var MULTIPLAYER_TRACE_DEBUG_SESSION_SHORT_ID_LENGTH = 16;
30060
+ var MULTIPLAYER_TRACE_SESSION_CACHE_PREFIX = 'cdbcac';
30061
+ var MULTIPLAYER_TRACE_CONTINUOUS_SESSION_DEBUG_PREFIX = 'debcdb';
30062
+ var MULTIPLAYER_TRACE_PREFIX_MAP = (_a = {},
30063
+ _a[_type__WEBPACK_IMPORTED_MODULE_0__.SessionType.CONTINUOUS] = MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX,
30064
+ _a[_type__WEBPACK_IMPORTED_MODULE_0__.SessionType.SESSION_CACHE] = MULTIPLAYER_TRACE_SESSION_CACHE_PREFIX,
30065
+ _a[_type__WEBPACK_IMPORTED_MODULE_0__.SessionType.CONTINUOUS_SESSION_CACHE] = MULTIPLAYER_TRACE_CONTINUOUS_SESSION_DEBUG_PREFIX,
30066
+ _a[_type__WEBPACK_IMPORTED_MODULE_0__.SessionType.MANUAL] = MULTIPLAYER_TRACE_DEBUG_PREFIX,
30067
+ _a);
30068
+ var MULTIPLAYER_TRACE_DEBUG_SESSION_SHORT_ID_LENGTH = 8;
30069
+ var MULTIPLAYER_TRACE_CLIENT_ID_LENGTH = 8;
29161
30070
  /**
29162
30071
  * @deprecated Use MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_HTTP_URL instead
29163
30072
  */
@@ -29181,6 +30090,7 @@ var ATTR_MULTIPLAYER_PLATFORM_NAME = 'multiplayer.platform.name';
29181
30090
  var ATTR_MULTIPLAYER_CLIENT_ID = 'multiplayer.client.id';
29182
30091
  var ATTR_MULTIPLAYER_INTEGRATION_ID = 'multiplayer.integration.id';
29183
30092
  var ATTR_MULTIPLAYER_SESSION_ID = 'multiplayer.session.id';
30093
+ var ATTR_MULTIPLAYER_SESSION_CLIENT_ID = 'multiplayer.session.client.id';
29184
30094
  var ATTR_MULTIPLAYER_HTTP_PROXY = 'multiplayer.http.proxy';
29185
30095
  var ATTR_MULTIPLAYER_HTTP_PROXY_TYPE = 'multiplayer.http.proxy.type';
29186
30096
  var ATTR_MULTIPLAYER_HTTP_REQUEST_BODY = 'multiplayer.http.request.body';
@@ -29238,6 +30148,7 @@ var MASK_PLACEHOLDER = '***MASKED***';
29238
30148
  /* harmony export */ ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE),
29239
30149
  /* harmony export */ ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE_ENCODING: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE_ENCODING),
29240
30150
  /* harmony export */ ATTR_MULTIPLAYER_RPC_RESPONSE_MESSAGE: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.ATTR_MULTIPLAYER_RPC_RESPONSE_MESSAGE),
30151
+ /* harmony export */ ATTR_MULTIPLAYER_SESSION_CLIENT_ID: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.ATTR_MULTIPLAYER_SESSION_CLIENT_ID),
29241
30152
  /* harmony export */ ATTR_MULTIPLAYER_SESSION_ID: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.ATTR_MULTIPLAYER_SESSION_ID),
29242
30153
  /* harmony export */ ATTR_MULTIPLAYER_SESSION_RECORDER_VERSION: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.ATTR_MULTIPLAYER_SESSION_RECORDER_VERSION),
29243
30154
  /* harmony export */ ATTR_MULTIPLAYER_USER_HASH: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.ATTR_MULTIPLAYER_USER_HASH),
@@ -29251,10 +30162,14 @@ var MASK_PLACEHOLDER = '***MASKED***';
29251
30162
  /* harmony export */ MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_GRPC_URL: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_GRPC_URL),
29252
30163
  /* harmony export */ MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_HTTP_URL: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_HTTP_URL),
29253
30164
  /* harmony export */ MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_URL: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_URL),
30165
+ /* harmony export */ MULTIPLAYER_TRACE_CLIENT_ID_LENGTH: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_CLIENT_ID_LENGTH),
29254
30166
  /* harmony export */ MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX),
30167
+ /* harmony export */ MULTIPLAYER_TRACE_CONTINUOUS_SESSION_DEBUG_PREFIX: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_CONTINUOUS_SESSION_DEBUG_PREFIX),
29255
30168
  /* harmony export */ MULTIPLAYER_TRACE_DEBUG_PREFIX: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_DEBUG_PREFIX),
29256
30169
  /* harmony export */ MULTIPLAYER_TRACE_DEBUG_SESSION_SHORT_ID_LENGTH: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_DEBUG_SESSION_SHORT_ID_LENGTH),
29257
- /* harmony export */ MULTIPLAYER_TRACE_DOC_PREFIX: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_DOC_PREFIX)
30170
+ /* harmony export */ MULTIPLAYER_TRACE_DOC_PREFIX: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_DOC_PREFIX),
30171
+ /* harmony export */ MULTIPLAYER_TRACE_PREFIX_MAP: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_PREFIX_MAP),
30172
+ /* harmony export */ MULTIPLAYER_TRACE_SESSION_CACHE_PREFIX: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_SESSION_CACHE_PREFIX)
29258
30173
  /* harmony export */ });
29259
30174
  /* harmony import */ var _constants_base__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constants.base */ "../session-recorder-common/dist/esm/constants/constants.base.js");
29260
30175
 
@@ -29444,6 +30359,7 @@ var SessionRecorderBrowserTraceExporter = /** @class */ (function () {
29444
30359
  /* harmony export */ ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE),
29445
30360
  /* harmony export */ ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE_ENCODING: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE_ENCODING),
29446
30361
  /* harmony export */ ATTR_MULTIPLAYER_RPC_RESPONSE_MESSAGE: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.ATTR_MULTIPLAYER_RPC_RESPONSE_MESSAGE),
30362
+ /* harmony export */ ATTR_MULTIPLAYER_SESSION_CLIENT_ID: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.ATTR_MULTIPLAYER_SESSION_CLIENT_ID),
29447
30363
  /* harmony export */ ATTR_MULTIPLAYER_SESSION_ID: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.ATTR_MULTIPLAYER_SESSION_ID),
29448
30364
  /* harmony export */ ATTR_MULTIPLAYER_SESSION_RECORDER_VERSION: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.ATTR_MULTIPLAYER_SESSION_RECORDER_VERSION),
29449
30365
  /* harmony export */ ATTR_MULTIPLAYER_USER_HASH: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.ATTR_MULTIPLAYER_USER_HASH),
@@ -29458,10 +30374,14 @@ var SessionRecorderBrowserTraceExporter = /** @class */ (function () {
29458
30374
  /* harmony export */ MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_GRPC_URL: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_GRPC_URL),
29459
30375
  /* harmony export */ MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_HTTP_URL: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_HTTP_URL),
29460
30376
  /* harmony export */ MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_URL: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_URL),
30377
+ /* harmony export */ MULTIPLAYER_TRACE_CLIENT_ID_LENGTH: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_CLIENT_ID_LENGTH),
29461
30378
  /* harmony export */ MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX),
30379
+ /* harmony export */ MULTIPLAYER_TRACE_CONTINUOUS_SESSION_DEBUG_PREFIX: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_CONTINUOUS_SESSION_DEBUG_PREFIX),
29462
30380
  /* harmony export */ MULTIPLAYER_TRACE_DEBUG_PREFIX: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_DEBUG_PREFIX),
29463
30381
  /* harmony export */ MULTIPLAYER_TRACE_DEBUG_SESSION_SHORT_ID_LENGTH: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_DEBUG_SESSION_SHORT_ID_LENGTH),
29464
30382
  /* harmony export */ MULTIPLAYER_TRACE_DOC_PREFIX: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_DOC_PREFIX),
30383
+ /* harmony export */ MULTIPLAYER_TRACE_PREFIX_MAP: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_PREFIX_MAP),
30384
+ /* harmony export */ MULTIPLAYER_TRACE_SESSION_CACHE_PREFIX: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_SESSION_CACHE_PREFIX),
29465
30385
  /* harmony export */ SessionRecorderBrowserTraceExporter: () => (/* reexport safe */ _exporters_index_browser__WEBPACK_IMPORTED_MODULE_5__.SessionRecorderBrowserTraceExporter),
29466
30386
  /* harmony export */ SessionRecorderIdGenerator: () => (/* reexport safe */ _SessionRecorderIdGenerator__WEBPACK_IMPORTED_MODULE_1__.SessionRecorderIdGenerator),
29467
30387
  /* harmony export */ SessionRecorderSdk: () => (/* reexport module object */ _sdk__WEBPACK_IMPORTED_MODULE_3__),
@@ -30096,6 +31016,8 @@ var SessionType;
30096
31016
  */
30097
31017
  SessionType["PLAIN"] = "MANUAL";
30098
31018
  SessionType["MANUAL"] = "MANUAL";
31019
+ SessionType["CONTINUOUS_SESSION_CACHE"] = "CONTINUOUS_SESSION_CACHE";
31020
+ SessionType["SESSION_CACHE"] = "SESSION_CACHE";
30099
31021
  })(SessionType || (SessionType = {}));
30100
31022
  //# sourceMappingURL=session-type.enum.js.map
30101
31023
 
@@ -31947,6 +32869,115 @@ const getRecordConsolePlugin = (options) => ({
31947
32869
  //# sourceMappingURL=rrweb-plugin-console-record.js.map
31948
32870
 
31949
32871
 
32872
+ /***/ }),
32873
+
32874
+ /***/ "../../node_modules/@rrweb/types/dist/types.js":
32875
+ /*!*****************************************************!*\
32876
+ !*** ../../node_modules/@rrweb/types/dist/types.js ***!
32877
+ \*****************************************************/
32878
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
32879
+
32880
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
32881
+ /* harmony export */ EventType: () => (/* binding */ EventType)
32882
+ /* harmony export */ });
32883
+ /* unused harmony exports CanvasContext, IncrementalSource, MediaInteractions, MouseInteractions, NodeType, PointerTypes, ReplayerEvents */
32884
+ var EventType = /* @__PURE__ */ ((EventType2) => {
32885
+ EventType2[EventType2["DomContentLoaded"] = 0] = "DomContentLoaded";
32886
+ EventType2[EventType2["Load"] = 1] = "Load";
32887
+ EventType2[EventType2["FullSnapshot"] = 2] = "FullSnapshot";
32888
+ EventType2[EventType2["IncrementalSnapshot"] = 3] = "IncrementalSnapshot";
32889
+ EventType2[EventType2["Meta"] = 4] = "Meta";
32890
+ EventType2[EventType2["Custom"] = 5] = "Custom";
32891
+ EventType2[EventType2["Plugin"] = 6] = "Plugin";
32892
+ return EventType2;
32893
+ })(EventType || {});
32894
+ var IncrementalSource = /* @__PURE__ */ ((IncrementalSource2) => {
32895
+ IncrementalSource2[IncrementalSource2["Mutation"] = 0] = "Mutation";
32896
+ IncrementalSource2[IncrementalSource2["MouseMove"] = 1] = "MouseMove";
32897
+ IncrementalSource2[IncrementalSource2["MouseInteraction"] = 2] = "MouseInteraction";
32898
+ IncrementalSource2[IncrementalSource2["Scroll"] = 3] = "Scroll";
32899
+ IncrementalSource2[IncrementalSource2["ViewportResize"] = 4] = "ViewportResize";
32900
+ IncrementalSource2[IncrementalSource2["Input"] = 5] = "Input";
32901
+ IncrementalSource2[IncrementalSource2["TouchMove"] = 6] = "TouchMove";
32902
+ IncrementalSource2[IncrementalSource2["MediaInteraction"] = 7] = "MediaInteraction";
32903
+ IncrementalSource2[IncrementalSource2["StyleSheetRule"] = 8] = "StyleSheetRule";
32904
+ IncrementalSource2[IncrementalSource2["CanvasMutation"] = 9] = "CanvasMutation";
32905
+ IncrementalSource2[IncrementalSource2["Font"] = 10] = "Font";
32906
+ IncrementalSource2[IncrementalSource2["Log"] = 11] = "Log";
32907
+ IncrementalSource2[IncrementalSource2["Drag"] = 12] = "Drag";
32908
+ IncrementalSource2[IncrementalSource2["StyleDeclaration"] = 13] = "StyleDeclaration";
32909
+ IncrementalSource2[IncrementalSource2["Selection"] = 14] = "Selection";
32910
+ IncrementalSource2[IncrementalSource2["AdoptedStyleSheet"] = 15] = "AdoptedStyleSheet";
32911
+ IncrementalSource2[IncrementalSource2["CustomElement"] = 16] = "CustomElement";
32912
+ return IncrementalSource2;
32913
+ })(IncrementalSource || {});
32914
+ var MouseInteractions = /* @__PURE__ */ ((MouseInteractions2) => {
32915
+ MouseInteractions2[MouseInteractions2["MouseUp"] = 0] = "MouseUp";
32916
+ MouseInteractions2[MouseInteractions2["MouseDown"] = 1] = "MouseDown";
32917
+ MouseInteractions2[MouseInteractions2["Click"] = 2] = "Click";
32918
+ MouseInteractions2[MouseInteractions2["ContextMenu"] = 3] = "ContextMenu";
32919
+ MouseInteractions2[MouseInteractions2["DblClick"] = 4] = "DblClick";
32920
+ MouseInteractions2[MouseInteractions2["Focus"] = 5] = "Focus";
32921
+ MouseInteractions2[MouseInteractions2["Blur"] = 6] = "Blur";
32922
+ MouseInteractions2[MouseInteractions2["TouchStart"] = 7] = "TouchStart";
32923
+ MouseInteractions2[MouseInteractions2["TouchMove_Departed"] = 8] = "TouchMove_Departed";
32924
+ MouseInteractions2[MouseInteractions2["TouchEnd"] = 9] = "TouchEnd";
32925
+ MouseInteractions2[MouseInteractions2["TouchCancel"] = 10] = "TouchCancel";
32926
+ return MouseInteractions2;
32927
+ })(MouseInteractions || {});
32928
+ var PointerTypes = /* @__PURE__ */ ((PointerTypes2) => {
32929
+ PointerTypes2[PointerTypes2["Mouse"] = 0] = "Mouse";
32930
+ PointerTypes2[PointerTypes2["Pen"] = 1] = "Pen";
32931
+ PointerTypes2[PointerTypes2["Touch"] = 2] = "Touch";
32932
+ return PointerTypes2;
32933
+ })(PointerTypes || {});
32934
+ var CanvasContext = /* @__PURE__ */ ((CanvasContext2) => {
32935
+ CanvasContext2[CanvasContext2["2D"] = 0] = "2D";
32936
+ CanvasContext2[CanvasContext2["WebGL"] = 1] = "WebGL";
32937
+ CanvasContext2[CanvasContext2["WebGL2"] = 2] = "WebGL2";
32938
+ return CanvasContext2;
32939
+ })(CanvasContext || {});
32940
+ var MediaInteractions = /* @__PURE__ */ ((MediaInteractions2) => {
32941
+ MediaInteractions2[MediaInteractions2["Play"] = 0] = "Play";
32942
+ MediaInteractions2[MediaInteractions2["Pause"] = 1] = "Pause";
32943
+ MediaInteractions2[MediaInteractions2["Seeked"] = 2] = "Seeked";
32944
+ MediaInteractions2[MediaInteractions2["VolumeChange"] = 3] = "VolumeChange";
32945
+ MediaInteractions2[MediaInteractions2["RateChange"] = 4] = "RateChange";
32946
+ return MediaInteractions2;
32947
+ })(MediaInteractions || {});
32948
+ var ReplayerEvents = /* @__PURE__ */ ((ReplayerEvents2) => {
32949
+ ReplayerEvents2["Start"] = "start";
32950
+ ReplayerEvents2["Pause"] = "pause";
32951
+ ReplayerEvents2["Resume"] = "resume";
32952
+ ReplayerEvents2["Resize"] = "resize";
32953
+ ReplayerEvents2["Finish"] = "finish";
32954
+ ReplayerEvents2["FullsnapshotRebuilded"] = "fullsnapshot-rebuilded";
32955
+ ReplayerEvents2["LoadStylesheetStart"] = "load-stylesheet-start";
32956
+ ReplayerEvents2["LoadStylesheetEnd"] = "load-stylesheet-end";
32957
+ ReplayerEvents2["SkipStart"] = "skip-start";
32958
+ ReplayerEvents2["SkipEnd"] = "skip-end";
32959
+ ReplayerEvents2["MouseInteraction"] = "mouse-interaction";
32960
+ ReplayerEvents2["EventCast"] = "event-cast";
32961
+ ReplayerEvents2["CustomEvent"] = "custom-event";
32962
+ ReplayerEvents2["Flush"] = "flush";
32963
+ ReplayerEvents2["StateChange"] = "state-change";
32964
+ ReplayerEvents2["PlayBack"] = "play-back";
32965
+ ReplayerEvents2["Destroy"] = "destroy";
32966
+ return ReplayerEvents2;
32967
+ })(ReplayerEvents || {});
32968
+ var NodeType = /* @__PURE__ */ ((NodeType2) => {
32969
+ NodeType2[NodeType2["Document"] = 0] = "Document";
32970
+ NodeType2[NodeType2["DocumentType"] = 1] = "DocumentType";
32971
+ NodeType2[NodeType2["Element"] = 2] = "Element";
32972
+ NodeType2[NodeType2["Text"] = 3] = "Text";
32973
+ NodeType2[NodeType2["CDATA"] = 4] = "CDATA";
32974
+ NodeType2[NodeType2["Comment"] = 5] = "Comment";
32975
+ return NodeType2;
32976
+ })(NodeType || {});
32977
+
32978
+ //# sourceMappingURL=types.js.map
32979
+
32980
+
31950
32981
  /***/ }),
31951
32982
 
31952
32983
  /***/ "../../node_modules/@socket.io/component-emitter/lib/esm/index.js":
@@ -48362,6 +49393,7 @@ var __webpack_exports__ = {};
48362
49393
  /* harmony export */ ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_7__.ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE),
48363
49394
  /* harmony export */ ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE_ENCODING: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_7__.ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE_ENCODING),
48364
49395
  /* harmony export */ ATTR_MULTIPLAYER_RPC_RESPONSE_MESSAGE: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_7__.ATTR_MULTIPLAYER_RPC_RESPONSE_MESSAGE),
49396
+ /* harmony export */ ATTR_MULTIPLAYER_SESSION_CLIENT_ID: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_7__.ATTR_MULTIPLAYER_SESSION_CLIENT_ID),
48365
49397
  /* harmony export */ ATTR_MULTIPLAYER_SESSION_ID: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_7__.ATTR_MULTIPLAYER_SESSION_ID),
48366
49398
  /* harmony export */ ATTR_MULTIPLAYER_SESSION_RECORDER_VERSION: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_7__.ATTR_MULTIPLAYER_SESSION_RECORDER_VERSION),
48367
49399
  /* harmony export */ ATTR_MULTIPLAYER_USER_HASH: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_7__.ATTR_MULTIPLAYER_USER_HASH),
@@ -48376,10 +49408,14 @@ var __webpack_exports__ = {};
48376
49408
  /* harmony export */ MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_GRPC_URL: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_7__.MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_GRPC_URL),
48377
49409
  /* harmony export */ MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_HTTP_URL: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_7__.MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_HTTP_URL),
48378
49410
  /* harmony export */ MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_URL: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_7__.MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_URL),
49411
+ /* harmony export */ MULTIPLAYER_TRACE_CLIENT_ID_LENGTH: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_7__.MULTIPLAYER_TRACE_CLIENT_ID_LENGTH),
48379
49412
  /* harmony export */ MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_7__.MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX),
49413
+ /* harmony export */ MULTIPLAYER_TRACE_CONTINUOUS_SESSION_DEBUG_PREFIX: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_7__.MULTIPLAYER_TRACE_CONTINUOUS_SESSION_DEBUG_PREFIX),
48380
49414
  /* harmony export */ MULTIPLAYER_TRACE_DEBUG_PREFIX: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_7__.MULTIPLAYER_TRACE_DEBUG_PREFIX),
48381
49415
  /* harmony export */ MULTIPLAYER_TRACE_DEBUG_SESSION_SHORT_ID_LENGTH: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_7__.MULTIPLAYER_TRACE_DEBUG_SESSION_SHORT_ID_LENGTH),
48382
49416
  /* harmony export */ MULTIPLAYER_TRACE_DOC_PREFIX: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_7__.MULTIPLAYER_TRACE_DOC_PREFIX),
49417
+ /* harmony export */ MULTIPLAYER_TRACE_PREFIX_MAP: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_7__.MULTIPLAYER_TRACE_PREFIX_MAP),
49418
+ /* harmony export */ MULTIPLAYER_TRACE_SESSION_CACHE_PREFIX: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_7__.MULTIPLAYER_TRACE_SESSION_CACHE_PREFIX),
48383
49419
  /* harmony export */ NavigationRecorder: () => (/* reexport safe */ _navigation__WEBPACK_IMPORTED_MODULE_6__.NavigationRecorder),
48384
49420
  /* harmony export */ SessionRecorderBrowserTraceExporter: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_7__.SessionRecorderBrowserTraceExporter),
48385
49421
  /* harmony export */ SessionRecorderIdGenerator: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_7__.SessionRecorderIdGenerator),
@@ -48457,6 +49493,7 @@ var __webpack_exports__ATTR_MULTIPLAYER_PROJECT_ID = __webpack_exports__.ATTR_MU
48457
49493
  var __webpack_exports__ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE = __webpack_exports__.ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE;
48458
49494
  var __webpack_exports__ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE_ENCODING = __webpack_exports__.ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE_ENCODING;
48459
49495
  var __webpack_exports__ATTR_MULTIPLAYER_RPC_RESPONSE_MESSAGE = __webpack_exports__.ATTR_MULTIPLAYER_RPC_RESPONSE_MESSAGE;
49496
+ var __webpack_exports__ATTR_MULTIPLAYER_SESSION_CLIENT_ID = __webpack_exports__.ATTR_MULTIPLAYER_SESSION_CLIENT_ID;
48460
49497
  var __webpack_exports__ATTR_MULTIPLAYER_SESSION_ID = __webpack_exports__.ATTR_MULTIPLAYER_SESSION_ID;
48461
49498
  var __webpack_exports__ATTR_MULTIPLAYER_SESSION_RECORDER_VERSION = __webpack_exports__.ATTR_MULTIPLAYER_SESSION_RECORDER_VERSION;
48462
49499
  var __webpack_exports__ATTR_MULTIPLAYER_USER_HASH = __webpack_exports__.ATTR_MULTIPLAYER_USER_HASH;
@@ -48471,10 +49508,14 @@ var __webpack_exports__MULTIPLAYER_OTEL_DEFAULT_LOGS_EXPORTER_URL = __webpack_ex
48471
49508
  var __webpack_exports__MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_GRPC_URL = __webpack_exports__.MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_GRPC_URL;
48472
49509
  var __webpack_exports__MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_HTTP_URL = __webpack_exports__.MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_HTTP_URL;
48473
49510
  var __webpack_exports__MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_URL = __webpack_exports__.MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_URL;
49511
+ var __webpack_exports__MULTIPLAYER_TRACE_CLIENT_ID_LENGTH = __webpack_exports__.MULTIPLAYER_TRACE_CLIENT_ID_LENGTH;
48474
49512
  var __webpack_exports__MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX = __webpack_exports__.MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX;
49513
+ var __webpack_exports__MULTIPLAYER_TRACE_CONTINUOUS_SESSION_DEBUG_PREFIX = __webpack_exports__.MULTIPLAYER_TRACE_CONTINUOUS_SESSION_DEBUG_PREFIX;
48475
49514
  var __webpack_exports__MULTIPLAYER_TRACE_DEBUG_PREFIX = __webpack_exports__.MULTIPLAYER_TRACE_DEBUG_PREFIX;
48476
49515
  var __webpack_exports__MULTIPLAYER_TRACE_DEBUG_SESSION_SHORT_ID_LENGTH = __webpack_exports__.MULTIPLAYER_TRACE_DEBUG_SESSION_SHORT_ID_LENGTH;
48477
49516
  var __webpack_exports__MULTIPLAYER_TRACE_DOC_PREFIX = __webpack_exports__.MULTIPLAYER_TRACE_DOC_PREFIX;
49517
+ var __webpack_exports__MULTIPLAYER_TRACE_PREFIX_MAP = __webpack_exports__.MULTIPLAYER_TRACE_PREFIX_MAP;
49518
+ var __webpack_exports__MULTIPLAYER_TRACE_SESSION_CACHE_PREFIX = __webpack_exports__.MULTIPLAYER_TRACE_SESSION_CACHE_PREFIX;
48478
49519
  var __webpack_exports__NavigationRecorder = __webpack_exports__.NavigationRecorder;
48479
49520
  var __webpack_exports__SessionRecorderBrowserTraceExporter = __webpack_exports__.SessionRecorderBrowserTraceExporter;
48480
49521
  var __webpack_exports__SessionRecorderIdGenerator = __webpack_exports__.SessionRecorderIdGenerator;
@@ -48486,6 +49527,6 @@ var __webpack_exports__UserType = __webpack_exports__.UserType;
48486
49527
  var __webpack_exports__WidgetButtonPlacement = __webpack_exports__.WidgetButtonPlacement;
48487
49528
  var __webpack_exports__default = __webpack_exports__["default"];
48488
49529
  var __webpack_exports__recorderEventBus = __webpack_exports__.recorderEventBus;
48489
- export { __webpack_exports__ATTR_MULTIPLAYER_CLIENT_ID as ATTR_MULTIPLAYER_CLIENT_ID, __webpack_exports__ATTR_MULTIPLAYER_CONTINUOUS_SESSION_AUTO_SAVE as ATTR_MULTIPLAYER_CONTINUOUS_SESSION_AUTO_SAVE, __webpack_exports__ATTR_MULTIPLAYER_CONTINUOUS_SESSION_AUTO_SAVE_REASON as ATTR_MULTIPLAYER_CONTINUOUS_SESSION_AUTO_SAVE_REASON, __webpack_exports__ATTR_MULTIPLAYER_GRPC_REQUEST_MESSAGE as ATTR_MULTIPLAYER_GRPC_REQUEST_MESSAGE, __webpack_exports__ATTR_MULTIPLAYER_GRPC_REQUEST_MESSAGE_ENCODING as ATTR_MULTIPLAYER_GRPC_REQUEST_MESSAGE_ENCODING, __webpack_exports__ATTR_MULTIPLAYER_GRPC_RESPONSE_MESSAGE as ATTR_MULTIPLAYER_GRPC_RESPONSE_MESSAGE, __webpack_exports__ATTR_MULTIPLAYER_HTTP_PROXY as ATTR_MULTIPLAYER_HTTP_PROXY, __webpack_exports__ATTR_MULTIPLAYER_HTTP_PROXY_TYPE as ATTR_MULTIPLAYER_HTTP_PROXY_TYPE, __webpack_exports__ATTR_MULTIPLAYER_HTTP_REQUEST_BODY as ATTR_MULTIPLAYER_HTTP_REQUEST_BODY, __webpack_exports__ATTR_MULTIPLAYER_HTTP_REQUEST_HEADERS as ATTR_MULTIPLAYER_HTTP_REQUEST_HEADERS, __webpack_exports__ATTR_MULTIPLAYER_HTTP_RESPONSE_BODY as ATTR_MULTIPLAYER_HTTP_RESPONSE_BODY, __webpack_exports__ATTR_MULTIPLAYER_HTTP_RESPONSE_BODY_ENCODING as ATTR_MULTIPLAYER_HTTP_RESPONSE_BODY_ENCODING, __webpack_exports__ATTR_MULTIPLAYER_HTTP_RESPONSE_HEADERS as ATTR_MULTIPLAYER_HTTP_RESPONSE_HEADERS, __webpack_exports__ATTR_MULTIPLAYER_INTEGRATION_ID as ATTR_MULTIPLAYER_INTEGRATION_ID, __webpack_exports__ATTR_MULTIPLAYER_ISSUE_COMPONENT_HASH as ATTR_MULTIPLAYER_ISSUE_COMPONENT_HASH, __webpack_exports__ATTR_MULTIPLAYER_ISSUE_CUSTOM_HASH as ATTR_MULTIPLAYER_ISSUE_CUSTOM_HASH, __webpack_exports__ATTR_MULTIPLAYER_ISSUE_HASH as ATTR_MULTIPLAYER_ISSUE_HASH, __webpack_exports__ATTR_MULTIPLAYER_MESSAGING_MESSAGE_BODY as ATTR_MULTIPLAYER_MESSAGING_MESSAGE_BODY, __webpack_exports__ATTR_MULTIPLAYER_MESSAGING_MESSAGE_BODY_ENCODING as ATTR_MULTIPLAYER_MESSAGING_MESSAGE_BODY_ENCODING, __webpack_exports__ATTR_MULTIPLAYER_PLATFORM_ID as ATTR_MULTIPLAYER_PLATFORM_ID, __webpack_exports__ATTR_MULTIPLAYER_PLATFORM_NAME as ATTR_MULTIPLAYER_PLATFORM_NAME, __webpack_exports__ATTR_MULTIPLAYER_PROJECT_ID as ATTR_MULTIPLAYER_PROJECT_ID, __webpack_exports__ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE as ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE, __webpack_exports__ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE_ENCODING as ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE_ENCODING, __webpack_exports__ATTR_MULTIPLAYER_RPC_RESPONSE_MESSAGE as ATTR_MULTIPLAYER_RPC_RESPONSE_MESSAGE, __webpack_exports__ATTR_MULTIPLAYER_SESSION_ID as ATTR_MULTIPLAYER_SESSION_ID, __webpack_exports__ATTR_MULTIPLAYER_SESSION_RECORDER_VERSION as ATTR_MULTIPLAYER_SESSION_RECORDER_VERSION, __webpack_exports__ATTR_MULTIPLAYER_USER_HASH as ATTR_MULTIPLAYER_USER_HASH, __webpack_exports__ATTR_MULTIPLAYER_WORKSPACE_ID as ATTR_MULTIPLAYER_WORKSPACE_ID, __webpack_exports__DebugSessionDataType as DebugSessionDataType, __webpack_exports__MASK_PLACEHOLDER as MASK_PLACEHOLDER, __webpack_exports__MULTIPLAYER_ATTRIBUTE_PREFIX as MULTIPLAYER_ATTRIBUTE_PREFIX, __webpack_exports__MULTIPLAYER_BASE_API_URL as MULTIPLAYER_BASE_API_URL, __webpack_exports__MULTIPLAYER_OTEL_DEFAULT_LOGS_EXPORTER_GRPC_URL as MULTIPLAYER_OTEL_DEFAULT_LOGS_EXPORTER_GRPC_URL, __webpack_exports__MULTIPLAYER_OTEL_DEFAULT_LOGS_EXPORTER_HTTP_URL as MULTIPLAYER_OTEL_DEFAULT_LOGS_EXPORTER_HTTP_URL, __webpack_exports__MULTIPLAYER_OTEL_DEFAULT_LOGS_EXPORTER_URL as MULTIPLAYER_OTEL_DEFAULT_LOGS_EXPORTER_URL, __webpack_exports__MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_GRPC_URL as MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_GRPC_URL, __webpack_exports__MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_HTTP_URL as MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_HTTP_URL, __webpack_exports__MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_URL as MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_URL, __webpack_exports__MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX as MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX, __webpack_exports__MULTIPLAYER_TRACE_DEBUG_PREFIX as MULTIPLAYER_TRACE_DEBUG_PREFIX, __webpack_exports__MULTIPLAYER_TRACE_DEBUG_SESSION_SHORT_ID_LENGTH as MULTIPLAYER_TRACE_DEBUG_SESSION_SHORT_ID_LENGTH, __webpack_exports__MULTIPLAYER_TRACE_DOC_PREFIX as MULTIPLAYER_TRACE_DOC_PREFIX, __webpack_exports__NavigationRecorder as NavigationRecorder, __webpack_exports__SessionRecorderBrowserTraceExporter as SessionRecorderBrowserTraceExporter, __webpack_exports__SessionRecorderIdGenerator as SessionRecorderIdGenerator, __webpack_exports__SessionRecorderSdk as SessionRecorderSdk, __webpack_exports__SessionRecorderTraceIdRatioBasedSampler as SessionRecorderTraceIdRatioBasedSampler, __webpack_exports__SessionState as SessionState, __webpack_exports__SessionType as SessionType, __webpack_exports__UserType as UserType, __webpack_exports__WidgetButtonPlacement as WidgetButtonPlacement, __webpack_exports__default as default, __webpack_exports__recorderEventBus as recorderEventBus };
49530
+ export { __webpack_exports__ATTR_MULTIPLAYER_CLIENT_ID as ATTR_MULTIPLAYER_CLIENT_ID, __webpack_exports__ATTR_MULTIPLAYER_CONTINUOUS_SESSION_AUTO_SAVE as ATTR_MULTIPLAYER_CONTINUOUS_SESSION_AUTO_SAVE, __webpack_exports__ATTR_MULTIPLAYER_CONTINUOUS_SESSION_AUTO_SAVE_REASON as ATTR_MULTIPLAYER_CONTINUOUS_SESSION_AUTO_SAVE_REASON, __webpack_exports__ATTR_MULTIPLAYER_GRPC_REQUEST_MESSAGE as ATTR_MULTIPLAYER_GRPC_REQUEST_MESSAGE, __webpack_exports__ATTR_MULTIPLAYER_GRPC_REQUEST_MESSAGE_ENCODING as ATTR_MULTIPLAYER_GRPC_REQUEST_MESSAGE_ENCODING, __webpack_exports__ATTR_MULTIPLAYER_GRPC_RESPONSE_MESSAGE as ATTR_MULTIPLAYER_GRPC_RESPONSE_MESSAGE, __webpack_exports__ATTR_MULTIPLAYER_HTTP_PROXY as ATTR_MULTIPLAYER_HTTP_PROXY, __webpack_exports__ATTR_MULTIPLAYER_HTTP_PROXY_TYPE as ATTR_MULTIPLAYER_HTTP_PROXY_TYPE, __webpack_exports__ATTR_MULTIPLAYER_HTTP_REQUEST_BODY as ATTR_MULTIPLAYER_HTTP_REQUEST_BODY, __webpack_exports__ATTR_MULTIPLAYER_HTTP_REQUEST_HEADERS as ATTR_MULTIPLAYER_HTTP_REQUEST_HEADERS, __webpack_exports__ATTR_MULTIPLAYER_HTTP_RESPONSE_BODY as ATTR_MULTIPLAYER_HTTP_RESPONSE_BODY, __webpack_exports__ATTR_MULTIPLAYER_HTTP_RESPONSE_BODY_ENCODING as ATTR_MULTIPLAYER_HTTP_RESPONSE_BODY_ENCODING, __webpack_exports__ATTR_MULTIPLAYER_HTTP_RESPONSE_HEADERS as ATTR_MULTIPLAYER_HTTP_RESPONSE_HEADERS, __webpack_exports__ATTR_MULTIPLAYER_INTEGRATION_ID as ATTR_MULTIPLAYER_INTEGRATION_ID, __webpack_exports__ATTR_MULTIPLAYER_ISSUE_COMPONENT_HASH as ATTR_MULTIPLAYER_ISSUE_COMPONENT_HASH, __webpack_exports__ATTR_MULTIPLAYER_ISSUE_CUSTOM_HASH as ATTR_MULTIPLAYER_ISSUE_CUSTOM_HASH, __webpack_exports__ATTR_MULTIPLAYER_ISSUE_HASH as ATTR_MULTIPLAYER_ISSUE_HASH, __webpack_exports__ATTR_MULTIPLAYER_MESSAGING_MESSAGE_BODY as ATTR_MULTIPLAYER_MESSAGING_MESSAGE_BODY, __webpack_exports__ATTR_MULTIPLAYER_MESSAGING_MESSAGE_BODY_ENCODING as ATTR_MULTIPLAYER_MESSAGING_MESSAGE_BODY_ENCODING, __webpack_exports__ATTR_MULTIPLAYER_PLATFORM_ID as ATTR_MULTIPLAYER_PLATFORM_ID, __webpack_exports__ATTR_MULTIPLAYER_PLATFORM_NAME as ATTR_MULTIPLAYER_PLATFORM_NAME, __webpack_exports__ATTR_MULTIPLAYER_PROJECT_ID as ATTR_MULTIPLAYER_PROJECT_ID, __webpack_exports__ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE as ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE, __webpack_exports__ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE_ENCODING as ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE_ENCODING, __webpack_exports__ATTR_MULTIPLAYER_RPC_RESPONSE_MESSAGE as ATTR_MULTIPLAYER_RPC_RESPONSE_MESSAGE, __webpack_exports__ATTR_MULTIPLAYER_SESSION_CLIENT_ID as ATTR_MULTIPLAYER_SESSION_CLIENT_ID, __webpack_exports__ATTR_MULTIPLAYER_SESSION_ID as ATTR_MULTIPLAYER_SESSION_ID, __webpack_exports__ATTR_MULTIPLAYER_SESSION_RECORDER_VERSION as ATTR_MULTIPLAYER_SESSION_RECORDER_VERSION, __webpack_exports__ATTR_MULTIPLAYER_USER_HASH as ATTR_MULTIPLAYER_USER_HASH, __webpack_exports__ATTR_MULTIPLAYER_WORKSPACE_ID as ATTR_MULTIPLAYER_WORKSPACE_ID, __webpack_exports__DebugSessionDataType as DebugSessionDataType, __webpack_exports__MASK_PLACEHOLDER as MASK_PLACEHOLDER, __webpack_exports__MULTIPLAYER_ATTRIBUTE_PREFIX as MULTIPLAYER_ATTRIBUTE_PREFIX, __webpack_exports__MULTIPLAYER_BASE_API_URL as MULTIPLAYER_BASE_API_URL, __webpack_exports__MULTIPLAYER_OTEL_DEFAULT_LOGS_EXPORTER_GRPC_URL as MULTIPLAYER_OTEL_DEFAULT_LOGS_EXPORTER_GRPC_URL, __webpack_exports__MULTIPLAYER_OTEL_DEFAULT_LOGS_EXPORTER_HTTP_URL as MULTIPLAYER_OTEL_DEFAULT_LOGS_EXPORTER_HTTP_URL, __webpack_exports__MULTIPLAYER_OTEL_DEFAULT_LOGS_EXPORTER_URL as MULTIPLAYER_OTEL_DEFAULT_LOGS_EXPORTER_URL, __webpack_exports__MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_GRPC_URL as MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_GRPC_URL, __webpack_exports__MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_HTTP_URL as MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_HTTP_URL, __webpack_exports__MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_URL as MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_URL, __webpack_exports__MULTIPLAYER_TRACE_CLIENT_ID_LENGTH as MULTIPLAYER_TRACE_CLIENT_ID_LENGTH, __webpack_exports__MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX as MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX, __webpack_exports__MULTIPLAYER_TRACE_CONTINUOUS_SESSION_DEBUG_PREFIX as MULTIPLAYER_TRACE_CONTINUOUS_SESSION_DEBUG_PREFIX, __webpack_exports__MULTIPLAYER_TRACE_DEBUG_PREFIX as MULTIPLAYER_TRACE_DEBUG_PREFIX, __webpack_exports__MULTIPLAYER_TRACE_DEBUG_SESSION_SHORT_ID_LENGTH as MULTIPLAYER_TRACE_DEBUG_SESSION_SHORT_ID_LENGTH, __webpack_exports__MULTIPLAYER_TRACE_DOC_PREFIX as MULTIPLAYER_TRACE_DOC_PREFIX, __webpack_exports__MULTIPLAYER_TRACE_PREFIX_MAP as MULTIPLAYER_TRACE_PREFIX_MAP, __webpack_exports__MULTIPLAYER_TRACE_SESSION_CACHE_PREFIX as MULTIPLAYER_TRACE_SESSION_CACHE_PREFIX, __webpack_exports__NavigationRecorder as NavigationRecorder, __webpack_exports__SessionRecorderBrowserTraceExporter as SessionRecorderBrowserTraceExporter, __webpack_exports__SessionRecorderIdGenerator as SessionRecorderIdGenerator, __webpack_exports__SessionRecorderSdk as SessionRecorderSdk, __webpack_exports__SessionRecorderTraceIdRatioBasedSampler as SessionRecorderTraceIdRatioBasedSampler, __webpack_exports__SessionState as SessionState, __webpack_exports__SessionType as SessionType, __webpack_exports__UserType as UserType, __webpack_exports__WidgetButtonPlacement as WidgetButtonPlacement, __webpack_exports__default as default, __webpack_exports__recorderEventBus as recorderEventBus };
48490
49531
 
48491
49532
  //# sourceMappingURL=index.js.map