@multiplayer-app/session-recorder-browser 1.3.17-session-buffering.0 → 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 (40) hide show
  1. package/dist/browser/index.js +354 -269
  2. package/dist/exporters/index.js +1 -1
  3. package/dist/exporters/index.js.LICENSE.txt +6 -0
  4. package/dist/exporters/index.js.map +1 -1
  5. package/dist/index.js +352 -271
  6. package/dist/index.js.map +1 -1
  7. package/dist/index.umd.js +352 -269
  8. package/dist/index.umd.js.map +1 -1
  9. package/dist/otel/CrashBufferSpanProcessor.d.ts +18 -0
  10. package/dist/otel/CrashBufferSpanProcessor.d.ts.map +1 -0
  11. package/dist/otel/CrashBufferSpanProcessor.js +42 -0
  12. package/dist/otel/CrashBufferSpanProcessor.js.map +1 -0
  13. package/dist/otel/index.d.ts +7 -5
  14. package/dist/otel/index.d.ts.map +1 -1
  15. package/dist/otel/index.js +36 -83
  16. package/dist/otel/index.js.map +1 -1
  17. package/dist/rrweb/index.d.ts +2 -2
  18. package/dist/rrweb/index.d.ts.map +1 -1
  19. package/dist/rrweb/index.js +11 -7
  20. package/dist/rrweb/index.js.map +1 -1
  21. package/dist/services/api.service.d.ts +22 -0
  22. package/dist/services/api.service.d.ts.map +1 -1
  23. package/dist/services/api.service.js +22 -5
  24. package/dist/services/api.service.js.map +1 -1
  25. package/dist/services/crashBuffer.service.d.ts +10 -35
  26. package/dist/services/crashBuffer.service.d.ts.map +1 -1
  27. package/dist/services/crashBuffer.service.js +66 -20
  28. package/dist/services/crashBuffer.service.js.map +1 -1
  29. package/dist/services/indexedDb.service.d.ts +3 -3
  30. package/dist/services/indexedDb.service.d.ts.map +1 -1
  31. package/dist/services/indexedDb.service.js +24 -21
  32. package/dist/services/indexedDb.service.js.map +1 -1
  33. package/dist/session-recorder.d.ts +4 -4
  34. package/dist/session-recorder.d.ts.map +1 -1
  35. package/dist/session-recorder.js +83 -86
  36. package/dist/session-recorder.js.map +1 -1
  37. package/dist/types/session-recorder.d.ts +6 -13
  38. package/dist/types/session-recorder.d.ts.map +1 -1
  39. package/dist/types/session-recorder.js.map +1 -1
  40. package/package.json +2 -2
@@ -25054,7 +25054,7 @@ const CONTINUOUS_DEBUGGING_TIMEOUT = 60000; // 1 minutes
25054
25054
  const DEBUG_SESSION_MAX_DURATION_SECONDS = 10 * 60 + 30; // TODO: move to shared config otel core
25055
25055
  const REMOTE_SESSION_RECORDING_START = 'remote-session-recording:start';
25056
25056
  const REMOTE_SESSION_RECORDING_STOP = 'remote-session-recording:stop';
25057
- const PACKAGE_VERSION_EXPORT = "1.3.17-session-buffering.0" || 0;
25057
+ const PACKAGE_VERSION_EXPORT = "1.3.19" || 0;
25058
25058
  // Regex patterns for OpenTelemetry ignore URLs
25059
25059
  const OTEL_IGNORE_URLS = [
25060
25060
  // Traces endpoint
@@ -25735,6 +25735,64 @@ __webpack_require__.r(__webpack_exports__);
25735
25735
 
25736
25736
 
25737
25737
 
25738
+ /***/ }),
25739
+
25740
+ /***/ "./src/otel/CrashBufferSpanProcessor.ts":
25741
+ /*!**********************************************!*\
25742
+ !*** ./src/otel/CrashBufferSpanProcessor.ts ***!
25743
+ \**********************************************/
25744
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
25745
+
25746
+ "use strict";
25747
+ __webpack_require__.r(__webpack_exports__);
25748
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
25749
+ /* harmony export */ CrashBufferSpanProcessor: () => (/* binding */ CrashBufferSpanProcessor)
25750
+ /* harmony export */ });
25751
+ /* harmony import */ var _opentelemetry_api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @opentelemetry/api */ "../../node_modules/@opentelemetry/api/build/esm/trace/trace_flags.js");
25752
+ /* 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");
25753
+
25754
+
25755
+ /**
25756
+ * Implementation of the {@link SpanProcessor} that batches spans exported by
25757
+ * the SDK then pushes them to the exporter pipeline.
25758
+ */
25759
+ class CrashBufferSpanProcessor {
25760
+ constructor(_exporter, _crashBuffer, _serializeSpan) {
25761
+ this._exporter = _exporter;
25762
+ this._crashBuffer = _crashBuffer;
25763
+ this._serializeSpan = _serializeSpan;
25764
+ }
25765
+ forceFlush() {
25766
+ return this._exporter.forceFlush();
25767
+ }
25768
+ onStart(_span, _parentContext) {
25769
+ return this._exporter.onStart(_span, _parentContext);
25770
+ }
25771
+ onEnd(span) {
25772
+ const traceId = span.spanContext().traceId;
25773
+ if ((span.spanContext().traceFlags & _opentelemetry_api__WEBPACK_IMPORTED_MODULE_1__.TraceFlags.SAMPLED) === 0) {
25774
+ return;
25775
+ }
25776
+ if (traceId.startsWith(_multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_SESSION_CACHE_PREFIX) ||
25777
+ traceId.startsWith(_multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_CONTINUOUS_SESSION_CACHE_PREFIX)) {
25778
+ if (this._crashBuffer) {
25779
+ this._crashBuffer.appendSpans([
25780
+ {
25781
+ ts: span.startTime[0] * 1000 + span.startTime[1] / 1000000,
25782
+ span: this._serializeSpan(span)
25783
+ }
25784
+ ]);
25785
+ }
25786
+ return;
25787
+ }
25788
+ this._exporter.onEnd(span);
25789
+ }
25790
+ shutdown() {
25791
+ return this._exporter.shutdown();
25792
+ }
25793
+ }
25794
+
25795
+
25738
25796
  /***/ }),
25739
25797
 
25740
25798
  /***/ "./src/otel/helpers.ts":
@@ -25979,19 +26037,21 @@ __webpack_require__.r(__webpack_exports__);
25979
26037
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
25980
26038
  /* harmony export */ TracerBrowserSDK: () => (/* binding */ TracerBrowserSDK)
25981
26039
  /* harmony export */ });
25982
- /* harmony import */ var _opentelemetry_resources__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @opentelemetry/resources */ "../../node_modules/@opentelemetry/resources/build/esm/ResourceImpl.js");
25983
- /* harmony import */ var _opentelemetry_core__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @opentelemetry/core */ "../../node_modules/@opentelemetry/core/build/esm/trace/W3CTraceContextPropagator.js");
25984
- /* 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");
25985
- /* 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");
25986
- /* 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");
25987
- /* harmony import */ var _opentelemetry_instrumentation__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @opentelemetry/instrumentation */ "../../node_modules/@opentelemetry/instrumentation/build/esm/autoLoader.js");
26040
+ /* harmony import */ var _opentelemetry_resources__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @opentelemetry/resources */ "../../node_modules/@opentelemetry/resources/build/esm/ResourceImpl.js");
26041
+ /* harmony import */ var _opentelemetry_core__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @opentelemetry/core */ "../../node_modules/@opentelemetry/core/build/esm/trace/W3CTraceContextPropagator.js");
26042
+ /* 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");
26043
+ /* 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");
26044
+ /* 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");
26045
+ /* harmony import */ var _opentelemetry_instrumentation__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @opentelemetry/instrumentation */ "../../node_modules/@opentelemetry/instrumentation/build/esm/autoLoader.js");
25988
26046
  /* 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");
25989
26047
  /* 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");
25990
- /* harmony import */ var _opentelemetry_api__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @opentelemetry/api */ "../../node_modules/@opentelemetry/api/build/esm/trace-api.js");
25991
- /* harmony import */ var _opentelemetry_api__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @opentelemetry/api */ "../../node_modules/@opentelemetry/api/build/esm/context-api.js");
25992
- /* harmony import */ var _opentelemetry_api__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @opentelemetry/api */ "../../node_modules/@opentelemetry/api/build/esm/trace/status.js");
26048
+ /* harmony import */ var _opentelemetry_api__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @opentelemetry/api */ "../../node_modules/@opentelemetry/api/build/esm/trace-api.js");
26049
+ /* harmony import */ var _opentelemetry_api__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @opentelemetry/api */ "../../node_modules/@opentelemetry/api/build/esm/context-api.js");
26050
+ /* harmony import */ var _opentelemetry_api__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @opentelemetry/api */ "../../node_modules/@opentelemetry/api/build/esm/trace/status.js");
25993
26051
  /* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../config */ "./src/config/index.ts");
25994
26052
  /* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers */ "./src/otel/helpers.ts");
26053
+ /* harmony import */ var _CrashBufferSpanProcessor__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./CrashBufferSpanProcessor */ "./src/otel/CrashBufferSpanProcessor.ts");
26054
+
25995
26055
 
25996
26056
 
25997
26057
 
@@ -26005,8 +26065,8 @@ __webpack_require__.r(__webpack_exports__);
26005
26065
 
26006
26066
  class TracerBrowserSDK {
26007
26067
  constructor() {
26008
- this.sessionId = '';
26009
26068
  this.clientId = '';
26069
+ this.sessionId = '';
26010
26070
  this.globalErrorListenersRegistered = false;
26011
26071
  }
26012
26072
  setSessionId(sessionId, sessionType = _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_1__.SessionType.MANUAL) {
@@ -26024,36 +26084,33 @@ class TracerBrowserSDK {
26024
26084
  this.exporter = new _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_1__.SessionRecorderBrowserTraceExporter({
26025
26085
  apiKey: options.apiKey,
26026
26086
  url: (0,_helpers__WEBPACK_IMPORTED_MODULE_3__.getExporterEndpoint)(options.exporterEndpoint),
26027
- usePostMessageFallback: options.usePostMessageFallback,
26087
+ usePostMessageFallback: options.usePostMessageFallback
26028
26088
  });
26029
- this.tracerProvider = new _opentelemetry_sdk_trace_web__WEBPACK_IMPORTED_MODULE_4__.WebTracerProvider({
26030
- resource: (0,_opentelemetry_resources__WEBPACK_IMPORTED_MODULE_5__.resourceFromAttributes)({
26031
- [_opentelemetry_semantic_conventions__WEBPACK_IMPORTED_MODULE_6__.SEMRESATTRS_SERVICE_NAME]: application,
26032
- [_opentelemetry_semantic_conventions__WEBPACK_IMPORTED_MODULE_6__.SEMRESATTRS_SERVICE_VERSION]: version,
26033
- [_opentelemetry_semantic_conventions__WEBPACK_IMPORTED_MODULE_6__.SEMRESATTRS_DEPLOYMENT_ENVIRONMENT]: environment,
26089
+ this.batchSpanProcessor = new _opentelemetry_sdk_trace_base__WEBPACK_IMPORTED_MODULE_5__.BatchSpanProcessor(this.exporter);
26090
+ this.tracerProvider = new _opentelemetry_sdk_trace_web__WEBPACK_IMPORTED_MODULE_6__.WebTracerProvider({
26091
+ resource: (0,_opentelemetry_resources__WEBPACK_IMPORTED_MODULE_7__.resourceFromAttributes)({
26092
+ [_opentelemetry_semantic_conventions__WEBPACK_IMPORTED_MODULE_8__.SEMRESATTRS_SERVICE_NAME]: application,
26093
+ [_opentelemetry_semantic_conventions__WEBPACK_IMPORTED_MODULE_8__.SEMRESATTRS_SERVICE_VERSION]: version,
26094
+ [_opentelemetry_semantic_conventions__WEBPACK_IMPORTED_MODULE_8__.SEMRESATTRS_DEPLOYMENT_ENVIRONMENT]: environment
26034
26095
  }),
26035
26096
  idGenerator: this.idGenerator,
26036
26097
  sampler: new _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_1__.SessionRecorderTraceIdRatioBasedSampler(this.config.sampleTraceRatio),
26037
26098
  spanProcessors: [
26038
26099
  this._getSpanSessionIdProcessor(),
26039
- this._getCrashBufferSpanProcessor(),
26040
- new _opentelemetry_sdk_trace_base__WEBPACK_IMPORTED_MODULE_7__.BatchSpanProcessor(this.exporter),
26041
- ],
26100
+ new _CrashBufferSpanProcessor__WEBPACK_IMPORTED_MODULE_4__.CrashBufferSpanProcessor(this.batchSpanProcessor, this.crashBuffer, this.exporter.serializeSpan.bind(this.exporter))
26101
+ ]
26042
26102
  });
26043
26103
  this.tracerProvider.register({
26044
26104
  // contextManager: new ZoneContextManager(),
26045
- propagator: new _opentelemetry_core__WEBPACK_IMPORTED_MODULE_8__.W3CTraceContextPropagator(),
26105
+ propagator: new _opentelemetry_core__WEBPACK_IMPORTED_MODULE_9__.W3CTraceContextPropagator()
26046
26106
  });
26047
- (0,_opentelemetry_instrumentation__WEBPACK_IMPORTED_MODULE_9__.registerInstrumentations)({
26107
+ (0,_opentelemetry_instrumentation__WEBPACK_IMPORTED_MODULE_10__.registerInstrumentations)({
26048
26108
  tracerProvider: this.tracerProvider,
26049
26109
  instrumentations: [
26050
26110
  (0,_opentelemetry_auto_instrumentations_web__WEBPACK_IMPORTED_MODULE_0__.getWebAutoInstrumentations)({
26051
26111
  '@opentelemetry/instrumentation-xml-http-request': {
26052
26112
  clearTimingResources: true,
26053
- ignoreUrls: [
26054
- ..._config__WEBPACK_IMPORTED_MODULE_2__.OTEL_IGNORE_URLS,
26055
- ...(this.config.ignoreUrls || []),
26056
- ],
26113
+ ignoreUrls: [..._config__WEBPACK_IMPORTED_MODULE_2__.OTEL_IGNORE_URLS, ...(this.config.ignoreUrls || [])],
26057
26114
  propagateTraceHeaderCorsUrls: options.propagateTraceHeaderCorsUrls,
26058
26115
  applyCustomAttributesOnSpan: (span, xhr) => {
26059
26116
  if (!this.config)
@@ -26073,7 +26130,7 @@ class TracerBrowserSDK {
26073
26130
  requestBody,
26074
26131
  responseBody,
26075
26132
  requestHeaders,
26076
- responseHeaders,
26133
+ responseHeaders
26077
26134
  };
26078
26135
  (0,_helpers__WEBPACK_IMPORTED_MODULE_3__.processHttpPayload)(payload, this.config, span);
26079
26136
  }
@@ -26081,14 +26138,11 @@ class TracerBrowserSDK {
26081
26138
  // eslint-disable-next-line
26082
26139
  console.error('[MULTIPLAYER_SESSION_RECORDER] Failed to capture xml-http payload', error);
26083
26140
  }
26084
- },
26141
+ }
26085
26142
  },
26086
26143
  '@opentelemetry/instrumentation-fetch': {
26087
26144
  clearTimingResources: true,
26088
- ignoreUrls: [
26089
- ..._config__WEBPACK_IMPORTED_MODULE_2__.OTEL_IGNORE_URLS,
26090
- ...(this.config.ignoreUrls || []),
26091
- ],
26145
+ ignoreUrls: [..._config__WEBPACK_IMPORTED_MODULE_2__.OTEL_IGNORE_URLS, ...(this.config.ignoreUrls || [])],
26092
26146
  propagateTraceHeaderCorsUrls: options.propagateTraceHeaderCorsUrls,
26093
26147
  applyCustomAttributesOnSpan: async (span, request, response) => {
26094
26148
  if (!this.config)
@@ -26125,7 +26179,7 @@ class TracerBrowserSDK {
26125
26179
  requestBody,
26126
26180
  responseBody,
26127
26181
  requestHeaders,
26128
- responseHeaders,
26182
+ responseHeaders
26129
26183
  };
26130
26184
  (0,_helpers__WEBPACK_IMPORTED_MODULE_3__.processHttpPayload)(payload, this.config, span);
26131
26185
  }
@@ -26133,7 +26187,7 @@ class TracerBrowserSDK {
26133
26187
  // eslint-disable-next-line
26134
26188
  console.error('[MULTIPLAYER_SESSION_RECORDER] Failed to capture fetch payload', error);
26135
26189
  }
26136
- },
26190
+ }
26137
26191
  },
26138
26192
  '@opentelemetry/instrumentation-user-interaction': {
26139
26193
  shouldPreventSpanCreation: (_event, element, span) => {
@@ -26142,71 +26196,20 @@ class TracerBrowserSDK {
26142
26196
  }
26143
26197
  span.setAttribute('target.innerText', (0,_helpers__WEBPACK_IMPORTED_MODULE_3__.getElementInnerText)(element));
26144
26198
  span.setAttribute('target.textContent', (0,_helpers__WEBPACK_IMPORTED_MODULE_3__.getElementTextContent)(element));
26145
- Array.from(element.attributes).forEach(attribute => {
26199
+ Array.from(element.attributes).forEach((attribute) => {
26146
26200
  span.setAttribute(`target.attribute.${attribute.name}`, attribute.value);
26147
26201
  });
26148
26202
  return false;
26149
- },
26150
- },
26151
- }),
26152
- ],
26203
+ }
26204
+ }
26205
+ })
26206
+ ]
26153
26207
  });
26154
26208
  this._registerGlobalErrorListeners();
26155
26209
  }
26156
26210
  setCrashBuffer(crashBuffer) {
26157
26211
  this.crashBuffer = crashBuffer;
26158
26212
  }
26159
- _getCrashBufferSpanProcessor() {
26160
- return {
26161
- onStart: () => { },
26162
- onEnd: (span) => {
26163
- // Only buffer spans when we don't have an active debug session.
26164
- if (this.sessionId)
26165
- return;
26166
- if (!this.crashBuffer)
26167
- return;
26168
- try {
26169
- const now = Date.now();
26170
- this.crashBuffer.appendOtelSpan({
26171
- ts: now,
26172
- span: this._serializeSpan(span),
26173
- });
26174
- }
26175
- catch (_e) {
26176
- // ignore
26177
- }
26178
- },
26179
- shutdown: () => Promise.resolve(),
26180
- forceFlush: () => Promise.resolve(),
26181
- };
26182
- }
26183
- _serializeSpan(span) {
26184
- var _a, _b;
26185
- const spanContext = ((_a = span === null || span === void 0 ? void 0 : span.spanContext) === null || _a === void 0 ? void 0 : _a.call(span))
26186
- ? span.spanContext()
26187
- : span === null || span === void 0 ? void 0 : span._spanContext;
26188
- return {
26189
- _spanContext: spanContext,
26190
- name: span === null || span === void 0 ? void 0 : span.name,
26191
- kind: span === null || span === void 0 ? void 0 : span.kind,
26192
- links: span === null || span === void 0 ? void 0 : span.links,
26193
- ended: span === null || span === void 0 ? void 0 : span.ended,
26194
- events: span === null || span === void 0 ? void 0 : span.events,
26195
- status: span === null || span === void 0 ? void 0 : span.status,
26196
- endTime: span === null || span === void 0 ? void 0 : span.endTime,
26197
- startTime: span === null || span === void 0 ? void 0 : span.startTime,
26198
- duration: span === null || span === void 0 ? void 0 : span.duration,
26199
- attributes: span === null || span === void 0 ? void 0 : span.attributes,
26200
- parentSpanId: (_b = span === null || span === void 0 ? void 0 : span.parentSpanContext) === null || _b === void 0 ? void 0 : _b.spanId,
26201
- droppedAttributesCount: span === null || span === void 0 ? void 0 : span.droppedAttributesCount,
26202
- droppedEventsCount: span === null || span === void 0 ? void 0 : span.droppedEventsCount,
26203
- droppedLinksCount: span === null || span === void 0 ? void 0 : span.droppedLinksCount,
26204
- resource: (span === null || span === void 0 ? void 0 : span.resource) ? {
26205
- attributes: span.resource.attributes,
26206
- asyncAttributesPending: span.resource.asyncAttributesPending,
26207
- } : undefined,
26208
- };
26209
- }
26210
26213
  start(sessionId, sessionType) {
26211
26214
  if (!this.tracerProvider) {
26212
26215
  throw new Error('Configuration not initialized. Call init() before start().');
@@ -26231,13 +26234,15 @@ class TracerBrowserSDK {
26231
26234
  * Otherwise, a short-lived span will be created to hold the exception event.
26232
26235
  */
26233
26236
  captureException(error, errorInfo) {
26237
+ var _a, _b;
26234
26238
  if (!error)
26235
26239
  return;
26236
26240
  // Prefer attaching to the active span to keep correlation intact
26237
26241
  try {
26238
- const activeSpan = _opentelemetry_api__WEBPACK_IMPORTED_MODULE_10__.trace.getSpan(_opentelemetry_api__WEBPACK_IMPORTED_MODULE_11__.context.active());
26242
+ const activeSpan = _opentelemetry_api__WEBPACK_IMPORTED_MODULE_11__.trace.getSpan(_opentelemetry_api__WEBPACK_IMPORTED_MODULE_12__.context.active());
26239
26243
  if (activeSpan) {
26240
26244
  this._recordException(activeSpan, error, errorInfo);
26245
+ (_a = this.tracerProvider) === null || _a === void 0 ? void 0 : _a.forceFlush();
26241
26246
  return;
26242
26247
  }
26243
26248
  // eslint-disable-next-line
@@ -26245,17 +26250,26 @@ class TracerBrowserSDK {
26245
26250
  catch (_ignored) { }
26246
26251
  // Fallback: create a short-lived span to hold the exception details
26247
26252
  try {
26248
- const tracer = _opentelemetry_api__WEBPACK_IMPORTED_MODULE_10__.trace.getTracer('exception');
26253
+ const tracer = _opentelemetry_api__WEBPACK_IMPORTED_MODULE_11__.trace.getTracer('exception');
26249
26254
  const span = tracer.startSpan(error.name || 'Error');
26250
26255
  this._recordException(span, error, errorInfo);
26251
26256
  span.end();
26257
+ (_b = this.tracerProvider) === null || _b === void 0 ? void 0 : _b.forceFlush();
26252
26258
  // eslint-disable-next-line
26253
26259
  }
26254
26260
  catch (_ignored) { }
26255
26261
  }
26262
+ async exportTraces(spans) {
26263
+ var _a;
26264
+ if ((_a = this === null || this === void 0 ? void 0 : this.batchSpanProcessor) === null || _a === void 0 ? void 0 : _a.onEnd) {
26265
+ 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); });
26266
+ // return this.batchSpanProcessor.onEnd()
26267
+ }
26268
+ throw new Error('Buffer span processor not initialized');
26269
+ }
26256
26270
  _recordException(span, error, errorInfo) {
26257
26271
  span.recordException(error);
26258
- span.setStatus({ code: _opentelemetry_api__WEBPACK_IMPORTED_MODULE_12__.SpanStatusCode.ERROR, message: error.message });
26272
+ span.setStatus({ code: _opentelemetry_api__WEBPACK_IMPORTED_MODULE_13__.SpanStatusCode.ERROR, message: error.message });
26259
26273
  span.setAttribute('exception.type', error.name || 'Error');
26260
26274
  span.setAttribute('exception.message', error.message);
26261
26275
  span.setAttribute('exception.stacktrace', error.stack || '');
@@ -26268,14 +26282,14 @@ class TracerBrowserSDK {
26268
26282
  _getSpanSessionIdProcessor() {
26269
26283
  return {
26270
26284
  forceFlush: () => Promise.resolve(),
26271
- onEnd: () => { },
26285
+ onEnd: () => Promise.resolve(),
26272
26286
  shutdown: () => Promise.resolve(),
26273
26287
  onStart: (span) => {
26274
26288
  var _a;
26275
26289
  if ((_a = this.sessionId) === null || _a === void 0 ? void 0 : _a.length) {
26276
26290
  span.setAttribute(_multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_1__.ATTR_MULTIPLAYER_SESSION_ID, this.sessionId);
26277
26291
  }
26278
- },
26292
+ }
26279
26293
  };
26280
26294
  }
26281
26295
  _registerGlobalErrorListeners() {
@@ -26285,14 +26299,12 @@ class TracerBrowserSDK {
26285
26299
  return;
26286
26300
  // eslint-disable-next-line
26287
26301
  const errorHandler = (event) => {
26288
- const err = (event === null || event === void 0 ? void 0 : event.error) instanceof Error
26289
- ? event.error
26290
- : new Error((event === null || event === void 0 ? void 0 : event.message) || 'Script error');
26302
+ 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');
26291
26303
  this.captureException(err);
26292
26304
  };
26293
26305
  // eslint-disable-next-line
26294
26306
  const rejectionHandler = (event) => {
26295
- const reason = (event && 'reason' in event) ? event.reason : undefined;
26307
+ const reason = event && 'reason' in event ? event.reason : undefined;
26296
26308
  const err = reason instanceof Error
26297
26309
  ? reason
26298
26310
  : new Error(typeof reason === 'string' ? reason : 'Unhandled promise rejection');
@@ -26746,7 +26758,7 @@ class RecorderBrowserSDK {
26746
26758
  constructor() {
26747
26759
  this.intervals = {
26748
26760
  restart: null,
26749
- bufferSnapshot: null,
26761
+ bufferSnapshot: null
26750
26762
  };
26751
26763
  this.startedAt = '';
26752
26764
  this.stoppedAt = '';
@@ -26755,6 +26767,9 @@ class RecorderBrowserSDK {
26755
26767
  * Full snapshot.
26756
26768
  */
26757
26769
  takeFullSnapshot() {
26770
+ if (!this.stopFn) {
26771
+ return;
26772
+ }
26758
26773
  rrweb__WEBPACK_IMPORTED_MODULE_6__.record.takeFullSnapshot();
26759
26774
  }
26760
26775
  /**
@@ -26785,7 +26800,7 @@ class RecorderBrowserSDK {
26785
26800
  return;
26786
26801
  }
26787
26802
  this._handleLiveSessionEvent(event, ts, sessionId, sessionType);
26788
- },
26803
+ }
26789
26804
  });
26790
26805
  this.takeFullSnapshot();
26791
26806
  this._setupPeriodicSnapshots(sessionId, sessionType);
@@ -26809,6 +26824,7 @@ class RecorderBrowserSDK {
26809
26824
  stop() {
26810
26825
  var _a, _b, _c;
26811
26826
  (_a = this.stopFn) === null || _a === void 0 ? void 0 : _a.call(this);
26827
+ this.stopFn = undefined;
26812
26828
  if (!((_b = this.config) === null || _b === void 0 ? void 0 : _b.useWebsocket)) {
26813
26829
  (_c = this.socketService) === null || _c === void 0 ? void 0 : _c.close();
26814
26830
  }
@@ -26855,14 +26871,14 @@ class RecorderBrowserSDK {
26855
26871
  this._applyConsoleMasking(event);
26856
26872
  const packedEvent = (0,_rrweb_packer__WEBPACK_IMPORTED_MODULE_0__.pack)(event);
26857
26873
  this.stoppedAt = new Date(ts).toISOString();
26858
- await this.crashBuffer.appendRrwebEvent({
26874
+ await this.crashBuffer.appendEvent({
26859
26875
  ts,
26860
26876
  isFullSnapshot: event.type === _rrweb_types__WEBPACK_IMPORTED_MODULE_1__.EventType.FullSnapshot,
26861
26877
  event: {
26862
26878
  event: packedEvent,
26863
26879
  eventType: event.type,
26864
- timestamp: ts,
26865
- },
26880
+ timestamp: ts
26881
+ }
26866
26882
  });
26867
26883
  }
26868
26884
  catch (error) {
@@ -26887,7 +26903,7 @@ class RecorderBrowserSDK {
26887
26903
  eventType: event.type,
26888
26904
  timestamp: ts,
26889
26905
  debugSessionId: sessionId,
26890
- debugSessionType: sessionType,
26906
+ debugSessionType: sessionType
26891
26907
  });
26892
26908
  }
26893
26909
  /**
@@ -26901,7 +26917,7 @@ class RecorderBrowserSDK {
26901
26917
  sampling: { canvas: 5 },
26902
26918
  recordCanvas: (_c = this.config) === null || _c === void 0 ? void 0 : _c.recordCanvas,
26903
26919
  dataURLOptions: { type: 'image/webp', quality: 0.1 },
26904
- plugins: [(0,_rrweb_rrweb_plugin_console_record__WEBPACK_IMPORTED_MODULE_3__.getRecordConsolePlugin)({ level: ['log', 'error'] })],
26920
+ plugins: [(0,_rrweb_rrweb_plugin_console_record__WEBPACK_IMPORTED_MODULE_3__.getRecordConsolePlugin)({ level: ['log', 'error'] })]
26905
26921
  };
26906
26922
  if (maskingConfig.maskInputOptions) {
26907
26923
  options.maskInputOptions = maskingConfig.maskInputOptions;
@@ -26963,7 +26979,7 @@ class ApiService {
26963
26979
  this.config = {
26964
26980
  apiKey: '',
26965
26981
  apiBaseUrl: '',
26966
- exporterEndpoint: '',
26982
+ exporterEndpoint: ''
26967
26983
  };
26968
26984
  }
26969
26985
  /**
@@ -26973,7 +26989,7 @@ class ApiService {
26973
26989
  init(config) {
26974
26990
  this.config = {
26975
26991
  ...this.config,
26976
- ...config,
26992
+ ...config
26977
26993
  };
26978
26994
  }
26979
26995
  /**
@@ -26991,6 +27007,14 @@ class ApiService {
26991
27007
  async startSession(request, signal) {
26992
27008
  return this.makeRequest('/debug-sessions/start', 'POST', request, signal);
26993
27009
  }
27010
+ /**
27011
+ * Create a new error span session
27012
+ * @param request - Session create error span request data
27013
+ * @param signal - Optional AbortSignal for request cancellation
27014
+ */
27015
+ async createErrorSession(request, signal) {
27016
+ return this.makeRequest('/debug-sessions/error-span/start', 'POST', request, signal);
27017
+ }
26994
27018
  /**
26995
27019
  * Stop an active debug session
26996
27020
  * @param sessionId - ID of the session to stop
@@ -27036,6 +27060,15 @@ class ApiService {
27036
27060
  async checkRemoteSession(requestBody, signal) {
27037
27061
  return this.makeRequest('/remote-debug-session/check', 'POST', requestBody, signal);
27038
27062
  }
27063
+ updateSessionAttributes(sessionId, requestBody, signal) {
27064
+ return this.makeRequest(`/debug-sessions/${sessionId}`, 'PATCH', requestBody, signal);
27065
+ }
27066
+ /**
27067
+ * Export events to the session debugger API
27068
+ */
27069
+ async exportEvents(sessionId, requestBody, signal) {
27070
+ return this.makeRequest(`/debug-sessions/${sessionId}/rrweb-events`, 'POST', requestBody, signal);
27071
+ }
27039
27072
  /**
27040
27073
  * Make a request to the session debugger API
27041
27074
  * @param path - API endpoint path (relative to the base URL)
@@ -27050,14 +27083,14 @@ class ApiService {
27050
27083
  body: body ? JSON.stringify(body) : null,
27051
27084
  headers: {
27052
27085
  'Content-Type': 'application/json',
27053
- ...(this.config.apiKey && { 'X-Api-Key': this.config.apiKey }),
27054
- },
27086
+ ...(this.config.apiKey && { 'X-Api-Key': this.config.apiKey })
27087
+ }
27055
27088
  };
27056
27089
  try {
27057
27090
  const response = await fetch(url, {
27058
27091
  ...params,
27059
27092
  credentials: 'include',
27060
- signal,
27093
+ signal
27061
27094
  });
27062
27095
  if (!response.ok) {
27063
27096
  throw new Error('Network response was not ok: ' + response.statusText);
@@ -27104,6 +27137,8 @@ __webpack_require__.r(__webpack_exports__);
27104
27137
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
27105
27138
  /* harmony export */ CrashBufferService: () => (/* binding */ CrashBufferService)
27106
27139
  /* harmony export */ });
27140
+ /* harmony import */ var _opentelemetry_api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @opentelemetry/api */ "../../node_modules/@opentelemetry/api/build/esm/trace/status.js");
27141
+
27107
27142
  class CrashBufferService {
27108
27143
  constructor(db, tabId, windowMs) {
27109
27144
  this.db = db;
@@ -27116,6 +27151,7 @@ class CrashBufferService {
27116
27151
  this.lastSeenEventTs = 0;
27117
27152
  this.requiresFullSnapshot = true;
27118
27153
  this.lastTouchAt = 0;
27154
+ this.listeners = new Map();
27119
27155
  }
27120
27156
  async _safe(fn, fallback) {
27121
27157
  try {
@@ -27129,11 +27165,11 @@ class CrashBufferService {
27129
27165
  await this._safe(async () => {
27130
27166
  await this.db.setAttrs({
27131
27167
  tabId: this.tabId,
27132
- ...attrs,
27168
+ ...attrs
27133
27169
  });
27134
27170
  }, undefined);
27135
27171
  }
27136
- async appendRrwebEvent(payload) {
27172
+ async appendEvent(payload, _windowMs) {
27137
27173
  this.lastSeenEventTs = Math.max(this.lastSeenEventTs, payload.ts || 0);
27138
27174
  if (!this.isActive)
27139
27175
  return;
@@ -27143,11 +27179,11 @@ class CrashBufferService {
27143
27179
  return;
27144
27180
  }
27145
27181
  await this._safe(async () => {
27146
- await this.db.appendRrwebEvent({
27182
+ await this.db.appendEvent({
27147
27183
  tabId: this.tabId,
27148
27184
  ts: payload.ts,
27149
27185
  isFullSnapshot: payload.isFullSnapshot,
27150
- event: payload.event,
27186
+ event: payload.event
27151
27187
  });
27152
27188
  }, undefined);
27153
27189
  if (isFullSnapshot && this.requiresFullSnapshot) {
@@ -27161,20 +27197,61 @@ class CrashBufferService {
27161
27197
  }
27162
27198
  this.pruneSoon();
27163
27199
  }
27164
- async appendOtelSpan(payload) {
27165
- this.lastSeenEventTs = Math.max(this.lastSeenEventTs, payload.ts || 0);
27200
+ async appendSpans(payload, _windowMs) {
27201
+ for (const p of payload) {
27202
+ this.lastSeenEventTs = Math.max(this.lastSeenEventTs, p.ts || 0);
27203
+ }
27166
27204
  if (!this.isActive)
27167
27205
  return;
27206
+ let errorEvent = null;
27168
27207
  await this._safe(async () => {
27169
- await this.db.appendOtelSpan({
27170
- tabId: this.tabId,
27171
- ts: payload.ts,
27172
- span: payload.span,
27208
+ const records = payload.map((p) => {
27209
+ var _a, _b;
27210
+ 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) {
27211
+ errorEvent = { ts: p.ts, span: p.span };
27212
+ }
27213
+ return {
27214
+ tabId: this.tabId,
27215
+ ts: p.ts,
27216
+ span: p.span
27217
+ };
27173
27218
  });
27219
+ await this.db.appendSpans(records);
27174
27220
  }, undefined);
27175
27221
  this.pruneSoon();
27222
+ if (errorEvent) {
27223
+ this._emit('error-span-appended', errorEvent);
27224
+ }
27225
+ }
27226
+ on(event, listener) {
27227
+ const set = this.listeners.get(event) || new Set();
27228
+ set.add(listener);
27229
+ this.listeners.set(event, set);
27230
+ return () => this.off(event, listener);
27231
+ }
27232
+ off(event, listener) {
27233
+ const set = this.listeners.get(event);
27234
+ if (!set)
27235
+ return;
27236
+ set.delete(listener);
27237
+ if (set.size === 0)
27238
+ this.listeners.delete(event);
27239
+ }
27240
+ _emit(event, payload) {
27241
+ const set = this.listeners.get(event);
27242
+ if (!set || set.size === 0)
27243
+ return;
27244
+ for (const fn of Array.from(set)) {
27245
+ try {
27246
+ ;
27247
+ fn(payload);
27248
+ }
27249
+ catch (_e) {
27250
+ // never throw into app code
27251
+ }
27252
+ }
27176
27253
  }
27177
- async snapshot(now = Date.now()) {
27254
+ async snapshot(_windowMs, now = Date.now()) {
27178
27255
  const toTs = now;
27179
27256
  const fromTs = Math.max(0, toTs - this.windowMs);
27180
27257
  // Always include a full snapshot "anchor" if one exists at/before the window start.
@@ -27185,7 +27262,7 @@ class CrashBufferService {
27185
27262
  const [rrweb, spans, attrs] = await Promise.all([
27186
27263
  this._safe(() => this.db.getRrwebEventsWindow(this.tabId, rrwebFromTs, toTs), []),
27187
27264
  this._safe(() => this.db.getOtelSpansWindow(this.tabId, fromTs, toTs), []),
27188
- this._safe(() => this.db.getAttrs(this.tabId), null),
27265
+ this._safe(() => this.db.getAttrs(this.tabId), null)
27189
27266
  ]);
27190
27267
  const rrwebSorted = rrweb
27191
27268
  .sort((a, b) => a.ts - b.ts)
@@ -27202,14 +27279,16 @@ class CrashBufferService {
27202
27279
  return {
27203
27280
  rrwebEvents,
27204
27281
  otelSpans,
27205
- attrs: attrs ? {
27206
- sessionAttributes: attrs.sessionAttributes,
27207
- resourceAttributes: attrs.resourceAttributes,
27208
- userAttributes: attrs.userAttributes,
27209
- } : null,
27282
+ attrs: attrs
27283
+ ? {
27284
+ sessionAttributes: attrs.sessionAttributes,
27285
+ resourceAttributes: attrs.resourceAttributes,
27286
+ userAttributes: attrs.userAttributes
27287
+ }
27288
+ : null,
27210
27289
  windowMs: this.windowMs,
27211
27290
  fromTs: replayStartTs,
27212
- toTs,
27291
+ toTs
27213
27292
  };
27214
27293
  }
27215
27294
  async clear() {
@@ -27260,8 +27339,9 @@ class CrashBufferService {
27260
27339
  this.lastTouchAt = now;
27261
27340
  void this._safe(() => this.db.touchTab(this.tabId, now), undefined);
27262
27341
  }
27263
- this.pruneInFlight = this._safe(() => this.db.pruneOlderThanWithRrwebSnapshotAnchor(this.tabId, cutoff), undefined)
27264
- .finally(() => { this.pruneInFlight = null; });
27342
+ this.pruneInFlight = this._safe(() => this.db.pruneOlderThanWithRrwebSnapshotAnchor(this.tabId, cutoff), undefined).finally(() => {
27343
+ this.pruneInFlight = null;
27344
+ });
27265
27345
  }
27266
27346
  }
27267
27347
 
@@ -27315,7 +27395,7 @@ class IndexedDBService {
27315
27395
  });
27316
27396
  }
27317
27397
  /**
27318
- * @deprecated Prefer `appendRrwebEvent(tabId, ...)` and `getRrwebEventsWindow(...)`.
27398
+ * @deprecated Prefer `appendEvent(tabId, ...)` and `getRrwebEventsWindow(...)`.
27319
27399
  * This writes into the legacy store with no pruning semantics.
27320
27400
  */
27321
27401
  async saveEvent(event) {
@@ -27362,7 +27442,7 @@ class IndexedDBService {
27362
27442
  const db = await this.dbPromise;
27363
27443
  const payload = {
27364
27444
  ...attrs,
27365
- updatedAt: (_a = attrs.updatedAt) !== null && _a !== void 0 ? _a : Date.now(),
27445
+ updatedAt: (_a = attrs.updatedAt) !== null && _a !== void 0 ? _a : Date.now()
27366
27446
  };
27367
27447
  return new Promise((resolve, reject) => {
27368
27448
  const tx = db.transaction(attrsStore, 'readwrite');
@@ -27400,9 +27480,7 @@ class IndexedDBService {
27400
27480
  const getReq = store.get(tabId);
27401
27481
  getReq.onsuccess = () => {
27402
27482
  const existing = (getReq.result || null);
27403
- const next = existing
27404
- ? { ...existing, updatedAt }
27405
- : { tabId, updatedAt };
27483
+ const next = existing ? { ...existing, updatedAt } : { tabId, updatedAt };
27406
27484
  store.put(next);
27407
27485
  };
27408
27486
  getReq.onerror = () => reject(getReq.error);
@@ -27433,7 +27511,7 @@ class IndexedDBService {
27433
27511
  }
27434
27512
  return cleared;
27435
27513
  }
27436
- async appendRrwebEvent(record) {
27514
+ async appendEvent(record) {
27437
27515
  const db = await this.dbPromise;
27438
27516
  return new Promise((resolve, reject) => {
27439
27517
  const tx = db.transaction(rrwebEventsStore, 'readwrite');
@@ -27442,11 +27520,16 @@ class IndexedDBService {
27442
27520
  tx.onerror = () => reject(tx.error);
27443
27521
  });
27444
27522
  }
27445
- async appendOtelSpan(record) {
27523
+ async appendSpans(records) {
27524
+ if (!records.length)
27525
+ return;
27446
27526
  const db = await this.dbPromise;
27447
27527
  return new Promise((resolve, reject) => {
27448
27528
  const tx = db.transaction(otelSpansStore, 'readwrite');
27449
- tx.objectStore(otelSpansStore).add(record);
27529
+ const store = tx.objectStore(otelSpansStore);
27530
+ for (const record of records) {
27531
+ store.add(record);
27532
+ }
27450
27533
  tx.oncomplete = () => resolve();
27451
27534
  tx.onerror = () => reject(tx.error);
27452
27535
  });
@@ -27522,12 +27605,11 @@ class IndexedDBService {
27522
27605
  const tx = db.transaction([rrwebEventsStore, otelSpansStore], 'readwrite');
27523
27606
  const rrwebStore = tx.objectStore(rrwebEventsStore);
27524
27607
  const spanStore = tx.objectStore(otelSpansStore);
27525
- Promise.all([
27526
- pruneStore(rrwebStore, rrwebRange),
27527
- pruneStore(spanStore, spansRange),
27528
- ]).then(() => {
27608
+ Promise.all([pruneStore(rrwebStore, rrwebRange), pruneStore(spanStore, spansRange)])
27609
+ .then(() => {
27529
27610
  // noop; completion is signaled by tx.oncomplete
27530
- }).catch((e) => {
27611
+ })
27612
+ .catch((e) => {
27531
27613
  reject(e);
27532
27614
  });
27533
27615
  tx.oncomplete = () => resolve();
@@ -27565,12 +27647,11 @@ class IndexedDBService {
27565
27647
  const tx = db.transaction([rrwebEventsStore, otelSpansStore], 'readwrite');
27566
27648
  const rrwebStore = tx.objectStore(rrwebEventsStore);
27567
27649
  const spanStore = tx.objectStore(otelSpansStore);
27568
- Promise.all([
27569
- pruneStore(rrwebStore, rrwebRange),
27570
- pruneStore(spanStore, spansRange),
27571
- ]).then(() => {
27650
+ Promise.all([pruneStore(rrwebStore, rrwebRange), pruneStore(spanStore, spansRange)])
27651
+ .then(() => {
27572
27652
  // noop
27573
- }).catch((e) => reject(e));
27653
+ })
27654
+ .catch((e) => reject(e));
27574
27655
  tx.oncomplete = () => resolve();
27575
27656
  tx.onerror = () => reject(tx.error);
27576
27657
  });
@@ -27604,10 +27685,12 @@ class IndexedDBService {
27604
27685
  const r = attr.delete(tabId);
27605
27686
  r.onsuccess = () => res();
27606
27687
  r.onerror = () => rej(r.error);
27607
- }),
27608
- ]).then(() => {
27688
+ })
27689
+ ])
27690
+ .then(() => {
27609
27691
  // noop
27610
- }).catch((e) => reject(e));
27692
+ })
27693
+ .catch((e) => reject(e));
27611
27694
  tx.oncomplete = () => resolve();
27612
27695
  tx.onerror = () => reject(tx.error);
27613
27696
  });
@@ -28035,17 +28118,13 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_16__.Obse
28035
28118
  return this._sessionAttributes || {};
28036
28119
  }
28037
28120
  set sessionAttributes(attributes) {
28038
- var _a;
28039
28121
  this._sessionAttributes = attributes;
28040
- (_a = this._crashBuffer) === null || _a === void 0 ? void 0 : _a.setAttrs({ sessionAttributes: this.sessionAttributes });
28041
28122
  }
28042
28123
  get userAttributes() {
28043
28124
  return this._userAttributes;
28044
28125
  }
28045
28126
  set userAttributes(userAttributes) {
28046
- var _a;
28047
28127
  this._userAttributes = userAttributes;
28048
- (_a = this._crashBuffer) === null || _a === void 0 ? void 0 : _a.setAttrs({ userAttributes: this._userAttributes });
28049
28128
  }
28050
28129
  get error() {
28051
28130
  return this._error;
@@ -28115,7 +28194,7 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_16__.Obse
28115
28194
  }
28116
28195
  this._configs = {
28117
28196
  ..._config__WEBPACK_IMPORTED_MODULE_5__.BASE_CONFIG,
28118
- apiKey: ((_a = this.session) === null || _a === void 0 ? void 0 : _a.tempApiKey) || '',
28197
+ apiKey: ((_a = this.session) === null || _a === void 0 ? void 0 : _a.tempApiKey) || ''
28119
28198
  };
28120
28199
  }
28121
28200
  /**
@@ -28123,7 +28202,6 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_16__.Obse
28123
28202
  * @param configs - custom configurations for session debugger
28124
28203
  */
28125
28204
  init(configs) {
28126
- var _a;
28127
28205
  if (typeof window === 'undefined') {
28128
28206
  return;
28129
28207
  }
@@ -28135,26 +28213,41 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_16__.Obse
28135
28213
  void this._bufferDb.sweepStaleTabs(24 * 60 * 60 * 1000);
28136
28214
  (0,_patch__WEBPACK_IMPORTED_MODULE_6__.setMaxCapturingHttpPayloadSize)(this._configs.maxCapturingHttpPayloadSize || _config__WEBPACK_IMPORTED_MODULE_5__.DEFAULT_MAX_HTTP_CAPTURING_PAYLOAD_SIZE);
28137
28215
  (0,_patch__WEBPACK_IMPORTED_MODULE_6__.setShouldRecordHttpData)(this._configs.captureBody, this._configs.captureHeaders);
28216
+ this._setupCrashBuffer();
28138
28217
  this._tracer.init(this._configs);
28139
28218
  this._apiService.init(this._configs);
28140
28219
  this._sessionWidget.init(this._configs);
28141
28220
  this._socketService.init({
28142
- clientId: this._tracer.clientId,
28143
28221
  apiKey: this._configs.apiKey,
28222
+ clientId: this._tracer.clientId,
28144
28223
  socketUrl: this._configs.apiBaseUrl || '',
28145
28224
  keepAlive: Boolean(this._configs.useWebsocket),
28146
- usePostMessageFallback: Boolean(this._configs.usePostMessageFallback),
28225
+ usePostMessageFallback: Boolean(this._configs.usePostMessageFallback)
28147
28226
  });
28148
28227
  this._navigationRecorder.init({
28149
28228
  version: this._configs.version,
28150
28229
  application: this._configs.application,
28151
28230
  environment: this._configs.environment,
28152
- enabled: this._configs.recordNavigation,
28231
+ enabled: this._configs.recordNavigation
28153
28232
  });
28154
28233
  if (this._configs.apiKey) {
28155
28234
  this._recorder.init(this._configs, this._socketService);
28156
28235
  }
28157
- // Crash buffer (browser): keep a short rolling window when not actively recording.
28236
+ if (this.sessionId && (this.sessionState === _types__WEBPACK_IMPORTED_MODULE_4__.SessionState.started || this.sessionState === _types__WEBPACK_IMPORTED_MODULE_4__.SessionState.paused)) {
28237
+ this._start();
28238
+ }
28239
+ else {
28240
+ // Buffer-only recording when there is no active debug session.
28241
+ this._startBufferOnlyRecording();
28242
+ }
28243
+ this._registerWidgetEvents();
28244
+ this._registerSocketServiceListeners();
28245
+ _services_messaging_service__WEBPACK_IMPORTED_MODULE_9__["default"].sendMessage('state-change', this.sessionState);
28246
+ // Emit init observable event
28247
+ this.emit('init', [this]);
28248
+ }
28249
+ _setupCrashBuffer() {
28250
+ var _a;
28158
28251
  if ((_a = this._configs.buffering) === null || _a === void 0 ? void 0 : _a.enabled) {
28159
28252
  const windowMinutes = this._configs.buffering.windowMinutes || 1;
28160
28253
  const windowMs = Math.max(10000, windowMinutes * 60 * 1000);
@@ -28164,24 +28257,17 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_16__.Obse
28164
28257
  this._crashBuffer.setAttrs({
28165
28258
  sessionAttributes: this.sessionAttributes,
28166
28259
  resourceAttributes: (0,_utils__WEBPACK_IMPORTED_MODULE_3__.getNavigatorInfo)(),
28167
- userAttributes: this._userAttributes,
28260
+ userAttributes: this._userAttributes
28261
+ });
28262
+ this._crashBuffer.on('error-span-appended', (payload) => {
28263
+ if (this.sessionState !== _types__WEBPACK_IMPORTED_MODULE_4__.SessionState.stopped || this.sessionId)
28264
+ return;
28265
+ if (!payload.span)
28266
+ return;
28267
+ this._createExceptionSession(payload.span);
28168
28268
  });
28169
28269
  this._registerCrashBufferLifecycleHandlers();
28170
28270
  }
28171
- if (this.sessionId
28172
- && (this.sessionState === _types__WEBPACK_IMPORTED_MODULE_4__.SessionState.started
28173
- || this.sessionState === _types__WEBPACK_IMPORTED_MODULE_4__.SessionState.paused)) {
28174
- this._start();
28175
- }
28176
- else {
28177
- // Buffer-only recording when there is no active debug session.
28178
- this._startBufferOnlyRecording();
28179
- }
28180
- this._registerWidgetEvents();
28181
- this._registerSocketServiceListeners();
28182
- _services_messaging_service__WEBPACK_IMPORTED_MODULE_9__["default"].sendMessage('state-change', this.sessionState);
28183
- // Emit init observable event
28184
- this.emit('init', [this]);
28185
28271
  }
28186
28272
  _registerCrashBufferLifecycleHandlers() {
28187
28273
  if (this._bufferLifecycleHandlersRegistered)
@@ -28253,8 +28339,9 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_16__.Obse
28253
28339
  type: 'success',
28254
28340
  message: 'Your session was saved',
28255
28341
  button: {
28256
- text: 'Open session', url: sessionUrl,
28257
- },
28342
+ text: 'Open session',
28343
+ url: sessionUrl
28344
+ }
28258
28345
  }, 5000);
28259
28346
  return res;
28260
28347
  }
@@ -28303,7 +28390,7 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_16__.Obse
28303
28390
  else {
28304
28391
  const request = {
28305
28392
  sessionAttributes: { comment },
28306
- stoppedAt: this._recorder.stoppedAt,
28393
+ stoppedAt: this._recorder.stoppedAt
28307
28394
  };
28308
28395
  const response = await this._apiService.stopSession(this.sessionId, request);
28309
28396
  _eventBus__WEBPACK_IMPORTED_MODULE_7__.recorderEventBus.emit(_config__WEBPACK_IMPORTED_MODULE_5__.SESSION_RESPONSE, response);
@@ -28361,7 +28448,7 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_16__.Obse
28361
28448
  /**
28362
28449
  * Set the session attributes
28363
28450
  * @param attributes - the attributes to set
28364
- */
28451
+ */
28365
28452
  setSessionAttributes(attributes) {
28366
28453
  this._sessionAttributes = attributes;
28367
28454
  }
@@ -28394,16 +28481,12 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_16__.Obse
28394
28481
  const normalizedError = this._normalizeError(error);
28395
28482
  const normalizedErrorInfo = this._normalizeErrorInfo(errorInfo);
28396
28483
  this._tracer.captureException(normalizedError, normalizedErrorInfo);
28397
- // If user isn't actively recording, auto-flush the crash buffer.
28398
- if (this.sessionState === _types__WEBPACK_IMPORTED_MODULE_4__.SessionState.stopped && !this.sessionId) {
28399
- void this.flushBuffer({ reason: 'exception' });
28400
- }
28401
28484
  }
28402
28485
  catch (e) {
28403
28486
  this.error = (e === null || e === void 0 ? void 0 : e.message) || 'Failed to capture exception';
28404
28487
  }
28405
28488
  }
28406
- async flushBuffer(payload) {
28489
+ async _flushBuffer(sessionId) {
28407
28490
  var _a, _b;
28408
28491
  if (!((_b = (_a = this._configs) === null || _a === void 0 ? void 0 : _a.buffering) === null || _b === void 0 ? void 0 : _b.enabled))
28409
28492
  return null;
@@ -28412,49 +28495,39 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_16__.Obse
28412
28495
  if (this._isFlushingBuffer)
28413
28496
  return null;
28414
28497
  // Don’t flush while a live recording is active.
28415
- if (this.sessionState !== _types__WEBPACK_IMPORTED_MODULE_4__.SessionState.stopped || this.sessionId)
28498
+ if (this.sessionState !== _types__WEBPACK_IMPORTED_MODULE_4__.SessionState.stopped)
28416
28499
  return null;
28417
28500
  this._isFlushingBuffer = true;
28418
28501
  try {
28419
- const reason = (payload === null || payload === void 0 ? void 0 : payload.reason) || 'manual';
28420
- await this._crashBuffer.setAttrs({
28421
- sessionAttributes: this.sessionAttributes,
28422
- resourceAttributes: (0,_utils__WEBPACK_IMPORTED_MODULE_3__.getNavigatorInfo)(),
28423
- userAttributes: this._userAttributes,
28424
- });
28502
+ // await this._crashBuffer.setAttrs({
28503
+ // sessionAttributes: this.sessionAttributes,
28504
+ // resourceAttributes: getNavigatorInfo(),
28505
+ // userAttributes: this._userAttributes
28506
+ // })
28425
28507
  const snapshot = await this._crashBuffer.snapshot();
28426
28508
  if (snapshot.rrwebEvents.length === 0 && snapshot.otelSpans.length === 0) {
28427
28509
  return null;
28428
28510
  }
28429
- const request = {
28430
- name: this._getSessionName(),
28431
- stoppedAt: new Date().toISOString(),
28432
- sessionAttributes: this.sessionAttributes,
28433
- resourceAttributes: (0,_utils__WEBPACK_IMPORTED_MODULE_3__.getNavigatorInfo)(),
28434
- ...(this._userAttributes ? { userAttributes: this._userAttributes } : {}),
28435
- debugSessionData: {
28436
- meta: {
28437
- reason,
28438
- windowMs: snapshot.windowMs,
28439
- fromTs: snapshot.fromTs,
28440
- toTs: snapshot.toTs,
28441
- },
28442
- events: snapshot.rrwebEvents.map((e) => e.event),
28443
- spans: snapshot.otelSpans.map((s) => s.span),
28444
- attrs: snapshot.attrs,
28445
- },
28446
- };
28447
- try {
28448
- const res = await this._apiService.startSession(request);
28449
- await this._crashBuffer.clear();
28450
- return res;
28451
- }
28452
- catch (_e) {
28453
- // swallow: flush is best-effort; never throw into app code
28454
- return null;
28511
+ if (sessionId) {
28512
+ const spans = snapshot.otelSpans.map((s) => s.span);
28513
+ const events = snapshot.rrwebEvents.map((e) => e.event);
28514
+ await Promise.all([
28515
+ this._tracer.exportTraces(spans),
28516
+ this._apiService.exportEvents(sessionId, { events }),
28517
+ this._apiService.updateSessionAttributes(sessionId, {
28518
+ name: this._getSessionName(),
28519
+ sessionAttributes: this.sessionAttributes,
28520
+ resourceAttributes: (0,_utils__WEBPACK_IMPORTED_MODULE_3__.getNavigatorInfo)(),
28521
+ userAttributes: this._userAttributes || undefined
28522
+ })
28523
+ ]);
28455
28524
  }
28456
28525
  }
28526
+ catch (_e) {
28527
+ // swallow: flush is best-effort; never throw into app code
28528
+ }
28457
28529
  finally {
28530
+ await this._crashBuffer.clear();
28458
28531
  this._isFlushingBuffer = false;
28459
28532
  }
28460
28533
  }
@@ -28471,11 +28544,11 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_16__.Obse
28471
28544
  const payload = {
28472
28545
  sessionAttributes: {
28473
28546
  ...this.sessionAttributes,
28474
- ...((sessionPayload === null || sessionPayload === void 0 ? void 0 : sessionPayload.sessionAttributes) || {}),
28547
+ ...((sessionPayload === null || sessionPayload === void 0 ? void 0 : sessionPayload.sessionAttributes) || {})
28475
28548
  },
28476
28549
  resourceAttributes: {
28477
28550
  ...(0,_utils__WEBPACK_IMPORTED_MODULE_3__.getNavigatorInfo)(),
28478
- ...((sessionPayload === null || sessionPayload === void 0 ? void 0 : sessionPayload.resourceAttributes) || {}),
28551
+ ...((sessionPayload === null || sessionPayload === void 0 ? void 0 : sessionPayload.resourceAttributes) || {})
28479
28552
  },
28480
28553
  userAttributes: this._userAttributes
28481
28554
  };
@@ -28603,8 +28676,8 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_16__.Obse
28603
28676
  message: 'Your session was auto-saved due to an error',
28604
28677
  button: {
28605
28678
  text: 'Open session',
28606
- url: (_a = payload === null || payload === void 0 ? void 0 : payload.data) === null || _a === void 0 ? void 0 : _a.url,
28607
- },
28679
+ url: (_a = payload === null || payload === void 0 ? void 0 : payload.data) === null || _a === void 0 ? void 0 : _a.url
28680
+ }
28608
28681
  }, 5000);
28609
28682
  });
28610
28683
  this._socketService.on(_config__WEBPACK_IMPORTED_MODULE_5__.REMOTE_SESSION_RECORDING_START, (payload) => {
@@ -28620,11 +28693,21 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_16__.Obse
28620
28693
  }
28621
28694
  });
28622
28695
  this._socketService.on(_config__WEBPACK_IMPORTED_MODULE_5__.SESSION_SAVE_BUFFER_EVENT, (payload) => {
28623
- // Backend asks the client to flush its crash buffer as a debug session.
28624
- const reason = (payload === null || payload === void 0 ? void 0 : payload.reason) || 'remote';
28625
- void this.flushBuffer({ reason });
28696
+ var _a;
28697
+ if (!((_a = payload === null || payload === void 0 ? void 0 : payload.debugSession) === null || _a === void 0 ? void 0 : _a._id))
28698
+ return;
28699
+ void this._flushBuffer(payload.debugSession._id);
28626
28700
  });
28627
28701
  }
28702
+ async _createExceptionSession(span) {
28703
+ try {
28704
+ const session = await this._apiService.createErrorSession({ span });
28705
+ if (session) {
28706
+ void this._flushBuffer(session._id);
28707
+ }
28708
+ }
28709
+ catch (_ignored) { }
28710
+ }
28628
28711
  /**
28629
28712
  * Create a new session and start it
28630
28713
  */
@@ -28636,17 +28719,14 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_16__.Obse
28636
28719
  sessionAttributes: this.sessionAttributes,
28637
28720
  resourceAttributes: (0,_utils__WEBPACK_IMPORTED_MODULE_3__.getNavigatorInfo)(),
28638
28721
  name: this._getSessionName(),
28639
- ...(this._userAttributes ? { userAttributes: this._userAttributes } : {}),
28722
+ ...(this._userAttributes ? { userAttributes: this._userAttributes } : {})
28640
28723
  };
28641
- const request = !this.continuousRecording ?
28642
- payload : { debugSessionData: payload };
28724
+ const request = !this.continuousRecording ? payload : { debugSessionData: payload };
28643
28725
  const session = this.continuousRecording
28644
28726
  ? await this._apiService.startContinuousDebugSession(request, signal)
28645
28727
  : await this._apiService.startSession(request, signal);
28646
28728
  if (session) {
28647
- session.sessionType = this.continuousRecording
28648
- ? _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_0__.SessionType.CONTINUOUS
28649
- : _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_0__.SessionType.MANUAL;
28729
+ 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;
28650
28730
  this._setupSessionAndStart(session, false);
28651
28731
  }
28652
28732
  }
@@ -28668,7 +28748,7 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_16__.Obse
28668
28748
  this._tracer.start(this.sessionId, this.sessionType);
28669
28749
  // Ensure we switch from buffer-only recording to session recording cleanly.
28670
28750
  void this._recorder.restart(this.sessionId, this.sessionType);
28671
- this._navigationRecorder.start({ sessionId: this.sessionId, sessionType: this.sessionType, });
28751
+ this._navigationRecorder.start({ sessionId: this.sessionId, sessionType: this.sessionType });
28672
28752
  if (this.session) {
28673
28753
  _eventBus__WEBPACK_IMPORTED_MODULE_7__.recorderEventBus.emit(_config__WEBPACK_IMPORTED_MODULE_5__.SESSION_STARTED_EVENT, this.session);
28674
28754
  this._socketService.subscribeToSession(this.session);
@@ -31026,7 +31106,10 @@ var SessionRecorderTraceIdRatioBasedSampler = /** @class */ (function () {
31026
31106
  }
31027
31107
  SessionRecorderTraceIdRatioBasedSampler.prototype.shouldSample = function (context, traceId) {
31028
31108
  if (traceId.startsWith(_constants_constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_DEBUG_PREFIX)
31029
- || traceId.startsWith(_constants_constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX)) {
31109
+ || traceId.startsWith(_constants_constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX)
31110
+ // || traceId.startsWith(MULTIPLAYER_TRACE_SESSION_CACHE_PREFIX)
31111
+ // || traceId.startsWith(MULTIPLAYER_TRACE_CONTINUOUS_SESSION_CACHE_PREFIX)
31112
+ ) {
31030
31113
  return {
31031
31114
  decision: _opentelemetry_sdk_trace_base__WEBPACK_IMPORTED_MODULE_1__.SamplingDecision.RECORD_AND_SAMPLED,
31032
31115
  };
@@ -31112,7 +31195,7 @@ __webpack_require__.r(__webpack_exports__);
31112
31195
  /* harmony export */ MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_URL: () => (/* binding */ MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_URL),
31113
31196
  /* harmony export */ MULTIPLAYER_TRACE_CLIENT_ID_LENGTH: () => (/* binding */ MULTIPLAYER_TRACE_CLIENT_ID_LENGTH),
31114
31197
  /* harmony export */ MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX: () => (/* binding */ MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX),
31115
- /* harmony export */ MULTIPLAYER_TRACE_CONTINUOUS_SESSION_DEBUG_PREFIX: () => (/* binding */ MULTIPLAYER_TRACE_CONTINUOUS_SESSION_DEBUG_PREFIX),
31198
+ /* harmony export */ MULTIPLAYER_TRACE_CONTINUOUS_SESSION_CACHE_PREFIX: () => (/* binding */ MULTIPLAYER_TRACE_CONTINUOUS_SESSION_CACHE_PREFIX),
31116
31199
  /* harmony export */ MULTIPLAYER_TRACE_DEBUG_PREFIX: () => (/* binding */ MULTIPLAYER_TRACE_DEBUG_PREFIX),
31117
31200
  /* harmony export */ MULTIPLAYER_TRACE_DEBUG_SESSION_SHORT_ID_LENGTH: () => (/* binding */ MULTIPLAYER_TRACE_DEBUG_SESSION_SHORT_ID_LENGTH),
31118
31201
  /* harmony export */ MULTIPLAYER_TRACE_DOC_PREFIX: () => (/* binding */ MULTIPLAYER_TRACE_DOC_PREFIX),
@@ -31129,11 +31212,11 @@ var MULTIPLAYER_TRACE_DOC_PREFIX = 'd0cd0c';
31129
31212
  var MULTIPLAYER_TRACE_DEBUG_PREFIX = 'debdeb';
31130
31213
  var MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX = 'cdbcdb';
31131
31214
  var MULTIPLAYER_TRACE_SESSION_CACHE_PREFIX = 'cdbcac';
31132
- var MULTIPLAYER_TRACE_CONTINUOUS_SESSION_DEBUG_PREFIX = 'debcdb';
31215
+ var MULTIPLAYER_TRACE_CONTINUOUS_SESSION_CACHE_PREFIX = 'debcdb';
31133
31216
  var MULTIPLAYER_TRACE_PREFIX_MAP = (_a = {},
31134
31217
  _a[_type__WEBPACK_IMPORTED_MODULE_0__.SessionType.CONTINUOUS] = MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX,
31135
31218
  _a[_type__WEBPACK_IMPORTED_MODULE_0__.SessionType.SESSION_CACHE] = MULTIPLAYER_TRACE_SESSION_CACHE_PREFIX,
31136
- _a[_type__WEBPACK_IMPORTED_MODULE_0__.SessionType.CONTINUOUS_SESSION_CACHE] = MULTIPLAYER_TRACE_CONTINUOUS_SESSION_DEBUG_PREFIX,
31219
+ _a[_type__WEBPACK_IMPORTED_MODULE_0__.SessionType.CONTINUOUS_SESSION_CACHE] = MULTIPLAYER_TRACE_CONTINUOUS_SESSION_CACHE_PREFIX,
31137
31220
  _a[_type__WEBPACK_IMPORTED_MODULE_0__.SessionType.MANUAL] = MULTIPLAYER_TRACE_DEBUG_PREFIX,
31138
31221
  _a);
31139
31222
  var MULTIPLAYER_TRACE_DEBUG_SESSION_SHORT_ID_LENGTH = 8;
@@ -31237,7 +31320,7 @@ __webpack_require__.r(__webpack_exports__);
31237
31320
  /* harmony export */ MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_URL: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_URL),
31238
31321
  /* harmony export */ MULTIPLAYER_TRACE_CLIENT_ID_LENGTH: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_CLIENT_ID_LENGTH),
31239
31322
  /* harmony export */ MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX),
31240
- /* harmony export */ MULTIPLAYER_TRACE_CONTINUOUS_SESSION_DEBUG_PREFIX: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_CONTINUOUS_SESSION_DEBUG_PREFIX),
31323
+ /* harmony export */ MULTIPLAYER_TRACE_CONTINUOUS_SESSION_CACHE_PREFIX: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_CONTINUOUS_SESSION_CACHE_PREFIX),
31241
31324
  /* harmony export */ MULTIPLAYER_TRACE_DEBUG_PREFIX: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_DEBUG_PREFIX),
31242
31325
  /* harmony export */ MULTIPLAYER_TRACE_DEBUG_SESSION_SHORT_ID_LENGTH: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_DEBUG_SESSION_SHORT_ID_LENGTH),
31243
31326
  /* harmony export */ MULTIPLAYER_TRACE_DOC_PREFIX: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_DOC_PREFIX),
@@ -31286,7 +31369,7 @@ var SessionRecorderBrowserTraceExporter = /** @class */ (function () {
31286
31369
  if (config === void 0) { config = {}; }
31287
31370
  this.usePostMessage = false;
31288
31371
  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;
31289
- this.config = __assign(__assign({}, config), { url: url, apiKey: apiKey, headers: headers, timeoutMillis: timeoutMillis, keepAlive: keepAlive, concurrencyLimit: concurrencyLimit });
31372
+ this.config = __assign(__assign({}, config), { url: url, apiKey: apiKey, headers: headers, keepAlive: keepAlive, timeoutMillis: timeoutMillis, concurrencyLimit: concurrencyLimit });
31290
31373
  this.postMessageType = postMessageType;
31291
31374
  this.postMessageTargetOrigin = postMessageTargetOrigin;
31292
31375
  this.exporter = this._createExporter();
@@ -31296,8 +31379,8 @@ var SessionRecorderBrowserTraceExporter = /** @class */ (function () {
31296
31379
  // Filter spans to only include those with Multiplayer trace prefixes
31297
31380
  var filteredSpans = spans.filter(function (span) {
31298
31381
  var traceId = span.spanContext().traceId;
31299
- return traceId.startsWith(_constants_constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_DEBUG_PREFIX) ||
31300
- traceId.startsWith(_constants_constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX);
31382
+ return (traceId.startsWith(_constants_constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_DEBUG_PREFIX) ||
31383
+ traceId.startsWith(_constants_constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX));
31301
31384
  });
31302
31385
  // Only proceed if there are filtered spans
31303
31386
  if (filteredSpans.length === 0) {
@@ -31324,6 +31407,14 @@ var SessionRecorderBrowserTraceExporter = /** @class */ (function () {
31324
31407
  SessionRecorderBrowserTraceExporter.prototype.shutdown = function () {
31325
31408
  return this.exporter.shutdown();
31326
31409
  };
31410
+ SessionRecorderBrowserTraceExporter.prototype.exportBuffer = function (spans) {
31411
+ var _this = this;
31412
+ return new Promise(function (resolve) {
31413
+ _this.exporter.export(spans, function (result) {
31414
+ resolve(result);
31415
+ });
31416
+ });
31417
+ };
31327
31418
  SessionRecorderBrowserTraceExporter.prototype.exportViaPostMessage = function (spans, resultCallback) {
31328
31419
  var _this = this;
31329
31420
  if (typeof window === 'undefined') {
@@ -31334,7 +31425,7 @@ var SessionRecorderBrowserTraceExporter = /** @class */ (function () {
31334
31425
  window.postMessage({
31335
31426
  action: 'traces',
31336
31427
  type: this.postMessageType,
31337
- payload: spans.map(function (span) { return _this._serializeSpan(span); }),
31428
+ payload: spans.map(function (span) { return _this.serializeSpan(span); })
31338
31429
  }, this.postMessageTargetOrigin);
31339
31430
  resultCallback({ code: 0 });
31340
31431
  }
@@ -31342,38 +31433,17 @@ var SessionRecorderBrowserTraceExporter = /** @class */ (function () {
31342
31433
  resultCallback({ code: 1 });
31343
31434
  }
31344
31435
  };
31345
- SessionRecorderBrowserTraceExporter.prototype._serializeSpan = function (span) {
31346
- var _a;
31436
+ SessionRecorderBrowserTraceExporter.prototype.serializeSpan = function (span) {
31347
31437
  var spanContext = span.spanContext();
31348
- return {
31349
- _spanContext: spanContext,
31350
- name: span.name,
31351
- kind: span.kind,
31352
- links: span.links,
31353
- ended: span.ended,
31354
- events: span.events,
31355
- status: span.status,
31356
- endTime: span.endTime,
31357
- startTime: span.startTime,
31358
- duration: span.duration,
31359
- attributes: span.attributes,
31360
- parentSpanId: (_a = span.parentSpanContext) === null || _a === void 0 ? void 0 : _a.spanId,
31361
- droppedAttributesCount: span.droppedAttributesCount,
31362
- droppedEventsCount: span.droppedEventsCount,
31363
- droppedLinksCount: span.droppedLinksCount,
31364
- resource: {
31365
- attributes: span.resource.attributes,
31366
- asyncAttributesPending: span.resource.asyncAttributesPending,
31367
- },
31368
- };
31438
+ return __assign(__assign({}, span), { _spanContext: spanContext });
31369
31439
  };
31370
31440
  SessionRecorderBrowserTraceExporter.prototype._createExporter = function () {
31371
31441
  return new _opentelemetry_exporter_trace_otlp_http__WEBPACK_IMPORTED_MODULE_1__.OTLPTraceExporter({
31372
31442
  url: this.config.url,
31373
- headers: __assign(__assign({ 'Content-Type': 'application/json' }, (this.config.apiKey ? { 'Authorization': this.config.apiKey } : {})), (this.config.headers || {})),
31443
+ headers: __assign(__assign({ 'Content-Type': 'application/json' }, (this.config.apiKey ? { Authorization: this.config.apiKey } : {})), (this.config.headers || {})),
31374
31444
  timeoutMillis: this.config.timeoutMillis,
31375
31445
  keepAlive: this.config.keepAlive,
31376
- concurrencyLimit: this.config.concurrencyLimit,
31446
+ concurrencyLimit: this.config.concurrencyLimit
31377
31447
  });
31378
31448
  };
31379
31449
  SessionRecorderBrowserTraceExporter.prototype.setApiKey = function (apiKey) {
@@ -31455,7 +31525,7 @@ __webpack_require__.r(__webpack_exports__);
31455
31525
  /* harmony export */ MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_URL: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_URL),
31456
31526
  /* harmony export */ MULTIPLAYER_TRACE_CLIENT_ID_LENGTH: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_CLIENT_ID_LENGTH),
31457
31527
  /* harmony export */ MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX),
31458
- /* harmony export */ MULTIPLAYER_TRACE_CONTINUOUS_SESSION_DEBUG_PREFIX: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_CONTINUOUS_SESSION_DEBUG_PREFIX),
31528
+ /* harmony export */ MULTIPLAYER_TRACE_CONTINUOUS_SESSION_CACHE_PREFIX: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_CONTINUOUS_SESSION_CACHE_PREFIX),
31459
31529
  /* harmony export */ MULTIPLAYER_TRACE_DEBUG_PREFIX: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_DEBUG_PREFIX),
31460
31530
  /* 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),
31461
31531
  /* harmony export */ MULTIPLAYER_TRACE_DOC_PREFIX: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_DOC_PREFIX),
@@ -32072,6 +32142,19 @@ var setGrpcResponseMessage = function (body, options) {
32072
32142
 
32073
32143
  /***/ }),
32074
32144
 
32145
+ /***/ "../session-recorder-common/dist/esm/type/crash-buffer.js":
32146
+ /*!****************************************************************!*\
32147
+ !*** ../session-recorder-common/dist/esm/type/crash-buffer.js ***!
32148
+ \****************************************************************/
32149
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
32150
+
32151
+ "use strict";
32152
+ __webpack_require__.r(__webpack_exports__);
32153
+
32154
+ //# sourceMappingURL=crash-buffer.js.map
32155
+
32156
+ /***/ }),
32157
+
32075
32158
  /***/ "../session-recorder-common/dist/esm/type/index.js":
32076
32159
  /*!*********************************************************!*\
32077
32160
  !*** ../session-recorder-common/dist/esm/type/index.js ***!
@@ -32088,6 +32171,8 @@ __webpack_require__.r(__webpack_exports__);
32088
32171
  /* 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");
32089
32172
  /* 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");
32090
32173
  /* harmony import */ var _session__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./session */ "../session-recorder-common/dist/esm/type/session.js");
32174
+ /* harmony import */ var _crash_buffer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./crash-buffer */ "../session-recorder-common/dist/esm/type/crash-buffer.js");
32175
+
32091
32176
 
32092
32177
 
32093
32178
 
@@ -50640,7 +50725,7 @@ __webpack_require__.r(__webpack_exports__);
50640
50725
  /* 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),
50641
50726
  /* harmony export */ MULTIPLAYER_TRACE_CLIENT_ID_LENGTH: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_7__.MULTIPLAYER_TRACE_CLIENT_ID_LENGTH),
50642
50727
  /* harmony export */ MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_7__.MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX),
50643
- /* harmony export */ MULTIPLAYER_TRACE_CONTINUOUS_SESSION_DEBUG_PREFIX: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_7__.MULTIPLAYER_TRACE_CONTINUOUS_SESSION_DEBUG_PREFIX),
50728
+ /* 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),
50644
50729
  /* harmony export */ MULTIPLAYER_TRACE_DEBUG_PREFIX: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_7__.MULTIPLAYER_TRACE_DEBUG_PREFIX),
50645
50730
  /* 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),
50646
50731
  /* harmony export */ MULTIPLAYER_TRACE_DOC_PREFIX: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_7__.MULTIPLAYER_TRACE_DOC_PREFIX),