@multiplayer-app/session-recorder-browser 1.2.9 → 1.2.11

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.
@@ -25245,7 +25245,7 @@ const DEFAULT_MAX_HTTP_CAPTURING_PAYLOAD_SIZE = 100000;
25245
25245
  const SESSION_RESPONSE = 'multiplayer-debug-session-response';
25246
25246
  const CONTINUOUS_DEBUGGING_TIMEOUT = 60000; // 1 minutes
25247
25247
  const DEBUG_SESSION_MAX_DURATION_SECONDS = 10 * 60 + 30; // TODO: move to shared config otel core
25248
- const PACKAGE_VERSION_EXPORT = "1.2.9" || 0;
25248
+ const PACKAGE_VERSION_EXPORT = "1.2.11" || 0;
25249
25249
  // Regex patterns for OpenTelemetry ignore URLs
25250
25250
  const OTEL_IGNORE_URLS = [
25251
25251
  // Traces endpoint
@@ -25842,7 +25842,7 @@ async function extractResponseBody(response) {
25842
25842
  catch (error) {
25843
25843
  // If cloning fails (body already consumed), return null
25844
25844
  // eslint-disable-next-line no-console
25845
- console.warn('[DEBUGGER_LIB] Failed to extract response body:', error);
25845
+ console.warn('[MULTIPLAYER_SESSION_RECORDER] Failed to extract response body:', error);
25846
25846
  return null;
25847
25847
  }
25848
25848
  }
@@ -25902,7 +25902,7 @@ class TracerBrowserSDK {
25902
25902
  this.allowedElements = new Set(['A', 'BUTTON']);
25903
25903
  this.sessionId = '';
25904
25904
  }
25905
- setSessionId(sessionId, sessionType = _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_1__.SessionType.MANUAL) {
25905
+ setSessionId(sessionId, sessionType = _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_1__.SessionType.PLAIN) {
25906
25906
  this.sessionId = sessionId;
25907
25907
  this.idGenerator.setSessionId(sessionId, sessionType);
25908
25908
  }
@@ -25952,13 +25952,11 @@ class TracerBrowserSDK {
25952
25952
  return;
25953
25953
  }
25954
25954
  // @ts-ignore
25955
- const requestBody = xhr.networkRequest.requestBody;
25956
- // @ts-ignore
25957
- const responseBody = xhr.networkRequest.responseBody;
25958
- // @ts-ignore
25959
- const requestHeaders = xhr.networkRequest.requestHeaders || {};
25960
- // @ts-ignore
25961
- const responseHeaders = xhr.networkRequest.responseHeaders || {};
25955
+ const networkRequest = xhr.networkRequest;
25956
+ const requestBody = networkRequest.requestBody;
25957
+ const responseBody = networkRequest.responseBody;
25958
+ const requestHeaders = networkRequest.requestHeaders || {};
25959
+ const responseHeaders = networkRequest.responseHeaders || {};
25962
25960
  const payload = {
25963
25961
  requestBody,
25964
25962
  responseBody,
@@ -25969,7 +25967,7 @@ class TracerBrowserSDK {
25969
25967
  }
25970
25968
  catch (error) {
25971
25969
  // eslint-disable-next-line
25972
- console.error('[DEBUGGER_LIB] Failed to capture xml-http payload', error);
25970
+ console.error('[MULTIPLAYER_SESSION_RECORDER] Failed to capture xml-http payload', error);
25973
25971
  }
25974
25972
  },
25975
25973
  },
@@ -25988,12 +25986,28 @@ class TracerBrowserSDK {
25988
25986
  if (!captureBody && !captureHeaders) {
25989
25987
  return;
25990
25988
  }
25991
- const requestBody = request.body;
25992
- const requestHeaders = (0,_helpers__WEBPACK_IMPORTED_MODULE_3__.headersToObject)(request.headers);
25993
- const responseHeaders = (0,_helpers__WEBPACK_IMPORTED_MODULE_3__.headersToObject)(response instanceof Response ? response.headers : undefined);
25989
+ // Try to get data from our fetch wrapper first
25990
+ // @ts-ignore
25991
+ const networkRequest = response === null || response === void 0 ? void 0 : response.networkRequest;
25992
+ let requestBody = null;
25994
25993
  let responseBody = null;
25995
- if (response instanceof Response && response.body) {
25996
- responseBody = await (0,_helpers__WEBPACK_IMPORTED_MODULE_3__.extractResponseBody)(response);
25994
+ let requestHeaders = {};
25995
+ let responseHeaders = {};
25996
+ if (networkRequest) {
25997
+ // Use data captured by our fetch wrapper
25998
+ requestBody = networkRequest.requestBody;
25999
+ responseBody = networkRequest.responseBody;
26000
+ requestHeaders = networkRequest.requestHeaders || {};
26001
+ responseHeaders = networkRequest.responseHeaders || {};
26002
+ }
26003
+ else {
26004
+ // Fallback to original OpenTelemetry approach
26005
+ requestBody = request.body;
26006
+ requestHeaders = (0,_helpers__WEBPACK_IMPORTED_MODULE_3__.headersToObject)(request.headers);
26007
+ responseHeaders = (0,_helpers__WEBPACK_IMPORTED_MODULE_3__.headersToObject)(response instanceof Response ? response.headers : undefined);
26008
+ if (response instanceof Response && response.body) {
26009
+ responseBody = await (0,_helpers__WEBPACK_IMPORTED_MODULE_3__.extractResponseBody)(response);
26010
+ }
25997
26011
  }
25998
26012
  const payload = {
25999
26013
  requestBody,
@@ -26005,7 +26019,7 @@ class TracerBrowserSDK {
26005
26019
  }
26006
26020
  catch (error) {
26007
26021
  // eslint-disable-next-line
26008
- console.error('[DEBUGGER_LIB] Failed to capture fetch payload', error);
26022
+ console.error('[MULTIPLAYER_SESSION_RECORDER] Failed to capture fetch payload', error);
26009
26023
  }
26010
26024
  },
26011
26025
  },
@@ -26060,6 +26074,158 @@ class TracerBrowserSDK {
26060
26074
  }
26061
26075
 
26062
26076
 
26077
+ /***/ }),
26078
+
26079
+ /***/ "./src/patch/fetch.ts":
26080
+ /*!****************************!*\
26081
+ !*** ./src/patch/fetch.ts ***!
26082
+ \****************************/
26083
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
26084
+
26085
+ "use strict";
26086
+ __webpack_require__.r(__webpack_exports__);
26087
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
26088
+ /* harmony export */ setMaxCapturingHttpPayloadSize: () => (/* binding */ setMaxCapturingHttpPayloadSize),
26089
+ /* harmony export */ setShouldRecordHttpData: () => (/* binding */ setShouldRecordHttpData)
26090
+ /* harmony export */ });
26091
+ /* harmony import */ var _utils_type_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/type-utils */ "./src/utils/type-utils.ts");
26092
+ /* harmony import */ var _utils_request_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/request-utils */ "./src/utils/request-utils.ts");
26093
+ /* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../config */ "./src/config/index.ts");
26094
+
26095
+
26096
+
26097
+ let recordRequestHeaders = true;
26098
+ let recordResponseHeaders = true;
26099
+ const shouldRecordBody = true;
26100
+ let maxCapturingHttpPayloadSize = _config__WEBPACK_IMPORTED_MODULE_2__.DEFAULT_MAX_HTTP_CAPTURING_PAYLOAD_SIZE;
26101
+ const setMaxCapturingHttpPayloadSize = (_maxCapturingHttpPayloadSize) => {
26102
+ maxCapturingHttpPayloadSize = _maxCapturingHttpPayloadSize;
26103
+ };
26104
+ const setShouldRecordHttpData = (shouldRecordBody, shouldRecordHeaders) => {
26105
+ recordRequestHeaders = shouldRecordHeaders;
26106
+ recordResponseHeaders = shouldRecordHeaders;
26107
+ // eslint-disable-next-line
26108
+ shouldRecordBody = shouldRecordBody;
26109
+ };
26110
+ function _tryReadFetchBody({ body, url, }) {
26111
+ if ((0,_utils_type_utils__WEBPACK_IMPORTED_MODULE_0__.isNullish)(body)) {
26112
+ return null;
26113
+ }
26114
+ if ((0,_utils_type_utils__WEBPACK_IMPORTED_MODULE_0__.isString)(body)) {
26115
+ return body;
26116
+ }
26117
+ if ((0,_utils_type_utils__WEBPACK_IMPORTED_MODULE_0__.isDocument)(body)) {
26118
+ return body.textContent;
26119
+ }
26120
+ if ((0,_utils_type_utils__WEBPACK_IMPORTED_MODULE_0__.isFormData)(body)) {
26121
+ return (0,_utils_request_utils__WEBPACK_IMPORTED_MODULE_1__.formDataToQuery)(body);
26122
+ }
26123
+ if ((0,_utils_type_utils__WEBPACK_IMPORTED_MODULE_0__.isObject)(body)) {
26124
+ try {
26125
+ return JSON.stringify(body);
26126
+ }
26127
+ catch (_a) {
26128
+ return '[Fetch] Failed to stringify request object';
26129
+ }
26130
+ }
26131
+ return `[Fetch] Cannot read body of type ${toString.call(body)}`;
26132
+ }
26133
+ async function _tryReadResponseBody(response) {
26134
+ var _a, _b;
26135
+ try {
26136
+ // Clone the response to avoid consuming the original stream
26137
+ const clonedResponse = response.clone();
26138
+ // Try different methods to read the body
26139
+ if ((_a = response.headers.get('content-type')) === null || _a === void 0 ? void 0 : _a.includes('application/json')) {
26140
+ const json = await clonedResponse.json();
26141
+ return JSON.stringify(json);
26142
+ }
26143
+ else if ((_b = response.headers.get('content-type')) === null || _b === void 0 ? void 0 : _b.includes('text/')) {
26144
+ return await clonedResponse.text();
26145
+ }
26146
+ else {
26147
+ // For other content types, try text first, fallback to arrayBuffer
26148
+ try {
26149
+ return await clonedResponse.text();
26150
+ }
26151
+ catch (_c) {
26152
+ try {
26153
+ const arrayBuffer = await clonedResponse.arrayBuffer();
26154
+ return `[Fetch] Binary data (${arrayBuffer.byteLength} bytes)`;
26155
+ }
26156
+ catch (_d) {
26157
+ return '[Fetch] Unable to read response body';
26158
+ }
26159
+ }
26160
+ }
26161
+ }
26162
+ catch (error) {
26163
+ return `[Fetch] Error reading response body: ${error instanceof Error ? error.message : 'Unknown error'}`;
26164
+ }
26165
+ }
26166
+ function _headersToObject(headers) {
26167
+ const result = {};
26168
+ headers.forEach((value, key) => {
26169
+ result[key] = value;
26170
+ });
26171
+ return result;
26172
+ }
26173
+ // Store original fetch
26174
+ const originalFetch = window.fetch;
26175
+ // Override fetch
26176
+ window.fetch = async function (input,
26177
+ // eslint-disable-next-line
26178
+ init) {
26179
+ const networkRequest = {};
26180
+ // Capture request data
26181
+ const request = new Request(input, init);
26182
+ if (recordRequestHeaders) {
26183
+ networkRequest.requestHeaders = _headersToObject(request.headers);
26184
+ }
26185
+ if (shouldRecordBody && request.body) {
26186
+ const requestBody = _tryReadFetchBody({
26187
+ body: request.body,
26188
+ url: request.url,
26189
+ });
26190
+ if ((requestBody === null || requestBody === void 0 ? void 0 : requestBody.length) &&
26191
+ new Blob([requestBody]).size <= maxCapturingHttpPayloadSize) {
26192
+ networkRequest.requestBody = requestBody;
26193
+ }
26194
+ }
26195
+ try {
26196
+ // Make the actual fetch request
26197
+ const response = await originalFetch(input, init);
26198
+ // Capture response data
26199
+ if (recordResponseHeaders) {
26200
+ networkRequest.responseHeaders = _headersToObject(response.headers);
26201
+ }
26202
+ if (shouldRecordBody) {
26203
+ const responseBody = await _tryReadResponseBody(response);
26204
+ if ((responseBody === null || responseBody === void 0 ? void 0 : responseBody.length) &&
26205
+ new Blob([responseBody]).size <= maxCapturingHttpPayloadSize) {
26206
+ networkRequest.responseBody = responseBody;
26207
+ }
26208
+ }
26209
+ // Attach network request data to the response for later access
26210
+ // @ts-ignore
26211
+ response.networkRequest = networkRequest;
26212
+ return response;
26213
+ }
26214
+ catch (error) {
26215
+ // Even if the fetch fails, we can still capture the request data
26216
+ // @ts-ignore
26217
+ const errorResponse = new Response(null, { status: 0, statusText: 'Network Error' });
26218
+ // @ts-ignore
26219
+ errorResponse.networkRequest = networkRequest;
26220
+ throw error;
26221
+ }
26222
+ };
26223
+ // Preserve the original fetch function's properties
26224
+ Object.setPrototypeOf(window.fetch, originalFetch);
26225
+ Object.defineProperty(window.fetch, 'name', { value: 'fetch' });
26226
+ Object.defineProperty(window.fetch, 'length', { value: originalFetch.length });
26227
+
26228
+
26063
26229
  /***/ }),
26064
26230
 
26065
26231
  /***/ "./src/patch/index.ts":
@@ -26071,6 +26237,8 @@ class TracerBrowserSDK {
26071
26237
  "use strict";
26072
26238
  __webpack_require__.r(__webpack_exports__);
26073
26239
  /* harmony import */ var _xhr__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./xhr */ "./src/patch/xhr.ts");
26240
+ /* harmony import */ var _fetch__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./fetch */ "./src/patch/fetch.ts");
26241
+
26074
26242
 
26075
26243
 
26076
26244
 
@@ -28985,7 +29153,7 @@ const getNavigatorInfo = () => {
28985
29153
  // System type identifier (previously in system tags)
28986
29154
  systemType: 'web',
28987
29155
  // Platform identifier (previously in system tags)
28988
- platform: osInfo
29156
+ platform: osInfo,
28989
29157
  };
28990
29158
  };
28991
29159
 
@@ -29259,7 +29427,8 @@ const isString = function (x) {
29259
29427
  return toString.call(x) == '[object String]';
29260
29428
  };
29261
29429
  const isEmptyString = function (x) {
29262
- return isString(x) && x.trim().length === 0;
29430
+ var _a;
29431
+ return isString(x) && ((_a = x.trim()) === null || _a === void 0 ? void 0 : _a.length) === 0;
29263
29432
  };
29264
29433
  const isNull = function (x) {
29265
29434
  return x === null;
@@ -29434,6 +29603,7 @@ __webpack_require__.r(__webpack_exports__);
29434
29603
  /* harmony export */ ATTR_MULTIPLAYER_HTTP_RESPONSE_BODY_ENCODING: () => (/* binding */ ATTR_MULTIPLAYER_HTTP_RESPONSE_BODY_ENCODING),
29435
29604
  /* harmony export */ ATTR_MULTIPLAYER_HTTP_RESPONSE_HEADERS: () => (/* binding */ ATTR_MULTIPLAYER_HTTP_RESPONSE_HEADERS),
29436
29605
  /* harmony export */ ATTR_MULTIPLAYER_INTEGRATION_ID: () => (/* binding */ ATTR_MULTIPLAYER_INTEGRATION_ID),
29606
+ /* harmony export */ ATTR_MULTIPLAYER_ISSUE_CUSTOM_HASH: () => (/* binding */ ATTR_MULTIPLAYER_ISSUE_CUSTOM_HASH),
29437
29607
  /* harmony export */ ATTR_MULTIPLAYER_MESSAGING_MESSAGE_BODY: () => (/* binding */ ATTR_MULTIPLAYER_MESSAGING_MESSAGE_BODY),
29438
29608
  /* harmony export */ ATTR_MULTIPLAYER_MESSAGING_MESSAGE_BODY_ENCODING: () => (/* binding */ ATTR_MULTIPLAYER_MESSAGING_MESSAGE_BODY_ENCODING),
29439
29609
  /* harmony export */ ATTR_MULTIPLAYER_PLATFORM_ID: () => (/* binding */ ATTR_MULTIPLAYER_PLATFORM_ID),
@@ -29505,6 +29675,7 @@ var ATTR_MULTIPLAYER_GRPC_RESPONSE_MESSAGE = 'multiplayer.rpc.grpc.response.mess
29505
29675
  var ATTR_MULTIPLAYER_MESSAGING_MESSAGE_BODY = 'multiplayer.messaging.message.body';
29506
29676
  var ATTR_MULTIPLAYER_MESSAGING_MESSAGE_BODY_ENCODING = 'multiplayer.messaging.message.body.encoding';
29507
29677
  var ATTR_MULTIPLAYER_SESSION_RECORDER_VERSION = 'multiplayer.session-recorder.version';
29678
+ var ATTR_MULTIPLAYER_ISSUE_CUSTOM_HASH = 'multiplayer.issue.custom-hash';
29508
29679
  var MASK_PLACEHOLDER = '***MASKED***';
29509
29680
  //# sourceMappingURL=constants.base.js.map
29510
29681
 
@@ -29533,6 +29704,7 @@ __webpack_require__.r(__webpack_exports__);
29533
29704
  /* harmony export */ ATTR_MULTIPLAYER_HTTP_RESPONSE_BODY_ENCODING: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.ATTR_MULTIPLAYER_HTTP_RESPONSE_BODY_ENCODING),
29534
29705
  /* harmony export */ ATTR_MULTIPLAYER_HTTP_RESPONSE_HEADERS: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.ATTR_MULTIPLAYER_HTTP_RESPONSE_HEADERS),
29535
29706
  /* harmony export */ ATTR_MULTIPLAYER_INTEGRATION_ID: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.ATTR_MULTIPLAYER_INTEGRATION_ID),
29707
+ /* harmony export */ ATTR_MULTIPLAYER_ISSUE_CUSTOM_HASH: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.ATTR_MULTIPLAYER_ISSUE_CUSTOM_HASH),
29536
29708
  /* harmony export */ ATTR_MULTIPLAYER_MESSAGING_MESSAGE_BODY: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.ATTR_MULTIPLAYER_MESSAGING_MESSAGE_BODY),
29537
29709
  /* harmony export */ ATTR_MULTIPLAYER_MESSAGING_MESSAGE_BODY_ENCODING: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.ATTR_MULTIPLAYER_MESSAGING_MESSAGE_BODY_ENCODING),
29538
29710
  /* harmony export */ ATTR_MULTIPLAYER_PLATFORM_ID: () => (/* reexport safe */ _constants_base__WEBPACK_IMPORTED_MODULE_0__.ATTR_MULTIPLAYER_PLATFORM_ID),
@@ -29741,6 +29913,7 @@ __webpack_require__.r(__webpack_exports__);
29741
29913
  /* harmony export */ ATTR_MULTIPLAYER_HTTP_RESPONSE_BODY_ENCODING: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.ATTR_MULTIPLAYER_HTTP_RESPONSE_BODY_ENCODING),
29742
29914
  /* harmony export */ ATTR_MULTIPLAYER_HTTP_RESPONSE_HEADERS: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.ATTR_MULTIPLAYER_HTTP_RESPONSE_HEADERS),
29743
29915
  /* harmony export */ ATTR_MULTIPLAYER_INTEGRATION_ID: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.ATTR_MULTIPLAYER_INTEGRATION_ID),
29916
+ /* harmony export */ ATTR_MULTIPLAYER_ISSUE_CUSTOM_HASH: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.ATTR_MULTIPLAYER_ISSUE_CUSTOM_HASH),
29744
29917
  /* harmony export */ ATTR_MULTIPLAYER_MESSAGING_MESSAGE_BODY: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.ATTR_MULTIPLAYER_MESSAGING_MESSAGE_BODY),
29745
29918
  /* harmony export */ ATTR_MULTIPLAYER_MESSAGING_MESSAGE_BODY_ENCODING: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.ATTR_MULTIPLAYER_MESSAGING_MESSAGE_BODY_ENCODING),
29746
29919
  /* harmony export */ ATTR_MULTIPLAYER_PLATFORM_ID: () => (/* reexport safe */ _constants_constants_browser__WEBPACK_IMPORTED_MODULE_0__.ATTR_MULTIPLAYER_PLATFORM_ID),
@@ -48777,6 +48950,7 @@ __webpack_require__.r(__webpack_exports__);
48777
48950
  /* harmony export */ ATTR_MULTIPLAYER_HTTP_RESPONSE_BODY_ENCODING: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_4__.ATTR_MULTIPLAYER_HTTP_RESPONSE_BODY_ENCODING),
48778
48951
  /* harmony export */ ATTR_MULTIPLAYER_HTTP_RESPONSE_HEADERS: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_4__.ATTR_MULTIPLAYER_HTTP_RESPONSE_HEADERS),
48779
48952
  /* harmony export */ ATTR_MULTIPLAYER_INTEGRATION_ID: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_4__.ATTR_MULTIPLAYER_INTEGRATION_ID),
48953
+ /* harmony export */ ATTR_MULTIPLAYER_ISSUE_CUSTOM_HASH: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_4__.ATTR_MULTIPLAYER_ISSUE_CUSTOM_HASH),
48780
48954
  /* harmony export */ ATTR_MULTIPLAYER_MESSAGING_MESSAGE_BODY: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_4__.ATTR_MULTIPLAYER_MESSAGING_MESSAGE_BODY),
48781
48955
  /* harmony export */ ATTR_MULTIPLAYER_MESSAGING_MESSAGE_BODY_ENCODING: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_4__.ATTR_MULTIPLAYER_MESSAGING_MESSAGE_BODY_ENCODING),
48782
48956
  /* harmony export */ ATTR_MULTIPLAYER_PLATFORM_ID: () => (/* reexport safe */ _multiplayer_app_session_recorder_common__WEBPACK_IMPORTED_MODULE_4__.ATTR_MULTIPLAYER_PLATFORM_ID),