@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
package/dist/index.umd.js CHANGED
@@ -24326,7 +24326,7 @@ const CONTINUOUS_DEBUGGING_TIMEOUT = 60000; // 1 minutes
24326
24326
  const DEBUG_SESSION_MAX_DURATION_SECONDS = 10 * 60 + 30; // TODO: move to shared config otel core
24327
24327
  const REMOTE_SESSION_RECORDING_START = 'remote-session-recording:start';
24328
24328
  const REMOTE_SESSION_RECORDING_STOP = 'remote-session-recording:stop';
24329
- const PACKAGE_VERSION_EXPORT = "1.3.17-session-buffering.0" || 0;
24329
+ const PACKAGE_VERSION_EXPORT = "1.3.19" || 0;
24330
24330
  // Regex patterns for OpenTelemetry ignore URLs
24331
24331
  const OTEL_IGNORE_URLS = [
24332
24332
  // Traces endpoint
@@ -24983,6 +24983,63 @@ class NavigationRecorder {
24983
24983
 
24984
24984
 
24985
24985
 
24986
+ /***/ }),
24987
+
24988
+ /***/ "./src/otel/CrashBufferSpanProcessor.ts":
24989
+ /*!**********************************************!*\
24990
+ !*** ./src/otel/CrashBufferSpanProcessor.ts ***!
24991
+ \**********************************************/
24992
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
24993
+
24994
+ "use strict";
24995
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
24996
+ /* harmony export */ CrashBufferSpanProcessor: () => (/* binding */ CrashBufferSpanProcessor)
24997
+ /* harmony export */ });
24998
+ /* harmony import */ var _opentelemetry_api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @opentelemetry/api */ "../../node_modules/@opentelemetry/api/build/esm/trace/trace_flags.js");
24999
+ /* 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");
25000
+
25001
+
25002
+ /**
25003
+ * Implementation of the {@link SpanProcessor} that batches spans exported by
25004
+ * the SDK then pushes them to the exporter pipeline.
25005
+ */
25006
+ class CrashBufferSpanProcessor {
25007
+ constructor(_exporter, _crashBuffer, _serializeSpan) {
25008
+ this._exporter = _exporter;
25009
+ this._crashBuffer = _crashBuffer;
25010
+ this._serializeSpan = _serializeSpan;
25011
+ }
25012
+ forceFlush() {
25013
+ return this._exporter.forceFlush();
25014
+ }
25015
+ onStart(_span, _parentContext) {
25016
+ return this._exporter.onStart(_span, _parentContext);
25017
+ }
25018
+ onEnd(span) {
25019
+ const traceId = span.spanContext().traceId;
25020
+ if ((span.spanContext().traceFlags & _opentelemetry_api__WEBPACK_IMPORTED_MODULE_1__.TraceFlags.SAMPLED) === 0) {
25021
+ return;
25022
+ }
25023
+ if (traceId.startsWith(_multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_SESSION_CACHE_PREFIX) ||
25024
+ traceId.startsWith(_multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_CONTINUOUS_SESSION_CACHE_PREFIX)) {
25025
+ if (this._crashBuffer) {
25026
+ this._crashBuffer.appendSpans([
25027
+ {
25028
+ ts: span.startTime[0] * 1000 + span.startTime[1] / 1000000,
25029
+ span: this._serializeSpan(span)
25030
+ }
25031
+ ]);
25032
+ }
25033
+ return;
25034
+ }
25035
+ this._exporter.onEnd(span);
25036
+ }
25037
+ shutdown() {
25038
+ return this._exporter.shutdown();
25039
+ }
25040
+ }
25041
+
25042
+
24986
25043
  /***/ }),
24987
25044
 
24988
25045
  /***/ "./src/otel/helpers.ts":
@@ -25223,19 +25280,21 @@ const getElementTextContent = (element) => {
25223
25280
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
25224
25281
  /* harmony export */ TracerBrowserSDK: () => (/* binding */ TracerBrowserSDK)
25225
25282
  /* harmony export */ });
25226
- /* harmony import */ var _opentelemetry_resources__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @opentelemetry/resources */ "../../node_modules/@opentelemetry/resources/build/esm/ResourceImpl.js");
25227
- /* harmony import */ var _opentelemetry_core__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @opentelemetry/core */ "../../node_modules/@opentelemetry/core/build/esm/trace/W3CTraceContextPropagator.js");
25228
- /* 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");
25229
- /* 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");
25230
- /* 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");
25231
- /* harmony import */ var _opentelemetry_instrumentation__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @opentelemetry/instrumentation */ "../../node_modules/@opentelemetry/instrumentation/build/esm/autoLoader.js");
25283
+ /* harmony import */ var _opentelemetry_resources__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @opentelemetry/resources */ "../../node_modules/@opentelemetry/resources/build/esm/ResourceImpl.js");
25284
+ /* harmony import */ var _opentelemetry_core__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @opentelemetry/core */ "../../node_modules/@opentelemetry/core/build/esm/trace/W3CTraceContextPropagator.js");
25285
+ /* 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");
25286
+ /* 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");
25287
+ /* 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");
25288
+ /* harmony import */ var _opentelemetry_instrumentation__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @opentelemetry/instrumentation */ "../../node_modules/@opentelemetry/instrumentation/build/esm/autoLoader.js");
25232
25289
  /* 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");
25233
25290
  /* 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");
25234
- /* harmony import */ var _opentelemetry_api__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @opentelemetry/api */ "../../node_modules/@opentelemetry/api/build/esm/trace-api.js");
25235
- /* harmony import */ var _opentelemetry_api__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @opentelemetry/api */ "../../node_modules/@opentelemetry/api/build/esm/context-api.js");
25236
- /* harmony import */ var _opentelemetry_api__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @opentelemetry/api */ "../../node_modules/@opentelemetry/api/build/esm/trace/status.js");
25291
+ /* harmony import */ var _opentelemetry_api__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @opentelemetry/api */ "../../node_modules/@opentelemetry/api/build/esm/trace-api.js");
25292
+ /* harmony import */ var _opentelemetry_api__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @opentelemetry/api */ "../../node_modules/@opentelemetry/api/build/esm/context-api.js");
25293
+ /* harmony import */ var _opentelemetry_api__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @opentelemetry/api */ "../../node_modules/@opentelemetry/api/build/esm/trace/status.js");
25237
25294
  /* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../config */ "./src/config/index.ts");
25238
25295
  /* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers */ "./src/otel/helpers.ts");
25296
+ /* harmony import */ var _CrashBufferSpanProcessor__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./CrashBufferSpanProcessor */ "./src/otel/CrashBufferSpanProcessor.ts");
25297
+
25239
25298
 
25240
25299
 
25241
25300
 
@@ -25249,8 +25308,8 @@ const getElementTextContent = (element) => {
25249
25308
 
25250
25309
  class TracerBrowserSDK {
25251
25310
  constructor() {
25252
- this.sessionId = '';
25253
25311
  this.clientId = '';
25312
+ this.sessionId = '';
25254
25313
  this.globalErrorListenersRegistered = false;
25255
25314
  }
25256
25315
  setSessionId(sessionId, sessionType = _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_1__.SessionType.MANUAL) {
@@ -25268,36 +25327,33 @@ class TracerBrowserSDK {
25268
25327
  this.exporter = new _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_1__.SessionRecorderBrowserTraceExporter({
25269
25328
  apiKey: options.apiKey,
25270
25329
  url: (0,_helpers__WEBPACK_IMPORTED_MODULE_3__.getExporterEndpoint)(options.exporterEndpoint),
25271
- usePostMessageFallback: options.usePostMessageFallback,
25330
+ usePostMessageFallback: options.usePostMessageFallback
25272
25331
  });
25273
- this.tracerProvider = new _opentelemetry_sdk_trace_web__WEBPACK_IMPORTED_MODULE_4__.WebTracerProvider({
25274
- resource: (0,_opentelemetry_resources__WEBPACK_IMPORTED_MODULE_5__.resourceFromAttributes)({
25275
- [_opentelemetry_semantic_conventions__WEBPACK_IMPORTED_MODULE_6__.SEMRESATTRS_SERVICE_NAME]: application,
25276
- [_opentelemetry_semantic_conventions__WEBPACK_IMPORTED_MODULE_6__.SEMRESATTRS_SERVICE_VERSION]: version,
25277
- [_opentelemetry_semantic_conventions__WEBPACK_IMPORTED_MODULE_6__.SEMRESATTRS_DEPLOYMENT_ENVIRONMENT]: environment,
25332
+ this.batchSpanProcessor = new _opentelemetry_sdk_trace_base__WEBPACK_IMPORTED_MODULE_5__.BatchSpanProcessor(this.exporter);
25333
+ this.tracerProvider = new _opentelemetry_sdk_trace_web__WEBPACK_IMPORTED_MODULE_6__.WebTracerProvider({
25334
+ resource: (0,_opentelemetry_resources__WEBPACK_IMPORTED_MODULE_7__.resourceFromAttributes)({
25335
+ [_opentelemetry_semantic_conventions__WEBPACK_IMPORTED_MODULE_8__.SEMRESATTRS_SERVICE_NAME]: application,
25336
+ [_opentelemetry_semantic_conventions__WEBPACK_IMPORTED_MODULE_8__.SEMRESATTRS_SERVICE_VERSION]: version,
25337
+ [_opentelemetry_semantic_conventions__WEBPACK_IMPORTED_MODULE_8__.SEMRESATTRS_DEPLOYMENT_ENVIRONMENT]: environment
25278
25338
  }),
25279
25339
  idGenerator: this.idGenerator,
25280
25340
  sampler: new _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_1__.SessionRecorderTraceIdRatioBasedSampler(this.config.sampleTraceRatio),
25281
25341
  spanProcessors: [
25282
25342
  this._getSpanSessionIdProcessor(),
25283
- this._getCrashBufferSpanProcessor(),
25284
- new _opentelemetry_sdk_trace_base__WEBPACK_IMPORTED_MODULE_7__.BatchSpanProcessor(this.exporter),
25285
- ],
25343
+ new _CrashBufferSpanProcessor__WEBPACK_IMPORTED_MODULE_4__.CrashBufferSpanProcessor(this.batchSpanProcessor, this.crashBuffer, this.exporter.serializeSpan.bind(this.exporter))
25344
+ ]
25286
25345
  });
25287
25346
  this.tracerProvider.register({
25288
25347
  // contextManager: new ZoneContextManager(),
25289
- propagator: new _opentelemetry_core__WEBPACK_IMPORTED_MODULE_8__.W3CTraceContextPropagator(),
25348
+ propagator: new _opentelemetry_core__WEBPACK_IMPORTED_MODULE_9__.W3CTraceContextPropagator()
25290
25349
  });
25291
- (0,_opentelemetry_instrumentation__WEBPACK_IMPORTED_MODULE_9__.registerInstrumentations)({
25350
+ (0,_opentelemetry_instrumentation__WEBPACK_IMPORTED_MODULE_10__.registerInstrumentations)({
25292
25351
  tracerProvider: this.tracerProvider,
25293
25352
  instrumentations: [
25294
25353
  (0,_opentelemetry_auto_instrumentations_web__WEBPACK_IMPORTED_MODULE_0__.getWebAutoInstrumentations)({
25295
25354
  '@opentelemetry/instrumentation-xml-http-request': {
25296
25355
  clearTimingResources: true,
25297
- ignoreUrls: [
25298
- ..._config__WEBPACK_IMPORTED_MODULE_2__.OTEL_IGNORE_URLS,
25299
- ...(this.config.ignoreUrls || []),
25300
- ],
25356
+ ignoreUrls: [..._config__WEBPACK_IMPORTED_MODULE_2__.OTEL_IGNORE_URLS, ...(this.config.ignoreUrls || [])],
25301
25357
  propagateTraceHeaderCorsUrls: options.propagateTraceHeaderCorsUrls,
25302
25358
  applyCustomAttributesOnSpan: (span, xhr) => {
25303
25359
  if (!this.config)
@@ -25317,7 +25373,7 @@ class TracerBrowserSDK {
25317
25373
  requestBody,
25318
25374
  responseBody,
25319
25375
  requestHeaders,
25320
- responseHeaders,
25376
+ responseHeaders
25321
25377
  };
25322
25378
  (0,_helpers__WEBPACK_IMPORTED_MODULE_3__.processHttpPayload)(payload, this.config, span);
25323
25379
  }
@@ -25325,14 +25381,11 @@ class TracerBrowserSDK {
25325
25381
  // eslint-disable-next-line
25326
25382
  console.error('[MULTIPLAYER_SESSION_RECORDER] Failed to capture xml-http payload', error);
25327
25383
  }
25328
- },
25384
+ }
25329
25385
  },
25330
25386
  '@opentelemetry/instrumentation-fetch': {
25331
25387
  clearTimingResources: true,
25332
- ignoreUrls: [
25333
- ..._config__WEBPACK_IMPORTED_MODULE_2__.OTEL_IGNORE_URLS,
25334
- ...(this.config.ignoreUrls || []),
25335
- ],
25388
+ ignoreUrls: [..._config__WEBPACK_IMPORTED_MODULE_2__.OTEL_IGNORE_URLS, ...(this.config.ignoreUrls || [])],
25336
25389
  propagateTraceHeaderCorsUrls: options.propagateTraceHeaderCorsUrls,
25337
25390
  applyCustomAttributesOnSpan: async (span, request, response) => {
25338
25391
  if (!this.config)
@@ -25369,7 +25422,7 @@ class TracerBrowserSDK {
25369
25422
  requestBody,
25370
25423
  responseBody,
25371
25424
  requestHeaders,
25372
- responseHeaders,
25425
+ responseHeaders
25373
25426
  };
25374
25427
  (0,_helpers__WEBPACK_IMPORTED_MODULE_3__.processHttpPayload)(payload, this.config, span);
25375
25428
  }
@@ -25377,7 +25430,7 @@ class TracerBrowserSDK {
25377
25430
  // eslint-disable-next-line
25378
25431
  console.error('[MULTIPLAYER_SESSION_RECORDER] Failed to capture fetch payload', error);
25379
25432
  }
25380
- },
25433
+ }
25381
25434
  },
25382
25435
  '@opentelemetry/instrumentation-user-interaction': {
25383
25436
  shouldPreventSpanCreation: (_event, element, span) => {
@@ -25386,71 +25439,20 @@ class TracerBrowserSDK {
25386
25439
  }
25387
25440
  span.setAttribute('target.innerText', (0,_helpers__WEBPACK_IMPORTED_MODULE_3__.getElementInnerText)(element));
25388
25441
  span.setAttribute('target.textContent', (0,_helpers__WEBPACK_IMPORTED_MODULE_3__.getElementTextContent)(element));
25389
- Array.from(element.attributes).forEach(attribute => {
25442
+ Array.from(element.attributes).forEach((attribute) => {
25390
25443
  span.setAttribute(`target.attribute.${attribute.name}`, attribute.value);
25391
25444
  });
25392
25445
  return false;
25393
- },
25394
- },
25395
- }),
25396
- ],
25446
+ }
25447
+ }
25448
+ })
25449
+ ]
25397
25450
  });
25398
25451
  this._registerGlobalErrorListeners();
25399
25452
  }
25400
25453
  setCrashBuffer(crashBuffer) {
25401
25454
  this.crashBuffer = crashBuffer;
25402
25455
  }
25403
- _getCrashBufferSpanProcessor() {
25404
- return {
25405
- onStart: () => { },
25406
- onEnd: (span) => {
25407
- // Only buffer spans when we don't have an active debug session.
25408
- if (this.sessionId)
25409
- return;
25410
- if (!this.crashBuffer)
25411
- return;
25412
- try {
25413
- const now = Date.now();
25414
- this.crashBuffer.appendOtelSpan({
25415
- ts: now,
25416
- span: this._serializeSpan(span),
25417
- });
25418
- }
25419
- catch (_e) {
25420
- // ignore
25421
- }
25422
- },
25423
- shutdown: () => Promise.resolve(),
25424
- forceFlush: () => Promise.resolve(),
25425
- };
25426
- }
25427
- _serializeSpan(span) {
25428
- var _a, _b;
25429
- const spanContext = ((_a = span === null || span === void 0 ? void 0 : span.spanContext) === null || _a === void 0 ? void 0 : _a.call(span))
25430
- ? span.spanContext()
25431
- : span === null || span === void 0 ? void 0 : span._spanContext;
25432
- return {
25433
- _spanContext: spanContext,
25434
- name: span === null || span === void 0 ? void 0 : span.name,
25435
- kind: span === null || span === void 0 ? void 0 : span.kind,
25436
- links: span === null || span === void 0 ? void 0 : span.links,
25437
- ended: span === null || span === void 0 ? void 0 : span.ended,
25438
- events: span === null || span === void 0 ? void 0 : span.events,
25439
- status: span === null || span === void 0 ? void 0 : span.status,
25440
- endTime: span === null || span === void 0 ? void 0 : span.endTime,
25441
- startTime: span === null || span === void 0 ? void 0 : span.startTime,
25442
- duration: span === null || span === void 0 ? void 0 : span.duration,
25443
- attributes: span === null || span === void 0 ? void 0 : span.attributes,
25444
- parentSpanId: (_b = span === null || span === void 0 ? void 0 : span.parentSpanContext) === null || _b === void 0 ? void 0 : _b.spanId,
25445
- droppedAttributesCount: span === null || span === void 0 ? void 0 : span.droppedAttributesCount,
25446
- droppedEventsCount: span === null || span === void 0 ? void 0 : span.droppedEventsCount,
25447
- droppedLinksCount: span === null || span === void 0 ? void 0 : span.droppedLinksCount,
25448
- resource: (span === null || span === void 0 ? void 0 : span.resource) ? {
25449
- attributes: span.resource.attributes,
25450
- asyncAttributesPending: span.resource.asyncAttributesPending,
25451
- } : undefined,
25452
- };
25453
- }
25454
25456
  start(sessionId, sessionType) {
25455
25457
  if (!this.tracerProvider) {
25456
25458
  throw new Error('Configuration not initialized. Call init() before start().');
@@ -25475,13 +25477,15 @@ class TracerBrowserSDK {
25475
25477
  * Otherwise, a short-lived span will be created to hold the exception event.
25476
25478
  */
25477
25479
  captureException(error, errorInfo) {
25480
+ var _a, _b;
25478
25481
  if (!error)
25479
25482
  return;
25480
25483
  // Prefer attaching to the active span to keep correlation intact
25481
25484
  try {
25482
- const activeSpan = _opentelemetry_api__WEBPACK_IMPORTED_MODULE_10__.trace.getSpan(_opentelemetry_api__WEBPACK_IMPORTED_MODULE_11__.context.active());
25485
+ const activeSpan = _opentelemetry_api__WEBPACK_IMPORTED_MODULE_11__.trace.getSpan(_opentelemetry_api__WEBPACK_IMPORTED_MODULE_12__.context.active());
25483
25486
  if (activeSpan) {
25484
25487
  this._recordException(activeSpan, error, errorInfo);
25488
+ (_a = this.tracerProvider) === null || _a === void 0 ? void 0 : _a.forceFlush();
25485
25489
  return;
25486
25490
  }
25487
25491
  // eslint-disable-next-line
@@ -25489,17 +25493,26 @@ class TracerBrowserSDK {
25489
25493
  catch (_ignored) { }
25490
25494
  // Fallback: create a short-lived span to hold the exception details
25491
25495
  try {
25492
- const tracer = _opentelemetry_api__WEBPACK_IMPORTED_MODULE_10__.trace.getTracer('exception');
25496
+ const tracer = _opentelemetry_api__WEBPACK_IMPORTED_MODULE_11__.trace.getTracer('exception');
25493
25497
  const span = tracer.startSpan(error.name || 'Error');
25494
25498
  this._recordException(span, error, errorInfo);
25495
25499
  span.end();
25500
+ (_b = this.tracerProvider) === null || _b === void 0 ? void 0 : _b.forceFlush();
25496
25501
  // eslint-disable-next-line
25497
25502
  }
25498
25503
  catch (_ignored) { }
25499
25504
  }
25505
+ async exportTraces(spans) {
25506
+ var _a;
25507
+ if ((_a = this === null || this === void 0 ? void 0 : this.batchSpanProcessor) === null || _a === void 0 ? void 0 : _a.onEnd) {
25508
+ 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); });
25509
+ // return this.batchSpanProcessor.onEnd()
25510
+ }
25511
+ throw new Error('Buffer span processor not initialized');
25512
+ }
25500
25513
  _recordException(span, error, errorInfo) {
25501
25514
  span.recordException(error);
25502
- span.setStatus({ code: _opentelemetry_api__WEBPACK_IMPORTED_MODULE_12__.SpanStatusCode.ERROR, message: error.message });
25515
+ span.setStatus({ code: _opentelemetry_api__WEBPACK_IMPORTED_MODULE_13__.SpanStatusCode.ERROR, message: error.message });
25503
25516
  span.setAttribute('exception.type', error.name || 'Error');
25504
25517
  span.setAttribute('exception.message', error.message);
25505
25518
  span.setAttribute('exception.stacktrace', error.stack || '');
@@ -25512,14 +25525,14 @@ class TracerBrowserSDK {
25512
25525
  _getSpanSessionIdProcessor() {
25513
25526
  return {
25514
25527
  forceFlush: () => Promise.resolve(),
25515
- onEnd: () => { },
25528
+ onEnd: () => Promise.resolve(),
25516
25529
  shutdown: () => Promise.resolve(),
25517
25530
  onStart: (span) => {
25518
25531
  var _a;
25519
25532
  if ((_a = this.sessionId) === null || _a === void 0 ? void 0 : _a.length) {
25520
25533
  span.setAttribute(_multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_1__.ATTR_MULTIPLAYER_SESSION_ID, this.sessionId);
25521
25534
  }
25522
- },
25535
+ }
25523
25536
  };
25524
25537
  }
25525
25538
  _registerGlobalErrorListeners() {
@@ -25529,14 +25542,12 @@ class TracerBrowserSDK {
25529
25542
  return;
25530
25543
  // eslint-disable-next-line
25531
25544
  const errorHandler = (event) => {
25532
- const err = (event === null || event === void 0 ? void 0 : event.error) instanceof Error
25533
- ? event.error
25534
- : new Error((event === null || event === void 0 ? void 0 : event.message) || 'Script error');
25545
+ 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');
25535
25546
  this.captureException(err);
25536
25547
  };
25537
25548
  // eslint-disable-next-line
25538
25549
  const rejectionHandler = (event) => {
25539
- const reason = (event && 'reason' in event) ? event.reason : undefined;
25550
+ const reason = event && 'reason' in event ? event.reason : undefined;
25540
25551
  const err = reason instanceof Error
25541
25552
  ? reason
25542
25553
  : new Error(typeof reason === 'string' ? reason : 'Unhandled promise rejection');
@@ -25984,7 +25995,7 @@ class RecorderBrowserSDK {
25984
25995
  constructor() {
25985
25996
  this.intervals = {
25986
25997
  restart: null,
25987
- bufferSnapshot: null,
25998
+ bufferSnapshot: null
25988
25999
  };
25989
26000
  this.startedAt = '';
25990
26001
  this.stoppedAt = '';
@@ -25993,6 +26004,9 @@ class RecorderBrowserSDK {
25993
26004
  * Full snapshot.
25994
26005
  */
25995
26006
  takeFullSnapshot() {
26007
+ if (!this.stopFn) {
26008
+ return;
26009
+ }
25996
26010
  rrweb__WEBPACK_IMPORTED_MODULE_6__.record.takeFullSnapshot();
25997
26011
  }
25998
26012
  /**
@@ -26023,7 +26037,7 @@ class RecorderBrowserSDK {
26023
26037
  return;
26024
26038
  }
26025
26039
  this._handleLiveSessionEvent(event, ts, sessionId, sessionType);
26026
- },
26040
+ }
26027
26041
  });
26028
26042
  this.takeFullSnapshot();
26029
26043
  this._setupPeriodicSnapshots(sessionId, sessionType);
@@ -26047,6 +26061,7 @@ class RecorderBrowserSDK {
26047
26061
  stop() {
26048
26062
  var _a, _b, _c;
26049
26063
  (_a = this.stopFn) === null || _a === void 0 ? void 0 : _a.call(this);
26064
+ this.stopFn = undefined;
26050
26065
  if (!((_b = this.config) === null || _b === void 0 ? void 0 : _b.useWebsocket)) {
26051
26066
  (_c = this.socketService) === null || _c === void 0 ? void 0 : _c.close();
26052
26067
  }
@@ -26093,14 +26108,14 @@ class RecorderBrowserSDK {
26093
26108
  this._applyConsoleMasking(event);
26094
26109
  const packedEvent = (0,_rrweb_packer__WEBPACK_IMPORTED_MODULE_0__.pack)(event);
26095
26110
  this.stoppedAt = new Date(ts).toISOString();
26096
- await this.crashBuffer.appendRrwebEvent({
26111
+ await this.crashBuffer.appendEvent({
26097
26112
  ts,
26098
26113
  isFullSnapshot: event.type === _rrweb_types__WEBPACK_IMPORTED_MODULE_1__.EventType.FullSnapshot,
26099
26114
  event: {
26100
26115
  event: packedEvent,
26101
26116
  eventType: event.type,
26102
- timestamp: ts,
26103
- },
26117
+ timestamp: ts
26118
+ }
26104
26119
  });
26105
26120
  }
26106
26121
  catch (error) {
@@ -26125,7 +26140,7 @@ class RecorderBrowserSDK {
26125
26140
  eventType: event.type,
26126
26141
  timestamp: ts,
26127
26142
  debugSessionId: sessionId,
26128
- debugSessionType: sessionType,
26143
+ debugSessionType: sessionType
26129
26144
  });
26130
26145
  }
26131
26146
  /**
@@ -26139,7 +26154,7 @@ class RecorderBrowserSDK {
26139
26154
  sampling: { canvas: 5 },
26140
26155
  recordCanvas: (_c = this.config) === null || _c === void 0 ? void 0 : _c.recordCanvas,
26141
26156
  dataURLOptions: { type: 'image/webp', quality: 0.1 },
26142
- plugins: [(0,_rrweb_rrweb_plugin_console_record__WEBPACK_IMPORTED_MODULE_3__.getRecordConsolePlugin)({ level: ['log', 'error'] })],
26157
+ plugins: [(0,_rrweb_rrweb_plugin_console_record__WEBPACK_IMPORTED_MODULE_3__.getRecordConsolePlugin)({ level: ['log', 'error'] })]
26143
26158
  };
26144
26159
  if (maskingConfig.maskInputOptions) {
26145
26160
  options.maskInputOptions = maskingConfig.maskInputOptions;
@@ -26200,7 +26215,7 @@ class ApiService {
26200
26215
  this.config = {
26201
26216
  apiKey: '',
26202
26217
  apiBaseUrl: '',
26203
- exporterEndpoint: '',
26218
+ exporterEndpoint: ''
26204
26219
  };
26205
26220
  }
26206
26221
  /**
@@ -26210,7 +26225,7 @@ class ApiService {
26210
26225
  init(config) {
26211
26226
  this.config = {
26212
26227
  ...this.config,
26213
- ...config,
26228
+ ...config
26214
26229
  };
26215
26230
  }
26216
26231
  /**
@@ -26228,6 +26243,14 @@ class ApiService {
26228
26243
  async startSession(request, signal) {
26229
26244
  return this.makeRequest('/debug-sessions/start', 'POST', request, signal);
26230
26245
  }
26246
+ /**
26247
+ * Create a new error span session
26248
+ * @param request - Session create error span request data
26249
+ * @param signal - Optional AbortSignal for request cancellation
26250
+ */
26251
+ async createErrorSession(request, signal) {
26252
+ return this.makeRequest('/debug-sessions/error-span/start', 'POST', request, signal);
26253
+ }
26231
26254
  /**
26232
26255
  * Stop an active debug session
26233
26256
  * @param sessionId - ID of the session to stop
@@ -26273,6 +26296,15 @@ class ApiService {
26273
26296
  async checkRemoteSession(requestBody, signal) {
26274
26297
  return this.makeRequest('/remote-debug-session/check', 'POST', requestBody, signal);
26275
26298
  }
26299
+ updateSessionAttributes(sessionId, requestBody, signal) {
26300
+ return this.makeRequest(`/debug-sessions/${sessionId}`, 'PATCH', requestBody, signal);
26301
+ }
26302
+ /**
26303
+ * Export events to the session debugger API
26304
+ */
26305
+ async exportEvents(sessionId, requestBody, signal) {
26306
+ return this.makeRequest(`/debug-sessions/${sessionId}/rrweb-events`, 'POST', requestBody, signal);
26307
+ }
26276
26308
  /**
26277
26309
  * Make a request to the session debugger API
26278
26310
  * @param path - API endpoint path (relative to the base URL)
@@ -26287,14 +26319,14 @@ class ApiService {
26287
26319
  body: body ? JSON.stringify(body) : null,
26288
26320
  headers: {
26289
26321
  'Content-Type': 'application/json',
26290
- ...(this.config.apiKey && { 'X-Api-Key': this.config.apiKey }),
26291
- },
26322
+ ...(this.config.apiKey && { 'X-Api-Key': this.config.apiKey })
26323
+ }
26292
26324
  };
26293
26325
  try {
26294
26326
  const response = await fetch(url, {
26295
26327
  ...params,
26296
26328
  credentials: 'include',
26297
- signal,
26329
+ signal
26298
26330
  });
26299
26331
  if (!response.ok) {
26300
26332
  throw new Error('Network response was not ok: ' + response.statusText);
@@ -26340,6 +26372,8 @@ class ApiService {
26340
26372
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
26341
26373
  /* harmony export */ CrashBufferService: () => (/* binding */ CrashBufferService)
26342
26374
  /* harmony export */ });
26375
+ /* harmony import */ var _opentelemetry_api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @opentelemetry/api */ "../../node_modules/@opentelemetry/api/build/esm/trace/status.js");
26376
+
26343
26377
  class CrashBufferService {
26344
26378
  constructor(db, tabId, windowMs) {
26345
26379
  this.db = db;
@@ -26352,6 +26386,7 @@ class CrashBufferService {
26352
26386
  this.lastSeenEventTs = 0;
26353
26387
  this.requiresFullSnapshot = true;
26354
26388
  this.lastTouchAt = 0;
26389
+ this.listeners = new Map();
26355
26390
  }
26356
26391
  async _safe(fn, fallback) {
26357
26392
  try {
@@ -26365,11 +26400,11 @@ class CrashBufferService {
26365
26400
  await this._safe(async () => {
26366
26401
  await this.db.setAttrs({
26367
26402
  tabId: this.tabId,
26368
- ...attrs,
26403
+ ...attrs
26369
26404
  });
26370
26405
  }, undefined);
26371
26406
  }
26372
- async appendRrwebEvent(payload) {
26407
+ async appendEvent(payload, _windowMs) {
26373
26408
  this.lastSeenEventTs = Math.max(this.lastSeenEventTs, payload.ts || 0);
26374
26409
  if (!this.isActive)
26375
26410
  return;
@@ -26379,11 +26414,11 @@ class CrashBufferService {
26379
26414
  return;
26380
26415
  }
26381
26416
  await this._safe(async () => {
26382
- await this.db.appendRrwebEvent({
26417
+ await this.db.appendEvent({
26383
26418
  tabId: this.tabId,
26384
26419
  ts: payload.ts,
26385
26420
  isFullSnapshot: payload.isFullSnapshot,
26386
- event: payload.event,
26421
+ event: payload.event
26387
26422
  });
26388
26423
  }, undefined);
26389
26424
  if (isFullSnapshot && this.requiresFullSnapshot) {
@@ -26397,20 +26432,61 @@ class CrashBufferService {
26397
26432
  }
26398
26433
  this.pruneSoon();
26399
26434
  }
26400
- async appendOtelSpan(payload) {
26401
- this.lastSeenEventTs = Math.max(this.lastSeenEventTs, payload.ts || 0);
26435
+ async appendSpans(payload, _windowMs) {
26436
+ for (const p of payload) {
26437
+ this.lastSeenEventTs = Math.max(this.lastSeenEventTs, p.ts || 0);
26438
+ }
26402
26439
  if (!this.isActive)
26403
26440
  return;
26441
+ let errorEvent = null;
26404
26442
  await this._safe(async () => {
26405
- await this.db.appendOtelSpan({
26406
- tabId: this.tabId,
26407
- ts: payload.ts,
26408
- span: payload.span,
26443
+ const records = payload.map((p) => {
26444
+ var _a, _b;
26445
+ 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) {
26446
+ errorEvent = { ts: p.ts, span: p.span };
26447
+ }
26448
+ return {
26449
+ tabId: this.tabId,
26450
+ ts: p.ts,
26451
+ span: p.span
26452
+ };
26409
26453
  });
26454
+ await this.db.appendSpans(records);
26410
26455
  }, undefined);
26411
26456
  this.pruneSoon();
26457
+ if (errorEvent) {
26458
+ this._emit('error-span-appended', errorEvent);
26459
+ }
26460
+ }
26461
+ on(event, listener) {
26462
+ const set = this.listeners.get(event) || new Set();
26463
+ set.add(listener);
26464
+ this.listeners.set(event, set);
26465
+ return () => this.off(event, listener);
26466
+ }
26467
+ off(event, listener) {
26468
+ const set = this.listeners.get(event);
26469
+ if (!set)
26470
+ return;
26471
+ set.delete(listener);
26472
+ if (set.size === 0)
26473
+ this.listeners.delete(event);
26474
+ }
26475
+ _emit(event, payload) {
26476
+ const set = this.listeners.get(event);
26477
+ if (!set || set.size === 0)
26478
+ return;
26479
+ for (const fn of Array.from(set)) {
26480
+ try {
26481
+ ;
26482
+ fn(payload);
26483
+ }
26484
+ catch (_e) {
26485
+ // never throw into app code
26486
+ }
26487
+ }
26412
26488
  }
26413
- async snapshot(now = Date.now()) {
26489
+ async snapshot(_windowMs, now = Date.now()) {
26414
26490
  const toTs = now;
26415
26491
  const fromTs = Math.max(0, toTs - this.windowMs);
26416
26492
  // Always include a full snapshot "anchor" if one exists at/before the window start.
@@ -26421,7 +26497,7 @@ class CrashBufferService {
26421
26497
  const [rrweb, spans, attrs] = await Promise.all([
26422
26498
  this._safe(() => this.db.getRrwebEventsWindow(this.tabId, rrwebFromTs, toTs), []),
26423
26499
  this._safe(() => this.db.getOtelSpansWindow(this.tabId, fromTs, toTs), []),
26424
- this._safe(() => this.db.getAttrs(this.tabId), null),
26500
+ this._safe(() => this.db.getAttrs(this.tabId), null)
26425
26501
  ]);
26426
26502
  const rrwebSorted = rrweb
26427
26503
  .sort((a, b) => a.ts - b.ts)
@@ -26438,14 +26514,16 @@ class CrashBufferService {
26438
26514
  return {
26439
26515
  rrwebEvents,
26440
26516
  otelSpans,
26441
- attrs: attrs ? {
26442
- sessionAttributes: attrs.sessionAttributes,
26443
- resourceAttributes: attrs.resourceAttributes,
26444
- userAttributes: attrs.userAttributes,
26445
- } : null,
26517
+ attrs: attrs
26518
+ ? {
26519
+ sessionAttributes: attrs.sessionAttributes,
26520
+ resourceAttributes: attrs.resourceAttributes,
26521
+ userAttributes: attrs.userAttributes
26522
+ }
26523
+ : null,
26446
26524
  windowMs: this.windowMs,
26447
26525
  fromTs: replayStartTs,
26448
- toTs,
26526
+ toTs
26449
26527
  };
26450
26528
  }
26451
26529
  async clear() {
@@ -26496,8 +26574,9 @@ class CrashBufferService {
26496
26574
  this.lastTouchAt = now;
26497
26575
  void this._safe(() => this.db.touchTab(this.tabId, now), undefined);
26498
26576
  }
26499
- this.pruneInFlight = this._safe(() => this.db.pruneOlderThanWithRrwebSnapshotAnchor(this.tabId, cutoff), undefined)
26500
- .finally(() => { this.pruneInFlight = null; });
26577
+ this.pruneInFlight = this._safe(() => this.db.pruneOlderThanWithRrwebSnapshotAnchor(this.tabId, cutoff), undefined).finally(() => {
26578
+ this.pruneInFlight = null;
26579
+ });
26501
26580
  }
26502
26581
  }
26503
26582
 
@@ -26550,7 +26629,7 @@ class IndexedDBService {
26550
26629
  });
26551
26630
  }
26552
26631
  /**
26553
- * @deprecated Prefer `appendRrwebEvent(tabId, ...)` and `getRrwebEventsWindow(...)`.
26632
+ * @deprecated Prefer `appendEvent(tabId, ...)` and `getRrwebEventsWindow(...)`.
26554
26633
  * This writes into the legacy store with no pruning semantics.
26555
26634
  */
26556
26635
  async saveEvent(event) {
@@ -26597,7 +26676,7 @@ class IndexedDBService {
26597
26676
  const db = await this.dbPromise;
26598
26677
  const payload = {
26599
26678
  ...attrs,
26600
- updatedAt: (_a = attrs.updatedAt) !== null && _a !== void 0 ? _a : Date.now(),
26679
+ updatedAt: (_a = attrs.updatedAt) !== null && _a !== void 0 ? _a : Date.now()
26601
26680
  };
26602
26681
  return new Promise((resolve, reject) => {
26603
26682
  const tx = db.transaction(attrsStore, 'readwrite');
@@ -26635,9 +26714,7 @@ class IndexedDBService {
26635
26714
  const getReq = store.get(tabId);
26636
26715
  getReq.onsuccess = () => {
26637
26716
  const existing = (getReq.result || null);
26638
- const next = existing
26639
- ? { ...existing, updatedAt }
26640
- : { tabId, updatedAt };
26717
+ const next = existing ? { ...existing, updatedAt } : { tabId, updatedAt };
26641
26718
  store.put(next);
26642
26719
  };
26643
26720
  getReq.onerror = () => reject(getReq.error);
@@ -26668,7 +26745,7 @@ class IndexedDBService {
26668
26745
  }
26669
26746
  return cleared;
26670
26747
  }
26671
- async appendRrwebEvent(record) {
26748
+ async appendEvent(record) {
26672
26749
  const db = await this.dbPromise;
26673
26750
  return new Promise((resolve, reject) => {
26674
26751
  const tx = db.transaction(rrwebEventsStore, 'readwrite');
@@ -26677,11 +26754,16 @@ class IndexedDBService {
26677
26754
  tx.onerror = () => reject(tx.error);
26678
26755
  });
26679
26756
  }
26680
- async appendOtelSpan(record) {
26757
+ async appendSpans(records) {
26758
+ if (!records.length)
26759
+ return;
26681
26760
  const db = await this.dbPromise;
26682
26761
  return new Promise((resolve, reject) => {
26683
26762
  const tx = db.transaction(otelSpansStore, 'readwrite');
26684
- tx.objectStore(otelSpansStore).add(record);
26763
+ const store = tx.objectStore(otelSpansStore);
26764
+ for (const record of records) {
26765
+ store.add(record);
26766
+ }
26685
26767
  tx.oncomplete = () => resolve();
26686
26768
  tx.onerror = () => reject(tx.error);
26687
26769
  });
@@ -26757,12 +26839,11 @@ class IndexedDBService {
26757
26839
  const tx = db.transaction([rrwebEventsStore, otelSpansStore], 'readwrite');
26758
26840
  const rrwebStore = tx.objectStore(rrwebEventsStore);
26759
26841
  const spanStore = tx.objectStore(otelSpansStore);
26760
- Promise.all([
26761
- pruneStore(rrwebStore, rrwebRange),
26762
- pruneStore(spanStore, spansRange),
26763
- ]).then(() => {
26842
+ Promise.all([pruneStore(rrwebStore, rrwebRange), pruneStore(spanStore, spansRange)])
26843
+ .then(() => {
26764
26844
  // noop; completion is signaled by tx.oncomplete
26765
- }).catch((e) => {
26845
+ })
26846
+ .catch((e) => {
26766
26847
  reject(e);
26767
26848
  });
26768
26849
  tx.oncomplete = () => resolve();
@@ -26800,12 +26881,11 @@ class IndexedDBService {
26800
26881
  const tx = db.transaction([rrwebEventsStore, otelSpansStore], 'readwrite');
26801
26882
  const rrwebStore = tx.objectStore(rrwebEventsStore);
26802
26883
  const spanStore = tx.objectStore(otelSpansStore);
26803
- Promise.all([
26804
- pruneStore(rrwebStore, rrwebRange),
26805
- pruneStore(spanStore, spansRange),
26806
- ]).then(() => {
26884
+ Promise.all([pruneStore(rrwebStore, rrwebRange), pruneStore(spanStore, spansRange)])
26885
+ .then(() => {
26807
26886
  // noop
26808
- }).catch((e) => reject(e));
26887
+ })
26888
+ .catch((e) => reject(e));
26809
26889
  tx.oncomplete = () => resolve();
26810
26890
  tx.onerror = () => reject(tx.error);
26811
26891
  });
@@ -26839,10 +26919,12 @@ class IndexedDBService {
26839
26919
  const r = attr.delete(tabId);
26840
26920
  r.onsuccess = () => res();
26841
26921
  r.onerror = () => rej(r.error);
26842
- }),
26843
- ]).then(() => {
26922
+ })
26923
+ ])
26924
+ .then(() => {
26844
26925
  // noop
26845
- }).catch((e) => reject(e));
26926
+ })
26927
+ .catch((e) => reject(e));
26846
26928
  tx.oncomplete = () => resolve();
26847
26929
  tx.onerror = () => reject(tx.error);
26848
26930
  });
@@ -27267,17 +27349,13 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_16__.Obse
27267
27349
  return this._sessionAttributes || {};
27268
27350
  }
27269
27351
  set sessionAttributes(attributes) {
27270
- var _a;
27271
27352
  this._sessionAttributes = attributes;
27272
- (_a = this._crashBuffer) === null || _a === void 0 ? void 0 : _a.setAttrs({ sessionAttributes: this.sessionAttributes });
27273
27353
  }
27274
27354
  get userAttributes() {
27275
27355
  return this._userAttributes;
27276
27356
  }
27277
27357
  set userAttributes(userAttributes) {
27278
- var _a;
27279
27358
  this._userAttributes = userAttributes;
27280
- (_a = this._crashBuffer) === null || _a === void 0 ? void 0 : _a.setAttrs({ userAttributes: this._userAttributes });
27281
27359
  }
27282
27360
  get error() {
27283
27361
  return this._error;
@@ -27347,7 +27425,7 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_16__.Obse
27347
27425
  }
27348
27426
  this._configs = {
27349
27427
  ..._config__WEBPACK_IMPORTED_MODULE_5__.BASE_CONFIG,
27350
- apiKey: ((_a = this.session) === null || _a === void 0 ? void 0 : _a.tempApiKey) || '',
27428
+ apiKey: ((_a = this.session) === null || _a === void 0 ? void 0 : _a.tempApiKey) || ''
27351
27429
  };
27352
27430
  }
27353
27431
  /**
@@ -27355,7 +27433,6 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_16__.Obse
27355
27433
  * @param configs - custom configurations for session debugger
27356
27434
  */
27357
27435
  init(configs) {
27358
- var _a;
27359
27436
  if (typeof window === 'undefined') {
27360
27437
  return;
27361
27438
  }
@@ -27367,26 +27444,41 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_16__.Obse
27367
27444
  void this._bufferDb.sweepStaleTabs(24 * 60 * 60 * 1000);
27368
27445
  (0,_patch__WEBPACK_IMPORTED_MODULE_6__.setMaxCapturingHttpPayloadSize)(this._configs.maxCapturingHttpPayloadSize || _config__WEBPACK_IMPORTED_MODULE_5__.DEFAULT_MAX_HTTP_CAPTURING_PAYLOAD_SIZE);
27369
27446
  (0,_patch__WEBPACK_IMPORTED_MODULE_6__.setShouldRecordHttpData)(this._configs.captureBody, this._configs.captureHeaders);
27447
+ this._setupCrashBuffer();
27370
27448
  this._tracer.init(this._configs);
27371
27449
  this._apiService.init(this._configs);
27372
27450
  this._sessionWidget.init(this._configs);
27373
27451
  this._socketService.init({
27374
- clientId: this._tracer.clientId,
27375
27452
  apiKey: this._configs.apiKey,
27453
+ clientId: this._tracer.clientId,
27376
27454
  socketUrl: this._configs.apiBaseUrl || '',
27377
27455
  keepAlive: Boolean(this._configs.useWebsocket),
27378
- usePostMessageFallback: Boolean(this._configs.usePostMessageFallback),
27456
+ usePostMessageFallback: Boolean(this._configs.usePostMessageFallback)
27379
27457
  });
27380
27458
  this._navigationRecorder.init({
27381
27459
  version: this._configs.version,
27382
27460
  application: this._configs.application,
27383
27461
  environment: this._configs.environment,
27384
- enabled: this._configs.recordNavigation,
27462
+ enabled: this._configs.recordNavigation
27385
27463
  });
27386
27464
  if (this._configs.apiKey) {
27387
27465
  this._recorder.init(this._configs, this._socketService);
27388
27466
  }
27389
- // Crash buffer (browser): keep a short rolling window when not actively recording.
27467
+ if (this.sessionId && (this.sessionState === _types__WEBPACK_IMPORTED_MODULE_4__.SessionState.started || this.sessionState === _types__WEBPACK_IMPORTED_MODULE_4__.SessionState.paused)) {
27468
+ this._start();
27469
+ }
27470
+ else {
27471
+ // Buffer-only recording when there is no active debug session.
27472
+ this._startBufferOnlyRecording();
27473
+ }
27474
+ this._registerWidgetEvents();
27475
+ this._registerSocketServiceListeners();
27476
+ _services_messaging_service__WEBPACK_IMPORTED_MODULE_9__["default"].sendMessage('state-change', this.sessionState);
27477
+ // Emit init observable event
27478
+ this.emit('init', [this]);
27479
+ }
27480
+ _setupCrashBuffer() {
27481
+ var _a;
27390
27482
  if ((_a = this._configs.buffering) === null || _a === void 0 ? void 0 : _a.enabled) {
27391
27483
  const windowMinutes = this._configs.buffering.windowMinutes || 1;
27392
27484
  const windowMs = Math.max(10000, windowMinutes * 60 * 1000);
@@ -27396,24 +27488,17 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_16__.Obse
27396
27488
  this._crashBuffer.setAttrs({
27397
27489
  sessionAttributes: this.sessionAttributes,
27398
27490
  resourceAttributes: (0,_utils__WEBPACK_IMPORTED_MODULE_3__.getNavigatorInfo)(),
27399
- userAttributes: this._userAttributes,
27491
+ userAttributes: this._userAttributes
27492
+ });
27493
+ this._crashBuffer.on('error-span-appended', (payload) => {
27494
+ if (this.sessionState !== _types__WEBPACK_IMPORTED_MODULE_4__.SessionState.stopped || this.sessionId)
27495
+ return;
27496
+ if (!payload.span)
27497
+ return;
27498
+ this._createExceptionSession(payload.span);
27400
27499
  });
27401
27500
  this._registerCrashBufferLifecycleHandlers();
27402
27501
  }
27403
- if (this.sessionId
27404
- && (this.sessionState === _types__WEBPACK_IMPORTED_MODULE_4__.SessionState.started
27405
- || this.sessionState === _types__WEBPACK_IMPORTED_MODULE_4__.SessionState.paused)) {
27406
- this._start();
27407
- }
27408
- else {
27409
- // Buffer-only recording when there is no active debug session.
27410
- this._startBufferOnlyRecording();
27411
- }
27412
- this._registerWidgetEvents();
27413
- this._registerSocketServiceListeners();
27414
- _services_messaging_service__WEBPACK_IMPORTED_MODULE_9__["default"].sendMessage('state-change', this.sessionState);
27415
- // Emit init observable event
27416
- this.emit('init', [this]);
27417
27502
  }
27418
27503
  _registerCrashBufferLifecycleHandlers() {
27419
27504
  if (this._bufferLifecycleHandlersRegistered)
@@ -27485,8 +27570,9 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_16__.Obse
27485
27570
  type: 'success',
27486
27571
  message: 'Your session was saved',
27487
27572
  button: {
27488
- text: 'Open session', url: sessionUrl,
27489
- },
27573
+ text: 'Open session',
27574
+ url: sessionUrl
27575
+ }
27490
27576
  }, 5000);
27491
27577
  return res;
27492
27578
  }
@@ -27535,7 +27621,7 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_16__.Obse
27535
27621
  else {
27536
27622
  const request = {
27537
27623
  sessionAttributes: { comment },
27538
- stoppedAt: this._recorder.stoppedAt,
27624
+ stoppedAt: this._recorder.stoppedAt
27539
27625
  };
27540
27626
  const response = await this._apiService.stopSession(this.sessionId, request);
27541
27627
  _eventBus__WEBPACK_IMPORTED_MODULE_7__.recorderEventBus.emit(_config__WEBPACK_IMPORTED_MODULE_5__.SESSION_RESPONSE, response);
@@ -27593,7 +27679,7 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_16__.Obse
27593
27679
  /**
27594
27680
  * Set the session attributes
27595
27681
  * @param attributes - the attributes to set
27596
- */
27682
+ */
27597
27683
  setSessionAttributes(attributes) {
27598
27684
  this._sessionAttributes = attributes;
27599
27685
  }
@@ -27626,16 +27712,12 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_16__.Obse
27626
27712
  const normalizedError = this._normalizeError(error);
27627
27713
  const normalizedErrorInfo = this._normalizeErrorInfo(errorInfo);
27628
27714
  this._tracer.captureException(normalizedError, normalizedErrorInfo);
27629
- // If user isn't actively recording, auto-flush the crash buffer.
27630
- if (this.sessionState === _types__WEBPACK_IMPORTED_MODULE_4__.SessionState.stopped && !this.sessionId) {
27631
- void this.flushBuffer({ reason: 'exception' });
27632
- }
27633
27715
  }
27634
27716
  catch (e) {
27635
27717
  this.error = (e === null || e === void 0 ? void 0 : e.message) || 'Failed to capture exception';
27636
27718
  }
27637
27719
  }
27638
- async flushBuffer(payload) {
27720
+ async _flushBuffer(sessionId) {
27639
27721
  var _a, _b;
27640
27722
  if (!((_b = (_a = this._configs) === null || _a === void 0 ? void 0 : _a.buffering) === null || _b === void 0 ? void 0 : _b.enabled))
27641
27723
  return null;
@@ -27644,49 +27726,39 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_16__.Obse
27644
27726
  if (this._isFlushingBuffer)
27645
27727
  return null;
27646
27728
  // Don’t flush while a live recording is active.
27647
- if (this.sessionState !== _types__WEBPACK_IMPORTED_MODULE_4__.SessionState.stopped || this.sessionId)
27729
+ if (this.sessionState !== _types__WEBPACK_IMPORTED_MODULE_4__.SessionState.stopped)
27648
27730
  return null;
27649
27731
  this._isFlushingBuffer = true;
27650
27732
  try {
27651
- const reason = (payload === null || payload === void 0 ? void 0 : payload.reason) || 'manual';
27652
- await this._crashBuffer.setAttrs({
27653
- sessionAttributes: this.sessionAttributes,
27654
- resourceAttributes: (0,_utils__WEBPACK_IMPORTED_MODULE_3__.getNavigatorInfo)(),
27655
- userAttributes: this._userAttributes,
27656
- });
27733
+ // await this._crashBuffer.setAttrs({
27734
+ // sessionAttributes: this.sessionAttributes,
27735
+ // resourceAttributes: getNavigatorInfo(),
27736
+ // userAttributes: this._userAttributes
27737
+ // })
27657
27738
  const snapshot = await this._crashBuffer.snapshot();
27658
27739
  if (snapshot.rrwebEvents.length === 0 && snapshot.otelSpans.length === 0) {
27659
27740
  return null;
27660
27741
  }
27661
- const request = {
27662
- name: this._getSessionName(),
27663
- stoppedAt: new Date().toISOString(),
27664
- sessionAttributes: this.sessionAttributes,
27665
- resourceAttributes: (0,_utils__WEBPACK_IMPORTED_MODULE_3__.getNavigatorInfo)(),
27666
- ...(this._userAttributes ? { userAttributes: this._userAttributes } : {}),
27667
- debugSessionData: {
27668
- meta: {
27669
- reason,
27670
- windowMs: snapshot.windowMs,
27671
- fromTs: snapshot.fromTs,
27672
- toTs: snapshot.toTs,
27673
- },
27674
- events: snapshot.rrwebEvents.map((e) => e.event),
27675
- spans: snapshot.otelSpans.map((s) => s.span),
27676
- attrs: snapshot.attrs,
27677
- },
27678
- };
27679
- try {
27680
- const res = await this._apiService.startSession(request);
27681
- await this._crashBuffer.clear();
27682
- return res;
27683
- }
27684
- catch (_e) {
27685
- // swallow: flush is best-effort; never throw into app code
27686
- return null;
27742
+ if (sessionId) {
27743
+ const spans = snapshot.otelSpans.map((s) => s.span);
27744
+ const events = snapshot.rrwebEvents.map((e) => e.event);
27745
+ await Promise.all([
27746
+ this._tracer.exportTraces(spans),
27747
+ this._apiService.exportEvents(sessionId, { events }),
27748
+ this._apiService.updateSessionAttributes(sessionId, {
27749
+ name: this._getSessionName(),
27750
+ sessionAttributes: this.sessionAttributes,
27751
+ resourceAttributes: (0,_utils__WEBPACK_IMPORTED_MODULE_3__.getNavigatorInfo)(),
27752
+ userAttributes: this._userAttributes || undefined
27753
+ })
27754
+ ]);
27687
27755
  }
27688
27756
  }
27757
+ catch (_e) {
27758
+ // swallow: flush is best-effort; never throw into app code
27759
+ }
27689
27760
  finally {
27761
+ await this._crashBuffer.clear();
27690
27762
  this._isFlushingBuffer = false;
27691
27763
  }
27692
27764
  }
@@ -27703,11 +27775,11 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_16__.Obse
27703
27775
  const payload = {
27704
27776
  sessionAttributes: {
27705
27777
  ...this.sessionAttributes,
27706
- ...((sessionPayload === null || sessionPayload === void 0 ? void 0 : sessionPayload.sessionAttributes) || {}),
27778
+ ...((sessionPayload === null || sessionPayload === void 0 ? void 0 : sessionPayload.sessionAttributes) || {})
27707
27779
  },
27708
27780
  resourceAttributes: {
27709
27781
  ...(0,_utils__WEBPACK_IMPORTED_MODULE_3__.getNavigatorInfo)(),
27710
- ...((sessionPayload === null || sessionPayload === void 0 ? void 0 : sessionPayload.resourceAttributes) || {}),
27782
+ ...((sessionPayload === null || sessionPayload === void 0 ? void 0 : sessionPayload.resourceAttributes) || {})
27711
27783
  },
27712
27784
  userAttributes: this._userAttributes
27713
27785
  };
@@ -27835,8 +27907,8 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_16__.Obse
27835
27907
  message: 'Your session was auto-saved due to an error',
27836
27908
  button: {
27837
27909
  text: 'Open session',
27838
- url: (_a = payload === null || payload === void 0 ? void 0 : payload.data) === null || _a === void 0 ? void 0 : _a.url,
27839
- },
27910
+ url: (_a = payload === null || payload === void 0 ? void 0 : payload.data) === null || _a === void 0 ? void 0 : _a.url
27911
+ }
27840
27912
  }, 5000);
27841
27913
  });
27842
27914
  this._socketService.on(_config__WEBPACK_IMPORTED_MODULE_5__.REMOTE_SESSION_RECORDING_START, (payload) => {
@@ -27852,11 +27924,21 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_16__.Obse
27852
27924
  }
27853
27925
  });
27854
27926
  this._socketService.on(_config__WEBPACK_IMPORTED_MODULE_5__.SESSION_SAVE_BUFFER_EVENT, (payload) => {
27855
- // Backend asks the client to flush its crash buffer as a debug session.
27856
- const reason = (payload === null || payload === void 0 ? void 0 : payload.reason) || 'remote';
27857
- void this.flushBuffer({ reason });
27927
+ var _a;
27928
+ if (!((_a = payload === null || payload === void 0 ? void 0 : payload.debugSession) === null || _a === void 0 ? void 0 : _a._id))
27929
+ return;
27930
+ void this._flushBuffer(payload.debugSession._id);
27858
27931
  });
27859
27932
  }
27933
+ async _createExceptionSession(span) {
27934
+ try {
27935
+ const session = await this._apiService.createErrorSession({ span });
27936
+ if (session) {
27937
+ void this._flushBuffer(session._id);
27938
+ }
27939
+ }
27940
+ catch (_ignored) { }
27941
+ }
27860
27942
  /**
27861
27943
  * Create a new session and start it
27862
27944
  */
@@ -27868,17 +27950,14 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_16__.Obse
27868
27950
  sessionAttributes: this.sessionAttributes,
27869
27951
  resourceAttributes: (0,_utils__WEBPACK_IMPORTED_MODULE_3__.getNavigatorInfo)(),
27870
27952
  name: this._getSessionName(),
27871
- ...(this._userAttributes ? { userAttributes: this._userAttributes } : {}),
27953
+ ...(this._userAttributes ? { userAttributes: this._userAttributes } : {})
27872
27954
  };
27873
- const request = !this.continuousRecording ?
27874
- payload : { debugSessionData: payload };
27955
+ const request = !this.continuousRecording ? payload : { debugSessionData: payload };
27875
27956
  const session = this.continuousRecording
27876
27957
  ? await this._apiService.startContinuousDebugSession(request, signal)
27877
27958
  : await this._apiService.startSession(request, signal);
27878
27959
  if (session) {
27879
- session.sessionType = this.continuousRecording
27880
- ? _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_0__.SessionType.CONTINUOUS
27881
- : _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_0__.SessionType.MANUAL;
27960
+ 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;
27882
27961
  this._setupSessionAndStart(session, false);
27883
27962
  }
27884
27963
  }
@@ -27900,7 +27979,7 @@ class SessionRecorder extends lib0_observable__WEBPACK_IMPORTED_MODULE_16__.Obse
27900
27979
  this._tracer.start(this.sessionId, this.sessionType);
27901
27980
  // Ensure we switch from buffer-only recording to session recording cleanly.
27902
27981
  void this._recorder.restart(this.sessionId, this.sessionType);
27903
- this._navigationRecorder.start({ sessionId: this.sessionId, sessionType: this.sessionType, });
27982
+ this._navigationRecorder.start({ sessionId: this.sessionId, sessionType: this.sessionType });
27904
27983
  if (this.session) {
27905
27984
  _eventBus__WEBPACK_IMPORTED_MODULE_7__.recorderEventBus.emit(_config__WEBPACK_IMPORTED_MODULE_5__.SESSION_STARTED_EVENT, this.session);
27906
27985
  this._socketService.subscribeToSession(this.session);
@@ -30182,7 +30261,10 @@ var SessionRecorderTraceIdRatioBasedSampler = /** @class */ (function () {
30182
30261
  }
30183
30262
  SessionRecorderTraceIdRatioBasedSampler.prototype.shouldSample = function (context, traceId) {
30184
30263
  if (traceId.startsWith(_constants_constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_DEBUG_PREFIX)
30185
- || traceId.startsWith(_constants_constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX)) {
30264
+ || traceId.startsWith(_constants_constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX)
30265
+ // || traceId.startsWith(MULTIPLAYER_TRACE_SESSION_CACHE_PREFIX)
30266
+ // || traceId.startsWith(MULTIPLAYER_TRACE_CONTINUOUS_SESSION_CACHE_PREFIX)
30267
+ ) {
30186
30268
  return {
30187
30269
  decision: _opentelemetry_sdk_trace_base__WEBPACK_IMPORTED_MODULE_1__.SamplingDecision.RECORD_AND_SAMPLED,
30188
30270
  };
@@ -30267,7 +30349,7 @@ var SessionRecorderTraceIdRatioBasedSampler = /** @class */ (function () {
30267
30349
  /* harmony export */ MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_URL: () => (/* binding */ MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_URL),
30268
30350
  /* harmony export */ MULTIPLAYER_TRACE_CLIENT_ID_LENGTH: () => (/* binding */ MULTIPLAYER_TRACE_CLIENT_ID_LENGTH),
30269
30351
  /* harmony export */ MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX: () => (/* binding */ MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX),
30270
- /* harmony export */ MULTIPLAYER_TRACE_CONTINUOUS_SESSION_DEBUG_PREFIX: () => (/* binding */ MULTIPLAYER_TRACE_CONTINUOUS_SESSION_DEBUG_PREFIX),
30352
+ /* harmony export */ MULTIPLAYER_TRACE_CONTINUOUS_SESSION_CACHE_PREFIX: () => (/* binding */ MULTIPLAYER_TRACE_CONTINUOUS_SESSION_CACHE_PREFIX),
30271
30353
  /* harmony export */ MULTIPLAYER_TRACE_DEBUG_PREFIX: () => (/* binding */ MULTIPLAYER_TRACE_DEBUG_PREFIX),
30272
30354
  /* harmony export */ MULTIPLAYER_TRACE_DEBUG_SESSION_SHORT_ID_LENGTH: () => (/* binding */ MULTIPLAYER_TRACE_DEBUG_SESSION_SHORT_ID_LENGTH),
30273
30355
  /* harmony export */ MULTIPLAYER_TRACE_DOC_PREFIX: () => (/* binding */ MULTIPLAYER_TRACE_DOC_PREFIX),
@@ -30284,11 +30366,11 @@ var MULTIPLAYER_TRACE_DOC_PREFIX = 'd0cd0c';
30284
30366
  var MULTIPLAYER_TRACE_DEBUG_PREFIX = 'debdeb';
30285
30367
  var MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX = 'cdbcdb';
30286
30368
  var MULTIPLAYER_TRACE_SESSION_CACHE_PREFIX = 'cdbcac';
30287
- var MULTIPLAYER_TRACE_CONTINUOUS_SESSION_DEBUG_PREFIX = 'debcdb';
30369
+ var MULTIPLAYER_TRACE_CONTINUOUS_SESSION_CACHE_PREFIX = 'debcdb';
30288
30370
  var MULTIPLAYER_TRACE_PREFIX_MAP = (_a = {},
30289
30371
  _a[_type__WEBPACK_IMPORTED_MODULE_0__.SessionType.CONTINUOUS] = MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX,
30290
30372
  _a[_type__WEBPACK_IMPORTED_MODULE_0__.SessionType.SESSION_CACHE] = MULTIPLAYER_TRACE_SESSION_CACHE_PREFIX,
30291
- _a[_type__WEBPACK_IMPORTED_MODULE_0__.SessionType.CONTINUOUS_SESSION_CACHE] = MULTIPLAYER_TRACE_CONTINUOUS_SESSION_DEBUG_PREFIX,
30373
+ _a[_type__WEBPACK_IMPORTED_MODULE_0__.SessionType.CONTINUOUS_SESSION_CACHE] = MULTIPLAYER_TRACE_CONTINUOUS_SESSION_CACHE_PREFIX,
30292
30374
  _a[_type__WEBPACK_IMPORTED_MODULE_0__.SessionType.MANUAL] = MULTIPLAYER_TRACE_DEBUG_PREFIX,
30293
30375
  _a);
30294
30376
  var MULTIPLAYER_TRACE_DEBUG_SESSION_SHORT_ID_LENGTH = 8;
@@ -30391,7 +30473,7 @@ var MASK_PLACEHOLDER = '***MASKED***';
30391
30473
  /* harmony export */ MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_URL: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_URL),
30392
30474
  /* harmony export */ MULTIPLAYER_TRACE_CLIENT_ID_LENGTH: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_CLIENT_ID_LENGTH),
30393
30475
  /* harmony export */ MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX),
30394
- /* harmony export */ MULTIPLAYER_TRACE_CONTINUOUS_SESSION_DEBUG_PREFIX: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_CONTINUOUS_SESSION_DEBUG_PREFIX),
30476
+ /* harmony export */ MULTIPLAYER_TRACE_CONTINUOUS_SESSION_CACHE_PREFIX: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_CONTINUOUS_SESSION_CACHE_PREFIX),
30395
30477
  /* harmony export */ MULTIPLAYER_TRACE_DEBUG_PREFIX: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_DEBUG_PREFIX),
30396
30478
  /* harmony export */ MULTIPLAYER_TRACE_DEBUG_SESSION_SHORT_ID_LENGTH: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_DEBUG_SESSION_SHORT_ID_LENGTH),
30397
30479
  /* harmony export */ MULTIPLAYER_TRACE_DOC_PREFIX: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_DOC_PREFIX),
@@ -30439,7 +30521,7 @@ var SessionRecorderBrowserTraceExporter = /** @class */ (function () {
30439
30521
  if (config === void 0) { config = {}; }
30440
30522
  this.usePostMessage = false;
30441
30523
  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;
30442
- this.config = __assign(__assign({}, config), { url: url, apiKey: apiKey, headers: headers, timeoutMillis: timeoutMillis, keepAlive: keepAlive, concurrencyLimit: concurrencyLimit });
30524
+ this.config = __assign(__assign({}, config), { url: url, apiKey: apiKey, headers: headers, keepAlive: keepAlive, timeoutMillis: timeoutMillis, concurrencyLimit: concurrencyLimit });
30443
30525
  this.postMessageType = postMessageType;
30444
30526
  this.postMessageTargetOrigin = postMessageTargetOrigin;
30445
30527
  this.exporter = this._createExporter();
@@ -30449,8 +30531,8 @@ var SessionRecorderBrowserTraceExporter = /** @class */ (function () {
30449
30531
  // Filter spans to only include those with Multiplayer trace prefixes
30450
30532
  var filteredSpans = spans.filter(function (span) {
30451
30533
  var traceId = span.spanContext().traceId;
30452
- return traceId.startsWith(_constants_constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_DEBUG_PREFIX) ||
30453
- traceId.startsWith(_constants_constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX);
30534
+ return (traceId.startsWith(_constants_constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_DEBUG_PREFIX) ||
30535
+ traceId.startsWith(_constants_constants_base__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX));
30454
30536
  });
30455
30537
  // Only proceed if there are filtered spans
30456
30538
  if (filteredSpans.length === 0) {
@@ -30477,6 +30559,14 @@ var SessionRecorderBrowserTraceExporter = /** @class */ (function () {
30477
30559
  SessionRecorderBrowserTraceExporter.prototype.shutdown = function () {
30478
30560
  return this.exporter.shutdown();
30479
30561
  };
30562
+ SessionRecorderBrowserTraceExporter.prototype.exportBuffer = function (spans) {
30563
+ var _this = this;
30564
+ return new Promise(function (resolve) {
30565
+ _this.exporter.export(spans, function (result) {
30566
+ resolve(result);
30567
+ });
30568
+ });
30569
+ };
30480
30570
  SessionRecorderBrowserTraceExporter.prototype.exportViaPostMessage = function (spans, resultCallback) {
30481
30571
  var _this = this;
30482
30572
  if (typeof window === 'undefined') {
@@ -30487,7 +30577,7 @@ var SessionRecorderBrowserTraceExporter = /** @class */ (function () {
30487
30577
  window.postMessage({
30488
30578
  action: 'traces',
30489
30579
  type: this.postMessageType,
30490
- payload: spans.map(function (span) { return _this._serializeSpan(span); }),
30580
+ payload: spans.map(function (span) { return _this.serializeSpan(span); })
30491
30581
  }, this.postMessageTargetOrigin);
30492
30582
  resultCallback({ code: 0 });
30493
30583
  }
@@ -30495,38 +30585,17 @@ var SessionRecorderBrowserTraceExporter = /** @class */ (function () {
30495
30585
  resultCallback({ code: 1 });
30496
30586
  }
30497
30587
  };
30498
- SessionRecorderBrowserTraceExporter.prototype._serializeSpan = function (span) {
30499
- var _a;
30588
+ SessionRecorderBrowserTraceExporter.prototype.serializeSpan = function (span) {
30500
30589
  var spanContext = span.spanContext();
30501
- return {
30502
- _spanContext: spanContext,
30503
- name: span.name,
30504
- kind: span.kind,
30505
- links: span.links,
30506
- ended: span.ended,
30507
- events: span.events,
30508
- status: span.status,
30509
- endTime: span.endTime,
30510
- startTime: span.startTime,
30511
- duration: span.duration,
30512
- attributes: span.attributes,
30513
- parentSpanId: (_a = span.parentSpanContext) === null || _a === void 0 ? void 0 : _a.spanId,
30514
- droppedAttributesCount: span.droppedAttributesCount,
30515
- droppedEventsCount: span.droppedEventsCount,
30516
- droppedLinksCount: span.droppedLinksCount,
30517
- resource: {
30518
- attributes: span.resource.attributes,
30519
- asyncAttributesPending: span.resource.asyncAttributesPending,
30520
- },
30521
- };
30590
+ return __assign(__assign({}, span), { _spanContext: spanContext });
30522
30591
  };
30523
30592
  SessionRecorderBrowserTraceExporter.prototype._createExporter = function () {
30524
30593
  return new _opentelemetry_exporter_trace_otlp_http__WEBPACK_IMPORTED_MODULE_1__.OTLPTraceExporter({
30525
30594
  url: this.config.url,
30526
- headers: __assign(__assign({ 'Content-Type': 'application/json' }, (this.config.apiKey ? { 'Authorization': this.config.apiKey } : {})), (this.config.headers || {})),
30595
+ headers: __assign(__assign({ 'Content-Type': 'application/json' }, (this.config.apiKey ? { Authorization: this.config.apiKey } : {})), (this.config.headers || {})),
30527
30596
  timeoutMillis: this.config.timeoutMillis,
30528
30597
  keepAlive: this.config.keepAlive,
30529
- concurrencyLimit: this.config.concurrencyLimit,
30598
+ concurrencyLimit: this.config.concurrencyLimit
30530
30599
  });
30531
30600
  };
30532
30601
  SessionRecorderBrowserTraceExporter.prototype.setApiKey = function (apiKey) {
@@ -30606,7 +30675,7 @@ var SessionRecorderBrowserTraceExporter = /** @class */ (function () {
30606
30675
  /* harmony export */ MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_URL: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_URL),
30607
30676
  /* harmony export */ MULTIPLAYER_TRACE_CLIENT_ID_LENGTH: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_CLIENT_ID_LENGTH),
30608
30677
  /* harmony export */ MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX),
30609
- /* harmony export */ MULTIPLAYER_TRACE_CONTINUOUS_SESSION_DEBUG_PREFIX: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_CONTINUOUS_SESSION_DEBUG_PREFIX),
30678
+ /* harmony export */ MULTIPLAYER_TRACE_CONTINUOUS_SESSION_CACHE_PREFIX: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_CONTINUOUS_SESSION_CACHE_PREFIX),
30610
30679
  /* harmony export */ MULTIPLAYER_TRACE_DEBUG_PREFIX: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_DEBUG_PREFIX),
30611
30680
  /* 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),
30612
30681
  /* harmony export */ MULTIPLAYER_TRACE_DOC_PREFIX: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.MULTIPLAYER_TRACE_DOC_PREFIX),
@@ -31216,6 +31285,18 @@ var setGrpcResponseMessage = function (body, options) {
31216
31285
 
31217
31286
  /***/ }),
31218
31287
 
31288
+ /***/ "../session-recorder-common/dist/esm/type/crash-buffer.js":
31289
+ /*!****************************************************************!*\
31290
+ !*** ../session-recorder-common/dist/esm/type/crash-buffer.js ***!
31291
+ \****************************************************************/
31292
+ /***/ (() => {
31293
+
31294
+ "use strict";
31295
+
31296
+ //# sourceMappingURL=crash-buffer.js.map
31297
+
31298
+ /***/ }),
31299
+
31219
31300
  /***/ "../session-recorder-common/dist/esm/type/index.js":
31220
31301
  /*!*********************************************************!*\
31221
31302
  !*** ../session-recorder-common/dist/esm/type/index.js ***!
@@ -31231,6 +31312,8 @@ var setGrpcResponseMessage = function (body, options) {
31231
31312
  /* 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");
31232
31313
  /* 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");
31233
31314
  /* harmony import */ var _session__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./session */ "../session-recorder-common/dist/esm/type/session.js");
31315
+ /* harmony import */ var _crash_buffer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./crash-buffer */ "../session-recorder-common/dist/esm/type/crash-buffer.js");
31316
+
31234
31317
 
31235
31318
 
31236
31319
 
@@ -49697,7 +49780,7 @@ __webpack_require__.r(__webpack_exports__);
49697
49780
  /* 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),
49698
49781
  /* harmony export */ MULTIPLAYER_TRACE_CLIENT_ID_LENGTH: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_7__.MULTIPLAYER_TRACE_CLIENT_ID_LENGTH),
49699
49782
  /* harmony export */ MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_7__.MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX),
49700
- /* 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),
49783
+ /* 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),
49701
49784
  /* harmony export */ MULTIPLAYER_TRACE_DEBUG_PREFIX: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_7__.MULTIPLAYER_TRACE_DEBUG_PREFIX),
49702
49785
  /* 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),
49703
49786
  /* harmony export */ MULTIPLAYER_TRACE_DOC_PREFIX: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_7__.MULTIPLAYER_TRACE_DOC_PREFIX),