@multiplayer-app/session-recorder-browser 2.0.80 → 2.0.83-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/dist/chunks/socket-io.js +5329 -0
  2. package/dist/index.js +28645 -50544
  3. package/dist/index.umd.js +26275 -34759
  4. package/dist/observable.d.ts +9 -0
  5. package/dist/observable.js +39 -0
  6. package/dist/otel/instrumentations/index.d.ts +4 -1
  7. package/dist/otel/instrumentations/index.js +88 -88
  8. package/dist/services/socket.service.d.ts +1 -1
  9. package/dist/services/socket.service.js +3 -3
  10. package/dist/session-recorder.d.ts +2 -1
  11. package/dist/session-recorder.js +23 -7
  12. package/dist/sessionWidget/index.d.ts +1 -1
  13. package/dist/sessionWidget/index.js +1 -1
  14. package/dist/socket-io.index.js +22 -0
  15. package/dist/types/session-recorder.d.ts +1 -1
  16. package/package.json +13 -10
  17. package/dist/browser/index.js +0 -58105
  18. package/dist/config/constants.d.ts.map +0 -1
  19. package/dist/config/constants.js.map +0 -1
  20. package/dist/config/defaults.d.ts.map +0 -1
  21. package/dist/config/defaults.js.map +0 -1
  22. package/dist/config/index.d.ts.map +0 -1
  23. package/dist/config/index.js.map +0 -1
  24. package/dist/config/masking.d.ts.map +0 -1
  25. package/dist/config/masking.js.map +0 -1
  26. package/dist/config/session-recorder.d.ts.map +0 -1
  27. package/dist/config/session-recorder.js.map +0 -1
  28. package/dist/config/validators.d.ts.map +0 -1
  29. package/dist/config/validators.js.map +0 -1
  30. package/dist/eventBus.d.ts.map +0 -1
  31. package/dist/eventBus.js.map +0 -1
  32. package/dist/exporters/index.js +0 -3
  33. package/dist/exporters/index.js.LICENSE.txt +0 -269
  34. package/dist/exporters/index.js.map +0 -1
  35. package/dist/exporters.d.ts.map +0 -1
  36. package/dist/exporters.js.map +0 -1
  37. package/dist/global.d.ts.map +0 -1
  38. package/dist/global.js.map +0 -1
  39. package/dist/index.d.ts.map +0 -1
  40. package/dist/index.js.map +0 -1
  41. package/dist/index.umd.js.map +0 -1
  42. package/dist/listeners.d.ts.map +0 -1
  43. package/dist/listeners.js.map +0 -1
  44. package/dist/navigation/index.d.ts.map +0 -1
  45. package/dist/navigation/index.js.map +0 -1
  46. package/dist/navigation/navigationRecorder.d.ts.map +0 -1
  47. package/dist/navigation/navigationRecorder.js.map +0 -1
  48. package/dist/navigation/types.d.ts.map +0 -1
  49. package/dist/navigation/types.js.map +0 -1
  50. package/dist/otel/CrashBufferSpanProcessor.d.ts.map +0 -1
  51. package/dist/otel/CrashBufferSpanProcessor.js.map +0 -1
  52. package/dist/otel/helpers.d.ts.map +0 -1
  53. package/dist/otel/helpers.js.map +0 -1
  54. package/dist/otel/index.d.ts.map +0 -1
  55. package/dist/otel/index.js.map +0 -1
  56. package/dist/otel/instrumentations/index.d.ts.map +0 -1
  57. package/dist/otel/instrumentations/index.js.map +0 -1
  58. package/dist/otel/types.d.ts.map +0 -1
  59. package/dist/otel/types.js.map +0 -1
  60. package/dist/patch/configs.d.ts.map +0 -1
  61. package/dist/patch/configs.js.map +0 -1
  62. package/dist/patch/fetch.d.ts.map +0 -1
  63. package/dist/patch/fetch.js.map +0 -1
  64. package/dist/patch/index.d.ts.map +0 -1
  65. package/dist/patch/index.js.map +0 -1
  66. package/dist/patch/xhr.d.ts.map +0 -1
  67. package/dist/patch/xhr.js.map +0 -1
  68. package/dist/rrweb/index.d.ts.map +0 -1
  69. package/dist/rrweb/index.js.map +0 -1
  70. package/dist/services/api.service.d.ts.map +0 -1
  71. package/dist/services/api.service.js.map +0 -1
  72. package/dist/services/crashBuffer.service.d.ts.map +0 -1
  73. package/dist/services/crashBuffer.service.js.map +0 -1
  74. package/dist/services/indexedDb.service.d.ts.map +0 -1
  75. package/dist/services/indexedDb.service.js.map +0 -1
  76. package/dist/services/messaging.service.d.ts.map +0 -1
  77. package/dist/services/messaging.service.js.map +0 -1
  78. package/dist/services/socket.service.d.ts.map +0 -1
  79. package/dist/services/socket.service.js.map +0 -1
  80. package/dist/session-recorder.d.ts.map +0 -1
  81. package/dist/session-recorder.js.map +0 -1
  82. package/dist/sessionWidget/UIManager.d.ts.map +0 -1
  83. package/dist/sessionWidget/UIManager.js.map +0 -1
  84. package/dist/sessionWidget/buttonStateConfigs.d.ts.map +0 -1
  85. package/dist/sessionWidget/buttonStateConfigs.js.map +0 -1
  86. package/dist/sessionWidget/constants.d.ts.map +0 -1
  87. package/dist/sessionWidget/constants.js.map +0 -1
  88. package/dist/sessionWidget/dragManager.d.ts.map +0 -1
  89. package/dist/sessionWidget/dragManager.js.map +0 -1
  90. package/dist/sessionWidget/index.d.ts.map +0 -1
  91. package/dist/sessionWidget/index.js.map +0 -1
  92. package/dist/sessionWidget/templates/finalPopover.d.ts.map +0 -1
  93. package/dist/sessionWidget/templates/finalPopover.js.map +0 -1
  94. package/dist/sessionWidget/templates/icons.d.ts.map +0 -1
  95. package/dist/sessionWidget/templates/icons.js.map +0 -1
  96. package/dist/sessionWidget/templates/initialPopover.d.ts.map +0 -1
  97. package/dist/sessionWidget/templates/initialPopover.js.map +0 -1
  98. package/dist/sessionWidget/templates/recordingOverlay.d.ts.map +0 -1
  99. package/dist/sessionWidget/templates/recordingOverlay.js.map +0 -1
  100. package/dist/sessionWidget/templates/submitSessionDialog.d.ts.map +0 -1
  101. package/dist/sessionWidget/templates/submitSessionDialog.js.map +0 -1
  102. package/dist/sessionWidget/templates/toast.d.ts.map +0 -1
  103. package/dist/sessionWidget/templates/toast.js.map +0 -1
  104. package/dist/types/index.d.ts.map +0 -1
  105. package/dist/types/index.js.map +0 -1
  106. package/dist/types/session-recorder.d.ts.map +0 -1
  107. package/dist/types/session-recorder.js.map +0 -1
  108. package/dist/types/widget.d.ts.map +0 -1
  109. package/dist/types/widget.js.map +0 -1
  110. package/dist/utils/array.d.ts.map +0 -1
  111. package/dist/utils/array.js.map +0 -1
  112. package/dist/utils/dom.d.ts.map +0 -1
  113. package/dist/utils/dom.js.map +0 -1
  114. package/dist/utils/globals.d.ts.map +0 -1
  115. package/dist/utils/globals.js.map +0 -1
  116. package/dist/utils/index.d.ts.map +0 -1
  117. package/dist/utils/index.js.map +0 -1
  118. package/dist/utils/navigator.d.ts.map +0 -1
  119. package/dist/utils/navigator.js.map +0 -1
  120. package/dist/utils/request-utils.d.ts.map +0 -1
  121. package/dist/utils/request-utils.js.map +0 -1
  122. package/dist/utils/session.d.ts.map +0 -1
  123. package/dist/utils/session.js.map +0 -1
  124. package/dist/utils/storage.d.ts.map +0 -1
  125. package/dist/utils/storage.js.map +0 -1
  126. package/dist/utils/tabId.d.ts.map +0 -1
  127. package/dist/utils/tabId.js.map +0 -1
  128. package/dist/utils/time.d.ts.map +0 -1
  129. package/dist/utils/time.js.map +0 -1
  130. package/dist/utils/type-utils.d.ts.map +0 -1
  131. package/dist/utils/type-utils.js.map +0 -1
@@ -0,0 +1,9 @@
1
+ export declare class Observable<N extends string> {
2
+ protected _observers: Map<N, Set<Function>>;
3
+ on(name: N, f: Function): void;
4
+ once(name: N, f: Function): void;
5
+ off(name: N, f: Function): void;
6
+ emit(name: N, args: any[]): void;
7
+ destroy(): void;
8
+ }
9
+ //# sourceMappingURL=observable.d.ts.map
@@ -0,0 +1,39 @@
1
+ export class Observable {
2
+ constructor() {
3
+ this._observers = new Map();
4
+ }
5
+ on(name, f) {
6
+ let listeners = this._observers.get(name);
7
+ if (!listeners) {
8
+ listeners = new Set();
9
+ this._observers.set(name, listeners);
10
+ }
11
+ listeners.add(f);
12
+ }
13
+ once(name, f) {
14
+ const _f = (...args) => {
15
+ this.off(name, _f);
16
+ f(...args);
17
+ };
18
+ this.on(name, _f);
19
+ }
20
+ off(name, f) {
21
+ const observers = this._observers.get(name);
22
+ if (observers) {
23
+ observers.delete(f);
24
+ if (observers.size === 0) {
25
+ this._observers.delete(name);
26
+ }
27
+ }
28
+ }
29
+ emit(name, args) {
30
+ const listeners = this._observers.get(name);
31
+ if (listeners) {
32
+ Array.from(listeners).forEach((f) => f(...args));
33
+ }
34
+ }
35
+ destroy() {
36
+ this._observers.clear();
37
+ }
38
+ }
39
+ //# sourceMappingURL=observable.js.map
@@ -1,3 +1,6 @@
1
+ import { XMLHttpRequestInstrumentation } from '@opentelemetry/instrumentation-xml-http-request';
2
+ import { FetchInstrumentation } from '@opentelemetry/instrumentation-fetch';
3
+ import { UserInteractionInstrumentation } from '@opentelemetry/instrumentation-user-interaction';
1
4
  import { TracerBrowserConfig } from '../../types';
2
- export declare const getInstrumentations: (config: TracerBrowserConfig) => import("@opentelemetry/instrumentation").Instrumentation<import("@opentelemetry/instrumentation").InstrumentationConfig>[][];
5
+ export declare const getInstrumentations: (config: TracerBrowserConfig) => (XMLHttpRequestInstrumentation | FetchInstrumentation | UserInteractionInstrumentation)[];
3
6
  //# sourceMappingURL=index.d.ts.map
@@ -1,102 +1,102 @@
1
- import { getWebAutoInstrumentations } from '@opentelemetry/auto-instrumentations-web';
1
+ import { XMLHttpRequestInstrumentation } from '@opentelemetry/instrumentation-xml-http-request';
2
+ import { FetchInstrumentation } from '@opentelemetry/instrumentation-fetch';
3
+ import { UserInteractionInstrumentation } from '@opentelemetry/instrumentation-user-interaction';
2
4
  import { headersToObject, processHttpPayload, extractResponseBody, getElementInnerText, getElementTextContent, } from '../helpers';
3
5
  import { OTEL_IGNORE_URLS } from '../../config';
4
6
  export const getInstrumentations = (config) => {
5
7
  return [
6
- getWebAutoInstrumentations({
7
- '@opentelemetry/instrumentation-xml-http-request': {
8
- clearTimingResources: true,
9
- ignoreUrls: [...OTEL_IGNORE_URLS, ...(config.ignoreUrls || [])],
10
- propagateTraceHeaderCorsUrls: config.propagateTraceHeaderCorsUrls,
11
- applyCustomAttributesOnSpan: (span, xhr) => {
12
- if (!config)
8
+ new XMLHttpRequestInstrumentation({
9
+ clearTimingResources: true,
10
+ ignoreUrls: [...OTEL_IGNORE_URLS, ...(config.ignoreUrls || [])],
11
+ propagateTraceHeaderCorsUrls: config.propagateTraceHeaderCorsUrls,
12
+ applyCustomAttributesOnSpan: (span, xhr) => {
13
+ if (!config)
14
+ return;
15
+ const { captureBody, captureHeaders } = config;
16
+ try {
17
+ if (!captureBody && !captureHeaders) {
13
18
  return;
14
- const { captureBody, captureHeaders } = config;
15
- try {
16
- if (!captureBody && !captureHeaders) {
17
- return;
18
- }
19
- // @ts-ignore
20
- const networkRequest = xhr.networkRequest;
21
- const requestBody = networkRequest.requestBody;
22
- const responseBody = networkRequest.responseBody;
23
- const requestHeaders = networkRequest.requestHeaders || {};
24
- const responseHeaders = networkRequest.responseHeaders || {};
25
- const payload = {
26
- requestBody,
27
- responseBody,
28
- requestHeaders,
29
- responseHeaders,
30
- };
31
- processHttpPayload(payload, config, span);
32
- }
33
- catch (error) {
34
- // eslint-disable-next-line
35
- console.error('[MULTIPLAYER_SESSION_RECORDER] Failed to capture xml-http payload', error);
36
19
  }
37
- },
20
+ // @ts-ignore
21
+ const networkRequest = xhr.networkRequest;
22
+ const requestBody = networkRequest.requestBody;
23
+ const responseBody = networkRequest.responseBody;
24
+ const requestHeaders = networkRequest.requestHeaders || {};
25
+ const responseHeaders = networkRequest.responseHeaders || {};
26
+ const payload = {
27
+ requestBody,
28
+ responseBody,
29
+ requestHeaders,
30
+ responseHeaders,
31
+ };
32
+ processHttpPayload(payload, config, span);
33
+ }
34
+ catch (error) {
35
+ // eslint-disable-next-line
36
+ console.error('[MULTIPLAYER_SESSION_RECORDER] Failed to capture xml-http payload', error);
37
+ }
38
38
  },
39
- '@opentelemetry/instrumentation-fetch': {
40
- clearTimingResources: true,
41
- ignoreUrls: [...OTEL_IGNORE_URLS, ...(config.ignoreUrls || [])],
42
- propagateTraceHeaderCorsUrls: config.propagateTraceHeaderCorsUrls,
43
- applyCustomAttributesOnSpan: async (span, request, response) => {
44
- if (!config)
39
+ }),
40
+ new FetchInstrumentation({
41
+ clearTimingResources: true,
42
+ ignoreUrls: [...OTEL_IGNORE_URLS, ...(config.ignoreUrls || [])],
43
+ propagateTraceHeaderCorsUrls: config.propagateTraceHeaderCorsUrls,
44
+ applyCustomAttributesOnSpan: async (span, request, response) => {
45
+ if (!config)
46
+ return;
47
+ const { captureBody, captureHeaders } = config;
48
+ try {
49
+ if (!captureBody && !captureHeaders) {
45
50
  return;
46
- const { captureBody, captureHeaders } = config;
47
- try {
48
- if (!captureBody && !captureHeaders) {
49
- return;
50
- }
51
- // Try to get data from our fetch wrapper first
52
- // @ts-ignore
53
- const networkRequest = response === null || response === void 0 ? void 0 : response.networkRequest;
54
- let requestBody = null;
55
- let responseBody = null;
56
- let requestHeaders = {};
57
- let responseHeaders = {};
58
- if (networkRequest) {
59
- // Use data captured by our fetch wrapper
60
- requestBody = networkRequest.requestBody;
61
- responseBody = networkRequest.responseBody;
62
- requestHeaders = networkRequest.requestHeaders || {};
63
- responseHeaders = networkRequest.responseHeaders || {};
64
- }
65
- else {
66
- // Fallback to original OpenTelemetry approach
67
- requestBody = request.body;
68
- requestHeaders = headersToObject(request.headers);
69
- responseHeaders = headersToObject(response instanceof Response ? response.headers : undefined);
70
- if (response instanceof Response && response.body) {
71
- responseBody = await extractResponseBody(response);
72
- }
73
- }
74
- const payload = {
75
- requestBody,
76
- responseBody,
77
- requestHeaders,
78
- responseHeaders,
79
- };
80
- processHttpPayload(payload, config, span);
81
51
  }
82
- catch (error) {
83
- // eslint-disable-next-line
84
- console.error('[MULTIPLAYER_SESSION_RECORDER] Failed to capture fetch payload', error);
52
+ // Try to get data from our fetch wrapper first
53
+ // @ts-ignore
54
+ const networkRequest = response === null || response === void 0 ? void 0 : response.networkRequest;
55
+ let requestBody = null;
56
+ let responseBody = null;
57
+ let requestHeaders = {};
58
+ let responseHeaders = {};
59
+ if (networkRequest) {
60
+ // Use data captured by our fetch wrapper
61
+ requestBody = networkRequest.requestBody;
62
+ responseBody = networkRequest.responseBody;
63
+ requestHeaders = networkRequest.requestHeaders || {};
64
+ responseHeaders = networkRequest.responseHeaders || {};
85
65
  }
86
- },
87
- },
88
- '@opentelemetry/instrumentation-user-interaction': {
89
- shouldPreventSpanCreation: (_event, element, span) => {
90
- if (span['parentSpanContext']) {
91
- return true;
66
+ else {
67
+ // Fallback to original OpenTelemetry approach
68
+ requestBody = request.body;
69
+ requestHeaders = headersToObject(request.headers);
70
+ responseHeaders = headersToObject(response instanceof Response ? response.headers : undefined);
71
+ if (response instanceof Response && response.body) {
72
+ responseBody = await extractResponseBody(response);
73
+ }
92
74
  }
93
- span.setAttribute('target.innerText', getElementInnerText(element));
94
- span.setAttribute('target.textContent', getElementTextContent(element));
95
- Array.from(element.attributes).forEach((attribute) => {
96
- span.setAttribute(`target.attribute.${attribute.name}`, attribute.value);
97
- });
98
- return false;
99
- },
75
+ const payload = {
76
+ requestBody,
77
+ responseBody,
78
+ requestHeaders,
79
+ responseHeaders,
80
+ };
81
+ processHttpPayload(payload, config, span);
82
+ }
83
+ catch (error) {
84
+ // eslint-disable-next-line
85
+ console.error('[MULTIPLAYER_SESSION_RECORDER] Failed to capture fetch payload', error);
86
+ }
87
+ },
88
+ }),
89
+ new UserInteractionInstrumentation({
90
+ shouldPreventSpanCreation: (_event, element, span) => {
91
+ if (span['parentSpanContext']) {
92
+ return true;
93
+ }
94
+ span.setAttribute('target.innerText', getElementInnerText(element));
95
+ span.setAttribute('target.textContent', getElementTextContent(element));
96
+ Array.from(element.attributes).forEach((attribute) => {
97
+ span.setAttribute(`target.attribute.${attribute.name}`, attribute.value);
98
+ });
99
+ return false;
100
100
  },
101
101
  }),
102
102
  ];
@@ -1,4 +1,4 @@
1
- import { Observable } from 'lib0/observable';
1
+ import { Observable } from '../observable';
2
2
  import { SESSION_AUTO_CREATED, SESSION_STOPPED_EVENT, REMOTE_SESSION_RECORDING_START, REMOTE_SESSION_RECORDING_STOP, SESSION_SAVE_BUFFER_EVENT } from '../config';
3
3
  import { type ISession, type IUserAttributes } from '@multiplayer-app/session-recorder-common';
4
4
  export type SocketServiceEvents = typeof SESSION_STOPPED_EVENT | typeof SESSION_AUTO_CREATED | typeof REMOTE_SESSION_RECORDING_START | typeof REMOTE_SESSION_RECORDING_STOP | typeof SESSION_SAVE_BUFFER_EVENT;
@@ -1,5 +1,4 @@
1
- import io from 'socket.io-client';
2
- import { Observable } from 'lib0/observable';
1
+ import { Observable } from '../observable';
3
2
  import messagingService from '../services/messaging.service';
4
3
  import { SESSION_ADD_EVENT, SESSION_AUTO_CREATED, SESSION_STOPPED_EVENT, SESSION_SUBSCRIBE_EVENT, SESSION_UNSUBSCRIBE_EVENT, SOCKET_SET_USER_EVENT, REMOTE_SESSION_RECORDING_START, REMOTE_SESSION_RECORDING_STOP, SESSION_STARTED_EVENT, SESSION_SAVE_BUFFER_EVENT, } from '../config';
5
4
  import { ATTR_MULTIPLAYER_SESSION_CLIENT_ID, } from '@multiplayer-app/session-recorder-common';
@@ -60,12 +59,13 @@ export class SocketService extends Observable {
60
59
  }
61
60
  }
62
61
  }
63
- _initConnection() {
62
+ async _initConnection() {
64
63
  if (this.isConnecting || this.isConnected || !this.isInitialized)
65
64
  return;
66
65
  this.attempts++;
67
66
  this.isConnecting = true;
68
67
  this.usePostMessage = false;
68
+ const { default: io } = await import(/* webpackChunkName: "socket-io" */ 'socket.io-client');
69
69
  this.socket = io(this.options.socketUrl, {
70
70
  path: '/v0/radar/ws',
71
71
  auth: {
@@ -1,4 +1,4 @@
1
- import { Observable } from 'lib0/observable';
1
+ import { Observable } from './observable';
2
2
  import { SessionType, type ISession, type IUserAttributes } from '@multiplayer-app/session-recorder-common';
3
3
  import { SessionState, SessionRecorderOptions, SessionRecorderEvents } from './types';
4
4
  import { ISessionRecorder } from './types';
@@ -193,6 +193,7 @@ export declare class SessionRecorder extends Observable<SessionRecorderEvents> i
193
193
  */
194
194
  private _checkOperation;
195
195
  private _normalizeError;
196
+ private _normalizePromiseRejectionMessage;
196
197
  private _normalizeErrorInfo;
197
198
  /**
198
199
  * Get the session name
@@ -1,4 +1,4 @@
1
- import { Observable } from 'lib0/observable';
1
+ import { Observable } from './observable';
2
2
  import { SessionType } from '@multiplayer-app/session-recorder-common';
3
3
  import { TracerBrowserSDK } from './otel';
4
4
  import { RecorderBrowserSDK } from './rrweb';
@@ -433,14 +433,14 @@ export class SessionRecorder extends Observable {
433
433
  this.error = (e === null || e === void 0 ? void 0 : e.message) || 'Failed to capture exception';
434
434
  }
435
435
  }
436
- async _flushBuffer(sessionId) {
436
+ async _flushBuffer(sessionId, force = false) {
437
437
  if (!sessionId || !this._crashBuffer || this._isFlushingBuffer) {
438
438
  return null;
439
439
  }
440
440
  this._isFlushingBuffer = true;
441
441
  try {
442
442
  const { events, spans, startedAt, stoppedAt } = await this._crashBuffer.snapshot();
443
- if (events.length === 0 && spans.length === 0) {
443
+ if (events.length === 0 && spans.length === 0 && !force) {
444
444
  return null;
445
445
  }
446
446
  await Promise.all([
@@ -630,7 +630,7 @@ export class SessionRecorder extends Observable {
630
630
  var _a, _b, _c;
631
631
  if (this.sessionState !== SessionState.stopped)
632
632
  return;
633
- this._flushBuffer((_a = payload === null || payload === void 0 ? void 0 : payload.debugSession) === null || _a === void 0 ? void 0 : _a._id);
633
+ this._flushBuffer((_a = payload === null || payload === void 0 ? void 0 : payload.debugSession) === null || _a === void 0 ? void 0 : _a._id, true);
634
634
  if ((_b = payload === null || payload === void 0 ? void 0 : payload.debugSession) === null || _b === void 0 ? void 0 : _b.url) {
635
635
  recorderEventBus.emit(SESSION_AUTO_CREATED, (_c = payload === null || payload === void 0 ? void 0 : payload.debugSession) === null || _c === void 0 ? void 0 : _c.url);
636
636
  }
@@ -813,10 +813,18 @@ export class SessionRecorder extends Observable {
813
813
  }
814
814
  }
815
815
  _normalizeError(error) {
816
- if (error instanceof Error)
817
- return error;
816
+ var _a;
817
+ if (error instanceof Error) {
818
+ const message = this._normalizePromiseRejectionMessage(error.message);
819
+ if (message === error.message)
820
+ return error;
821
+ const normalizedError = new Error(message);
822
+ normalizedError.name = error.name;
823
+ normalizedError.stack = (_a = error.stack) === null || _a === void 0 ? void 0 : _a.replace(error.message, message);
824
+ return normalizedError;
825
+ }
818
826
  if (typeof error === 'string')
819
- return new Error(error);
827
+ return new Error(this._normalizePromiseRejectionMessage(error));
820
828
  try {
821
829
  return new Error(JSON.stringify(error));
822
830
  }
@@ -824,6 +832,14 @@ export class SessionRecorder extends Observable {
824
832
  return new Error(String(error));
825
833
  }
826
834
  }
835
+ _normalizePromiseRejectionMessage(message) {
836
+ const prefix = 'Unhandled Promise Rejection:';
837
+ let normalizedMessage = message.trim();
838
+ while (normalizedMessage.startsWith(prefix)) {
839
+ normalizedMessage = normalizedMessage.slice(prefix.length).trim();
840
+ }
841
+ return normalizedMessage || message;
842
+ }
827
843
  _normalizeErrorInfo(errorInfo) {
828
844
  if (!errorInfo)
829
845
  return {};
@@ -1,4 +1,4 @@
1
- import { Observable } from 'lib0/observable';
1
+ import { Observable } from '../observable';
2
2
  import { SessionWidgetConfig, SessionState, ToastConfig } from '../types';
3
3
  import { ButtonState, ContinuousRecordingSaveButtonState } from './buttonStateConfigs';
4
4
  import './styles/button.scss';
@@ -1,4 +1,4 @@
1
- import { Observable } from 'lib0/observable';
1
+ import { Observable } from '../observable';
2
2
  import { insertTrustedHTML, injectStylesIntoShadowRoot, formatTimeForSessionTimer } from '../utils';
3
3
  import { SessionState } from '../types';
4
4
  import { POPOVER_WIDTH, NON_DRAGGABLE_OFFSET, POPOVER_DISTANCE_FROM_BUTTON, } from './constants';
@@ -0,0 +1,22 @@
1
+ import * as __WEBPACK_EXTERNAL_MODULE_socket_io_client_a48daf0e__ from "socket.io-client";
2
+ export const __webpack_esm_id__ = "socket-io";
3
+ export const __webpack_esm_ids__ = ["socket-io"];
4
+ export const __webpack_esm_modules__ = {
5
+
6
+ /***/ "socket.io-client"
7
+ /*!***********************************!*\
8
+ !*** external "socket.io-client" ***!
9
+ \***********************************/
10
+ (module, __unused_webpack_exports, __webpack_require__) {
11
+
12
+ var x = (y) => {
13
+ var x = {}; __webpack_require__.d(x, y); return x
14
+ }
15
+ var y = (x) => (() => (x))
16
+ module.exports = x({ ["default"]: () => (__WEBPACK_EXTERNAL_MODULE_socket_io_client_a48daf0e__["default"]) });
17
+
18
+ /***/ }
19
+
20
+ };
21
+
22
+ //# sourceMappingURL=socket-io.index.js.map
@@ -4,7 +4,7 @@ import { PropagateTraceHeaderCorsUrls } from '@opentelemetry/sdk-trace-web';
4
4
  import type { MaskTextFn, MaskInputFn, MaskInputOptions } from 'rrweb-snapshot';
5
5
  import type { maskTextClass } from '@rrweb/types';
6
6
  import { LogData } from '@rrweb/rrweb-plugin-console-record';
7
- import { Observable } from 'lib0/observable';
7
+ import { Observable } from '../observable';
8
8
  import type { NavigationRecorderPublicApi } from '../navigation';
9
9
  export declare enum WidgetButtonPlacement {
10
10
  topLeft = "top-left",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@multiplayer-app/session-recorder-browser",
3
- "version": "2.0.80",
3
+ "version": "2.0.83-beta.0",
4
4
  "description": "Multiplayer Fullstack Session Recorder for Browser",
5
5
  "author": {
6
6
  "name": "Multiplayer Software, Inc.",
@@ -19,6 +19,7 @@
19
19
  "types": "dist/index.d.ts",
20
20
  "files": [
21
21
  "dist/**",
22
+ "!dist/**/*.map",
22
23
  "README.md",
23
24
  "LICENSE"
24
25
  ],
@@ -27,9 +28,7 @@
27
28
  "types": "./dist/index.d.ts",
28
29
  "import": "./dist/index.js",
29
30
  "require": "./dist/index.umd.js"
30
- },
31
- "./browser": "./dist/browser/index.js",
32
- "./exporters": "./dist/exporters/index.js"
31
+ }
33
32
  },
34
33
  "engines": {
35
34
  "node": ">=18",
@@ -49,8 +48,12 @@
49
48
  "lint": "eslint 'src/**/*.ts' --config eslint.config.js",
50
49
  "preversion": "npm run lint",
51
50
  "postversion:skip": "git push && git push --tags",
52
- "build": "rm -rf dist tsconfig.tsbuildinfo && tsc && webpack",
53
- "prepublishOnly": "npm run build"
51
+ "build": "rm -rf dist tsconfig.tsbuildinfo && tsc && webpack --config-name esm --config-name umd && node scripts/sync-exports.js",
52
+ "build:browser": "webpack --config-name browser && node scripts/sync-exports.js",
53
+ "build:exporters": "webpack --config-name exporters && node scripts/sync-exports.js",
54
+ "build:extras": "webpack --config-name browser --config-name exporters && node scripts/sync-exports.js",
55
+ "build:all": "rm -rf dist tsconfig.tsbuildinfo && tsc && webpack && node scripts/sync-exports.js",
56
+ "prepublishOnly": "npm run build:all"
54
57
  },
55
58
  "devDependencies": {
56
59
  "@types/node": "^22.0.0",
@@ -70,12 +73,13 @@
70
73
  "webpack-cli": "5.1.4"
71
74
  },
72
75
  "dependencies": {
73
- "@multiplayer-app/session-recorder-common": "2.0.80",
74
- "@opentelemetry/auto-instrumentations-web": "0.49.0",
75
- "@opentelemetry/context-zone": "2.0.1",
76
+ "@multiplayer-app/session-recorder-common": "2.0.83-beta.0",
76
77
  "@opentelemetry/core": "2.0.1",
77
78
  "@opentelemetry/exporter-trace-otlp-http": "0.203.0",
78
79
  "@opentelemetry/instrumentation": "0.203.0",
80
+ "@opentelemetry/instrumentation-fetch": "0.203.0",
81
+ "@opentelemetry/instrumentation-user-interaction": "0.48.1",
82
+ "@opentelemetry/instrumentation-xml-http-request": "0.203.0",
79
83
  "@opentelemetry/otlp-exporter-base": "0.203.0",
80
84
  "@opentelemetry/otlp-transformer": "0.203.0",
81
85
  "@opentelemetry/resources": "2.0.1",
@@ -85,7 +89,6 @@
85
89
  "@rrweb/packer": "2.0.0-alpha.20",
86
90
  "@rrweb/rrweb-plugin-console-record": "2.0.0-alpha.20",
87
91
  "dompurify": "^3.4.2",
88
- "lib0": "0.2.82",
89
92
  "rrweb": "2.0.0-alpha.20",
90
93
  "socket.io-client": "4.7.5",
91
94
  "to-json-schema": "^0.2.5"