@multiplayer-app/session-recorder-react-native 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.
- package/lib/module/otel/helpers.js +1 -1
- package/lib/module/otel/helpers.js.map +1 -1
- package/lib/module/otel/instrumentations/index.js +32 -12
- package/lib/module/otel/instrumentations/index.js.map +1 -1
- package/lib/module/patch/fetch.js +150 -0
- package/lib/module/patch/fetch.js.map +1 -0
- package/lib/module/patch/index.js +1 -0
- package/lib/module/patch/index.js.map +1 -1
- package/lib/module/types/client-type.enum.js +9 -0
- package/lib/module/types/client-type.enum.js.map +1 -0
- package/lib/module/types/session.js.map +1 -1
- package/lib/typescript/src/otel/instrumentations/index.d.ts.map +1 -1
- package/lib/typescript/src/patch/fetch.d.ts +3 -0
- package/lib/typescript/src/patch/fetch.d.ts.map +1 -0
- package/lib/typescript/src/patch/index.d.ts +1 -0
- package/lib/typescript/src/patch/index.d.ts.map +1 -1
- package/lib/typescript/src/types/client-type.enum.d.ts +6 -0
- package/lib/typescript/src/types/client-type.enum.d.ts.map +1 -0
- package/lib/typescript/src/types/session.d.ts +13 -1
- package/lib/typescript/src/types/session.d.ts.map +1 -1
- package/package.json +3 -4
- package/src/otel/helpers.ts +1 -1
- package/src/otel/instrumentations/index.ts +38 -16
- package/src/patch/fetch.ts +185 -0
- package/src/patch/index.ts +1 -0
- package/src/types/client-type.enum.ts +5 -0
- package/src/types/session.ts +20 -5
|
@@ -196,7 +196,7 @@ export async function extractResponseBody(response) {
|
|
|
196
196
|
} catch (error) {
|
|
197
197
|
// If cloning fails (body already consumed), return null
|
|
198
198
|
|
|
199
|
-
logger.warn('
|
|
199
|
+
logger.warn('MULTIPLAYER_SESSION_RECORDER', 'Failed to extract response body', error);
|
|
200
200
|
return null;
|
|
201
201
|
}
|
|
202
202
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["MULTIPLAYER_TRACE_DEBUG_PREFIX","MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX","ATTR_MULTIPLAYER_HTTP_REQUEST_BODY","ATTR_MULTIPLAYER_HTTP_REQUEST_HEADERS","ATTR_MULTIPLAYER_HTTP_RESPONSE_BODY","ATTR_MULTIPLAYER_HTTP_RESPONSE_HEADERS","logger","shouldProcessTrace","traceId","startsWith","processBody","payload","config","span","captureBody","masking","spanContext","requestBody","responseBody","undefined","JSON","parse","stringify","isContentMaskingEnabled","maskBody","length","processHeaders","captureHeaders","requestHeaders","responseHeaders","headersToInclude","headersToExclude","_requestHeaders","_responseHeaders","headerName","maskedRequestHeaders","maskHeaders","maskedResponseHeaders","requestHeadersStr","responseHeadersStr","processHttpPayload","setAttribute","headersToObject","headers","result","Headers","forEach","value","key","Array","isArray","Object","entries","extractResponseBody","response","body","ReadableStream","bodyUsed","responseClone","clone","text","error","warn","getExporterEndpoint","exporterEndpoint","hasPath","url","URL","pathname","trimmedExporterEndpoint","origin"],"sourceRoot":"../../../src","sources":["otel/helpers.ts"],"mappings":"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
|
|
1
|
+
{"version":3,"names":["MULTIPLAYER_TRACE_DEBUG_PREFIX","MULTIPLAYER_TRACE_CONTINUOUS_DEBUG_PREFIX","ATTR_MULTIPLAYER_HTTP_REQUEST_BODY","ATTR_MULTIPLAYER_HTTP_REQUEST_HEADERS","ATTR_MULTIPLAYER_HTTP_RESPONSE_BODY","ATTR_MULTIPLAYER_HTTP_RESPONSE_HEADERS","logger","shouldProcessTrace","traceId","startsWith","processBody","payload","config","span","captureBody","masking","spanContext","requestBody","responseBody","undefined","JSON","parse","stringify","isContentMaskingEnabled","maskBody","length","processHeaders","captureHeaders","requestHeaders","responseHeaders","headersToInclude","headersToExclude","_requestHeaders","_responseHeaders","headerName","maskedRequestHeaders","maskHeaders","maskedResponseHeaders","requestHeadersStr","responseHeadersStr","processHttpPayload","setAttribute","headersToObject","headers","result","Headers","forEach","value","key","Array","isArray","Object","entries","extractResponseBody","response","body","ReadableStream","bodyUsed","responseClone","clone","text","error","warn","getExporterEndpoint","exporterEndpoint","hasPath","url","URL","pathname","trimmedExporterEndpoint","origin"],"sourceRoot":"../../../src","sources":["otel/helpers.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -24,12 +24,28 @@ export function getInstrumentations(config) {
|
|
|
24
24
|
if (!captureBody && !captureHeaders) {
|
|
25
25
|
return;
|
|
26
26
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
|
|
28
|
+
// Try to get data from our fetch wrapper first
|
|
29
|
+
// @ts-ignore
|
|
30
|
+
const networkRequest = response?.networkRequest;
|
|
31
|
+
let requestBody = null;
|
|
30
32
|
let responseBody = null;
|
|
31
|
-
|
|
32
|
-
|
|
33
|
+
let requestHeaders = {};
|
|
34
|
+
let responseHeaders = {};
|
|
35
|
+
if (networkRequest) {
|
|
36
|
+
// Use data captured by our fetch wrapper
|
|
37
|
+
requestBody = networkRequest.requestBody;
|
|
38
|
+
responseBody = networkRequest.responseBody;
|
|
39
|
+
requestHeaders = networkRequest.requestHeaders || {};
|
|
40
|
+
responseHeaders = networkRequest.responseHeaders || {};
|
|
41
|
+
} else {
|
|
42
|
+
// Fallback to original OpenTelemetry approach
|
|
43
|
+
requestBody = request.body;
|
|
44
|
+
requestHeaders = headersToObject(request.headers);
|
|
45
|
+
responseHeaders = headersToObject(response instanceof Response ? response.headers : undefined);
|
|
46
|
+
if (response instanceof Response && response.body) {
|
|
47
|
+
responseBody = await extractResponseBody(response);
|
|
48
|
+
}
|
|
33
49
|
}
|
|
34
50
|
const payload = {
|
|
35
51
|
requestBody,
|
|
@@ -66,13 +82,17 @@ export function getInstrumentations(config) {
|
|
|
66
82
|
}
|
|
67
83
|
|
|
68
84
|
// @ts-ignore
|
|
69
|
-
const
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
85
|
+
const networkRequest = xhr.networkRequest;
|
|
86
|
+
let requestBody = null;
|
|
87
|
+
let responseBody = null;
|
|
88
|
+
let requestHeaders = {};
|
|
89
|
+
let responseHeaders = {};
|
|
90
|
+
if (networkRequest) {
|
|
91
|
+
requestBody = networkRequest.requestBody;
|
|
92
|
+
responseBody = networkRequest.responseBody;
|
|
93
|
+
requestHeaders = networkRequest.requestHeaders || {};
|
|
94
|
+
responseHeaders = networkRequest.responseHeaders || {};
|
|
95
|
+
}
|
|
76
96
|
const payload = {
|
|
77
97
|
requestBody,
|
|
78
98
|
responseBody,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["FetchInstrumentation","XMLHttpRequestInstrumentation","logger","OTEL_IGNORE_URLS","extractResponseBody","headersToObject","processHttpPayload","getInstrumentations","config","instrumentations","push","clearTimingResources","ignoreUrls","propagateTraceHeaderCorsUrls","applyCustomAttributesOnSpan","span","request","response","captureBody","captureHeaders","requestBody","
|
|
1
|
+
{"version":3,"names":["FetchInstrumentation","XMLHttpRequestInstrumentation","logger","OTEL_IGNORE_URLS","extractResponseBody","headersToObject","processHttpPayload","getInstrumentations","config","instrumentations","push","clearTimingResources","ignoreUrls","propagateTraceHeaderCorsUrls","applyCustomAttributesOnSpan","span","request","response","captureBody","captureHeaders","networkRequest","requestBody","responseBody","requestHeaders","responseHeaders","body","headers","Response","undefined","payload","error","warn","xhr"],"sourceRoot":"../../../../src","sources":["otel/instrumentations/index.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { isFormData, isNullish, isObject, isString } from "../utils/type-utils.js";
|
|
4
|
+
import { formDataToQuery } from "../utils/request-utils.js";
|
|
5
|
+
import { DEFAULT_MAX_HTTP_CAPTURING_PAYLOAD_SIZE } from "../config/index.js";
|
|
6
|
+
let recordRequestHeaders = true;
|
|
7
|
+
let recordResponseHeaders = true;
|
|
8
|
+
let shouldRecordBody = true;
|
|
9
|
+
let maxCapturingHttpPayloadSize = DEFAULT_MAX_HTTP_CAPTURING_PAYLOAD_SIZE;
|
|
10
|
+
export const setMaxCapturingHttpPayloadSize = _maxCapturingHttpPayloadSize => {
|
|
11
|
+
maxCapturingHttpPayloadSize = _maxCapturingHttpPayloadSize;
|
|
12
|
+
};
|
|
13
|
+
export const setShouldRecordHttpData = (shouldRecordBody, shouldRecordHeaders) => {
|
|
14
|
+
recordRequestHeaders = shouldRecordHeaders;
|
|
15
|
+
recordResponseHeaders = shouldRecordHeaders;
|
|
16
|
+
shouldRecordBody = shouldRecordBody;
|
|
17
|
+
};
|
|
18
|
+
function _tryReadFetchBody({
|
|
19
|
+
body
|
|
20
|
+
}) {
|
|
21
|
+
if (isNullish(body)) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
if (isString(body)) {
|
|
25
|
+
return body;
|
|
26
|
+
}
|
|
27
|
+
if (isFormData(body)) {
|
|
28
|
+
return formDataToQuery(body);
|
|
29
|
+
}
|
|
30
|
+
if (isObject(body)) {
|
|
31
|
+
try {
|
|
32
|
+
return JSON.stringify(body);
|
|
33
|
+
} catch {
|
|
34
|
+
return '[Fetch] Failed to stringify request object';
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return `[Fetch] Cannot read body of type ${Object.prototype.toString.call(body)}`;
|
|
38
|
+
}
|
|
39
|
+
function _headersToObject(headers) {
|
|
40
|
+
const result = {};
|
|
41
|
+
headers.forEach((value, key) => {
|
|
42
|
+
result[key] = value;
|
|
43
|
+
});
|
|
44
|
+
return result;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Only patch fetch if available and safe to do so
|
|
48
|
+
if (typeof fetch !== 'undefined' && typeof global !== 'undefined') {
|
|
49
|
+
// Store original fetch
|
|
50
|
+
const originalFetch = global.fetch;
|
|
51
|
+
|
|
52
|
+
// Override fetch with safer implementation
|
|
53
|
+
global.fetch = async function (input, init) {
|
|
54
|
+
const networkRequest = {};
|
|
55
|
+
try {
|
|
56
|
+
// Capture request data safely
|
|
57
|
+
const request = new Request(input, init);
|
|
58
|
+
if (recordRequestHeaders) {
|
|
59
|
+
try {
|
|
60
|
+
networkRequest.requestHeaders = _headersToObject(request.headers);
|
|
61
|
+
} catch (error) {
|
|
62
|
+
console.warn('[Fetch Patch] Failed to capture request headers:', error);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (shouldRecordBody && request.body) {
|
|
66
|
+
try {
|
|
67
|
+
const requestBody = _tryReadFetchBody({
|
|
68
|
+
body: request.body
|
|
69
|
+
});
|
|
70
|
+
if (requestBody?.length && requestBody.length <= maxCapturingHttpPayloadSize) {
|
|
71
|
+
networkRequest.requestBody = requestBody;
|
|
72
|
+
}
|
|
73
|
+
} catch (error) {
|
|
74
|
+
console.warn('[Fetch Patch] Failed to capture request body:', error);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Make the actual fetch request
|
|
79
|
+
const response = await originalFetch(input, init);
|
|
80
|
+
|
|
81
|
+
// Capture response data safely
|
|
82
|
+
if (recordResponseHeaders) {
|
|
83
|
+
try {
|
|
84
|
+
networkRequest.responseHeaders = _headersToObject(response.headers);
|
|
85
|
+
} catch (error) {
|
|
86
|
+
console.warn('[Fetch Patch] Failed to capture response headers:', error);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (shouldRecordBody) {
|
|
90
|
+
try {
|
|
91
|
+
// Try to capture response body without cloning first
|
|
92
|
+
let responseBody = null;
|
|
93
|
+
|
|
94
|
+
// Check if response body is available and not consumed
|
|
95
|
+
if (response.body && !response.bodyUsed) {
|
|
96
|
+
try {
|
|
97
|
+
// Try cloning first (might fail in React Native)
|
|
98
|
+
const clonedResponse = response.clone();
|
|
99
|
+
responseBody = await clonedResponse.text();
|
|
100
|
+
} catch (cloneError) {
|
|
101
|
+
// If cloning fails, try to read from original response
|
|
102
|
+
// This is risky but we'll catch the error
|
|
103
|
+
try {
|
|
104
|
+
responseBody = await response.text();
|
|
105
|
+
// If we get here, we consumed the body, so we need to recreate the response
|
|
106
|
+
// This is a limitation - we can't both capture and preserve the body
|
|
107
|
+
console.warn('[Fetch Patch] Response body consumed for capture - user code may not be able to read it');
|
|
108
|
+
} catch (readError) {
|
|
109
|
+
console.warn('[Fetch Patch] Failed to read response body:', readError);
|
|
110
|
+
responseBody = '[Fetch] Unable to read response body';
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
} else if (response.bodyUsed) {
|
|
114
|
+
responseBody = '[Fetch] Response body already consumed';
|
|
115
|
+
}
|
|
116
|
+
if (responseBody?.length && responseBody.length <= maxCapturingHttpPayloadSize) {
|
|
117
|
+
networkRequest.responseBody = responseBody;
|
|
118
|
+
}
|
|
119
|
+
} catch (error) {
|
|
120
|
+
console.warn('[Fetch Patch] Failed to capture response body:', error);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Attach network request data to the response for later access
|
|
125
|
+
// @ts-ignore
|
|
126
|
+
response.networkRequest = networkRequest;
|
|
127
|
+
return response;
|
|
128
|
+
} catch (error) {
|
|
129
|
+
// Don't interfere with the original error - just log and rethrow
|
|
130
|
+
console.warn('[Fetch Patch] Fetch failed:', error);
|
|
131
|
+
throw error;
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
// Preserve the original fetch function's properties
|
|
136
|
+
try {
|
|
137
|
+
Object.setPrototypeOf(global.fetch, originalFetch);
|
|
138
|
+
Object.defineProperty(global.fetch, 'name', {
|
|
139
|
+
value: 'fetch'
|
|
140
|
+
});
|
|
141
|
+
Object.defineProperty(global.fetch, 'length', {
|
|
142
|
+
value: originalFetch.length
|
|
143
|
+
});
|
|
144
|
+
} catch (error) {
|
|
145
|
+
console.warn('[Fetch Patch] Failed to preserve fetch properties:', error);
|
|
146
|
+
}
|
|
147
|
+
} else {
|
|
148
|
+
console.info('Fetch patch: Skipping fetch patching - fetch not available or unsafe environment');
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=fetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["isFormData","isNullish","isObject","isString","formDataToQuery","DEFAULT_MAX_HTTP_CAPTURING_PAYLOAD_SIZE","recordRequestHeaders","recordResponseHeaders","shouldRecordBody","maxCapturingHttpPayloadSize","setMaxCapturingHttpPayloadSize","_maxCapturingHttpPayloadSize","setShouldRecordHttpData","shouldRecordHeaders","_tryReadFetchBody","body","JSON","stringify","Object","prototype","toString","call","_headersToObject","headers","result","forEach","value","key","fetch","global","originalFetch","input","init","networkRequest","request","Request","requestHeaders","error","console","warn","requestBody","length","response","responseHeaders","responseBody","bodyUsed","clonedResponse","clone","text","cloneError","readError","setPrototypeOf","defineProperty","info"],"sourceRoot":"../../../src","sources":["patch/fetch.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sourceRoot":"../../../src","sources":["patch/index.ts"],"mappings":";;AAAA,OAAO,UAAO","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"../../../src","sources":["patch/index.ts"],"mappings":";;AAAA,OAAO,UAAO;AACd,OAAO,YAAS","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["UserType"],"sourceRoot":"../../../src","sources":["types/client-type.enum.ts"],"mappings":";;AAAA,WAAYA,QAAQ,0BAARA,QAAQ;EAARA,QAAQ;EAARA,QAAQ;EAARA,QAAQ;EAAA,OAARA,QAAQ;AAAA","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["DebugSessionDataType"],"sourceRoot":"../../../src","sources":["types/session.ts"],"mappings":";;
|
|
1
|
+
{"version":3,"names":["DebugSessionDataType"],"sourceRoot":"../../../src","sources":["types/session.ts"],"mappings":";;AA2EA,WAAYA,oBAAoB,0BAApBA,oBAAoB;EAApBA,oBAAoB;EAApBA,oBAAoB;EAApBA,oBAAoB;EAAA,OAApBA,oBAAoB;AAAA","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/otel/instrumentations/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAE,6BAA6B,EAAE,MAAM,iDAAiD,CAAC;AAIhG,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAO3D,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,uBAAuB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/otel/instrumentations/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAE,6BAA6B,EAAE,MAAM,iDAAiD,CAAC;AAIhG,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAO3D,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,uBAAuB,4DA+HlE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../../../src/patch/fetch.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,8BAA8B,GACzC,8BAA8B,MAAM,SAGrC,CAAA;AAED,eAAO,MAAM,uBAAuB,GAClC,kBAAkB,OAAO,EACzB,qBAAqB,OAAO,SAK7B,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/patch/index.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/patch/index.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,CAAC;AACf,OAAO,SAAS,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-type.enum.d.ts","sourceRoot":"","sources":["../../../../src/types/client-type.enum.ts"],"names":[],"mappings":"AAAA,oBAAY,QAAQ;IAClB,IAAI,SAAS;IACb,OAAO,YAAY;IACnB,UAAU,eAAe;CAC1B"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { SessionType } from '@multiplayer-app/session-recorder-common';
|
|
2
|
+
import type { UserType } from './client-type.enum';
|
|
2
3
|
export interface IResourceAttributes {
|
|
3
4
|
browserInfo?: string;
|
|
4
5
|
cookiesEnabled?: string;
|
|
@@ -11,12 +12,22 @@ export interface IResourceAttributes {
|
|
|
11
12
|
[key: string]: any;
|
|
12
13
|
}
|
|
13
14
|
export interface ISessionAttributes {
|
|
15
|
+
[key: string]: any;
|
|
16
|
+
}
|
|
17
|
+
export interface IUserAttributes {
|
|
18
|
+
type: UserType;
|
|
19
|
+
id?: string;
|
|
20
|
+
name?: string;
|
|
21
|
+
groupId?: string;
|
|
22
|
+
groupName?: string;
|
|
14
23
|
userEmail?: string;
|
|
15
24
|
userId?: string;
|
|
16
25
|
userName?: string;
|
|
17
26
|
accountId?: string;
|
|
18
27
|
accountName?: string;
|
|
19
|
-
|
|
28
|
+
orgId?: string;
|
|
29
|
+
orgName?: string;
|
|
30
|
+
tags?: string[];
|
|
20
31
|
}
|
|
21
32
|
export interface ISessionView {
|
|
22
33
|
_id: string;
|
|
@@ -39,6 +50,7 @@ export interface ISession {
|
|
|
39
50
|
tags: any[];
|
|
40
51
|
resourceAttributes?: IResourceAttributes;
|
|
41
52
|
sessionAttributes?: ISessionAttributes;
|
|
53
|
+
userAttributes?: IUserAttributes;
|
|
42
54
|
views: ISessionView[];
|
|
43
55
|
starred: boolean;
|
|
44
56
|
starredItems: string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../../src/types/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,0CAA0C,CAAC;
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../../src/types/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,0CAA0C,CAAC;AACvE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD,MAAM,WAAW,mBAAmB;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAGD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,QAAQ,CAAA;IACd,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;CAChB;AACD,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,YAAY,EAAE,WAAW,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,EAAE,GAAG,EAAE,CAAC;IAEZ,kBAAkB,CAAC,EAAE,mBAAmB,CAAC;IACzC,iBAAiB,CAAC,EAAE,kBAAkB,CAAC;IAEvC,cAAc,CAAC,EAAE,eAAe,CAAA;IAEhC,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,EAAE;QACP,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,oBAAoB,CAAC;QAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,EAAE,CAAC;IACJ,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,oBAAY,oBAAoB;IAC9B,WAAW,gBAAgB;IAC3B,SAAS,cAAc;IACvB,YAAY,iBAAiB;CAC9B"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@multiplayer-app/session-recorder-react-native",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.11",
|
|
4
4
|
"description": "Multiplayer Fullstack Session Recorder for React Native",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Multiplayer Software, Inc.",
|
|
@@ -58,8 +58,7 @@
|
|
|
58
58
|
"typecheck": "tsc",
|
|
59
59
|
"lint": "eslint \"**/*.{js,ts,tsx}\"",
|
|
60
60
|
"prepare": "bob build",
|
|
61
|
-
"release": "release-it --only-version"
|
|
62
|
-
"copy": "./copy.sh"
|
|
61
|
+
"release": "release-it --only-version"
|
|
63
62
|
},
|
|
64
63
|
"keywords": [
|
|
65
64
|
"multiplayer",
|
|
@@ -108,7 +107,7 @@
|
|
|
108
107
|
"typescript": "^5.9.2"
|
|
109
108
|
},
|
|
110
109
|
"dependencies": {
|
|
111
|
-
"@multiplayer-app/session-recorder-common": "1.2.
|
|
110
|
+
"@multiplayer-app/session-recorder-common": "1.2.11",
|
|
112
111
|
"@opentelemetry/core": "2.0.1",
|
|
113
112
|
"@opentelemetry/exporter-trace-otlp-http": "0.203.0",
|
|
114
113
|
"@opentelemetry/instrumentation": "0.203.0",
|
package/src/otel/helpers.ts
CHANGED
|
@@ -263,7 +263,7 @@ export async function extractResponseBody(
|
|
|
263
263
|
} catch (error) {
|
|
264
264
|
// If cloning fails (body already consumed), return null
|
|
265
265
|
|
|
266
|
-
logger.warn('
|
|
266
|
+
logger.warn('MULTIPLAYER_SESSION_RECORDER', 'Failed to extract response body', error);
|
|
267
267
|
return null;
|
|
268
268
|
}
|
|
269
269
|
}
|
|
@@ -30,15 +30,32 @@ export function getInstrumentations(config: TracerReactNativeConfig) {
|
|
|
30
30
|
return;
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
let
|
|
40
|
-
|
|
41
|
-
|
|
33
|
+
// Try to get data from our fetch wrapper first
|
|
34
|
+
// @ts-ignore
|
|
35
|
+
const networkRequest = response?.networkRequest
|
|
36
|
+
|
|
37
|
+
let requestBody: any = null
|
|
38
|
+
let responseBody: string | null = null
|
|
39
|
+
let requestHeaders: Record<string, string> = {}
|
|
40
|
+
let responseHeaders: Record<string, string> = {}
|
|
41
|
+
|
|
42
|
+
if (networkRequest) {
|
|
43
|
+
// Use data captured by our fetch wrapper
|
|
44
|
+
requestBody = networkRequest.requestBody
|
|
45
|
+
responseBody = networkRequest.responseBody
|
|
46
|
+
requestHeaders = networkRequest.requestHeaders || {}
|
|
47
|
+
responseHeaders = networkRequest.responseHeaders || {}
|
|
48
|
+
} else {
|
|
49
|
+
// Fallback to original OpenTelemetry approach
|
|
50
|
+
requestBody = request.body
|
|
51
|
+
requestHeaders = headersToObject(request.headers)
|
|
52
|
+
responseHeaders = headersToObject(
|
|
53
|
+
response instanceof Response ? response.headers : undefined
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
if (response instanceof Response && response.body) {
|
|
57
|
+
responseBody = await extractResponseBody(response)
|
|
58
|
+
}
|
|
42
59
|
}
|
|
43
60
|
|
|
44
61
|
const payload = {
|
|
@@ -77,13 +94,18 @@ export function getInstrumentations(config: TracerReactNativeConfig) {
|
|
|
77
94
|
}
|
|
78
95
|
|
|
79
96
|
// @ts-ignore
|
|
80
|
-
const
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
97
|
+
const networkRequest = xhr.networkRequest
|
|
98
|
+
let requestBody: any = null
|
|
99
|
+
let responseBody: string | null = null
|
|
100
|
+
let requestHeaders: Record<string, string> = {}
|
|
101
|
+
let responseHeaders: Record<string, string> = {}
|
|
102
|
+
|
|
103
|
+
if (networkRequest) {
|
|
104
|
+
requestBody = networkRequest.requestBody
|
|
105
|
+
responseBody = networkRequest.responseBody
|
|
106
|
+
requestHeaders = networkRequest.requestHeaders || {}
|
|
107
|
+
responseHeaders = networkRequest.responseHeaders || {}
|
|
108
|
+
}
|
|
87
109
|
|
|
88
110
|
const payload = {
|
|
89
111
|
requestBody,
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import {
|
|
2
|
+
isFormData,
|
|
3
|
+
isNullish,
|
|
4
|
+
isObject,
|
|
5
|
+
isString,
|
|
6
|
+
} from '../utils/type-utils'
|
|
7
|
+
import { formDataToQuery } from '../utils/request-utils'
|
|
8
|
+
import { DEFAULT_MAX_HTTP_CAPTURING_PAYLOAD_SIZE } from '../config'
|
|
9
|
+
|
|
10
|
+
let recordRequestHeaders = true
|
|
11
|
+
let recordResponseHeaders = true
|
|
12
|
+
let shouldRecordBody = true
|
|
13
|
+
let maxCapturingHttpPayloadSize = DEFAULT_MAX_HTTP_CAPTURING_PAYLOAD_SIZE
|
|
14
|
+
|
|
15
|
+
export const setMaxCapturingHttpPayloadSize = (
|
|
16
|
+
_maxCapturingHttpPayloadSize: number
|
|
17
|
+
) => {
|
|
18
|
+
maxCapturingHttpPayloadSize = _maxCapturingHttpPayloadSize
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export const setShouldRecordHttpData = (
|
|
22
|
+
shouldRecordBody: boolean,
|
|
23
|
+
shouldRecordHeaders: boolean
|
|
24
|
+
) => {
|
|
25
|
+
recordRequestHeaders = shouldRecordHeaders
|
|
26
|
+
recordResponseHeaders = shouldRecordHeaders
|
|
27
|
+
shouldRecordBody = shouldRecordBody
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function _tryReadFetchBody({
|
|
31
|
+
body,
|
|
32
|
+
}: {
|
|
33
|
+
body: any | null | undefined
|
|
34
|
+
}): string | null {
|
|
35
|
+
if (isNullish(body)) {
|
|
36
|
+
return null
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (isString(body)) {
|
|
40
|
+
return body
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (isFormData(body)) {
|
|
44
|
+
return formDataToQuery(body)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (isObject(body)) {
|
|
48
|
+
try {
|
|
49
|
+
return JSON.stringify(body)
|
|
50
|
+
} catch {
|
|
51
|
+
return '[Fetch] Failed to stringify request object'
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return `[Fetch] Cannot read body of type ${Object.prototype.toString.call(body)}`
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function _headersToObject(headers: Headers): Record<string, string> {
|
|
59
|
+
const result: Record<string, string> = {}
|
|
60
|
+
headers.forEach((value, key) => {
|
|
61
|
+
result[key] = value
|
|
62
|
+
})
|
|
63
|
+
return result
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Only patch fetch if available and safe to do so
|
|
67
|
+
if (typeof fetch !== 'undefined' && typeof global !== 'undefined') {
|
|
68
|
+
// Store original fetch
|
|
69
|
+
const originalFetch = global.fetch
|
|
70
|
+
|
|
71
|
+
// Override fetch with safer implementation
|
|
72
|
+
global.fetch = async function (
|
|
73
|
+
input: RequestInfo | URL,
|
|
74
|
+
init?: RequestInit
|
|
75
|
+
): Promise<Response> {
|
|
76
|
+
const networkRequest: {
|
|
77
|
+
requestHeaders?: Record<string, string>
|
|
78
|
+
requestBody?: string
|
|
79
|
+
responseHeaders?: Record<string, string>
|
|
80
|
+
responseBody?: string
|
|
81
|
+
} = {}
|
|
82
|
+
|
|
83
|
+
try {
|
|
84
|
+
// Capture request data safely
|
|
85
|
+
const request = new Request(input as RequestInfo, init)
|
|
86
|
+
|
|
87
|
+
if (recordRequestHeaders) {
|
|
88
|
+
try {
|
|
89
|
+
networkRequest.requestHeaders = _headersToObject(request.headers)
|
|
90
|
+
} catch (error) {
|
|
91
|
+
console.warn('[Fetch Patch] Failed to capture request headers:', error)
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if (shouldRecordBody && request.body) {
|
|
96
|
+
try {
|
|
97
|
+
const requestBody = _tryReadFetchBody({
|
|
98
|
+
body: request.body,
|
|
99
|
+
})
|
|
100
|
+
|
|
101
|
+
if (
|
|
102
|
+
requestBody?.length &&
|
|
103
|
+
requestBody.length <= maxCapturingHttpPayloadSize
|
|
104
|
+
) {
|
|
105
|
+
networkRequest.requestBody = requestBody
|
|
106
|
+
}
|
|
107
|
+
} catch (error) {
|
|
108
|
+
console.warn('[Fetch Patch] Failed to capture request body:', error)
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Make the actual fetch request
|
|
113
|
+
const response = await originalFetch(input, init)
|
|
114
|
+
|
|
115
|
+
// Capture response data safely
|
|
116
|
+
if (recordResponseHeaders) {
|
|
117
|
+
try {
|
|
118
|
+
networkRequest.responseHeaders = _headersToObject(response.headers)
|
|
119
|
+
} catch (error) {
|
|
120
|
+
console.warn('[Fetch Patch] Failed to capture response headers:', error)
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
if (shouldRecordBody) {
|
|
125
|
+
try {
|
|
126
|
+
// Try to capture response body without cloning first
|
|
127
|
+
let responseBody: string | null = null
|
|
128
|
+
|
|
129
|
+
// Check if response body is available and not consumed
|
|
130
|
+
if (response.body && !response.bodyUsed) {
|
|
131
|
+
try {
|
|
132
|
+
// Try cloning first (might fail in React Native)
|
|
133
|
+
const clonedResponse = response.clone()
|
|
134
|
+
responseBody = await clonedResponse.text()
|
|
135
|
+
} catch (cloneError) {
|
|
136
|
+
// If cloning fails, try to read from original response
|
|
137
|
+
// This is risky but we'll catch the error
|
|
138
|
+
try {
|
|
139
|
+
responseBody = await response.text()
|
|
140
|
+
// If we get here, we consumed the body, so we need to recreate the response
|
|
141
|
+
// This is a limitation - we can't both capture and preserve the body
|
|
142
|
+
console.warn('[Fetch Patch] Response body consumed for capture - user code may not be able to read it')
|
|
143
|
+
} catch (readError) {
|
|
144
|
+
console.warn('[Fetch Patch] Failed to read response body:', readError)
|
|
145
|
+
responseBody = '[Fetch] Unable to read response body'
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
} else if (response.bodyUsed) {
|
|
149
|
+
responseBody = '[Fetch] Response body already consumed'
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
if (
|
|
153
|
+
responseBody?.length &&
|
|
154
|
+
responseBody.length <= maxCapturingHttpPayloadSize
|
|
155
|
+
) {
|
|
156
|
+
networkRequest.responseBody = responseBody
|
|
157
|
+
}
|
|
158
|
+
} catch (error) {
|
|
159
|
+
console.warn('[Fetch Patch] Failed to capture response body:', error)
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Attach network request data to the response for later access
|
|
164
|
+
// @ts-ignore
|
|
165
|
+
response.networkRequest = networkRequest
|
|
166
|
+
|
|
167
|
+
return response
|
|
168
|
+
} catch (error) {
|
|
169
|
+
// Don't interfere with the original error - just log and rethrow
|
|
170
|
+
console.warn('[Fetch Patch] Fetch failed:', error)
|
|
171
|
+
throw error
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// Preserve the original fetch function's properties
|
|
176
|
+
try {
|
|
177
|
+
Object.setPrototypeOf(global.fetch, originalFetch)
|
|
178
|
+
Object.defineProperty(global.fetch, 'name', { value: 'fetch' })
|
|
179
|
+
Object.defineProperty(global.fetch, 'length', { value: originalFetch.length })
|
|
180
|
+
} catch (error) {
|
|
181
|
+
console.warn('[Fetch Patch] Failed to preserve fetch properties:', error)
|
|
182
|
+
}
|
|
183
|
+
} else {
|
|
184
|
+
console.info('Fetch patch: Skipping fetch patching - fetch not available or unsafe environment')
|
|
185
|
+
}
|
package/src/patch/index.ts
CHANGED
package/src/types/session.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { SessionType } from '@multiplayer-app/session-recorder-common';
|
|
2
|
+
import type { UserType } from './client-type.enum';
|
|
2
3
|
|
|
3
4
|
export interface IResourceAttributes {
|
|
4
5
|
browserInfo?: string;
|
|
@@ -13,14 +14,25 @@ export interface IResourceAttributes {
|
|
|
13
14
|
}
|
|
14
15
|
|
|
15
16
|
export interface ISessionAttributes {
|
|
16
|
-
userEmail?: string;
|
|
17
|
-
userId?: string;
|
|
18
|
-
userName?: string;
|
|
19
|
-
accountId?: string;
|
|
20
|
-
accountName?: string;
|
|
21
17
|
[key: string]: any;
|
|
22
18
|
}
|
|
23
19
|
|
|
20
|
+
|
|
21
|
+
export interface IUserAttributes {
|
|
22
|
+
type: UserType
|
|
23
|
+
id?: string
|
|
24
|
+
name?: string
|
|
25
|
+
groupId?: string
|
|
26
|
+
groupName?: string
|
|
27
|
+
userEmail?: string
|
|
28
|
+
userId?: string
|
|
29
|
+
userName?: string
|
|
30
|
+
accountId?: string
|
|
31
|
+
accountName?: string
|
|
32
|
+
orgId?: string
|
|
33
|
+
orgName?: string
|
|
34
|
+
tags?: string[]
|
|
35
|
+
}
|
|
24
36
|
export interface ISessionView {
|
|
25
37
|
_id: string;
|
|
26
38
|
name: string;
|
|
@@ -44,6 +56,9 @@ export interface ISession {
|
|
|
44
56
|
|
|
45
57
|
resourceAttributes?: IResourceAttributes;
|
|
46
58
|
sessionAttributes?: ISessionAttributes;
|
|
59
|
+
|
|
60
|
+
userAttributes?: IUserAttributes
|
|
61
|
+
|
|
47
62
|
views: ISessionView[];
|
|
48
63
|
starred: boolean;
|
|
49
64
|
starredItems: string[];
|