@multiplayer-app/session-recorder-browser 1.3.16 → 1.3.19

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 (72) hide show
  1. package/dist/browser/index.js +1423 -288
  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 +8 -0
  14. package/dist/exporters/index.js.map +1 -1
  15. package/dist/index.js +1411 -289
  16. package/dist/index.js.map +1 -1
  17. package/dist/index.umd.js +1411 -288
  18. package/dist/index.umd.js.map +1 -1
  19. package/dist/otel/CrashBufferSpanProcessor.d.ts +18 -0
  20. package/dist/otel/CrashBufferSpanProcessor.d.ts.map +1 -0
  21. package/dist/otel/CrashBufferSpanProcessor.js +42 -0
  22. package/dist/otel/CrashBufferSpanProcessor.js.map +1 -0
  23. package/dist/otel/index.d.ts +9 -1
  24. package/dist/otel/index.d.ts.map +1 -1
  25. package/dist/otel/index.js +45 -32
  26. package/dist/otel/index.js.map +1 -1
  27. package/dist/patch/fetch.js +2 -2
  28. package/dist/patch/fetch.js.map +1 -1
  29. package/dist/rrweb/index.d.ts +50 -17
  30. package/dist/rrweb/index.d.ts.map +1 -1
  31. package/dist/rrweb/index.js +162 -84
  32. package/dist/rrweb/index.js.map +1 -1
  33. package/dist/services/api.service.d.ts +22 -0
  34. package/dist/services/api.service.d.ts.map +1 -1
  35. package/dist/services/api.service.js +22 -5
  36. package/dist/services/api.service.js.map +1 -1
  37. package/dist/services/crashBuffer.service.d.ts +35 -0
  38. package/dist/services/crashBuffer.service.d.ts.map +1 -0
  39. package/dist/services/crashBuffer.service.js +207 -0
  40. package/dist/services/crashBuffer.service.js.map +1 -0
  41. package/dist/services/indexedDb.service.d.ts +72 -0
  42. package/dist/services/indexedDb.service.d.ts.map +1 -0
  43. package/dist/services/indexedDb.service.js +338 -0
  44. package/dist/services/indexedDb.service.js.map +1 -0
  45. package/dist/services/socket.service.d.ts +3 -2
  46. package/dist/services/socket.service.d.ts.map +1 -1
  47. package/dist/services/socket.service.js +8 -1
  48. package/dist/services/socket.service.js.map +1 -1
  49. package/dist/session-recorder.d.ts +13 -2
  50. package/dist/session-recorder.d.ts.map +1 -1
  51. package/dist/session-recorder.js +176 -31
  52. package/dist/session-recorder.js.map +1 -1
  53. package/dist/types/session-recorder.d.ts +19 -6
  54. package/dist/types/session-recorder.d.ts.map +1 -1
  55. package/dist/types/session-recorder.js.map +1 -1
  56. package/dist/utils/index.d.ts +1 -0
  57. package/dist/utils/index.d.ts.map +1 -1
  58. package/dist/utils/index.js +1 -0
  59. package/dist/utils/index.js.map +1 -1
  60. package/dist/utils/storage.d.ts +4 -1
  61. package/dist/utils/storage.d.ts.map +1 -1
  62. package/dist/utils/storage.js +35 -13
  63. package/dist/utils/storage.js.map +1 -1
  64. package/dist/utils/tabId.d.ts +2 -0
  65. package/dist/utils/tabId.d.ts.map +1 -0
  66. package/dist/utils/tabId.js +22 -0
  67. package/dist/utils/tabId.js.map +1 -0
  68. package/package.json +2 -2
  69. package/dist/rrweb/indexedDbService.d.ts +0 -9
  70. package/dist/rrweb/indexedDbService.d.ts.map +0 -1
  71. package/dist/rrweb/indexedDbService.js +0 -54
  72. 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.19" || 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
 
@@ -24784,6 +24798,62 @@ class NavigationRecorder {
24784
24798
 
24785
24799
 
24786
24800
 
24801
+ /***/ }),
24802
+
24803
+ /***/ "./src/otel/CrashBufferSpanProcessor.ts":
24804
+ /*!**********************************************!*\
24805
+ !*** ./src/otel/CrashBufferSpanProcessor.ts ***!
24806
+ \**********************************************/
24807
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
24808
+
24809
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
24810
+ /* harmony export */ CrashBufferSpanProcessor: () => (/* binding */ CrashBufferSpanProcessor)
24811
+ /* harmony export */ });
24812
+ /* harmony import */ var _opentelemetry_api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @opentelemetry/api */ "../../node_modules/@opentelemetry/api/build/esm/trace/trace_flags.js");
24813
+ /* 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");
24814
+
24815
+
24816
+ /**
24817
+ * Implementation of the {@link SpanProcessor} that batches spans exported by
24818
+ * the SDK then pushes them to the exporter pipeline.
24819
+ */
24820
+ class CrashBufferSpanProcessor {
24821
+ constructor(_exporter, _crashBuffer, _serializeSpan) {
24822
+ this._exporter = _exporter;
24823
+ this._crashBuffer = _crashBuffer;
24824
+ this._serializeSpan = _serializeSpan;
24825
+ }
24826
+ forceFlush() {
24827
+ return this._exporter.forceFlush();
24828
+ }
24829
+ onStart(_span, _parentContext) {
24830
+ return this._exporter.onStart(_span, _parentContext);
24831
+ }
24832
+ onEnd(span) {
24833
+ const traceId = span.spanContext().traceId;
24834
+ if ((span.spanContext().traceFlags & _opentelemetry_api__WEBPACK_IMPORTED_MODULE_1__.TraceFlags.SAMPLED) === 0) {
24835
+ return;
24836
+ }
24837
+ if (traceId.startsWith(_multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_SESSION_CACHE_PREFIX) ||
24838
+ traceId.startsWith(_multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_CONTINUOUS_SESSION_CACHE_PREFIX)) {
24839
+ if (this._crashBuffer) {
24840
+ this._crashBuffer.appendSpans([
24841
+ {
24842
+ ts: span.startTime[0] * 1000 + span.startTime[1] / 1000000,
24843
+ span: this._serializeSpan(span)
24844
+ }
24845
+ ]);
24846
+ }
24847
+ return;
24848
+ }
24849
+ this._exporter.onEnd(span);
24850
+ }
24851
+ shutdown() {
24852
+ return this._exporter.shutdown();
24853
+ }
24854
+ }
24855
+
24856
+
24787
24857
  /***/ }),
24788
24858
 
24789
24859
  /***/ "./src/otel/helpers.ts":
@@ -25022,19 +25092,21 @@ const getElementTextContent = (element) => {
25022
25092
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
25023
25093
  /* harmony export */ TracerBrowserSDK: () => (/* binding */ TracerBrowserSDK)
25024
25094
  /* harmony export */ });
25025
- /* harmony import */ var _opentelemetry_resources__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @opentelemetry/resources */ "../../node_modules/@opentelemetry/resources/build/esm/ResourceImpl.js");
25026
- /* harmony import */ var _opentelemetry_core__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @opentelemetry/core */ "../../node_modules/@opentelemetry/core/build/esm/trace/W3CTraceContextPropagator.js");
25027
- /* harmony import */ var _opentelemetry_sdk_trace_web__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @opentelemetry/sdk-trace-web */ "../../node_modules/@opentelemetry/sdk-trace-web/build/esm/WebTracerProvider.js");
25028
- /* harmony import */ var _opentelemetry_sdk_trace_base__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @opentelemetry/sdk-trace-base */ "../../node_modules/@opentelemetry/sdk-trace-base/build/esm/platform/browser/export/BatchSpanProcessor.js");
25029
- /* harmony import */ var _opentelemetry_semantic_conventions__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @opentelemetry/semantic-conventions */ "../../node_modules/@opentelemetry/semantic-conventions/build/esm/resource/SemanticResourceAttributes.js");
25030
- /* harmony import */ var _opentelemetry_instrumentation__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @opentelemetry/instrumentation */ "../../node_modules/@opentelemetry/instrumentation/build/esm/autoLoader.js");
25095
+ /* harmony import */ var _opentelemetry_resources__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @opentelemetry/resources */ "../../node_modules/@opentelemetry/resources/build/esm/ResourceImpl.js");
25096
+ /* harmony import */ var _opentelemetry_core__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @opentelemetry/core */ "../../node_modules/@opentelemetry/core/build/esm/trace/W3CTraceContextPropagator.js");
25097
+ /* harmony import */ var _opentelemetry_sdk_trace_web__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @opentelemetry/sdk-trace-web */ "../../node_modules/@opentelemetry/sdk-trace-web/build/esm/WebTracerProvider.js");
25098
+ /* harmony import */ var _opentelemetry_sdk_trace_base__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @opentelemetry/sdk-trace-base */ "../../node_modules/@opentelemetry/sdk-trace-base/build/esm/platform/browser/export/BatchSpanProcessor.js");
25099
+ /* harmony import */ var _opentelemetry_semantic_conventions__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @opentelemetry/semantic-conventions */ "../../node_modules/@opentelemetry/semantic-conventions/build/esm/resource/SemanticResourceAttributes.js");
25100
+ /* harmony import */ var _opentelemetry_instrumentation__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @opentelemetry/instrumentation */ "../../node_modules/@opentelemetry/instrumentation/build/esm/autoLoader.js");
25031
25101
  /* harmony import */ var _opentelemetry_auto_instrumentations_web__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @opentelemetry/auto-instrumentations-web */ "../../node_modules/@opentelemetry/auto-instrumentations-web/build/esm/index.js");
25032
25102
  /* 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");
25033
- /* harmony import */ var _opentelemetry_api__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @opentelemetry/api */ "../../node_modules/@opentelemetry/api/build/esm/trace-api.js");
25034
- /* harmony import */ var _opentelemetry_api__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @opentelemetry/api */ "../../node_modules/@opentelemetry/api/build/esm/context-api.js");
25035
- /* harmony import */ var _opentelemetry_api__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @opentelemetry/api */ "../../node_modules/@opentelemetry/api/build/esm/trace/status.js");
25103
+ /* harmony import */ var _opentelemetry_api__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @opentelemetry/api */ "../../node_modules/@opentelemetry/api/build/esm/trace-api.js");
25104
+ /* harmony import */ var _opentelemetry_api__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @opentelemetry/api */ "../../node_modules/@opentelemetry/api/build/esm/context-api.js");
25105
+ /* harmony import */ var _opentelemetry_api__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @opentelemetry/api */ "../../node_modules/@opentelemetry/api/build/esm/trace/status.js");
25036
25106
  /* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../config */ "./src/config/index.ts");
25037
25107
  /* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers */ "./src/otel/helpers.ts");
25108
+ /* harmony import */ var _CrashBufferSpanProcessor__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./CrashBufferSpanProcessor */ "./src/otel/CrashBufferSpanProcessor.ts");
25109
+
25038
25110
 
25039
25111
 
25040
25112
 
@@ -25048,49 +25120,52 @@ const getElementTextContent = (element) => {
25048
25120
 
25049
25121
  class TracerBrowserSDK {
25050
25122
  constructor() {
25123
+ this.clientId = '';
25051
25124
  this.sessionId = '';
25052
25125
  this.globalErrorListenersRegistered = false;
25053
25126
  }
25054
- setSessionId(sessionId, sessionType = _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_1__.SessionType.PLAIN) {
25127
+ setSessionId(sessionId, sessionType = _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_1__.SessionType.MANUAL) {
25055
25128
  this.sessionId = sessionId;
25056
- this.idGenerator.setSessionId(sessionId, sessionType);
25129
+ if (!this.idGenerator) {
25130
+ throw new Error('Id generator not initialized');
25131
+ }
25132
+ this.idGenerator.setSessionId(sessionId, sessionType, this.clientId);
25057
25133
  }
25058
25134
  init(options) {
25059
25135
  this.config = options;
25136
+ 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
25137
  const { application, version, environment } = this.config;
25061
25138
  this.idGenerator = new _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_1__.SessionRecorderIdGenerator();
25062
25139
  this.exporter = new _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_1__.SessionRecorderBrowserTraceExporter({
25063
25140
  apiKey: options.apiKey,
25064
25141
  url: (0,_helpers__WEBPACK_IMPORTED_MODULE_3__.getExporterEndpoint)(options.exporterEndpoint),
25065
- usePostMessageFallback: options.usePostMessageFallback,
25142
+ usePostMessageFallback: options.usePostMessageFallback
25066
25143
  });
25067
- this.tracerProvider = new _opentelemetry_sdk_trace_web__WEBPACK_IMPORTED_MODULE_4__.WebTracerProvider({
25068
- resource: (0,_opentelemetry_resources__WEBPACK_IMPORTED_MODULE_5__.resourceFromAttributes)({
25069
- [_opentelemetry_semantic_conventions__WEBPACK_IMPORTED_MODULE_6__.SEMRESATTRS_SERVICE_NAME]: application,
25070
- [_opentelemetry_semantic_conventions__WEBPACK_IMPORTED_MODULE_6__.SEMRESATTRS_SERVICE_VERSION]: version,
25071
- [_opentelemetry_semantic_conventions__WEBPACK_IMPORTED_MODULE_6__.SEMRESATTRS_DEPLOYMENT_ENVIRONMENT]: environment,
25144
+ this.batchSpanProcessor = new _opentelemetry_sdk_trace_base__WEBPACK_IMPORTED_MODULE_5__.BatchSpanProcessor(this.exporter);
25145
+ this.tracerProvider = new _opentelemetry_sdk_trace_web__WEBPACK_IMPORTED_MODULE_6__.WebTracerProvider({
25146
+ resource: (0,_opentelemetry_resources__WEBPACK_IMPORTED_MODULE_7__.resourceFromAttributes)({
25147
+ [_opentelemetry_semantic_conventions__WEBPACK_IMPORTED_MODULE_8__.SEMRESATTRS_SERVICE_NAME]: application,
25148
+ [_opentelemetry_semantic_conventions__WEBPACK_IMPORTED_MODULE_8__.SEMRESATTRS_SERVICE_VERSION]: version,
25149
+ [_opentelemetry_semantic_conventions__WEBPACK_IMPORTED_MODULE_8__.SEMRESATTRS_DEPLOYMENT_ENVIRONMENT]: environment
25072
25150
  }),
25073
25151
  idGenerator: this.idGenerator,
25074
25152
  sampler: new _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_1__.SessionRecorderTraceIdRatioBasedSampler(this.config.sampleTraceRatio),
25075
25153
  spanProcessors: [
25076
25154
  this._getSpanSessionIdProcessor(),
25077
- new _opentelemetry_sdk_trace_base__WEBPACK_IMPORTED_MODULE_7__.BatchSpanProcessor(this.exporter),
25078
- ],
25155
+ new _CrashBufferSpanProcessor__WEBPACK_IMPORTED_MODULE_4__.CrashBufferSpanProcessor(this.batchSpanProcessor, this.crashBuffer, this.exporter.serializeSpan.bind(this.exporter))
25156
+ ]
25079
25157
  });
25080
25158
  this.tracerProvider.register({
25081
25159
  // contextManager: new ZoneContextManager(),
25082
- propagator: new _opentelemetry_core__WEBPACK_IMPORTED_MODULE_8__.W3CTraceContextPropagator(),
25160
+ propagator: new _opentelemetry_core__WEBPACK_IMPORTED_MODULE_9__.W3CTraceContextPropagator()
25083
25161
  });
25084
- (0,_opentelemetry_instrumentation__WEBPACK_IMPORTED_MODULE_9__.registerInstrumentations)({
25162
+ (0,_opentelemetry_instrumentation__WEBPACK_IMPORTED_MODULE_10__.registerInstrumentations)({
25085
25163
  tracerProvider: this.tracerProvider,
25086
25164
  instrumentations: [
25087
25165
  (0,_opentelemetry_auto_instrumentations_web__WEBPACK_IMPORTED_MODULE_0__.getWebAutoInstrumentations)({
25088
25166
  '@opentelemetry/instrumentation-xml-http-request': {
25089
25167
  clearTimingResources: true,
25090
- ignoreUrls: [
25091
- ..._config__WEBPACK_IMPORTED_MODULE_2__.OTEL_IGNORE_URLS,
25092
- ...(this.config.ignoreUrls || []),
25093
- ],
25168
+ ignoreUrls: [..._config__WEBPACK_IMPORTED_MODULE_2__.OTEL_IGNORE_URLS, ...(this.config.ignoreUrls || [])],
25094
25169
  propagateTraceHeaderCorsUrls: options.propagateTraceHeaderCorsUrls,
25095
25170
  applyCustomAttributesOnSpan: (span, xhr) => {
25096
25171
  if (!this.config)
@@ -25110,7 +25185,7 @@ class TracerBrowserSDK {
25110
25185
  requestBody,
25111
25186
  responseBody,
25112
25187
  requestHeaders,
25113
- responseHeaders,
25188
+ responseHeaders
25114
25189
  };
25115
25190
  (0,_helpers__WEBPACK_IMPORTED_MODULE_3__.processHttpPayload)(payload, this.config, span);
25116
25191
  }
@@ -25118,14 +25193,11 @@ class TracerBrowserSDK {
25118
25193
  // eslint-disable-next-line
25119
25194
  console.error('[MULTIPLAYER_SESSION_RECORDER] Failed to capture xml-http payload', error);
25120
25195
  }
25121
- },
25196
+ }
25122
25197
  },
25123
25198
  '@opentelemetry/instrumentation-fetch': {
25124
25199
  clearTimingResources: true,
25125
- ignoreUrls: [
25126
- ..._config__WEBPACK_IMPORTED_MODULE_2__.OTEL_IGNORE_URLS,
25127
- ...(this.config.ignoreUrls || []),
25128
- ],
25200
+ ignoreUrls: [..._config__WEBPACK_IMPORTED_MODULE_2__.OTEL_IGNORE_URLS, ...(this.config.ignoreUrls || [])],
25129
25201
  propagateTraceHeaderCorsUrls: options.propagateTraceHeaderCorsUrls,
25130
25202
  applyCustomAttributesOnSpan: async (span, request, response) => {
25131
25203
  if (!this.config)
@@ -25162,7 +25234,7 @@ class TracerBrowserSDK {
25162
25234
  requestBody,
25163
25235
  responseBody,
25164
25236
  requestHeaders,
25165
- responseHeaders,
25237
+ responseHeaders
25166
25238
  };
25167
25239
  (0,_helpers__WEBPACK_IMPORTED_MODULE_3__.processHttpPayload)(payload, this.config, span);
25168
25240
  }
@@ -25170,7 +25242,7 @@ class TracerBrowserSDK {
25170
25242
  // eslint-disable-next-line
25171
25243
  console.error('[MULTIPLAYER_SESSION_RECORDER] Failed to capture fetch payload', error);
25172
25244
  }
25173
- },
25245
+ }
25174
25246
  },
25175
25247
  '@opentelemetry/instrumentation-user-interaction': {
25176
25248
  shouldPreventSpanCreation: (_event, element, span) => {
@@ -25179,17 +25251,20 @@ class TracerBrowserSDK {
25179
25251
  }
25180
25252
  span.setAttribute('target.innerText', (0,_helpers__WEBPACK_IMPORTED_MODULE_3__.getElementInnerText)(element));
25181
25253
  span.setAttribute('target.textContent', (0,_helpers__WEBPACK_IMPORTED_MODULE_3__.getElementTextContent)(element));
25182
- Array.from(element.attributes).forEach(attribute => {
25254
+ Array.from(element.attributes).forEach((attribute) => {
25183
25255
  span.setAttribute(`target.attribute.${attribute.name}`, attribute.value);
25184
25256
  });
25185
25257
  return false;
25186
- },
25187
- },
25188
- }),
25189
- ],
25258
+ }
25259
+ }
25260
+ })
25261
+ ]
25190
25262
  });
25191
25263
  this._registerGlobalErrorListeners();
25192
25264
  }
25265
+ setCrashBuffer(crashBuffer) {
25266
+ this.crashBuffer = crashBuffer;
25267
+ }
25193
25268
  start(sessionId, sessionType) {
25194
25269
  if (!this.tracerProvider) {
25195
25270
  throw new Error('Configuration not initialized. Call init() before start().');
@@ -25214,13 +25289,15 @@ class TracerBrowserSDK {
25214
25289
  * Otherwise, a short-lived span will be created to hold the exception event.
25215
25290
  */
25216
25291
  captureException(error, errorInfo) {
25292
+ var _a, _b;
25217
25293
  if (!error)
25218
25294
  return;
25219
25295
  // Prefer attaching to the active span to keep correlation intact
25220
25296
  try {
25221
- const activeSpan = _opentelemetry_api__WEBPACK_IMPORTED_MODULE_10__.trace.getSpan(_opentelemetry_api__WEBPACK_IMPORTED_MODULE_11__.context.active());
25297
+ const activeSpan = _opentelemetry_api__WEBPACK_IMPORTED_MODULE_11__.trace.getSpan(_opentelemetry_api__WEBPACK_IMPORTED_MODULE_12__.context.active());
25222
25298
  if (activeSpan) {
25223
25299
  this._recordException(activeSpan, error, errorInfo);
25300
+ (_a = this.tracerProvider) === null || _a === void 0 ? void 0 : _a.forceFlush();
25224
25301
  return;
25225
25302
  }
25226
25303
  // eslint-disable-next-line
@@ -25228,17 +25305,26 @@ class TracerBrowserSDK {
25228
25305
  catch (_ignored) { }
25229
25306
  // Fallback: create a short-lived span to hold the exception details
25230
25307
  try {
25231
- const tracer = _opentelemetry_api__WEBPACK_IMPORTED_MODULE_10__.trace.getTracer('exception');
25308
+ const tracer = _opentelemetry_api__WEBPACK_IMPORTED_MODULE_11__.trace.getTracer('exception');
25232
25309
  const span = tracer.startSpan(error.name || 'Error');
25233
25310
  this._recordException(span, error, errorInfo);
25234
25311
  span.end();
25312
+ (_b = this.tracerProvider) === null || _b === void 0 ? void 0 : _b.forceFlush();
25235
25313
  // eslint-disable-next-line
25236
25314
  }
25237
25315
  catch (_ignored) { }
25238
25316
  }
25317
+ async exportTraces(spans) {
25318
+ var _a;
25319
+ if ((_a = this === null || this === void 0 ? void 0 : this.batchSpanProcessor) === null || _a === void 0 ? void 0 : _a.onEnd) {
25320
+ spans.map((span) => { var _a; return (_a = this === null || this === void 0 ? void 0 : this.batchSpanProcessor) === null || _a === void 0 ? void 0 : _a.onEnd(span); });
25321
+ // return this.batchSpanProcessor.onEnd()
25322
+ }
25323
+ throw new Error('Buffer span processor not initialized');
25324
+ }
25239
25325
  _recordException(span, error, errorInfo) {
25240
25326
  span.recordException(error);
25241
- span.setStatus({ code: _opentelemetry_api__WEBPACK_IMPORTED_MODULE_12__.SpanStatusCode.ERROR, message: error.message });
25327
+ span.setStatus({ code: _opentelemetry_api__WEBPACK_IMPORTED_MODULE_13__.SpanStatusCode.ERROR, message: error.message });
25242
25328
  span.setAttribute('exception.type', error.name || 'Error');
25243
25329
  span.setAttribute('exception.message', error.message);
25244
25330
  span.setAttribute('exception.stacktrace', error.stack || '');
@@ -25251,14 +25337,14 @@ class TracerBrowserSDK {
25251
25337
  _getSpanSessionIdProcessor() {
25252
25338
  return {
25253
25339
  forceFlush: () => Promise.resolve(),
25254
- onEnd: () => { },
25340
+ onEnd: () => Promise.resolve(),
25255
25341
  shutdown: () => Promise.resolve(),
25256
25342
  onStart: (span) => {
25257
25343
  var _a;
25258
25344
  if ((_a = this.sessionId) === null || _a === void 0 ? void 0 : _a.length) {
25259
25345
  span.setAttribute(_multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_1__.ATTR_MULTIPLAYER_SESSION_ID, this.sessionId);
25260
25346
  }
25261
- },
25347
+ }
25262
25348
  };
25263
25349
  }
25264
25350
  _registerGlobalErrorListeners() {
@@ -25268,14 +25354,12 @@ class TracerBrowserSDK {
25268
25354
  return;
25269
25355
  // eslint-disable-next-line
25270
25356
  const errorHandler = (event) => {
25271
- const err = (event === null || event === void 0 ? void 0 : event.error) instanceof Error
25272
- ? event.error
25273
- : new Error((event === null || event === void 0 ? void 0 : event.message) || 'Script error');
25357
+ const err = (event === null || event === void 0 ? void 0 : event.error) instanceof Error ? event.error : new Error((event === null || event === void 0 ? void 0 : event.message) || 'Script error');
25274
25358
  this.captureException(err);
25275
25359
  };
25276
25360
  // eslint-disable-next-line
25277
25361
  const rejectionHandler = (event) => {
25278
- const reason = (event && 'reason' in event) ? event.reason : undefined;
25362
+ const reason = event && 'reason' in event ? event.reason : undefined;
25279
25363
  const err = reason instanceof Error
25280
25364
  ? reason
25281
25365
  : new Error(typeof reason === 'string' ? reason : 'Unhandled promise rejection');
@@ -25333,7 +25417,7 @@ const setShouldRecordHttpData = (shouldRecordBody, shouldRecordHeaders) => {
25333
25417
 
25334
25418
 
25335
25419
 
25336
- function _tryReadFetchBody({ body, url }) {
25420
+ function _tryReadFetchBody({ body, url, }) {
25337
25421
  if ((0,_utils_type_utils__WEBPACK_IMPORTED_MODULE_0__.isNullish)(body)) {
25338
25422
  return null;
25339
25423
  }
@@ -25506,7 +25590,7 @@ if (typeof window !== 'undefined' && typeof window.fetch !== 'undefined') {
25506
25590
  if (!(0,_utils_type_utils__WEBPACK_IMPORTED_MODULE_0__.isNullish)(candidateBody)) {
25507
25591
  const requestBody = _tryReadFetchBody({
25508
25592
  body: candidateBody,
25509
- url: urlStr
25593
+ url: urlStr,
25510
25594
  });
25511
25595
  if ((requestBody === null || requestBody === void 0 ? void 0 : requestBody.length) && new Blob([requestBody]).size <= _configs__WEBPACK_IMPORTED_MODULE_2__.configs.maxCapturingHttpPayloadSize) {
25512
25596
  networkRequest.requestBody = requestBody;
@@ -25701,11 +25785,13 @@ if (typeof XMLHttpRequest !== 'undefined') {
25701
25785
  /* harmony export */ RecorderBrowserSDK: () => (/* binding */ RecorderBrowserSDK)
25702
25786
  /* harmony export */ });
25703
25787
  /* 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");
25788
+ /* harmony import */ var _rrweb_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @rrweb/types */ "../../node_modules/@rrweb/types/dist/types.js");
25789
+ /* harmony import */ var rrweb__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! rrweb */ "../../node_modules/rrweb/dist/rrweb.js");
25790
+ /* 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");
25791
+ /* 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");
25792
+ /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils */ "./src/utils/index.ts");
25793
+ /* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../config */ "./src/config/index.ts");
25794
+
25709
25795
 
25710
25796
 
25711
25797
 
@@ -25713,129 +25799,206 @@ if (typeof XMLHttpRequest !== 'undefined') {
25713
25799
 
25714
25800
 
25715
25801
  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
25802
  constructor() {
25729
- this.restartInterval = null;
25730
- this._startedAt = '';
25731
- this._stoppedAt = '';
25803
+ this.intervals = {
25804
+ restart: null,
25805
+ bufferSnapshot: null
25806
+ };
25807
+ this.startedAt = '';
25808
+ this.stoppedAt = '';
25809
+ }
25810
+ /**
25811
+ * Full snapshot.
25812
+ */
25813
+ takeFullSnapshot() {
25814
+ if (!this.stopFn) {
25815
+ return;
25816
+ }
25817
+ rrweb__WEBPACK_IMPORTED_MODULE_6__.record.takeFullSnapshot();
25732
25818
  }
25733
25819
  /**
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.
25820
+ * Initializes the recorder SDK.
25821
+ * @param config - Configuration settings.
25822
+ * @param socketService - Optional socket service.
25737
25823
  */
25738
25824
  init(config, socketService) {
25739
25825
  this.config = config;
25740
25826
  this.socketService = socketService;
25741
25827
  }
25742
25828
  /**
25743
- * Starts recording events for a given session ID.
25744
- * @param sessionId - The ID of the session to record events for.
25829
+ * Starts recording.
25830
+ * @param sessionId - Session ID or null for buffer-only mode.
25831
+ * @param sessionType - Session type.
25745
25832
  */
25746
25833
  start(sessionId, sessionType) {
25747
- var _a;
25748
25834
  if (!this.config) {
25749
25835
  throw new Error('Configuration not initialized. Call init() before start().');
25750
25836
  }
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
25837
  this.startedAt = new Date().toISOString();
25753
- // Build masking configuration
25754
- const maskingConfig = this.config.masking || {};
25838
+ this.stopFn = (0,rrweb__WEBPACK_IMPORTED_MODULE_6__.record)({
25839
+ ...this._buildRecordOptions(),
25840
+ emit: async (event) => {
25841
+ const ts = event.timestamp;
25842
+ if (!sessionId) {
25843
+ await this._handleBufferOnlyEvent(event, ts);
25844
+ return;
25845
+ }
25846
+ this._handleLiveSessionEvent(event, ts, sessionId, sessionType);
25847
+ }
25848
+ });
25849
+ this.takeFullSnapshot();
25850
+ this._setupPeriodicSnapshots(sessionId, sessionType);
25851
+ }
25852
+ /**
25853
+ * Restarts recording. Never throws - library mode constraint.
25854
+ */
25855
+ async restart(sessionId, sessionType) {
25856
+ var _a;
25857
+ try {
25858
+ (_a = this.stopFn) === null || _a === void 0 ? void 0 : _a.call(this);
25859
+ this.start(sessionId, sessionType);
25860
+ }
25861
+ catch (_e) {
25862
+ // Silent failure
25863
+ }
25864
+ }
25865
+ /**
25866
+ * Stops recording and cleans up resources.
25867
+ */
25868
+ stop() {
25869
+ var _a, _b, _c;
25870
+ (_a = this.stopFn) === null || _a === void 0 ? void 0 : _a.call(this);
25871
+ this.stopFn = undefined;
25872
+ if (!((_b = this.config) === null || _b === void 0 ? void 0 : _b.useWebsocket)) {
25873
+ (_c = this.socketService) === null || _c === void 0 ? void 0 : _c.close();
25874
+ }
25875
+ this._clearAllIntervals();
25876
+ }
25877
+ _clearAllIntervals() {
25878
+ if (this.intervals.restart) {
25879
+ clearInterval(this.intervals.restart);
25880
+ this.intervals.restart = null;
25881
+ }
25882
+ if (this.intervals.bufferSnapshot) {
25883
+ clearInterval(this.intervals.bufferSnapshot);
25884
+ this.intervals.bufferSnapshot = null;
25885
+ }
25886
+ }
25887
+ /**
25888
+ * Sets the crash buffer.
25889
+ * @param crashBuffer - Crash buffer service.
25890
+ */
25891
+ setCrashBuffer(crashBuffer) {
25892
+ this.crashBuffer = crashBuffer;
25893
+ }
25894
+ /**
25895
+ * Mutates event in-place for performance.
25896
+ */
25897
+ _applyConsoleMasking(event) {
25898
+ var _a, _b;
25899
+ const maskFn = (_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.masking) === null || _b === void 0 ? void 0 : _b.maskConsoleEvent;
25900
+ if (typeof maskFn === 'function' && (0,_utils__WEBPACK_IMPORTED_MODULE_4__.isConsoleEvent)(event)) {
25901
+ const pluginEvt = event;
25902
+ const maskedPayload = maskFn(pluginEvt.data.payload);
25903
+ pluginEvt.data = { ...pluginEvt.data, payload: maskedPayload };
25904
+ }
25905
+ }
25906
+ /**
25907
+ * Handles buffer-only event.
25908
+ * @param event - Event.
25909
+ * @param ts - Timestamp.
25910
+ */
25911
+ async _handleBufferOnlyEvent(event, ts) {
25912
+ if (!this.crashBuffer)
25913
+ return;
25914
+ try {
25915
+ this._applyConsoleMasking(event);
25916
+ const packedEvent = (0,_rrweb_packer__WEBPACK_IMPORTED_MODULE_0__.pack)(event);
25917
+ this.stoppedAt = new Date(ts).toISOString();
25918
+ await this.crashBuffer.appendEvent({
25919
+ ts,
25920
+ isFullSnapshot: event.type === _rrweb_types__WEBPACK_IMPORTED_MODULE_1__.EventType.FullSnapshot,
25921
+ event: {
25922
+ event: packedEvent,
25923
+ eventType: event.type,
25924
+ timestamp: ts
25925
+ }
25926
+ });
25927
+ }
25928
+ catch (error) {
25929
+ // Silent failure - library constraint
25930
+ }
25931
+ }
25932
+ /**
25933
+ * Handles live session event.
25934
+ * @param event - Event.
25935
+ * @param ts - Timestamp.
25936
+ * @param sessionId - Session ID.
25937
+ * @param sessionType - Session type.
25938
+ */
25939
+ _handleLiveSessionEvent(event, ts, sessionId, sessionType) {
25940
+ if (!this.socketService)
25941
+ return;
25942
+ this._applyConsoleMasking(event);
25943
+ const packedEvent = (0,_rrweb_packer__WEBPACK_IMPORTED_MODULE_0__.pack)(event);
25944
+ this.stoppedAt = new Date(ts).toISOString();
25945
+ this.socketService.send({
25946
+ event: packedEvent,
25947
+ eventType: event.type,
25948
+ timestamp: ts,
25949
+ debugSessionId: sessionId,
25950
+ debugSessionType: sessionType
25951
+ });
25952
+ }
25953
+ /**
25954
+ * Builds record options.
25955
+ */
25956
+ _buildRecordOptions() {
25957
+ var _a, _b, _c;
25958
+ const maskingConfig = ((_a = this.config) === null || _a === void 0 ? void 0 : _a.masking) || {};
25755
25959
  const options = {
25756
- maskAllInputs: (_a = maskingConfig.maskAllInputs) !== null && _a !== void 0 ? _a : true,
25960
+ maskAllInputs: (_b = maskingConfig.maskAllInputs) !== null && _b !== void 0 ? _b : true,
25757
25961
  sampling: { canvas: 5 },
25758
- recordCanvas: this.config.recordCanvas,
25962
+ recordCanvas: (_c = this.config) === null || _c === void 0 ? void 0 : _c.recordCanvas,
25759
25963
  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
- ],
25964
+ plugins: [(0,_rrweb_rrweb_plugin_console_record__WEBPACK_IMPORTED_MODULE_3__.getRecordConsolePlugin)({ level: ['log', 'error'] })]
25763
25965
  };
25764
- // Add mask input options if provided
25765
25966
  if (maskingConfig.maskInputOptions) {
25766
25967
  options.maskInputOptions = maskingConfig.maskInputOptions;
25767
25968
  }
25768
- // Add mask text class if provided
25769
25969
  if (maskingConfig.maskTextClass) {
25770
25970
  options.maskTextClass = maskingConfig.maskTextClass;
25771
25971
  }
25772
- // Add mask text selector if provided
25773
25972
  if (maskingConfig.maskTextSelector) {
25774
25973
  options.maskTextSelector = maskingConfig.maskTextSelector;
25775
25974
  }
25776
- // Add custom masking functions if provided
25777
25975
  if (typeof maskingConfig.maskInput === 'function') {
25778
25976
  options.maskInputFn = maskingConfig.maskInput;
25779
25977
  }
25780
25978
  if (typeof maskingConfig.maskText === 'function') {
25781
25979
  options.maskTextFn = maskingConfig.maskText;
25782
25980
  }
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
- }
25981
+ return options;
25811
25982
  }
25812
25983
  /**
25813
- * Restarts the recording of events.
25984
+ * Sets up periodic snapshots.
25985
+ * @param sessionId - Session ID.
25986
+ * @param sessionType - Session type.
25814
25987
  */
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);
25819
- }
25820
- /**
25821
- * Clears the restart timeout.
25822
- */
25823
- clearRestartInterval() {
25824
- if (this.restartInterval) {
25825
- clearInterval(this.restartInterval);
25826
- this.restartInterval = null;
25988
+ _setupPeriodicSnapshots(sessionId, sessionType) {
25989
+ var _a, _b;
25990
+ this._clearAllIntervals();
25991
+ if (sessionType === _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_2__.SessionType.CONTINUOUS) {
25992
+ this.intervals.restart = setInterval(() => {
25993
+ this.takeFullSnapshot();
25994
+ }, _config__WEBPACK_IMPORTED_MODULE_5__.CONTINUOUS_DEBUGGING_TIMEOUT);
25827
25995
  }
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();
25996
+ if (!sessionId && ((_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.buffering) === null || _b === void 0 ? void 0 : _b.enabled)) {
25997
+ const interval = this.config.buffering.snapshotIntervalMs || 30000;
25998
+ this.intervals.bufferSnapshot = setInterval(() => {
25999
+ this.takeFullSnapshot();
26000
+ }, interval);
25837
26001
  }
25838
- this.clearRestartInterval();
25839
26002
  }
25840
26003
  }
25841
26004
 
@@ -25858,7 +26021,7 @@ class ApiService {
25858
26021
  this.config = {
25859
26022
  apiKey: '',
25860
26023
  apiBaseUrl: '',
25861
- exporterEndpoint: '',
26024
+ exporterEndpoint: ''
25862
26025
  };
25863
26026
  }
25864
26027
  /**
@@ -25868,7 +26031,7 @@ class ApiService {
25868
26031
  init(config) {
25869
26032
  this.config = {
25870
26033
  ...this.config,
25871
- ...config,
26034
+ ...config
25872
26035
  };
25873
26036
  }
25874
26037
  /**
@@ -25886,6 +26049,14 @@ class ApiService {
25886
26049
  async startSession(request, signal) {
25887
26050
  return this.makeRequest('/debug-sessions/start', 'POST', request, signal);
25888
26051
  }
26052
+ /**
26053
+ * Create a new error span session
26054
+ * @param request - Session create error span request data
26055
+ * @param signal - Optional AbortSignal for request cancellation
26056
+ */
26057
+ async createErrorSession(request, signal) {
26058
+ return this.makeRequest('/debug-sessions/error-span/start', 'POST', request, signal);
26059
+ }
25889
26060
  /**
25890
26061
  * Stop an active debug session
25891
26062
  * @param sessionId - ID of the session to stop
@@ -25931,6 +26102,15 @@ class ApiService {
25931
26102
  async checkRemoteSession(requestBody, signal) {
25932
26103
  return this.makeRequest('/remote-debug-session/check', 'POST', requestBody, signal);
25933
26104
  }
26105
+ updateSessionAttributes(sessionId, requestBody, signal) {
26106
+ return this.makeRequest(`/debug-sessions/${sessionId}`, 'PATCH', requestBody, signal);
26107
+ }
26108
+ /**
26109
+ * Export events to the session debugger API
26110
+ */
26111
+ async exportEvents(sessionId, requestBody, signal) {
26112
+ return this.makeRequest(`/debug-sessions/${sessionId}/rrweb-events`, 'POST', requestBody, signal);
26113
+ }
25934
26114
  /**
25935
26115
  * Make a request to the session debugger API
25936
26116
  * @param path - API endpoint path (relative to the base URL)
@@ -25945,14 +26125,14 @@ class ApiService {
25945
26125
  body: body ? JSON.stringify(body) : null,
25946
26126
  headers: {
25947
26127
  'Content-Type': 'application/json',
25948
- ...(this.config.apiKey && { 'X-Api-Key': this.config.apiKey }),
25949
- },
26128
+ ...(this.config.apiKey && { 'X-Api-Key': this.config.apiKey })
26129
+ }
25950
26130
  };
25951
26131
  try {
25952
26132
  const response = await fetch(url, {
25953
26133
  ...params,
25954
26134
  credentials: 'include',
25955
- signal,
26135
+ signal
25956
26136
  });
25957
26137
  if (!response.ok) {
25958
26138
  throw new Error('Network response was not ok: ' + response.statusText);
@@ -25969,19 +26149,589 @@ class ApiService {
25969
26149
  return this.handleRequestError(error, { url, params });
25970
26150
  }
25971
26151
  }
25972
- async handleRequestError(error, payload) {
25973
- if (this.config.usePostMessageFallback) {
25974
- try {
25975
- const response = await _messaging_service__WEBPACK_IMPORTED_MODULE_0__["default"].sendMessagePromise('request', payload);
25976
- return response;
25977
- }
25978
- catch (error) {
25979
- throw new Error('Error making request: ' + error.message);
25980
- }
25981
- }
25982
- else {
25983
- throw new Error('Error making request: ' + error.message);
25984
- }
26152
+ async handleRequestError(error, payload) {
26153
+ if (this.config.usePostMessageFallback) {
26154
+ try {
26155
+ const response = await _messaging_service__WEBPACK_IMPORTED_MODULE_0__["default"].sendMessagePromise('request', payload);
26156
+ return response;
26157
+ }
26158
+ catch (error) {
26159
+ throw new Error('Error making request: ' + error.message);
26160
+ }
26161
+ }
26162
+ else {
26163
+ throw new Error('Error making request: ' + error.message);
26164
+ }
26165
+ }
26166
+ }
26167
+
26168
+
26169
+ /***/ }),
26170
+
26171
+ /***/ "./src/services/crashBuffer.service.ts":
26172
+ /*!*********************************************!*\
26173
+ !*** ./src/services/crashBuffer.service.ts ***!
26174
+ \*********************************************/
26175
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
26176
+
26177
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
26178
+ /* harmony export */ CrashBufferService: () => (/* binding */ CrashBufferService)
26179
+ /* harmony export */ });
26180
+ /* harmony import */ var _opentelemetry_api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @opentelemetry/api */ "../../node_modules/@opentelemetry/api/build/esm/trace/status.js");
26181
+
26182
+ class CrashBufferService {
26183
+ constructor(db, tabId, windowMs) {
26184
+ this.db = db;
26185
+ this.tabId = tabId;
26186
+ this.windowMs = windowMs;
26187
+ this.lastPruneAt = 0;
26188
+ this.pruneInFlight = null;
26189
+ this.isActive = true;
26190
+ this.frozenAtTs = null;
26191
+ this.lastSeenEventTs = 0;
26192
+ this.requiresFullSnapshot = true;
26193
+ this.lastTouchAt = 0;
26194
+ this.listeners = new Map();
26195
+ }
26196
+ async _safe(fn, fallback) {
26197
+ try {
26198
+ return await fn();
26199
+ }
26200
+ catch (_e) {
26201
+ return fallback;
26202
+ }
26203
+ }
26204
+ async setAttrs(attrs) {
26205
+ await this._safe(async () => {
26206
+ await this.db.setAttrs({
26207
+ tabId: this.tabId,
26208
+ ...attrs
26209
+ });
26210
+ }, undefined);
26211
+ }
26212
+ async appendEvent(payload, _windowMs) {
26213
+ this.lastSeenEventTs = Math.max(this.lastSeenEventTs, payload.ts || 0);
26214
+ if (!this.isActive)
26215
+ return;
26216
+ const isFullSnapshot = Boolean(payload.isFullSnapshot);
26217
+ if (this.requiresFullSnapshot && !isFullSnapshot) {
26218
+ // Buffer must always start with a full snapshot; drop incrementals until we see one.
26219
+ return;
26220
+ }
26221
+ await this._safe(async () => {
26222
+ await this.db.appendEvent({
26223
+ tabId: this.tabId,
26224
+ ts: payload.ts,
26225
+ isFullSnapshot: payload.isFullSnapshot,
26226
+ event: payload.event
26227
+ });
26228
+ }, undefined);
26229
+ if (isFullSnapshot && this.requiresFullSnapshot) {
26230
+ // Ensure this snapshot becomes the first replayable event.
26231
+ // We keep the snapshot itself and prune everything older.
26232
+ await this._safe(() => this.db.pruneOlderThan(this.tabId, Math.max(0, payload.ts - 1)), undefined);
26233
+ this.requiresFullSnapshot = false;
26234
+ }
26235
+ else if (isFullSnapshot) {
26236
+ this.requiresFullSnapshot = false;
26237
+ }
26238
+ this.pruneSoon();
26239
+ }
26240
+ async appendSpans(payload, _windowMs) {
26241
+ for (const p of payload) {
26242
+ this.lastSeenEventTs = Math.max(this.lastSeenEventTs, p.ts || 0);
26243
+ }
26244
+ if (!this.isActive)
26245
+ return;
26246
+ let errorEvent = null;
26247
+ await this._safe(async () => {
26248
+ const records = payload.map((p) => {
26249
+ var _a, _b;
26250
+ if (!errorEvent && ((_b = (_a = p === null || p === void 0 ? void 0 : p.span) === null || _a === void 0 ? void 0 : _a.status) === null || _b === void 0 ? void 0 : _b.code) === _opentelemetry_api__WEBPACK_IMPORTED_MODULE_0__.SpanStatusCode.ERROR) {
26251
+ errorEvent = { ts: p.ts, span: p.span };
26252
+ }
26253
+ return {
26254
+ tabId: this.tabId,
26255
+ ts: p.ts,
26256
+ span: p.span
26257
+ };
26258
+ });
26259
+ await this.db.appendSpans(records);
26260
+ }, undefined);
26261
+ this.pruneSoon();
26262
+ if (errorEvent) {
26263
+ this._emit('error-span-appended', errorEvent);
26264
+ }
26265
+ }
26266
+ on(event, listener) {
26267
+ const set = this.listeners.get(event) || new Set();
26268
+ set.add(listener);
26269
+ this.listeners.set(event, set);
26270
+ return () => this.off(event, listener);
26271
+ }
26272
+ off(event, listener) {
26273
+ const set = this.listeners.get(event);
26274
+ if (!set)
26275
+ return;
26276
+ set.delete(listener);
26277
+ if (set.size === 0)
26278
+ this.listeners.delete(event);
26279
+ }
26280
+ _emit(event, payload) {
26281
+ const set = this.listeners.get(event);
26282
+ if (!set || set.size === 0)
26283
+ return;
26284
+ for (const fn of Array.from(set)) {
26285
+ try {
26286
+ ;
26287
+ fn(payload);
26288
+ }
26289
+ catch (_e) {
26290
+ // never throw into app code
26291
+ }
26292
+ }
26293
+ }
26294
+ async snapshot(_windowMs, now = Date.now()) {
26295
+ const toTs = now;
26296
+ const fromTs = Math.max(0, toTs - this.windowMs);
26297
+ // Always include a full snapshot "anchor" if one exists at/before the window start.
26298
+ const rrwebFromTs = await this._safe(async () => {
26299
+ const anchor = await this.db.getLastRrwebFullSnapshotBefore(this.tabId, fromTs);
26300
+ return typeof (anchor === null || anchor === void 0 ? void 0 : anchor.ts) === 'number' ? anchor.ts : fromTs;
26301
+ }, fromTs);
26302
+ const [rrweb, spans, attrs] = await Promise.all([
26303
+ this._safe(() => this.db.getRrwebEventsWindow(this.tabId, rrwebFromTs, toTs), []),
26304
+ this._safe(() => this.db.getOtelSpansWindow(this.tabId, fromTs, toTs), []),
26305
+ this._safe(() => this.db.getAttrs(this.tabId), null)
26306
+ ]);
26307
+ const rrwebSorted = rrweb
26308
+ .sort((a, b) => a.ts - b.ts)
26309
+ .map((r) => ({ ts: r.ts, isFullSnapshot: r.isFullSnapshot, event: r.event }));
26310
+ // Hard guarantee: snapshot payload starts with a FullSnapshot (or is empty).
26311
+ const firstFullSnapshotIdx = rrwebSorted.findIndex((e) => Boolean(e.isFullSnapshot));
26312
+ const rrwebEvents = firstFullSnapshotIdx >= 0 ? rrwebSorted.slice(firstFullSnapshotIdx) : [];
26313
+ // Align spans with the rrweb replay start: spans must start from the FullSnapshot timestamp.
26314
+ const replayStartTs = rrwebEvents.length > 0 ? rrwebEvents[0].ts : fromTs;
26315
+ const otelSpans = spans
26316
+ .filter((s) => typeof (s === null || s === void 0 ? void 0 : s.ts) === 'number' && s.ts >= replayStartTs)
26317
+ .sort((a, b) => a.ts - b.ts)
26318
+ .map((r) => ({ ts: r.ts, span: r.span }));
26319
+ return {
26320
+ rrwebEvents,
26321
+ otelSpans,
26322
+ attrs: attrs
26323
+ ? {
26324
+ sessionAttributes: attrs.sessionAttributes,
26325
+ resourceAttributes: attrs.resourceAttributes,
26326
+ userAttributes: attrs.userAttributes
26327
+ }
26328
+ : null,
26329
+ windowMs: this.windowMs,
26330
+ fromTs: replayStartTs,
26331
+ toTs
26332
+ };
26333
+ }
26334
+ async clear() {
26335
+ await this._safe(() => this.db.clearTab(this.tabId), undefined);
26336
+ this.requiresFullSnapshot = true;
26337
+ }
26338
+ needsFullSnapshot() {
26339
+ return this.requiresFullSnapshot;
26340
+ }
26341
+ /**
26342
+ * Mark the tab as active/inactive.
26343
+ *
26344
+ * - When inactive, we freeze the buffer and keep the last active `windowMs` indefinitely.
26345
+ * - When re-activated, we resume buffering but require a new FullSnapshot to start a replayable segment.
26346
+ */
26347
+ setActive(active) {
26348
+ if (this.isActive === active)
26349
+ return;
26350
+ this.isActive = active;
26351
+ if (!active) {
26352
+ const freezeAt = this.lastSeenEventTs || Date.now();
26353
+ this.frozenAtTs = freezeAt;
26354
+ // Keep the last active window, but preserve rrweb replayability via snapshot anchor.
26355
+ const cutoff = Math.max(0, freezeAt - this.windowMs);
26356
+ void this._safe(() => this.db.pruneOlderThanWithRrwebSnapshotAnchor(this.tabId, cutoff), undefined);
26357
+ return;
26358
+ }
26359
+ const wasFrozen = this.frozenAtTs !== null;
26360
+ this.frozenAtTs = null;
26361
+ // New active segment must start with a full snapshot (don’t stitch segments together).
26362
+ if (wasFrozen)
26363
+ this.requiresFullSnapshot = true;
26364
+ this.pruneSoon();
26365
+ }
26366
+ pruneSoon() {
26367
+ if (!this.isActive)
26368
+ return;
26369
+ const now = Date.now();
26370
+ // Throttle pruning to avoid hammering IDB on high event rates
26371
+ if (now - this.lastPruneAt < 2000)
26372
+ return;
26373
+ if (this.pruneInFlight)
26374
+ return;
26375
+ this.lastPruneAt = now;
26376
+ const cutoff = Math.max(0, now - this.windowMs);
26377
+ // Heartbeat so the stale-tab sweeper never deletes active tabs.
26378
+ if (now - this.lastTouchAt > 30000) {
26379
+ this.lastTouchAt = now;
26380
+ void this._safe(() => this.db.touchTab(this.tabId, now), undefined);
26381
+ }
26382
+ this.pruneInFlight = this._safe(() => this.db.pruneOlderThanWithRrwebSnapshotAnchor(this.tabId, cutoff), undefined).finally(() => {
26383
+ this.pruneInFlight = null;
26384
+ });
26385
+ }
26386
+ }
26387
+
26388
+
26389
+ /***/ }),
26390
+
26391
+ /***/ "./src/services/indexedDb.service.ts":
26392
+ /*!*******************************************!*\
26393
+ !*** ./src/services/indexedDb.service.ts ***!
26394
+ \*******************************************/
26395
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
26396
+
26397
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
26398
+ /* harmony export */ IndexedDBService: () => (/* binding */ IndexedDBService)
26399
+ /* harmony export */ });
26400
+ const dbName = 'mpEventsDB';
26401
+ const dbVersion = 2;
26402
+ const legacyStoreName = 'mpEventsStore';
26403
+ const rrwebEventsStore = 'rrwebEvents';
26404
+ const otelSpansStore = 'otelSpans';
26405
+ const attrsStore = 'crashBufferAttrs';
26406
+ class IndexedDBService {
26407
+ constructor() {
26408
+ this.dbPromise = this.openDB();
26409
+ }
26410
+ openDB() {
26411
+ return new Promise((resolve, reject) => {
26412
+ const request = indexedDB.open(dbName, dbVersion);
26413
+ request.onupgradeneeded = () => {
26414
+ const db = request.result;
26415
+ // Keep the legacy store if it exists to avoid breaking older versions.
26416
+ if (!db.objectStoreNames.contains(legacyStoreName)) {
26417
+ db.createObjectStore(legacyStoreName, { keyPath: 'id', autoIncrement: true });
26418
+ }
26419
+ if (!db.objectStoreNames.contains(rrwebEventsStore)) {
26420
+ const store = db.createObjectStore(rrwebEventsStore, { keyPath: 'id', autoIncrement: true });
26421
+ store.createIndex('tabId_ts', ['tabId', 'ts'], { unique: false });
26422
+ }
26423
+ if (!db.objectStoreNames.contains(otelSpansStore)) {
26424
+ const store = db.createObjectStore(otelSpansStore, { keyPath: 'id', autoIncrement: true });
26425
+ store.createIndex('tabId_ts', ['tabId', 'ts'], { unique: false });
26426
+ }
26427
+ if (!db.objectStoreNames.contains(attrsStore)) {
26428
+ db.createObjectStore(attrsStore, { keyPath: 'tabId' });
26429
+ }
26430
+ };
26431
+ request.onsuccess = () => resolve(request.result);
26432
+ request.onerror = () => reject(request.error);
26433
+ });
26434
+ }
26435
+ /**
26436
+ * @deprecated Prefer `appendEvent(tabId, ...)` and `getRrwebEventsWindow(...)`.
26437
+ * This writes into the legacy store with no pruning semantics.
26438
+ */
26439
+ async saveEvent(event) {
26440
+ const db = await this.dbPromise;
26441
+ return new Promise((resolve, reject) => {
26442
+ const tx = db.transaction(legacyStoreName, 'readwrite');
26443
+ const store = tx.objectStore(legacyStoreName);
26444
+ store.add({ event });
26445
+ tx.oncomplete = () => resolve();
26446
+ tx.onerror = () => reject(tx.error);
26447
+ });
26448
+ }
26449
+ /**
26450
+ * @deprecated Prefer `getRrwebEventsWindow(...)`.
26451
+ */
26452
+ async getAllEvents() {
26453
+ const db = await this.dbPromise;
26454
+ return new Promise((resolve, reject) => {
26455
+ const tx = db.transaction(legacyStoreName, 'readonly');
26456
+ const store = tx.objectStore(legacyStoreName);
26457
+ const request = store.getAll();
26458
+ request.onsuccess = () => {
26459
+ const events = request.result.map((record) => record.event);
26460
+ resolve(events);
26461
+ };
26462
+ request.onerror = () => reject(request.error);
26463
+ });
26464
+ }
26465
+ /**
26466
+ * @deprecated Prefer `clearTab(tabId)`.
26467
+ */
26468
+ async clearEvents() {
26469
+ const db = await this.dbPromise;
26470
+ return new Promise((resolve, reject) => {
26471
+ const tx = db.transaction(legacyStoreName, 'readwrite');
26472
+ const store = tx.objectStore(legacyStoreName);
26473
+ store.clear();
26474
+ tx.oncomplete = () => resolve();
26475
+ tx.onerror = () => reject(tx.error);
26476
+ });
26477
+ }
26478
+ async setAttrs(attrs) {
26479
+ var _a;
26480
+ const db = await this.dbPromise;
26481
+ const payload = {
26482
+ ...attrs,
26483
+ updatedAt: (_a = attrs.updatedAt) !== null && _a !== void 0 ? _a : Date.now()
26484
+ };
26485
+ return new Promise((resolve, reject) => {
26486
+ const tx = db.transaction(attrsStore, 'readwrite');
26487
+ tx.objectStore(attrsStore).put(payload);
26488
+ tx.oncomplete = () => resolve();
26489
+ tx.onerror = () => reject(tx.error);
26490
+ });
26491
+ }
26492
+ async getAttrs(tabId) {
26493
+ const db = await this.dbPromise;
26494
+ return new Promise((resolve, reject) => {
26495
+ const tx = db.transaction(attrsStore, 'readonly');
26496
+ const request = tx.objectStore(attrsStore).get(tabId);
26497
+ request.onsuccess = () => resolve(request.result || null);
26498
+ request.onerror = () => reject(request.error);
26499
+ });
26500
+ }
26501
+ async getAllAttrs() {
26502
+ const db = await this.dbPromise;
26503
+ return new Promise((resolve, reject) => {
26504
+ const tx = db.transaction(attrsStore, 'readonly');
26505
+ const request = tx.objectStore(attrsStore).getAll();
26506
+ request.onsuccess = () => resolve(request.result || []);
26507
+ request.onerror = () => reject(request.error);
26508
+ });
26509
+ }
26510
+ /**
26511
+ * Updates `updatedAt` for the tab without clobbering existing attributes.
26512
+ */
26513
+ async touchTab(tabId, updatedAt = Date.now()) {
26514
+ const db = await this.dbPromise;
26515
+ return new Promise((resolve, reject) => {
26516
+ const tx = db.transaction(attrsStore, 'readwrite');
26517
+ const store = tx.objectStore(attrsStore);
26518
+ const getReq = store.get(tabId);
26519
+ getReq.onsuccess = () => {
26520
+ const existing = (getReq.result || null);
26521
+ const next = existing ? { ...existing, updatedAt } : { tabId, updatedAt };
26522
+ store.put(next);
26523
+ };
26524
+ getReq.onerror = () => reject(getReq.error);
26525
+ tx.oncomplete = () => resolve();
26526
+ tx.onerror = () => reject(tx.error);
26527
+ });
26528
+ }
26529
+ /**
26530
+ * Best-effort garbage collection for orphaned tabs.
26531
+ * Deletes all data for tabs whose `attrs.updatedAt` is older than `maxAgeMs`.
26532
+ */
26533
+ async sweepStaleTabs(maxAgeMs, now = Date.now()) {
26534
+ const attrs = await this.getAllAttrs().catch(() => []);
26535
+ if (!attrs.length)
26536
+ return 0;
26537
+ const stale = attrs
26538
+ .filter((a) => typeof (a === null || a === void 0 ? void 0 : a.updatedAt) === 'number' && now - a.updatedAt > maxAgeMs)
26539
+ .map((a) => a.tabId);
26540
+ let cleared = 0;
26541
+ for (const tabId of stale) {
26542
+ try {
26543
+ await this.clearTab(tabId);
26544
+ cleared += 1;
26545
+ }
26546
+ catch (_e) {
26547
+ // best effort
26548
+ }
26549
+ }
26550
+ return cleared;
26551
+ }
26552
+ async appendEvent(record) {
26553
+ const db = await this.dbPromise;
26554
+ return new Promise((resolve, reject) => {
26555
+ const tx = db.transaction(rrwebEventsStore, 'readwrite');
26556
+ tx.objectStore(rrwebEventsStore).add(record);
26557
+ tx.oncomplete = () => resolve();
26558
+ tx.onerror = () => reject(tx.error);
26559
+ });
26560
+ }
26561
+ async appendSpans(records) {
26562
+ if (!records.length)
26563
+ return;
26564
+ const db = await this.dbPromise;
26565
+ return new Promise((resolve, reject) => {
26566
+ const tx = db.transaction(otelSpansStore, 'readwrite');
26567
+ const store = tx.objectStore(otelSpansStore);
26568
+ for (const record of records) {
26569
+ store.add(record);
26570
+ }
26571
+ tx.oncomplete = () => resolve();
26572
+ tx.onerror = () => reject(tx.error);
26573
+ });
26574
+ }
26575
+ async getRrwebEventsWindow(tabId, fromTs, toTs) {
26576
+ const db = await this.dbPromise;
26577
+ const range = IDBKeyRange.bound([tabId, fromTs], [tabId, toTs]);
26578
+ return new Promise((resolve, reject) => {
26579
+ const tx = db.transaction(rrwebEventsStore, 'readonly');
26580
+ const idx = tx.objectStore(rrwebEventsStore).index('tabId_ts');
26581
+ const req = idx.getAll(range);
26582
+ req.onsuccess = () => resolve(req.result || []);
26583
+ req.onerror = () => reject(req.error);
26584
+ });
26585
+ }
26586
+ /**
26587
+ * Returns the last (highest-ts) FullSnapshot record at/before `cutoffTs`.
26588
+ * Used to keep a replayable anchor when pruning.
26589
+ */
26590
+ async getLastRrwebFullSnapshotBefore(tabId, cutoffTs) {
26591
+ const db = await this.dbPromise;
26592
+ const range = IDBKeyRange.bound([tabId, 0], [tabId, cutoffTs]);
26593
+ return new Promise((resolve, reject) => {
26594
+ const tx = db.transaction(rrwebEventsStore, 'readonly');
26595
+ const idx = tx.objectStore(rrwebEventsStore).index('tabId_ts');
26596
+ const req = idx.openCursor(range, 'prev');
26597
+ req.onsuccess = () => {
26598
+ const cursor = req.result;
26599
+ if (!cursor) {
26600
+ resolve(null);
26601
+ return;
26602
+ }
26603
+ const value = cursor.value;
26604
+ if (value === null || value === void 0 ? void 0 : value.isFullSnapshot) {
26605
+ resolve(value);
26606
+ return;
26607
+ }
26608
+ cursor.continue();
26609
+ };
26610
+ req.onerror = () => reject(req.error);
26611
+ });
26612
+ }
26613
+ async getOtelSpansWindow(tabId, fromTs, toTs) {
26614
+ const db = await this.dbPromise;
26615
+ const range = IDBKeyRange.bound([tabId, fromTs], [tabId, toTs]);
26616
+ return new Promise((resolve, reject) => {
26617
+ const tx = db.transaction(otelSpansStore, 'readonly');
26618
+ const idx = tx.objectStore(otelSpansStore).index('tabId_ts');
26619
+ const req = idx.getAll(range);
26620
+ req.onsuccess = () => resolve(req.result || []);
26621
+ req.onerror = () => reject(req.error);
26622
+ });
26623
+ }
26624
+ async pruneOlderThan(tabId, cutoffTs) {
26625
+ const db = await this.dbPromise;
26626
+ const rrwebRange = IDBKeyRange.bound([tabId, 0], [tabId, cutoffTs]);
26627
+ const spansRange = IDBKeyRange.bound([tabId, 0], [tabId, cutoffTs]);
26628
+ const pruneStore = (store, range) => new Promise((resolve, reject) => {
26629
+ const idx = store.index('tabId_ts');
26630
+ const req = idx.openCursor(range);
26631
+ req.onsuccess = () => {
26632
+ const cursor = req.result;
26633
+ if (!cursor) {
26634
+ resolve();
26635
+ return;
26636
+ }
26637
+ cursor.delete();
26638
+ cursor.continue();
26639
+ };
26640
+ req.onerror = () => reject(req.error);
26641
+ });
26642
+ return new Promise((resolve, reject) => {
26643
+ const tx = db.transaction([rrwebEventsStore, otelSpansStore], 'readwrite');
26644
+ const rrwebStore = tx.objectStore(rrwebEventsStore);
26645
+ const spanStore = tx.objectStore(otelSpansStore);
26646
+ Promise.all([pruneStore(rrwebStore, rrwebRange), pruneStore(spanStore, spansRange)])
26647
+ .then(() => {
26648
+ // noop; completion is signaled by tx.oncomplete
26649
+ })
26650
+ .catch((e) => {
26651
+ reject(e);
26652
+ });
26653
+ tx.oncomplete = () => resolve();
26654
+ tx.onerror = () => reject(tx.error);
26655
+ });
26656
+ }
26657
+ /**
26658
+ * Prune older data while keeping rrweb replayability:
26659
+ * - rrweb: keep the last FullSnapshot at/before cutoff as an "anchor"
26660
+ * - spans: prune strictly by cutoff
26661
+ */
26662
+ async pruneOlderThanWithRrwebSnapshotAnchor(tabId, cutoffTs) {
26663
+ const db = await this.dbPromise;
26664
+ const anchor = await this.getLastRrwebFullSnapshotBefore(tabId, cutoffTs);
26665
+ // rrweb: delete everything strictly older than the anchor snapshot (keep the anchor itself)
26666
+ // spans: delete everything older than cutoffTs
26667
+ const rrwebCutoffTs = typeof (anchor === null || anchor === void 0 ? void 0 : anchor.ts) === 'number' ? Math.max(0, anchor.ts - 1) : cutoffTs;
26668
+ const rrwebRange = IDBKeyRange.bound([tabId, 0], [tabId, rrwebCutoffTs]);
26669
+ const spansRange = IDBKeyRange.bound([tabId, 0], [tabId, cutoffTs]);
26670
+ const pruneStore = (store, range) => new Promise((resolve, reject) => {
26671
+ const idx = store.index('tabId_ts');
26672
+ const req = idx.openCursor(range);
26673
+ req.onsuccess = () => {
26674
+ const cursor = req.result;
26675
+ if (!cursor) {
26676
+ resolve();
26677
+ return;
26678
+ }
26679
+ cursor.delete();
26680
+ cursor.continue();
26681
+ };
26682
+ req.onerror = () => reject(req.error);
26683
+ });
26684
+ return new Promise((resolve, reject) => {
26685
+ const tx = db.transaction([rrwebEventsStore, otelSpansStore], 'readwrite');
26686
+ const rrwebStore = tx.objectStore(rrwebEventsStore);
26687
+ const spanStore = tx.objectStore(otelSpansStore);
26688
+ Promise.all([pruneStore(rrwebStore, rrwebRange), pruneStore(spanStore, spansRange)])
26689
+ .then(() => {
26690
+ // noop
26691
+ })
26692
+ .catch((e) => reject(e));
26693
+ tx.oncomplete = () => resolve();
26694
+ tx.onerror = () => reject(tx.error);
26695
+ });
26696
+ }
26697
+ async clearTab(tabId) {
26698
+ const db = await this.dbPromise;
26699
+ const allRange = IDBKeyRange.bound([tabId, 0], [tabId, Number.MAX_SAFE_INTEGER]);
26700
+ const clearByTab = (store) => new Promise((resolve, reject) => {
26701
+ const idx = store.index('tabId_ts');
26702
+ const req = idx.openCursor(allRange);
26703
+ req.onsuccess = () => {
26704
+ const cursor = req.result;
26705
+ if (!cursor) {
26706
+ resolve();
26707
+ return;
26708
+ }
26709
+ cursor.delete();
26710
+ cursor.continue();
26711
+ };
26712
+ req.onerror = () => reject(req.error);
26713
+ });
26714
+ return new Promise((resolve, reject) => {
26715
+ const tx = db.transaction([rrwebEventsStore, otelSpansStore, attrsStore], 'readwrite');
26716
+ const rrwebStore = tx.objectStore(rrwebEventsStore);
26717
+ const spanStore = tx.objectStore(otelSpansStore);
26718
+ const attr = tx.objectStore(attrsStore);
26719
+ Promise.all([
26720
+ clearByTab(rrwebStore),
26721
+ clearByTab(spanStore),
26722
+ new Promise((res, rej) => {
26723
+ const r = attr.delete(tabId);
26724
+ r.onsuccess = () => res();
26725
+ r.onerror = () => rej(r.error);
26726
+ })
26727
+ ])
26728
+ .then(() => {
26729
+ // noop
26730
+ })
26731
+ .catch((e) => reject(e));
26732
+ tx.oncomplete = () => resolve();
26733
+ tx.onerror = () => reject(tx.error);
26734
+ });
25985
26735
  }
25986
26736
  }
25987
26737
 
@@ -26104,15 +26854,17 @@ const messagingService = new MessagingService();
26104
26854
  /* harmony export */ SocketService: () => (/* binding */ SocketService)
26105
26855
  /* harmony export */ });
26106
26856
  /* 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");
26857
+ /* harmony import */ var lib0_observable__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lib0/observable */ "../../node_modules/lib0/observable.js");
26108
26858
  /* harmony import */ var _services_messaging_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../services/messaging.service */ "./src/services/messaging.service.ts");
26109
26859
  /* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../config */ "./src/config/index.ts");
26860
+ /* 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");
26861
+
26110
26862
 
26111
26863
 
26112
26864
 
26113
26865
 
26114
26866
  const MAX_RECONNECTION_ATTEMPTS = 2;
26115
- class SocketService extends lib0_observable__WEBPACK_IMPORTED_MODULE_3__.Observable {
26867
+ class SocketService extends lib0_observable__WEBPACK_IMPORTED_MODULE_4__.Observable {
26116
26868
  constructor() {
26117
26869
  super();
26118
26870
  this.socket = null;
@@ -26179,6 +26931,9 @@ class SocketService extends lib0_observable__WEBPACK_IMPORTED_MODULE_3__.Observa
26179
26931
  path: '/v0/radar/ws',
26180
26932
  auth: {
26181
26933
  'x-api-key': this.options.apiKey,
26934
+ ...this.options.clientId
26935
+ ? { [_multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_3__.ATTR_MULTIPLAYER_SESSION_CLIENT_ID]: this.options.clientId }
26936
+ : {},
26182
26937
  },
26183
26938
  reconnectionAttempts: 2,
26184
26939
  transports: ['websocket'],
@@ -26210,6 +26965,9 @@ class SocketService extends lib0_observable__WEBPACK_IMPORTED_MODULE_3__.Observa
26210
26965
  this.socket.on(_config__WEBPACK_IMPORTED_MODULE_2__.REMOTE_SESSION_RECORDING_STOP, (data) => {
26211
26966
  this.emit(_config__WEBPACK_IMPORTED_MODULE_2__.REMOTE_SESSION_RECORDING_STOP, [data]);
26212
26967
  });
26968
+ this.socket.on(_config__WEBPACK_IMPORTED_MODULE_2__.SESSION_SAVE_BUFFER_EVENT, (data) => {
26969
+ this.emit(_config__WEBPACK_IMPORTED_MODULE_2__.SESSION_SAVE_BUFFER_EVENT, [data]);
26970
+ });
26213
26971
  }
26214
26972
  checkReconnectionAttempts() {
26215
26973
  if (this.attempts >= MAX_RECONNECTION_ATTEMPTS) {
@@ -26309,21 +27067,24 @@ class SocketService extends lib0_observable__WEBPACK_IMPORTED_MODULE_3__.Observa
26309
27067
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
26310
27068
  /* harmony export */ SessionRecorder: () => (/* binding */ SessionRecorder)
26311
27069
  /* harmony export */ });
26312
- /* harmony import */ var lib0_observable__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! lib0/observable */ "../../node_modules/lib0/observable.js");
27070
+ /* harmony import */ var lib0_observable__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! lib0/observable */ "../../node_modules/lib0/observable.js");
26313
27071
  /* 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
27072
  /* harmony import */ var _otel__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./otel */ "./src/otel/index.ts");
26315
27073
  /* harmony import */ var _rrweb__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./rrweb */ "./src/rrweb/index.ts");
26316
27074
  /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ "./src/utils/index.ts");
26317
27075
  /* 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");
27076
+ /* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./config */ "./src/config/index.ts");
27077
+ /* harmony import */ var _patch__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./patch */ "./src/patch/index.ts");
27078
+ /* harmony import */ var _eventBus__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./eventBus */ "./src/eventBus.ts");
27079
+ /* harmony import */ var _sessionWidget__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./sessionWidget */ "./src/sessionWidget/index.ts");
27080
+ /* harmony import */ var _services_messaging_service__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./services/messaging.service */ "./src/services/messaging.service.ts");
27081
+ /* harmony import */ var _services_api_service__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./services/api.service */ "./src/services/api.service.ts");
27082
+ /* harmony import */ var _services_socket_service__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./services/socket.service */ "./src/services/socket.service.ts");
27083
+ /* harmony import */ var _services_indexedDb_service__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./services/indexedDb.service */ "./src/services/indexedDb.service.ts");
27084
+ /* harmony import */ var _services_crashBuffer_service__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./services/crashBuffer.service */ "./src/services/crashBuffer.service.ts");
27085
+ /* harmony import */ var _sessionWidget_buttonStateConfigs__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./sessionWidget/buttonStateConfigs */ "./src/sessionWidget/buttonStateConfigs.ts");
27086
+ /* harmony import */ var _navigation__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./navigation */ "./src/navigation/index.ts");
27087
+
26327
27088
 
26328
27089
 
26329
27090
 
@@ -26339,7 +27100,8 @@ class SocketService extends lib0_observable__WEBPACK_IMPORTED_MODULE_3__.Observa
26339
27100
 
26340
27101
 
26341
27102
 
26342
- class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_14__.Observable {
27103
+
27104
+ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_16__.Observable {
26343
27105
  get navigation() {
26344
27106
  return this._navigationRecorder.api;
26345
27107
  }
@@ -26351,7 +27113,7 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_14__.Obse
26351
27113
  }
26352
27114
  set sessionId(sessionId) {
26353
27115
  this._sessionId = sessionId;
26354
- (0,_utils__WEBPACK_IMPORTED_MODULE_3__.setStoredItem)(_config__WEBPACK_IMPORTED_MODULE_6__.SESSION_ID_PROP_NAME, sessionId);
27116
+ (0,_utils__WEBPACK_IMPORTED_MODULE_3__.setStoredItem)(_config__WEBPACK_IMPORTED_MODULE_5__.SESSION_ID_PROP_NAME, sessionId);
26355
27117
  }
26356
27118
  get sessionType() {
26357
27119
  return this._sessionType;
@@ -26360,8 +27122,8 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_14__.Obse
26360
27122
  this._sessionType = sessionType;
26361
27123
  const continuousRecording = sessionType === _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_0__.SessionType.CONTINUOUS;
26362
27124
  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);
27125
+ _services_messaging_service__WEBPACK_IMPORTED_MODULE_9__["default"].sendMessage('continuous-debugging', continuousRecording);
27126
+ (0,_utils__WEBPACK_IMPORTED_MODULE_3__.setStoredItem)(_config__WEBPACK_IMPORTED_MODULE_5__.SESSION_TYPE_PROP_NAME, sessionType);
26365
27127
  }
26366
27128
  get continuousRecording() {
26367
27129
  return this.sessionType === _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_0__.SessionType.CONTINUOUS;
@@ -26372,8 +27134,8 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_14__.Obse
26372
27134
  set sessionState(state) {
26373
27135
  this._sessionState = state;
26374
27136
  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);
27137
+ _services_messaging_service__WEBPACK_IMPORTED_MODULE_9__["default"].sendMessage('state-change', this._sessionState);
27138
+ (0,_utils__WEBPACK_IMPORTED_MODULE_3__.setStoredItem)(_config__WEBPACK_IMPORTED_MODULE_5__.SESSION_STATE_PROP_NAME, state);
26377
27139
  // Emit observable event to support React wrapper
26378
27140
  this.emit('state-change', [this._sessionState || _types__WEBPACK_IMPORTED_MODULE_4__.SessionState.stopped, this.sessionType]);
26379
27141
  }
@@ -26382,7 +27144,7 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_14__.Obse
26382
27144
  }
26383
27145
  set session(session) {
26384
27146
  this._session = session;
26385
- (0,_utils__WEBPACK_IMPORTED_MODULE_3__.setStoredItem)(_config__WEBPACK_IMPORTED_MODULE_6__.SESSION_PROP_NAME, this._session);
27147
+ (0,_utils__WEBPACK_IMPORTED_MODULE_3__.setStoredItem)(_config__WEBPACK_IMPORTED_MODULE_5__.SESSION_PROP_NAME, this._session);
26386
27148
  }
26387
27149
  get sessionAttributes() {
26388
27150
  return this._sessionAttributes || {};
@@ -26420,15 +27182,20 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_14__.Obse
26420
27182
  constructor() {
26421
27183
  var _a;
26422
27184
  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();
27185
+ this._apiService = new _services_api_service__WEBPACK_IMPORTED_MODULE_10__.ApiService();
27186
+ this._socketService = new _services_socket_service__WEBPACK_IMPORTED_MODULE_11__.SocketService();
26425
27187
  this._tracer = new _otel__WEBPACK_IMPORTED_MODULE_1__.TracerBrowserSDK();
26426
27188
  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();
27189
+ this._sessionWidget = new _sessionWidget__WEBPACK_IMPORTED_MODULE_8__.SessionWidget();
27190
+ this._navigationRecorder = new _navigation__WEBPACK_IMPORTED_MODULE_15__.NavigationRecorder();
26429
27191
  this._startRequestController = null;
27192
+ this._tabId = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.getOrCreateTabId)();
27193
+ this._bufferDb = new _services_indexedDb_service__WEBPACK_IMPORTED_MODULE_12__.IndexedDBService();
27194
+ this._crashBuffer = null;
27195
+ this._isFlushingBuffer = false;
27196
+ this._bufferLifecycleHandlersRegistered = false;
26430
27197
  this._isInitialized = false;
26431
- // Session ID and state are stored in localStorage
27198
+ // Session ID and state are stored in sessionStorage (with fallback) to avoid multi-tab conflicts
26432
27199
  this._sessionId = null;
26433
27200
  this._sessionType = _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_0__.SessionType.MANUAL;
26434
27201
  this._sessionState = null;
@@ -26441,10 +27208,10 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_14__.Obse
26441
27208
  this._error = '';
26442
27209
  // Safety: avoid accessing storage in SSR/non-browser environments
26443
27210
  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;
27211
+ const sessionLocal = isBrowser ? (0,_utils__WEBPACK_IMPORTED_MODULE_3__.getStoredItem)(_config__WEBPACK_IMPORTED_MODULE_5__.SESSION_PROP_NAME, true) : null;
27212
+ const sessionIdLocal = isBrowser ? (0,_utils__WEBPACK_IMPORTED_MODULE_3__.getStoredItem)(_config__WEBPACK_IMPORTED_MODULE_5__.SESSION_ID_PROP_NAME) : null;
27213
+ const sessionStateLocal = isBrowser ? (0,_utils__WEBPACK_IMPORTED_MODULE_3__.getStoredItem)(_config__WEBPACK_IMPORTED_MODULE_5__.SESSION_STATE_PROP_NAME) : null;
27214
+ const sessionTypeLocal = isBrowser ? (0,_utils__WEBPACK_IMPORTED_MODULE_3__.getStoredItem)(_config__WEBPACK_IMPORTED_MODULE_5__.SESSION_TYPE_PROP_NAME) : null;
26448
27215
  if ((0,_utils__WEBPACK_IMPORTED_MODULE_3__.isSessionActive)(sessionLocal, sessionTypeLocal)) {
26449
27216
  this.session = sessionLocal;
26450
27217
  this.sessionId = sessionIdLocal;
@@ -26458,8 +27225,8 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_14__.Obse
26458
27225
  this.sessionType = _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_0__.SessionType.MANUAL;
26459
27226
  }
26460
27227
  this._configs = {
26461
- ..._config__WEBPACK_IMPORTED_MODULE_6__.BASE_CONFIG,
26462
- apiKey: ((_a = this.session) === null || _a === void 0 ? void 0 : _a.tempApiKey) || '',
27228
+ ..._config__WEBPACK_IMPORTED_MODULE_5__.BASE_CONFIG,
27229
+ apiKey: ((_a = this.session) === null || _a === void 0 ? void 0 : _a.tempApiKey) || ''
26463
27230
  };
26464
27231
  }
26465
27232
  /**
@@ -26470,40 +27237,118 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_14__.Obse
26470
27237
  if (typeof window === 'undefined') {
26471
27238
  return;
26472
27239
  }
26473
- this._configs = (0,_config__WEBPACK_IMPORTED_MODULE_6__.getSessionRecorderConfig)({ ...this._configs, ...configs });
27240
+ this._configs = (0,_config__WEBPACK_IMPORTED_MODULE_5__.getSessionRecorderConfig)({ ...this._configs, ...configs });
26474
27241
  this._isInitialized = true;
26475
27242
  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);
27243
+ // GC: remove orphaned crash buffers from old tabs.
27244
+ // Keep TTL large to avoid any accidental data loss.
27245
+ void this._bufferDb.sweepStaleTabs(24 * 60 * 60 * 1000);
27246
+ (0,_patch__WEBPACK_IMPORTED_MODULE_6__.setMaxCapturingHttpPayloadSize)(this._configs.maxCapturingHttpPayloadSize || _config__WEBPACK_IMPORTED_MODULE_5__.DEFAULT_MAX_HTTP_CAPTURING_PAYLOAD_SIZE);
27247
+ (0,_patch__WEBPACK_IMPORTED_MODULE_6__.setShouldRecordHttpData)(this._configs.captureBody, this._configs.captureHeaders);
27248
+ this._setupCrashBuffer();
26478
27249
  this._tracer.init(this._configs);
26479
27250
  this._apiService.init(this._configs);
26480
27251
  this._sessionWidget.init(this._configs);
26481
27252
  this._socketService.init({
26482
27253
  apiKey: this._configs.apiKey,
27254
+ clientId: this._tracer.clientId,
26483
27255
  socketUrl: this._configs.apiBaseUrl || '',
26484
27256
  keepAlive: Boolean(this._configs.useWebsocket),
26485
- usePostMessageFallback: Boolean(this._configs.usePostMessageFallback),
27257
+ usePostMessageFallback: Boolean(this._configs.usePostMessageFallback)
26486
27258
  });
26487
27259
  this._navigationRecorder.init({
26488
27260
  version: this._configs.version,
26489
27261
  application: this._configs.application,
26490
27262
  environment: this._configs.environment,
26491
- enabled: this._configs.recordNavigation,
27263
+ enabled: this._configs.recordNavigation
26492
27264
  });
26493
27265
  if (this._configs.apiKey) {
26494
27266
  this._recorder.init(this._configs, this._socketService);
26495
27267
  }
26496
- if (this.sessionId
26497
- && (this.sessionState === _types__WEBPACK_IMPORTED_MODULE_4__.SessionState.started
26498
- || this.sessionState === _types__WEBPACK_IMPORTED_MODULE_4__.SessionState.paused)) {
27268
+ if (this.sessionId && (this.sessionState === _types__WEBPACK_IMPORTED_MODULE_4__.SessionState.started || this.sessionState === _types__WEBPACK_IMPORTED_MODULE_4__.SessionState.paused)) {
26499
27269
  this._start();
26500
27270
  }
27271
+ else {
27272
+ // Buffer-only recording when there is no active debug session.
27273
+ this._startBufferOnlyRecording();
27274
+ }
26501
27275
  this._registerWidgetEvents();
26502
27276
  this._registerSocketServiceListeners();
26503
- _services_messaging_service__WEBPACK_IMPORTED_MODULE_10__["default"].sendMessage('state-change', this.sessionState);
27277
+ _services_messaging_service__WEBPACK_IMPORTED_MODULE_9__["default"].sendMessage('state-change', this.sessionState);
26504
27278
  // Emit init observable event
26505
27279
  this.emit('init', [this]);
26506
27280
  }
27281
+ _setupCrashBuffer() {
27282
+ var _a;
27283
+ if ((_a = this._configs.buffering) === null || _a === void 0 ? void 0 : _a.enabled) {
27284
+ const windowMinutes = this._configs.buffering.windowMinutes || 1;
27285
+ const windowMs = Math.max(10000, windowMinutes * 60 * 1000);
27286
+ this._crashBuffer = new _services_crashBuffer_service__WEBPACK_IMPORTED_MODULE_13__.CrashBufferService(this._bufferDb, this._tabId, windowMs);
27287
+ this._recorder.setCrashBuffer(this._crashBuffer);
27288
+ this._tracer.setCrashBuffer(this._crashBuffer);
27289
+ this._crashBuffer.setAttrs({
27290
+ sessionAttributes: this.sessionAttributes,
27291
+ resourceAttributes: (0,_utils__WEBPACK_IMPORTED_MODULE_3__.getNavigatorInfo)(),
27292
+ userAttributes: this._userAttributes
27293
+ });
27294
+ this._crashBuffer.on('error-span-appended', (payload) => {
27295
+ if (this.sessionState !== _types__WEBPACK_IMPORTED_MODULE_4__.SessionState.stopped || this.sessionId)
27296
+ return;
27297
+ if (!payload.span)
27298
+ return;
27299
+ this._createExceptionSession(payload.span);
27300
+ });
27301
+ this._registerCrashBufferLifecycleHandlers();
27302
+ }
27303
+ }
27304
+ _registerCrashBufferLifecycleHandlers() {
27305
+ if (this._bufferLifecycleHandlersRegistered)
27306
+ return;
27307
+ if (typeof window === 'undefined')
27308
+ return;
27309
+ if (typeof document === 'undefined')
27310
+ return;
27311
+ if (!this._crashBuffer)
27312
+ return;
27313
+ this._bufferLifecycleHandlersRegistered = true;
27314
+ const update = () => this._updateCrashBufferActiveState();
27315
+ window.addEventListener('focus', update, { passive: true });
27316
+ window.addEventListener('blur', update, { passive: true });
27317
+ document.addEventListener('visibilitychange', update, { passive: true });
27318
+ // Set initial state.
27319
+ update();
27320
+ }
27321
+ _updateCrashBufferActiveState() {
27322
+ if (!this._crashBuffer)
27323
+ return;
27324
+ if (typeof document === 'undefined')
27325
+ return;
27326
+ let hasFocus = true;
27327
+ try {
27328
+ hasFocus = typeof document.hasFocus === 'function' ? document.hasFocus() : true;
27329
+ }
27330
+ catch (_e) {
27331
+ hasFocus = true;
27332
+ }
27333
+ const isVisible = document.visibilityState === 'visible' && !document.hidden;
27334
+ const active = isVisible && hasFocus;
27335
+ this._crashBuffer.setActive(active);
27336
+ if (active && this._crashBuffer.needsFullSnapshot()) {
27337
+ // If the buffer was cleared while inactive, the next stored rrweb event must be a FullSnapshot.
27338
+ this._recorder.takeFullSnapshot();
27339
+ }
27340
+ }
27341
+ _startBufferOnlyRecording() {
27342
+ var _a, _b;
27343
+ if (!((_b = (_a = this._configs) === null || _a === void 0 ? void 0 : _a.buffering) === null || _b === void 0 ? void 0 : _b.enabled))
27344
+ return;
27345
+ if (!this._crashBuffer)
27346
+ return;
27347
+ // Don’t start if a session is active.
27348
+ if (this.sessionState !== _types__WEBPACK_IMPORTED_MODULE_4__.SessionState.stopped || this.sessionId)
27349
+ return;
27350
+ void this._recorder.restart(null, _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_0__.SessionType.MANUAL);
27351
+ }
26507
27352
  /**
26508
27353
  * Save the continuous recording session
26509
27354
  */
@@ -26513,31 +27358,32 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_14__.Obse
26513
27358
  if (!this.continuousRecording || !this._configs.showContinuousRecording) {
26514
27359
  return;
26515
27360
  }
26516
- this._sessionWidget.updateSaveContinuousDebugSessionState(_sessionWidget_buttonStateConfigs__WEBPACK_IMPORTED_MODULE_12__.ContinuousRecordingSaveButtonState.SAVING);
27361
+ this._sessionWidget.updateSaveContinuousDebugSessionState(_sessionWidget_buttonStateConfigs__WEBPACK_IMPORTED_MODULE_14__.ContinuousRecordingSaveButtonState.SAVING);
26517
27362
  const res = await this._apiService.saveContinuousDebugSession(this.sessionId, {
26518
27363
  sessionAttributes: this.sessionAttributes,
26519
27364
  resourceAttributes: (0,_utils__WEBPACK_IMPORTED_MODULE_3__.getNavigatorInfo)(),
26520
27365
  stoppedAt: this._recorder.stoppedAt,
26521
27366
  name: this._getSessionName()
26522
27367
  });
26523
- this._sessionWidget.updateSaveContinuousDebugSessionState(_sessionWidget_buttonStateConfigs__WEBPACK_IMPORTED_MODULE_12__.ContinuousRecordingSaveButtonState.SAVED);
27368
+ this._sessionWidget.updateSaveContinuousDebugSessionState(_sessionWidget_buttonStateConfigs__WEBPACK_IMPORTED_MODULE_14__.ContinuousRecordingSaveButtonState.SAVED);
26524
27369
  const sessionUrl = res === null || res === void 0 ? void 0 : res.url;
26525
27370
  this._sessionWidget.showToast({
26526
27371
  type: 'success',
26527
27372
  message: 'Your session was saved',
26528
27373
  button: {
26529
- text: 'Open session', url: sessionUrl,
26530
- },
27374
+ text: 'Open session',
27375
+ url: sessionUrl
27376
+ }
26531
27377
  }, 5000);
26532
27378
  return res;
26533
27379
  }
26534
27380
  catch (error) {
26535
27381
  this.error = error.message;
26536
- this._sessionWidget.updateSaveContinuousDebugSessionState(_sessionWidget_buttonStateConfigs__WEBPACK_IMPORTED_MODULE_12__.ContinuousRecordingSaveButtonState.ERROR);
27382
+ this._sessionWidget.updateSaveContinuousDebugSessionState(_sessionWidget_buttonStateConfigs__WEBPACK_IMPORTED_MODULE_14__.ContinuousRecordingSaveButtonState.ERROR);
26537
27383
  }
26538
27384
  finally {
26539
27385
  setTimeout(() => {
26540
- this._sessionWidget.updateSaveContinuousDebugSessionState(_sessionWidget_buttonStateConfigs__WEBPACK_IMPORTED_MODULE_12__.ContinuousRecordingSaveButtonState.IDLE);
27386
+ this._sessionWidget.updateSaveContinuousDebugSessionState(_sessionWidget_buttonStateConfigs__WEBPACK_IMPORTED_MODULE_14__.ContinuousRecordingSaveButtonState.IDLE);
26541
27387
  }, 3000);
26542
27388
  }
26543
27389
  }
@@ -26576,10 +27422,10 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_14__.Obse
26576
27422
  else {
26577
27423
  const request = {
26578
27424
  sessionAttributes: { comment },
26579
- stoppedAt: this._recorder.stoppedAt,
27425
+ stoppedAt: this._recorder.stoppedAt
26580
27426
  };
26581
27427
  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);
27428
+ _eventBus__WEBPACK_IMPORTED_MODULE_7__.recorderEventBus.emit(_config__WEBPACK_IMPORTED_MODULE_5__.SESSION_RESPONSE, response);
26583
27429
  }
26584
27430
  this._clearSession();
26585
27431
  }
@@ -26634,7 +27480,7 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_14__.Obse
26634
27480
  /**
26635
27481
  * Set the session attributes
26636
27482
  * @param attributes - the attributes to set
26637
- */
27483
+ */
26638
27484
  setSessionAttributes(attributes) {
26639
27485
  this._sessionAttributes = attributes;
26640
27486
  }
@@ -26672,6 +27518,51 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_14__.Obse
26672
27518
  this.error = (e === null || e === void 0 ? void 0 : e.message) || 'Failed to capture exception';
26673
27519
  }
26674
27520
  }
27521
+ async _flushBuffer(sessionId) {
27522
+ var _a, _b;
27523
+ if (!((_b = (_a = this._configs) === null || _a === void 0 ? void 0 : _a.buffering) === null || _b === void 0 ? void 0 : _b.enabled))
27524
+ return null;
27525
+ if (!this._crashBuffer)
27526
+ return null;
27527
+ if (this._isFlushingBuffer)
27528
+ return null;
27529
+ // Don’t flush while a live recording is active.
27530
+ if (this.sessionState !== _types__WEBPACK_IMPORTED_MODULE_4__.SessionState.stopped)
27531
+ return null;
27532
+ this._isFlushingBuffer = true;
27533
+ try {
27534
+ // await this._crashBuffer.setAttrs({
27535
+ // sessionAttributes: this.sessionAttributes,
27536
+ // resourceAttributes: getNavigatorInfo(),
27537
+ // userAttributes: this._userAttributes
27538
+ // })
27539
+ const snapshot = await this._crashBuffer.snapshot();
27540
+ if (snapshot.rrwebEvents.length === 0 && snapshot.otelSpans.length === 0) {
27541
+ return null;
27542
+ }
27543
+ if (sessionId) {
27544
+ const spans = snapshot.otelSpans.map((s) => s.span);
27545
+ const events = snapshot.rrwebEvents.map((e) => e.event);
27546
+ await Promise.all([
27547
+ this._tracer.exportTraces(spans),
27548
+ this._apiService.exportEvents(sessionId, { events }),
27549
+ this._apiService.updateSessionAttributes(sessionId, {
27550
+ name: this._getSessionName(),
27551
+ sessionAttributes: this.sessionAttributes,
27552
+ resourceAttributes: (0,_utils__WEBPACK_IMPORTED_MODULE_3__.getNavigatorInfo)(),
27553
+ userAttributes: this._userAttributes || undefined
27554
+ })
27555
+ ]);
27556
+ }
27557
+ }
27558
+ catch (_e) {
27559
+ // swallow: flush is best-effort; never throw into app code
27560
+ }
27561
+ finally {
27562
+ await this._crashBuffer.clear();
27563
+ this._isFlushingBuffer = false;
27564
+ }
27565
+ }
26675
27566
  /**
26676
27567
  * @description Check if session should be started/stopped automatically
26677
27568
  * @param {ISession} [sessionPayload]
@@ -26685,11 +27576,11 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_14__.Obse
26685
27576
  const payload = {
26686
27577
  sessionAttributes: {
26687
27578
  ...this.sessionAttributes,
26688
- ...((sessionPayload === null || sessionPayload === void 0 ? void 0 : sessionPayload.sessionAttributes) || {}),
27579
+ ...((sessionPayload === null || sessionPayload === void 0 ? void 0 : sessionPayload.sessionAttributes) || {})
26689
27580
  },
26690
27581
  resourceAttributes: {
26691
27582
  ...(0,_utils__WEBPACK_IMPORTED_MODULE_3__.getNavigatorInfo)(),
26692
- ...((sessionPayload === null || sessionPayload === void 0 ? void 0 : sessionPayload.resourceAttributes) || {}),
27583
+ ...((sessionPayload === null || sessionPayload === void 0 ? void 0 : sessionPayload.resourceAttributes) || {})
26693
27584
  },
26694
27585
  userAttributes: this._userAttributes
26695
27586
  };
@@ -26803,12 +27694,12 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_14__.Obse
26803
27694
  * Register socket service event listeners
26804
27695
  */
26805
27696
  _registerSocketServiceListeners() {
26806
- this._socketService.on(_config__WEBPACK_IMPORTED_MODULE_6__.SESSION_STOPPED_EVENT, () => {
27697
+ this._socketService.on(_config__WEBPACK_IMPORTED_MODULE_5__.SESSION_STOPPED_EVENT, () => {
26807
27698
  this._stop();
26808
27699
  this._clearSession();
26809
27700
  this._sessionWidget.handleUIReseting();
26810
27701
  });
26811
- this._socketService.on(_config__WEBPACK_IMPORTED_MODULE_6__.SESSION_AUTO_CREATED, (payload) => {
27702
+ this._socketService.on(_config__WEBPACK_IMPORTED_MODULE_5__.SESSION_AUTO_CREATED, (payload) => {
26812
27703
  var _a;
26813
27704
  if (!(payload === null || payload === void 0 ? void 0 : payload.data))
26814
27705
  return;
@@ -26817,22 +27708,37 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_14__.Obse
26817
27708
  message: 'Your session was auto-saved due to an error',
26818
27709
  button: {
26819
27710
  text: 'Open session',
26820
- url: (_a = payload === null || payload === void 0 ? void 0 : payload.data) === null || _a === void 0 ? void 0 : _a.url,
26821
- },
27711
+ url: (_a = payload === null || payload === void 0 ? void 0 : payload.data) === null || _a === void 0 ? void 0 : _a.url
27712
+ }
26822
27713
  }, 5000);
26823
27714
  });
26824
- this._socketService.on(_config__WEBPACK_IMPORTED_MODULE_6__.REMOTE_SESSION_RECORDING_START, (payload) => {
27715
+ this._socketService.on(_config__WEBPACK_IMPORTED_MODULE_5__.REMOTE_SESSION_RECORDING_START, (payload) => {
26825
27716
  console.log('REMOTE_SESSION_RECORDING_START', payload);
26826
27717
  if (this.sessionState === _types__WEBPACK_IMPORTED_MODULE_4__.SessionState.stopped) {
26827
27718
  this.start();
26828
27719
  }
26829
27720
  });
26830
- this._socketService.on(_config__WEBPACK_IMPORTED_MODULE_6__.REMOTE_SESSION_RECORDING_STOP, (payload) => {
27721
+ this._socketService.on(_config__WEBPACK_IMPORTED_MODULE_5__.REMOTE_SESSION_RECORDING_STOP, (payload) => {
26831
27722
  console.log('REMOTE_SESSION_RECORDING_STOP', payload);
26832
27723
  if (this.sessionState !== _types__WEBPACK_IMPORTED_MODULE_4__.SessionState.stopped) {
26833
27724
  this.stop();
26834
27725
  }
26835
27726
  });
27727
+ this._socketService.on(_config__WEBPACK_IMPORTED_MODULE_5__.SESSION_SAVE_BUFFER_EVENT, (payload) => {
27728
+ var _a;
27729
+ if (!((_a = payload === null || payload === void 0 ? void 0 : payload.debugSession) === null || _a === void 0 ? void 0 : _a._id))
27730
+ return;
27731
+ void this._flushBuffer(payload.debugSession._id);
27732
+ });
27733
+ }
27734
+ async _createExceptionSession(span) {
27735
+ try {
27736
+ const session = await this._apiService.createErrorSession({ span });
27737
+ if (session) {
27738
+ void this._flushBuffer(session._id);
27739
+ }
27740
+ }
27741
+ catch (_ignored) { }
26836
27742
  }
26837
27743
  /**
26838
27744
  * Create a new session and start it
@@ -26845,17 +27751,14 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_14__.Obse
26845
27751
  sessionAttributes: this.sessionAttributes,
26846
27752
  resourceAttributes: (0,_utils__WEBPACK_IMPORTED_MODULE_3__.getNavigatorInfo)(),
26847
27753
  name: this._getSessionName(),
26848
- ...(this._userAttributes ? { userAttributes: this._userAttributes } : {}),
27754
+ ...(this._userAttributes ? { userAttributes: this._userAttributes } : {})
26849
27755
  };
26850
- const request = !this.continuousRecording ?
26851
- payload : { debugSessionData: payload };
27756
+ const request = !this.continuousRecording ? payload : { debugSessionData: payload };
26852
27757
  const session = this.continuousRecording
26853
27758
  ? await this._apiService.startContinuousDebugSession(request, signal)
26854
27759
  : await this._apiService.startSession(request, signal);
26855
27760
  if (session) {
26856
- session.sessionType = this.continuousRecording
26857
- ? _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_0__.SessionType.CONTINUOUS
26858
- : _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_0__.SessionType.MANUAL;
27761
+ session.sessionType = this.continuousRecording ? _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_0__.SessionType.CONTINUOUS : _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_0__.SessionType.MANUAL;
26859
27762
  this._setupSessionAndStart(session, false);
26860
27763
  }
26861
27764
  }
@@ -26875,10 +27778,11 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_14__.Obse
26875
27778
  this.sessionState = _types__WEBPACK_IMPORTED_MODULE_4__.SessionState.started;
26876
27779
  this.sessionType = this.sessionType;
26877
27780
  this._tracer.start(this.sessionId, this.sessionType);
26878
- this._recorder.start(this.sessionId, this.sessionType);
26879
- this._navigationRecorder.start({ sessionId: this.sessionId, sessionType: this.sessionType, });
27781
+ // Ensure we switch from buffer-only recording to session recording cleanly.
27782
+ void this._recorder.restart(this.sessionId, this.sessionType);
27783
+ this._navigationRecorder.start({ sessionId: this.sessionId, sessionType: this.sessionType });
26880
27784
  if (this.session) {
26881
- _eventBus__WEBPACK_IMPORTED_MODULE_8__.recorderEventBus.emit(_config__WEBPACK_IMPORTED_MODULE_6__.SESSION_STARTED_EVENT, this.session);
27785
+ _eventBus__WEBPACK_IMPORTED_MODULE_7__.recorderEventBus.emit(_config__WEBPACK_IMPORTED_MODULE_5__.SESSION_STARTED_EVENT, this.session);
26882
27786
  this._socketService.subscribeToSession(this.session);
26883
27787
  this._sessionWidget.seconds = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.getTimeDifferenceInSeconds)((_a = this.session) === null || _a === void 0 ? void 0 : _a.startedAt);
26884
27788
  }
@@ -26892,6 +27796,7 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_14__.Obse
26892
27796
  this._tracer.stop();
26893
27797
  this._recorder.stop();
26894
27798
  this._navigationRecorder.stop();
27799
+ this._startBufferOnlyRecording();
26895
27800
  }
26896
27801
  /**
26897
27802
  * Pause the session tracing and recording
@@ -26907,7 +27812,7 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_14__.Obse
26907
27812
  */
26908
27813
  _resume() {
26909
27814
  this._tracer.start(this.sessionId, this.sessionType);
26910
- this._recorder.start(this.sessionId, this.sessionType);
27815
+ void this._recorder.restart(this.sessionId, this.sessionType);
26911
27816
  this._navigationRecorder.resume();
26912
27817
  this.sessionState = _types__WEBPACK_IMPORTED_MODULE_4__.SessionState.started;
26913
27818
  }
@@ -26923,7 +27828,7 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_14__.Obse
26923
27828
  this._start();
26924
27829
  }
26925
27830
  /**
26926
- * Set the session ID in localStorage
27831
+ * Set the session ID in sessionStorage (with fallback)
26927
27832
  * @param sessionId - the session ID to set or clear
26928
27833
  */
26929
27834
  _setSession(session) {
@@ -28566,6 +29471,7 @@ const userAgent = navigator === null || navigator === void 0 ? void 0 : navigato
28566
29471
  /* harmony export */ formatTimeForSessionTimer: () => (/* reexport safe */ _time__WEBPACK_IMPORTED_MODULE_2__.formatTimeForSessionTimer),
28567
29472
  /* harmony export */ getFormattedDate: () => (/* reexport safe */ _time__WEBPACK_IMPORTED_MODULE_2__.getFormattedDate),
28568
29473
  /* harmony export */ getNavigatorInfo: () => (/* reexport safe */ _navigator__WEBPACK_IMPORTED_MODULE_0__.getNavigatorInfo),
29474
+ /* harmony export */ getOrCreateTabId: () => (/* reexport safe */ _tabId__WEBPACK_IMPORTED_MODULE_8__.getOrCreateTabId),
28569
29475
  /* harmony export */ getStoredItem: () => (/* reexport safe */ _storage__WEBPACK_IMPORTED_MODULE_1__.getStoredItem),
28570
29476
  /* harmony export */ getTimeDifferenceInSeconds: () => (/* reexport safe */ _time__WEBPACK_IMPORTED_MODULE_2__.getTimeDifferenceInSeconds),
28571
29477
  /* harmony export */ injectStylesIntoShadowRoot: () => (/* reexport safe */ _dom__WEBPACK_IMPORTED_MODULE_4__.injectStylesIntoShadowRoot),
@@ -28583,6 +29489,7 @@ const userAgent = navigator === null || navigator === void 0 ? void 0 : navigato
28583
29489
  /* harmony import */ var _array__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./array */ "./src/utils/array.ts");
28584
29490
  /* harmony import */ var _type_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./type-utils */ "./src/utils/type-utils.ts");
28585
29491
  /* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./globals */ "./src/utils/globals.ts");
29492
+ /* harmony import */ var _tabId__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./tabId */ "./src/utils/tabId.ts");
28586
29493
  // Export all utility functions
28587
29494
 
28588
29495
 
@@ -28594,6 +29501,7 @@ const userAgent = navigator === null || navigator === void 0 ? void 0 : navigato
28594
29501
 
28595
29502
 
28596
29503
 
29504
+
28597
29505
  /***/ }),
28598
29506
 
28599
29507
  /***/ "./src/utils/navigator.ts":
@@ -28826,32 +29734,88 @@ const isConsoleEvent = (event) => {
28826
29734
  /* harmony export */ });
28827
29735
  /* unused harmony export removeStoredItem */
28828
29736
  /**
28829
- * LocalStorage utility functions
29737
+ * Storage utility functions.
29738
+ *
29739
+ * Session state must be isolated per-tab to avoid conflicts across multiple tabs.
29740
+ * We therefore prefer `sessionStorage` and fall back to `localStorage` if needed.
28830
29741
  */
28831
- const hasLocalStorage = typeof window !== 'undefined' && !!window.localStorage;
28832
- const getStoredItem = (key, parse) => {
28833
- if (!hasLocalStorage) {
28834
- return parse ? null : null;
29742
+ const hasWindow = typeof window !== 'undefined';
29743
+ const getStorage = () => {
29744
+ if (!hasWindow)
29745
+ return null;
29746
+ try {
29747
+ if (window.sessionStorage)
29748
+ return window.sessionStorage;
29749
+ }
29750
+ catch (_e) {
29751
+ // sessionStorage can throw (e.g. blocked in some environments)
29752
+ }
29753
+ try {
29754
+ if (window.localStorage)
29755
+ return window.localStorage;
29756
+ }
29757
+ catch (_e) {
29758
+ // localStorage can throw (e.g. blocked in some environments)
28835
29759
  }
28836
- const item = window.localStorage.getItem(key);
29760
+ return null;
29761
+ };
29762
+ const getStoredItem = (key, parse) => {
29763
+ const storage = getStorage();
29764
+ if (!storage)
29765
+ return null;
29766
+ const item = storage.getItem(key);
28837
29767
  return parse ? (item ? JSON.parse(item) : null) : item;
28838
29768
  };
28839
29769
  const setStoredItem = (key, value) => {
28840
- if (!hasLocalStorage) {
29770
+ const storage = getStorage();
29771
+ if (!storage)
28841
29772
  return;
28842
- }
28843
29773
  if (value === null || value === undefined) {
28844
- window.localStorage.removeItem(key);
29774
+ storage.removeItem(key);
28845
29775
  }
28846
29776
  else {
28847
- window.localStorage.setItem(key, typeof value === 'string' ? value : JSON.stringify(value));
29777
+ storage.setItem(key, typeof value === 'string' ? value : JSON.stringify(value));
28848
29778
  }
28849
29779
  };
28850
29780
  const removeStoredItem = (key) => {
28851
- if (!hasLocalStorage) {
29781
+ const storage = getStorage();
29782
+ if (!storage)
28852
29783
  return;
29784
+ storage.removeItem(key);
29785
+ };
29786
+
29787
+
29788
+ /***/ }),
29789
+
29790
+ /***/ "./src/utils/tabId.ts":
29791
+ /*!****************************!*\
29792
+ !*** ./src/utils/tabId.ts ***!
29793
+ \****************************/
29794
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
29795
+
29796
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
29797
+ /* harmony export */ getOrCreateTabId: () => (/* binding */ getOrCreateTabId)
29798
+ /* harmony export */ });
29799
+ const TAB_ID_KEY = 'multiplayer-tab-id';
29800
+ const randomId = () => {
29801
+ // Avoid crypto dependency for older browsers; good enough for per-tab isolation
29802
+ return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
29803
+ };
29804
+ const getOrCreateTabId = () => {
29805
+ if (typeof window === 'undefined')
29806
+ return 'ssr';
29807
+ try {
29808
+ const existing = window.sessionStorage.getItem(TAB_ID_KEY);
29809
+ if (existing)
29810
+ return existing;
29811
+ const id = randomId();
29812
+ window.sessionStorage.setItem(TAB_ID_KEY, id);
29813
+ return id;
29814
+ }
29815
+ catch (_e) {
29816
+ // If sessionStorage is blocked, fall back to a runtime-only id.
29817
+ return randomId();
28853
29818
  }
28854
- window.localStorage.removeItem(key);
28855
29819
  };
28856
29820
 
28857
29821
 
@@ -28997,42 +29961,48 @@ const isFile = (x) => {
28997
29961
  /* harmony export */ SessionRecorderIdGenerator: () => (/* binding */ SessionRecorderIdGenerator)
28998
29962
  /* harmony export */ });
28999
29963
  /* 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");
29964
+ /* harmony import */ var _sdk__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdk */ "../session-recorder-common/dist/esm/sdk/index.js");
29965
+ /* 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
29966
 
29003
29967
 
29004
29968
 
29005
29969
  var SessionRecorderIdGenerator = /** @class */ (function () {
29006
29970
  function SessionRecorderIdGenerator() {
29007
- this.generateLongId = (0,_sdk__WEBPACK_IMPORTED_MODULE_2__.getIdGenerator)(16);
29008
- this.generateShortId = (0,_sdk__WEBPACK_IMPORTED_MODULE_2__.getIdGenerator)(8);
29971
+ this.generateLongId = (0,_sdk__WEBPACK_IMPORTED_MODULE_1__.getIdGenerator)(16);
29972
+ this.generateShortId = (0,_sdk__WEBPACK_IMPORTED_MODULE_1__.getIdGenerator)(8);
29009
29973
  this.sessionShortId = '';
29974
+ this.clientId = '';
29010
29975
  this.sessionType = _type__WEBPACK_IMPORTED_MODULE_0__.SessionType.MANUAL;
29011
29976
  }
29012
29977
  SessionRecorderIdGenerator.prototype.generateTraceId = function () {
29013
29978
  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;
29979
+ if (!this.sessionShortId && !this.sessionType) {
29980
+ return traceId;
29026
29981
  }
29027
- return traceId;
29982
+ var sessionTypePrefix = _constants_constants_base__WEBPACK_IMPORTED_MODULE_2__.MULTIPLAYER_TRACE_PREFIX_MAP[this.sessionType];
29983
+ 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);
29984
+ var sessionTraceId = "".concat(prefix).concat(traceId.substring(prefix.length, traceId.length));
29985
+ return sessionTraceId;
29028
29986
  };
29029
29987
  SessionRecorderIdGenerator.prototype.generateSpanId = function () {
29030
29988
  return this.generateShortId();
29031
29989
  };
29032
- SessionRecorderIdGenerator.prototype.setSessionId = function (sessionShortId, sessionType) {
29990
+ SessionRecorderIdGenerator.prototype.setSessionId = function (sessionShortId, sessionType, clientId) {
29033
29991
  if (sessionType === void 0) { sessionType = _type__WEBPACK_IMPORTED_MODULE_0__.SessionType.MANUAL; }
29992
+ if (clientId === void 0) { clientId = ''; }
29993
+ if (!clientId &&
29994
+ [
29995
+ _type__WEBPACK_IMPORTED_MODULE_0__.SessionType.SESSION_CACHE,
29996
+ _type__WEBPACK_IMPORTED_MODULE_0__.SessionType.CONTINUOUS_SESSION_CACHE,
29997
+ ].includes(sessionType)) {
29998
+ throw new Error("Client ID is required for ".concat([
29999
+ _type__WEBPACK_IMPORTED_MODULE_0__.SessionType.SESSION_CACHE,
30000
+ _type__WEBPACK_IMPORTED_MODULE_0__.SessionType.CONTINUOUS_SESSION_CACHE,
30001
+ ].join(', '), " session types"));
30002
+ }
29034
30003
  this.sessionShortId = sessionShortId;
29035
30004
  this.sessionType = sessionType;
30005
+ this.clientId = clientId;
29036
30006
  };
29037
30007
  return SessionRecorderIdGenerator;
29038
30008
  }());
@@ -29065,7 +30035,10 @@ var SessionRecorderTraceIdRatioBasedSampler = /** @class */ (function () {
29065
30035
  }
29066
30036
  SessionRecorderTraceIdRatioBasedSampler.prototype.shouldSample = function (context, traceId) {
29067
30037
  if (traceId.startsWith(_constants_constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_DEBUG_PREFIX)
29068
- || traceId.startsWith(_constants_constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX)) {
30038
+ || traceId.startsWith(_constants_constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX)
30039
+ // || traceId.startsWith(MULTIPLAYER_TRACE_SESSION_CACHE_PREFIX)
30040
+ // || traceId.startsWith(MULTIPLAYER_TRACE_CONTINUOUS_SESSION_CACHE_PREFIX)
30041
+ ) {
29069
30042
  return {
29070
30043
  decision: _opentelemetry_sdk_trace_base__WEBPACK_IMPORTED_MODULE_1__.SamplingDecision.RECORD_AND_SAMPLED,
29071
30044
  };
@@ -29133,6 +30106,7 @@ var SessionRecorderTraceIdRatioBasedSampler = /** @class */ (function () {
29133
30106
  /* harmony export */ ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE: () => (/* binding */ ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE),
29134
30107
  /* harmony export */ ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE_ENCODING: () => (/* binding */ ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE_ENCODING),
29135
30108
  /* harmony export */ ATTR_MULTIPLAYER_RPC_RESPONSE_MESSAGE: () => (/* binding */ ATTR_MULTIPLAYER_RPC_RESPONSE_MESSAGE),
30109
+ /* harmony export */ ATTR_MULTIPLAYER_SESSION_CLIENT_ID: () => (/* binding */ ATTR_MULTIPLAYER_SESSION_CLIENT_ID),
29136
30110
  /* harmony export */ ATTR_MULTIPLAYER_SESSION_ID: () => (/* binding */ ATTR_MULTIPLAYER_SESSION_ID),
29137
30111
  /* harmony export */ ATTR_MULTIPLAYER_SESSION_RECORDER_VERSION: () => (/* binding */ ATTR_MULTIPLAYER_SESSION_RECORDER_VERSION),
29138
30112
  /* harmony export */ ATTR_MULTIPLAYER_USER_HASH: () => (/* binding */ ATTR_MULTIPLAYER_USER_HASH),
@@ -29146,18 +30120,34 @@ var SessionRecorderTraceIdRatioBasedSampler = /** @class */ (function () {
29146
30120
  /* harmony export */ MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_GRPC_URL: () => (/* binding */ MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_GRPC_URL),
29147
30121
  /* harmony export */ MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_HTTP_URL: () => (/* binding */ MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_HTTP_URL),
29148
30122
  /* harmony export */ MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_URL: () => (/* binding */ MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_URL),
30123
+ /* harmony export */ MULTIPLAYER_TRACE_CLIENT_ID_LENGTH: () => (/* binding */ MULTIPLAYER_TRACE_CLIENT_ID_LENGTH),
29149
30124
  /* harmony export */ MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX: () => (/* binding */ MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX),
30125
+ /* harmony export */ MULTIPLAYER_TRACE_CONTINUOUS_SESSION_CACHE_PREFIX: () => (/* binding */ MULTIPLAYER_TRACE_CONTINUOUS_SESSION_CACHE_PREFIX),
29150
30126
  /* harmony export */ MULTIPLAYER_TRACE_DEBUG_PREFIX: () => (/* binding */ MULTIPLAYER_TRACE_DEBUG_PREFIX),
29151
30127
  /* 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)
30128
+ /* harmony export */ MULTIPLAYER_TRACE_DOC_PREFIX: () => (/* binding */ MULTIPLAYER_TRACE_DOC_PREFIX),
30129
+ /* harmony export */ MULTIPLAYER_TRACE_PREFIX_MAP: () => (/* binding */ MULTIPLAYER_TRACE_PREFIX_MAP),
30130
+ /* harmony export */ MULTIPLAYER_TRACE_SESSION_CACHE_PREFIX: () => (/* binding */ MULTIPLAYER_TRACE_SESSION_CACHE_PREFIX)
29153
30131
  /* harmony export */ });
30132
+ /* harmony import */ var _type__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../type */ "../session-recorder-common/dist/esm/type/index.js");
30133
+ var _a;
30134
+
29154
30135
  /**
29155
30136
  * @deprecated
29156
30137
  */
29157
30138
  var MULTIPLAYER_TRACE_DOC_PREFIX = 'd0cd0c';
29158
30139
  var MULTIPLAYER_TRACE_DEBUG_PREFIX = 'debdeb';
29159
30140
  var MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX = 'cdbcdb';
29160
- var MULTIPLAYER_TRACE_DEBUG_SESSION_SHORT_ID_LENGTH = 16;
30141
+ var MULTIPLAYER_TRACE_SESSION_CACHE_PREFIX = 'cdbcac';
30142
+ var MULTIPLAYER_TRACE_CONTINUOUS_SESSION_CACHE_PREFIX = 'debcdb';
30143
+ var MULTIPLAYER_TRACE_PREFIX_MAP = (_a = {},
30144
+ _a[_type__WEBPACK_IMPORTED_MODULE_0__.SessionType.CONTINUOUS] = MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX,
30145
+ _a[_type__WEBPACK_IMPORTED_MODULE_0__.SessionType.SESSION_CACHE] = MULTIPLAYER_TRACE_SESSION_CACHE_PREFIX,
30146
+ _a[_type__WEBPACK_IMPORTED_MODULE_0__.SessionType.CONTINUOUS_SESSION_CACHE] = MULTIPLAYER_TRACE_CONTINUOUS_SESSION_CACHE_PREFIX,
30147
+ _a[_type__WEBPACK_IMPORTED_MODULE_0__.SessionType.MANUAL] = MULTIPLAYER_TRACE_DEBUG_PREFIX,
30148
+ _a);
30149
+ var MULTIPLAYER_TRACE_DEBUG_SESSION_SHORT_ID_LENGTH = 8;
30150
+ var MULTIPLAYER_TRACE_CLIENT_ID_LENGTH = 8;
29161
30151
  /**
29162
30152
  * @deprecated Use MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_HTTP_URL instead
29163
30153
  */
@@ -29181,6 +30171,7 @@ var ATTR_MULTIPLAYER_PLATFORM_NAME = 'multiplayer.platform.name';
29181
30171
  var ATTR_MULTIPLAYER_CLIENT_ID = 'multiplayer.client.id';
29182
30172
  var ATTR_MULTIPLAYER_INTEGRATION_ID = 'multiplayer.integration.id';
29183
30173
  var ATTR_MULTIPLAYER_SESSION_ID = 'multiplayer.session.id';
30174
+ var ATTR_MULTIPLAYER_SESSION_CLIENT_ID = 'multiplayer.session.client.id';
29184
30175
  var ATTR_MULTIPLAYER_HTTP_PROXY = 'multiplayer.http.proxy';
29185
30176
  var ATTR_MULTIPLAYER_HTTP_PROXY_TYPE = 'multiplayer.http.proxy.type';
29186
30177
  var ATTR_MULTIPLAYER_HTTP_REQUEST_BODY = 'multiplayer.http.request.body';
@@ -29238,6 +30229,7 @@ var MASK_PLACEHOLDER = '***MASKED***';
29238
30229
  /* harmony export */ ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE),
29239
30230
  /* harmony export */ ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE_ENCODING: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE_ENCODING),
29240
30231
  /* harmony export */ ATTR_MULTIPLAYER_RPC_RESPONSE_MESSAGE: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.ATTR_MULTIPLAYER_RPC_RESPONSE_MESSAGE),
30232
+ /* harmony export */ ATTR_MULTIPLAYER_SESSION_CLIENT_ID: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.ATTR_MULTIPLAYER_SESSION_CLIENT_ID),
29241
30233
  /* harmony export */ ATTR_MULTIPLAYER_SESSION_ID: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.ATTR_MULTIPLAYER_SESSION_ID),
29242
30234
  /* harmony export */ ATTR_MULTIPLAYER_SESSION_RECORDER_VERSION: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.ATTR_MULTIPLAYER_SESSION_RECORDER_VERSION),
29243
30235
  /* harmony export */ ATTR_MULTIPLAYER_USER_HASH: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.ATTR_MULTIPLAYER_USER_HASH),
@@ -29251,10 +30243,14 @@ var MASK_PLACEHOLDER = '***MASKED***';
29251
30243
  /* 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
30244
  /* 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
30245
  /* harmony export */ MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_URL: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_URL),
30246
+ /* harmony export */ MULTIPLAYER_TRACE_CLIENT_ID_LENGTH: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_CLIENT_ID_LENGTH),
29254
30247
  /* harmony export */ MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX),
30248
+ /* harmony export */ MULTIPLAYER_TRACE_CONTINUOUS_SESSION_CACHE_PREFIX: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_CONTINUOUS_SESSION_CACHE_PREFIX),
29255
30249
  /* harmony export */ MULTIPLAYER_TRACE_DEBUG_PREFIX: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_DEBUG_PREFIX),
29256
30250
  /* 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)
30251
+ /* harmony export */ MULTIPLAYER_TRACE_DOC_PREFIX: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_DOC_PREFIX),
30252
+ /* harmony export */ MULTIPLAYER_TRACE_PREFIX_MAP: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_PREFIX_MAP),
30253
+ /* harmony export */ MULTIPLAYER_TRACE_SESSION_CACHE_PREFIX: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_SESSION_CACHE_PREFIX)
29258
30254
  /* harmony export */ });
29259
30255
  /* harmony import */ var _constants_base__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constants.base */ "../session-recorder-common/dist/esm/constants/constants.base.js");
29260
30256
 
@@ -29296,7 +30292,7 @@ var SessionRecorderBrowserTraceExporter = /** @class */ (function () {
29296
30292
  if (config === void 0) { config = {}; }
29297
30293
  this.usePostMessage = false;
29298
30294
  var _a = config.url, url = _a === void 0 ? _constants_constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_HTTP_URL : _a, apiKey = config.apiKey, _b = config.headers, headers = _b === void 0 ? {} : _b, _c = config.timeoutMillis, timeoutMillis = _c === void 0 ? 30000 : _c, _d = config.keepAlive, keepAlive = _d === void 0 ? true : _d, _e = config.concurrencyLimit, concurrencyLimit = _e === void 0 ? 20 : _e, _f = config.postMessageType, postMessageType = _f === void 0 ? 'MULTIPLAYER_SESSION_DEBUGGER_LIB' : _f, _g = config.postMessageTargetOrigin, postMessageTargetOrigin = _g === void 0 ? '*' : _g;
29299
- this.config = __assign(__assign({}, config), { url: url, apiKey: apiKey, headers: headers, timeoutMillis: timeoutMillis, keepAlive: keepAlive, concurrencyLimit: concurrencyLimit });
30295
+ this.config = __assign(__assign({}, config), { url: url, apiKey: apiKey, headers: headers, keepAlive: keepAlive, timeoutMillis: timeoutMillis, concurrencyLimit: concurrencyLimit });
29300
30296
  this.postMessageType = postMessageType;
29301
30297
  this.postMessageTargetOrigin = postMessageTargetOrigin;
29302
30298
  this.exporter = this._createExporter();
@@ -29306,8 +30302,8 @@ var SessionRecorderBrowserTraceExporter = /** @class */ (function () {
29306
30302
  // Filter spans to only include those with Multiplayer trace prefixes
29307
30303
  var filteredSpans = spans.filter(function (span) {
29308
30304
  var traceId = span.spanContext().traceId;
29309
- return traceId.startsWith(_constants_constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_DEBUG_PREFIX) ||
29310
- traceId.startsWith(_constants_constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX);
30305
+ return (traceId.startsWith(_constants_constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_DEBUG_PREFIX) ||
30306
+ traceId.startsWith(_constants_constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX));
29311
30307
  });
29312
30308
  // Only proceed if there are filtered spans
29313
30309
  if (filteredSpans.length === 0) {
@@ -29334,6 +30330,14 @@ var SessionRecorderBrowserTraceExporter = /** @class */ (function () {
29334
30330
  SessionRecorderBrowserTraceExporter.prototype.shutdown = function () {
29335
30331
  return this.exporter.shutdown();
29336
30332
  };
30333
+ SessionRecorderBrowserTraceExporter.prototype.exportBuffer = function (spans) {
30334
+ var _this = this;
30335
+ return new Promise(function (resolve) {
30336
+ _this.exporter.export(spans, function (result) {
30337
+ resolve(result);
30338
+ });
30339
+ });
30340
+ };
29337
30341
  SessionRecorderBrowserTraceExporter.prototype.exportViaPostMessage = function (spans, resultCallback) {
29338
30342
  var _this = this;
29339
30343
  if (typeof window === 'undefined') {
@@ -29344,7 +30348,7 @@ var SessionRecorderBrowserTraceExporter = /** @class */ (function () {
29344
30348
  window.postMessage({
29345
30349
  action: 'traces',
29346
30350
  type: this.postMessageType,
29347
- payload: spans.map(function (span) { return _this._serializeSpan(span); }),
30351
+ payload: spans.map(function (span) { return _this.serializeSpan(span); })
29348
30352
  }, this.postMessageTargetOrigin);
29349
30353
  resultCallback({ code: 0 });
29350
30354
  }
@@ -29352,38 +30356,17 @@ var SessionRecorderBrowserTraceExporter = /** @class */ (function () {
29352
30356
  resultCallback({ code: 1 });
29353
30357
  }
29354
30358
  };
29355
- SessionRecorderBrowserTraceExporter.prototype._serializeSpan = function (span) {
29356
- var _a;
30359
+ SessionRecorderBrowserTraceExporter.prototype.serializeSpan = function (span) {
29357
30360
  var spanContext = span.spanContext();
29358
- return {
29359
- _spanContext: spanContext,
29360
- name: span.name,
29361
- kind: span.kind,
29362
- links: span.links,
29363
- ended: span.ended,
29364
- events: span.events,
29365
- status: span.status,
29366
- endTime: span.endTime,
29367
- startTime: span.startTime,
29368
- duration: span.duration,
29369
- attributes: span.attributes,
29370
- parentSpanId: (_a = span.parentSpanContext) === null || _a === void 0 ? void 0 : _a.spanId,
29371
- droppedAttributesCount: span.droppedAttributesCount,
29372
- droppedEventsCount: span.droppedEventsCount,
29373
- droppedLinksCount: span.droppedLinksCount,
29374
- resource: {
29375
- attributes: span.resource.attributes,
29376
- asyncAttributesPending: span.resource.asyncAttributesPending,
29377
- },
29378
- };
30361
+ return __assign(__assign({}, span), { _spanContext: spanContext });
29379
30362
  };
29380
30363
  SessionRecorderBrowserTraceExporter.prototype._createExporter = function () {
29381
30364
  return new _opentelemetry_exporter_trace_otlp_http__WEBPACK_IMPORTED_MODULE_1__.OTLPTraceExporter({
29382
30365
  url: this.config.url,
29383
- headers: __assign(__assign({ 'Content-Type': 'application/json' }, (this.config.apiKey ? { 'Authorization': this.config.apiKey } : {})), (this.config.headers || {})),
30366
+ headers: __assign(__assign({ 'Content-Type': 'application/json' }, (this.config.apiKey ? { Authorization: this.config.apiKey } : {})), (this.config.headers || {})),
29384
30367
  timeoutMillis: this.config.timeoutMillis,
29385
30368
  keepAlive: this.config.keepAlive,
29386
- concurrencyLimit: this.config.concurrencyLimit,
30369
+ concurrencyLimit: this.config.concurrencyLimit
29387
30370
  });
29388
30371
  };
29389
30372
  SessionRecorderBrowserTraceExporter.prototype.setApiKey = function (apiKey) {
@@ -29444,6 +30427,7 @@ var SessionRecorderBrowserTraceExporter = /** @class */ (function () {
29444
30427
  /* harmony export */ ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE),
29445
30428
  /* harmony export */ ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE_ENCODING: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE_ENCODING),
29446
30429
  /* harmony export */ ATTR_MULTIPLAYER_RPC_RESPONSE_MESSAGE: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.ATTR_MULTIPLAYER_RPC_RESPONSE_MESSAGE),
30430
+ /* harmony export */ ATTR_MULTIPLAYER_SESSION_CLIENT_ID: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.ATTR_MULTIPLAYER_SESSION_CLIENT_ID),
29447
30431
  /* harmony export */ ATTR_MULTIPLAYER_SESSION_ID: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.ATTR_MULTIPLAYER_SESSION_ID),
29448
30432
  /* harmony export */ ATTR_MULTIPLAYER_SESSION_RECORDER_VERSION: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.ATTR_MULTIPLAYER_SESSION_RECORDER_VERSION),
29449
30433
  /* harmony export */ ATTR_MULTIPLAYER_USER_HASH: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.ATTR_MULTIPLAYER_USER_HASH),
@@ -29458,10 +30442,14 @@ var SessionRecorderBrowserTraceExporter = /** @class */ (function () {
29458
30442
  /* 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
30443
  /* 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
30444
  /* harmony export */ MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_URL: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_URL),
30445
+ /* harmony export */ MULTIPLAYER_TRACE_CLIENT_ID_LENGTH: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_CLIENT_ID_LENGTH),
29461
30446
  /* harmony export */ MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX),
30447
+ /* harmony export */ MULTIPLAYER_TRACE_CONTINUOUS_SESSION_CACHE_PREFIX: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_CONTINUOUS_SESSION_CACHE_PREFIX),
29462
30448
  /* harmony export */ MULTIPLAYER_TRACE_DEBUG_PREFIX: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_DEBUG_PREFIX),
29463
30449
  /* 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
30450
  /* harmony export */ MULTIPLAYER_TRACE_DOC_PREFIX: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_DOC_PREFIX),
30451
+ /* harmony export */ MULTIPLAYER_TRACE_PREFIX_MAP: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_PREFIX_MAP),
30452
+ /* harmony export */ MULTIPLAYER_TRACE_SESSION_CACHE_PREFIX: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_SESSION_CACHE_PREFIX),
29465
30453
  /* harmony export */ SessionRecorderBrowserTraceExporter: () => (/* reexport safe */ _exporters_index_browser__WEBPACK_IMPORTED_MODULE_5__.SessionRecorderBrowserTraceExporter),
29466
30454
  /* harmony export */ SessionRecorderIdGenerator: () => (/* reexport safe */ _SessionRecorderIdGenerator__WEBPACK_IMPORTED_MODULE_1__.SessionRecorderIdGenerator),
29467
30455
  /* harmony export */ SessionRecorderSdk: () => (/* reexport module object */ _sdk__WEBPACK_IMPORTED_MODULE_3__),
@@ -30058,6 +31046,17 @@ var setGrpcResponseMessage = function (body, options) {
30058
31046
 
30059
31047
  /***/ }),
30060
31048
 
31049
+ /***/ "../session-recorder-common/dist/esm/type/crash-buffer.js":
31050
+ /*!****************************************************************!*\
31051
+ !*** ../session-recorder-common/dist/esm/type/crash-buffer.js ***!
31052
+ \****************************************************************/
31053
+ /***/ (() => {
31054
+
31055
+
31056
+ //# sourceMappingURL=crash-buffer.js.map
31057
+
31058
+ /***/ }),
31059
+
30061
31060
  /***/ "../session-recorder-common/dist/esm/type/index.js":
30062
31061
  /*!*********************************************************!*\
30063
31062
  !*** ../session-recorder-common/dist/esm/type/index.js ***!
@@ -30072,6 +31071,8 @@ var setGrpcResponseMessage = function (body, options) {
30072
31071
  /* harmony import */ var _session_type_enum__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./session-type.enum */ "../session-recorder-common/dist/esm/type/session-type.enum.js");
30073
31072
  /* harmony import */ var _user_type_enum__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./user-type.enum */ "../session-recorder-common/dist/esm/type/user-type.enum.js");
30074
31073
  /* harmony import */ var _session__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./session */ "../session-recorder-common/dist/esm/type/session.js");
31074
+ /* harmony import */ var _crash_buffer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./crash-buffer */ "../session-recorder-common/dist/esm/type/crash-buffer.js");
31075
+
30075
31076
 
30076
31077
 
30077
31078
 
@@ -30096,6 +31097,8 @@ var SessionType;
30096
31097
  */
30097
31098
  SessionType["PLAIN"] = "MANUAL";
30098
31099
  SessionType["MANUAL"] = "MANUAL";
31100
+ SessionType["CONTINUOUS_SESSION_CACHE"] = "CONTINUOUS_SESSION_CACHE";
31101
+ SessionType["SESSION_CACHE"] = "SESSION_CACHE";
30099
31102
  })(SessionType || (SessionType = {}));
30100
31103
  //# sourceMappingURL=session-type.enum.js.map
30101
31104
 
@@ -31947,6 +32950,115 @@ const getRecordConsolePlugin = (options) => ({
31947
32950
  //# sourceMappingURL=rrweb-plugin-console-record.js.map
31948
32951
 
31949
32952
 
32953
+ /***/ }),
32954
+
32955
+ /***/ "../../node_modules/@rrweb/types/dist/types.js":
32956
+ /*!*****************************************************!*\
32957
+ !*** ../../node_modules/@rrweb/types/dist/types.js ***!
32958
+ \*****************************************************/
32959
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
32960
+
32961
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
32962
+ /* harmony export */ EventType: () => (/* binding */ EventType)
32963
+ /* harmony export */ });
32964
+ /* unused harmony exports CanvasContext, IncrementalSource, MediaInteractions, MouseInteractions, NodeType, PointerTypes, ReplayerEvents */
32965
+ var EventType = /* @__PURE__ */ ((EventType2) => {
32966
+ EventType2[EventType2["DomContentLoaded"] = 0] = "DomContentLoaded";
32967
+ EventType2[EventType2["Load"] = 1] = "Load";
32968
+ EventType2[EventType2["FullSnapshot"] = 2] = "FullSnapshot";
32969
+ EventType2[EventType2["IncrementalSnapshot"] = 3] = "IncrementalSnapshot";
32970
+ EventType2[EventType2["Meta"] = 4] = "Meta";
32971
+ EventType2[EventType2["Custom"] = 5] = "Custom";
32972
+ EventType2[EventType2["Plugin"] = 6] = "Plugin";
32973
+ return EventType2;
32974
+ })(EventType || {});
32975
+ var IncrementalSource = /* @__PURE__ */ ((IncrementalSource2) => {
32976
+ IncrementalSource2[IncrementalSource2["Mutation"] = 0] = "Mutation";
32977
+ IncrementalSource2[IncrementalSource2["MouseMove"] = 1] = "MouseMove";
32978
+ IncrementalSource2[IncrementalSource2["MouseInteraction"] = 2] = "MouseInteraction";
32979
+ IncrementalSource2[IncrementalSource2["Scroll"] = 3] = "Scroll";
32980
+ IncrementalSource2[IncrementalSource2["ViewportResize"] = 4] = "ViewportResize";
32981
+ IncrementalSource2[IncrementalSource2["Input"] = 5] = "Input";
32982
+ IncrementalSource2[IncrementalSource2["TouchMove"] = 6] = "TouchMove";
32983
+ IncrementalSource2[IncrementalSource2["MediaInteraction"] = 7] = "MediaInteraction";
32984
+ IncrementalSource2[IncrementalSource2["StyleSheetRule"] = 8] = "StyleSheetRule";
32985
+ IncrementalSource2[IncrementalSource2["CanvasMutation"] = 9] = "CanvasMutation";
32986
+ IncrementalSource2[IncrementalSource2["Font"] = 10] = "Font";
32987
+ IncrementalSource2[IncrementalSource2["Log"] = 11] = "Log";
32988
+ IncrementalSource2[IncrementalSource2["Drag"] = 12] = "Drag";
32989
+ IncrementalSource2[IncrementalSource2["StyleDeclaration"] = 13] = "StyleDeclaration";
32990
+ IncrementalSource2[IncrementalSource2["Selection"] = 14] = "Selection";
32991
+ IncrementalSource2[IncrementalSource2["AdoptedStyleSheet"] = 15] = "AdoptedStyleSheet";
32992
+ IncrementalSource2[IncrementalSource2["CustomElement"] = 16] = "CustomElement";
32993
+ return IncrementalSource2;
32994
+ })(IncrementalSource || {});
32995
+ var MouseInteractions = /* @__PURE__ */ ((MouseInteractions2) => {
32996
+ MouseInteractions2[MouseInteractions2["MouseUp"] = 0] = "MouseUp";
32997
+ MouseInteractions2[MouseInteractions2["MouseDown"] = 1] = "MouseDown";
32998
+ MouseInteractions2[MouseInteractions2["Click"] = 2] = "Click";
32999
+ MouseInteractions2[MouseInteractions2["ContextMenu"] = 3] = "ContextMenu";
33000
+ MouseInteractions2[MouseInteractions2["DblClick"] = 4] = "DblClick";
33001
+ MouseInteractions2[MouseInteractions2["Focus"] = 5] = "Focus";
33002
+ MouseInteractions2[MouseInteractions2["Blur"] = 6] = "Blur";
33003
+ MouseInteractions2[MouseInteractions2["TouchStart"] = 7] = "TouchStart";
33004
+ MouseInteractions2[MouseInteractions2["TouchMove_Departed"] = 8] = "TouchMove_Departed";
33005
+ MouseInteractions2[MouseInteractions2["TouchEnd"] = 9] = "TouchEnd";
33006
+ MouseInteractions2[MouseInteractions2["TouchCancel"] = 10] = "TouchCancel";
33007
+ return MouseInteractions2;
33008
+ })(MouseInteractions || {});
33009
+ var PointerTypes = /* @__PURE__ */ ((PointerTypes2) => {
33010
+ PointerTypes2[PointerTypes2["Mouse"] = 0] = "Mouse";
33011
+ PointerTypes2[PointerTypes2["Pen"] = 1] = "Pen";
33012
+ PointerTypes2[PointerTypes2["Touch"] = 2] = "Touch";
33013
+ return PointerTypes2;
33014
+ })(PointerTypes || {});
33015
+ var CanvasContext = /* @__PURE__ */ ((CanvasContext2) => {
33016
+ CanvasContext2[CanvasContext2["2D"] = 0] = "2D";
33017
+ CanvasContext2[CanvasContext2["WebGL"] = 1] = "WebGL";
33018
+ CanvasContext2[CanvasContext2["WebGL2"] = 2] = "WebGL2";
33019
+ return CanvasContext2;
33020
+ })(CanvasContext || {});
33021
+ var MediaInteractions = /* @__PURE__ */ ((MediaInteractions2) => {
33022
+ MediaInteractions2[MediaInteractions2["Play"] = 0] = "Play";
33023
+ MediaInteractions2[MediaInteractions2["Pause"] = 1] = "Pause";
33024
+ MediaInteractions2[MediaInteractions2["Seeked"] = 2] = "Seeked";
33025
+ MediaInteractions2[MediaInteractions2["VolumeChange"] = 3] = "VolumeChange";
33026
+ MediaInteractions2[MediaInteractions2["RateChange"] = 4] = "RateChange";
33027
+ return MediaInteractions2;
33028
+ })(MediaInteractions || {});
33029
+ var ReplayerEvents = /* @__PURE__ */ ((ReplayerEvents2) => {
33030
+ ReplayerEvents2["Start"] = "start";
33031
+ ReplayerEvents2["Pause"] = "pause";
33032
+ ReplayerEvents2["Resume"] = "resume";
33033
+ ReplayerEvents2["Resize"] = "resize";
33034
+ ReplayerEvents2["Finish"] = "finish";
33035
+ ReplayerEvents2["FullsnapshotRebuilded"] = "fullsnapshot-rebuilded";
33036
+ ReplayerEvents2["LoadStylesheetStart"] = "load-stylesheet-start";
33037
+ ReplayerEvents2["LoadStylesheetEnd"] = "load-stylesheet-end";
33038
+ ReplayerEvents2["SkipStart"] = "skip-start";
33039
+ ReplayerEvents2["SkipEnd"] = "skip-end";
33040
+ ReplayerEvents2["MouseInteraction"] = "mouse-interaction";
33041
+ ReplayerEvents2["EventCast"] = "event-cast";
33042
+ ReplayerEvents2["CustomEvent"] = "custom-event";
33043
+ ReplayerEvents2["Flush"] = "flush";
33044
+ ReplayerEvents2["StateChange"] = "state-change";
33045
+ ReplayerEvents2["PlayBack"] = "play-back";
33046
+ ReplayerEvents2["Destroy"] = "destroy";
33047
+ return ReplayerEvents2;
33048
+ })(ReplayerEvents || {});
33049
+ var NodeType = /* @__PURE__ */ ((NodeType2) => {
33050
+ NodeType2[NodeType2["Document"] = 0] = "Document";
33051
+ NodeType2[NodeType2["DocumentType"] = 1] = "DocumentType";
33052
+ NodeType2[NodeType2["Element"] = 2] = "Element";
33053
+ NodeType2[NodeType2["Text"] = 3] = "Text";
33054
+ NodeType2[NodeType2["CDATA"] = 4] = "CDATA";
33055
+ NodeType2[NodeType2["Comment"] = 5] = "Comment";
33056
+ return NodeType2;
33057
+ })(NodeType || {});
33058
+
33059
+ //# sourceMappingURL=types.js.map
33060
+
33061
+
31950
33062
  /***/ }),
31951
33063
 
31952
33064
  /***/ "../../node_modules/@socket.io/component-emitter/lib/esm/index.js":
@@ -48362,6 +49474,7 @@ var __webpack_exports__ = {};
48362
49474
  /* harmony export */ ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_7__.ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE),
48363
49475
  /* 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
49476
  /* harmony export */ ATTR_MULTIPLAYER_RPC_RESPONSE_MESSAGE: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_7__.ATTR_MULTIPLAYER_RPC_RESPONSE_MESSAGE),
49477
+ /* harmony export */ ATTR_MULTIPLAYER_SESSION_CLIENT_ID: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_7__.ATTR_MULTIPLAYER_SESSION_CLIENT_ID),
48365
49478
  /* harmony export */ ATTR_MULTIPLAYER_SESSION_ID: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_7__.ATTR_MULTIPLAYER_SESSION_ID),
48366
49479
  /* harmony export */ ATTR_MULTIPLAYER_SESSION_RECORDER_VERSION: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_7__.ATTR_MULTIPLAYER_SESSION_RECORDER_VERSION),
48367
49480
  /* harmony export */ ATTR_MULTIPLAYER_USER_HASH: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_7__.ATTR_MULTIPLAYER_USER_HASH),
@@ -48376,10 +49489,14 @@ var __webpack_exports__ = {};
48376
49489
  /* 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
49490
  /* 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
49491
  /* 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),
49492
+ /* harmony export */ MULTIPLAYER_TRACE_CLIENT_ID_LENGTH: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_7__.MULTIPLAYER_TRACE_CLIENT_ID_LENGTH),
48379
49493
  /* harmony export */ MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_7__.MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX),
49494
+ /* harmony export */ MULTIPLAYER_TRACE_CONTINUOUS_SESSION_CACHE_PREFIX: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_7__.MULTIPLAYER_TRACE_CONTINUOUS_SESSION_CACHE_PREFIX),
48380
49495
  /* harmony export */ MULTIPLAYER_TRACE_DEBUG_PREFIX: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_7__.MULTIPLAYER_TRACE_DEBUG_PREFIX),
48381
49496
  /* 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
49497
  /* harmony export */ MULTIPLAYER_TRACE_DOC_PREFIX: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_7__.MULTIPLAYER_TRACE_DOC_PREFIX),
49498
+ /* harmony export */ MULTIPLAYER_TRACE_PREFIX_MAP: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_7__.MULTIPLAYER_TRACE_PREFIX_MAP),
49499
+ /* harmony export */ MULTIPLAYER_TRACE_SESSION_CACHE_PREFIX: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_7__.MULTIPLAYER_TRACE_SESSION_CACHE_PREFIX),
48383
49500
  /* harmony export */ NavigationRecorder: () => (/* reexport safe */ _navigation__WEBPACK_IMPORTED_MODULE_6__.NavigationRecorder),
48384
49501
  /* harmony export */ SessionRecorderBrowserTraceExporter: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_7__.SessionRecorderBrowserTraceExporter),
48385
49502
  /* harmony export */ SessionRecorderIdGenerator: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_7__.SessionRecorderIdGenerator),
@@ -48457,6 +49574,7 @@ var __webpack_exports__ATTR_MULTIPLAYER_PROJECT_ID = __webpack_exports__.ATTR_MU
48457
49574
  var __webpack_exports__ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE = __webpack_exports__.ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE;
48458
49575
  var __webpack_exports__ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE_ENCODING = __webpack_exports__.ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE_ENCODING;
48459
49576
  var __webpack_exports__ATTR_MULTIPLAYER_RPC_RESPONSE_MESSAGE = __webpack_exports__.ATTR_MULTIPLAYER_RPC_RESPONSE_MESSAGE;
49577
+ var __webpack_exports__ATTR_MULTIPLAYER_SESSION_CLIENT_ID = __webpack_exports__.ATTR_MULTIPLAYER_SESSION_CLIENT_ID;
48460
49578
  var __webpack_exports__ATTR_MULTIPLAYER_SESSION_ID = __webpack_exports__.ATTR_MULTIPLAYER_SESSION_ID;
48461
49579
  var __webpack_exports__ATTR_MULTIPLAYER_SESSION_RECORDER_VERSION = __webpack_exports__.ATTR_MULTIPLAYER_SESSION_RECORDER_VERSION;
48462
49580
  var __webpack_exports__ATTR_MULTIPLAYER_USER_HASH = __webpack_exports__.ATTR_MULTIPLAYER_USER_HASH;
@@ -48471,10 +49589,14 @@ var __webpack_exports__MULTIPLAYER_OTEL_DEFAULT_LOGS_EXPORTER_URL = __webpack_ex
48471
49589
  var __webpack_exports__MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_GRPC_URL = __webpack_exports__.MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_GRPC_URL;
48472
49590
  var __webpack_exports__MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_HTTP_URL = __webpack_exports__.MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_HTTP_URL;
48473
49591
  var __webpack_exports__MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_URL = __webpack_exports__.MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_URL;
49592
+ var __webpack_exports__MULTIPLAYER_TRACE_CLIENT_ID_LENGTH = __webpack_exports__.MULTIPLAYER_TRACE_CLIENT_ID_LENGTH;
48474
49593
  var __webpack_exports__MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX = __webpack_exports__.MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX;
49594
+ var __webpack_exports__MULTIPLAYER_TRACE_CONTINUOUS_SESSION_CACHE_PREFIX = __webpack_exports__.MULTIPLAYER_TRACE_CONTINUOUS_SESSION_CACHE_PREFIX;
48475
49595
  var __webpack_exports__MULTIPLAYER_TRACE_DEBUG_PREFIX = __webpack_exports__.MULTIPLAYER_TRACE_DEBUG_PREFIX;
48476
49596
  var __webpack_exports__MULTIPLAYER_TRACE_DEBUG_SESSION_SHORT_ID_LENGTH = __webpack_exports__.MULTIPLAYER_TRACE_DEBUG_SESSION_SHORT_ID_LENGTH;
48477
49597
  var __webpack_exports__MULTIPLAYER_TRACE_DOC_PREFIX = __webpack_exports__.MULTIPLAYER_TRACE_DOC_PREFIX;
49598
+ var __webpack_exports__MULTIPLAYER_TRACE_PREFIX_MAP = __webpack_exports__.MULTIPLAYER_TRACE_PREFIX_MAP;
49599
+ var __webpack_exports__MULTIPLAYER_TRACE_SESSION_CACHE_PREFIX = __webpack_exports__.MULTIPLAYER_TRACE_SESSION_CACHE_PREFIX;
48478
49600
  var __webpack_exports__NavigationRecorder = __webpack_exports__.NavigationRecorder;
48479
49601
  var __webpack_exports__SessionRecorderBrowserTraceExporter = __webpack_exports__.SessionRecorderBrowserTraceExporter;
48480
49602
  var __webpack_exports__SessionRecorderIdGenerator = __webpack_exports__.SessionRecorderIdGenerator;
@@ -48486,6 +49608,6 @@ var __webpack_exports__UserType = __webpack_exports__.UserType;
48486
49608
  var __webpack_exports__WidgetButtonPlacement = __webpack_exports__.WidgetButtonPlacement;
48487
49609
  var __webpack_exports__default = __webpack_exports__["default"];
48488
49610
  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 };
49611
+ 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_CACHE_PREFIX as MULTIPLAYER_TRACE_CONTINUOUS_SESSION_CACHE_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
49612
 
48491
49613
  //# sourceMappingURL=index.js.map