@softprobe/web-record 0.1.7 → 0.1.9
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/README.md +29 -34
- package/dist/http-interceptor.d.ts +21 -9
- package/dist/http-interceptor.d.ts.map +1 -1
- package/dist/http-interceptor.js +334 -67
- package/dist/http-interceptor.js.map +1 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/otlp.d.ts +21 -0
- package/dist/otlp.d.ts.map +1 -1
- package/dist/otlp.js +48 -0
- package/dist/otlp.js.map +1 -1
- package/dist/sdk.d.ts +20 -3
- package/dist/sdk.d.ts.map +1 -1
- package/dist/sdk.js +201 -12
- package/dist/sdk.js.map +1 -1
- package/dist/types.d.ts +31 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,55 +1,50 @@
|
|
|
1
1
|
# @softprobe/web-record
|
|
2
2
|
|
|
3
|
-
Browser session recording
|
|
4
|
-
and exports batches to Softprobe **thelake** via OTLP `POST {baseUrl}/v1/traces`.
|
|
3
|
+
Browser session recording and request tracing SDK.
|
|
5
4
|
|
|
6
5
|
## Install
|
|
7
6
|
|
|
8
|
-
```
|
|
7
|
+
```sh
|
|
9
8
|
npm install @softprobe/web-record
|
|
10
9
|
```
|
|
11
10
|
|
|
12
|
-
##
|
|
11
|
+
## Start capture
|
|
12
|
+
|
|
13
|
+
Initialize once when your app starts. The Agent API key is visible in browser code, so use an ingest-only key.
|
|
13
14
|
|
|
14
15
|
```ts
|
|
15
16
|
import { RecordSdk } from "@softprobe/web-record";
|
|
16
17
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
baseUrl:
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
18
|
+
RecordSdk.init({
|
|
19
|
+
apiKey: "<Agent API key>",
|
|
20
|
+
baseUrl: "https://explorer.softprobe.ai/api/thelake",
|
|
21
|
+
serviceName: "my-web-app",
|
|
22
|
+
environment: "production",
|
|
23
|
+
apiOrigins: ["https://api.example.com"],
|
|
24
|
+
httpBodyCapture: {
|
|
25
|
+
maxBodyBytes: 65536,
|
|
26
|
+
routes: [
|
|
27
|
+
{
|
|
28
|
+
origin: "https://api.example.com",
|
|
29
|
+
method: "POST",
|
|
30
|
+
path: "/api/orders",
|
|
31
|
+
redactJsonPaths: ["$.payment.cardNumber", "$.payment.cvv"],
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
},
|
|
23
35
|
});
|
|
24
|
-
|
|
25
|
-
// When the chat session changes:
|
|
26
|
-
recorder.setSessionId(nextSessionId);
|
|
27
|
-
|
|
28
|
-
// On teardown:
|
|
29
|
-
recorder.stop();
|
|
30
36
|
```
|
|
31
37
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
## Session header
|
|
38
|
+
The SDK creates a Session ID and keeps it in this tab across page loads. Set `sessionId` if your app already has a non-secret ID for the same user journey.
|
|
35
39
|
|
|
36
|
-
|
|
37
|
-
`x-sp-session-id` on **same-origin** requests only (relative URLs and
|
|
38
|
-
`location.origin`). Third-party / CDN calls are left untouched.
|
|
40
|
+
## Choose browser bodies
|
|
39
41
|
|
|
40
|
-
|
|
42
|
+
List each route by exact origin, method, and path. Its origin must also appear in `apiOrigins`. The SDK captures JSON bodies up to `maxBodyBytes`, replaces the configured JSON fields with `[REDACTED]`, and omits other content types and oversized bodies.
|
|
41
43
|
|
|
42
|
-
|
|
44
|
+
`apiOrigins` controls which API calls receive `traceparent` and `tracestate` headers. If the API has a different origin from the website, allow these headers in its CORS settings.
|
|
43
45
|
|
|
44
|
-
|
|
45
|
-
|---|---|
|
|
46
|
-
| name | `softprobe.web.recording` |
|
|
47
|
-
| `sp.observation.type` | `recording` |
|
|
48
|
-
| `sp.session.id` | correlation id |
|
|
49
|
-
| `sp.recording.batch_index` | monotonic batch counter |
|
|
50
|
-
| event `sp.recording.batch` | attribute `sp.recording.events` = JSON rrweb events |
|
|
46
|
+
## Configure backend bodies
|
|
51
47
|
|
|
52
|
-
|
|
48
|
+
Browser body rules do not configure OBI. Add the backend and outgoing HTTP routes to OBI's native `payload_extraction` rules. Keep the default body action set to `exclude`, then include and redact the routes you need. See the [OBI Config v2 guide](https://opentelemetry.io/docs/zero-code/obi/configure/config-v2/) and [payload-capture limits](https://github.com/open-telemetry/opentelemetry-ebpf-instrumentation/blob/main/devdocs/features.md#payload-capture).
|
|
53
49
|
|
|
54
|
-
|
|
55
|
-
(same product semantics as the LLM SDK).
|
|
50
|
+
Input masking applies to the browser recording. It does not redact HTTP bodies. Use `redactJsonPaths` for browser bodies and OBI obfuscation rules for backend and outgoing bodies.
|
|
@@ -1,12 +1,24 @@
|
|
|
1
|
-
type
|
|
2
|
-
export
|
|
1
|
+
import type { HttpBodyCaptureOptions } from "./types.js";
|
|
2
|
+
export type CapturedHttpBodies = {
|
|
3
|
+
requestBody?: string;
|
|
4
|
+
responseBody?: string;
|
|
5
|
+
};
|
|
6
|
+
export type RequestTraceHandle = {
|
|
7
|
+
traceparent: string;
|
|
8
|
+
tracestate?: string;
|
|
9
|
+
finish: (status: number, error?: unknown, bodies?: CapturedHttpBodies) => void;
|
|
10
|
+
};
|
|
11
|
+
export type RequestSpanFactory = (method: string, url: string) => RequestTraceHandle | null;
|
|
12
|
+
export type HttpInterceptorOptions = {
|
|
13
|
+
/** Exact HTTP(S) origins allowed to receive W3C trace context. */
|
|
14
|
+
apiOrigins?: string[];
|
|
15
|
+
httpBodyCapture?: HttpBodyCaptureOptions;
|
|
16
|
+
createRequestSpan?: RequestSpanFactory;
|
|
17
|
+
};
|
|
3
18
|
/**
|
|
4
|
-
* Patches XHR + fetch to inject
|
|
5
|
-
*
|
|
19
|
+
* Patches XHR + fetch to inject W3C trace context only on explicitly selected
|
|
20
|
+
* API origins. Session correlation is carried by exported spans, not request
|
|
21
|
+
* headers.
|
|
6
22
|
*/
|
|
7
|
-
export declare function initializeHttpInterceptor(
|
|
8
|
-
export declare function updateHttpInterceptorSessionId(getSessionId: SessionIdProvider): void;
|
|
9
|
-
/** Relative URLs and same `location.origin` only — skip third-party/CDN. */
|
|
10
|
-
export declare function isSameOriginRequest(resource: RequestInfo | URL): boolean;
|
|
11
|
-
export {};
|
|
23
|
+
export declare function initializeHttpInterceptor(options?: HttpInterceptorOptions): void;
|
|
12
24
|
//# sourceMappingURL=http-interceptor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-interceptor.d.ts","sourceRoot":"","sources":["../src/http-interceptor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"http-interceptor.d.ts","sourceRoot":"","sources":["../src/http-interceptor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAwB,MAAM,YAAY,CAAC;AAM/E,MAAM,MAAM,kBAAkB,GAAG;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,kBAAkB,KAAK,IAAI,CAAC;CAChF,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,CAC/B,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,KACR,kBAAkB,GAAG,IAAI,CAAC;AAE/B,MAAM,MAAM,sBAAsB,GAAG;IACnC,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,eAAe,CAAC,EAAE,sBAAsB,CAAC;IACzC,iBAAiB,CAAC,EAAE,kBAAkB,CAAC;CACxC,CAAC;AAkBF;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,GAAE,sBAA2B,GACnC,IAAI,CAMN"}
|
package/dist/http-interceptor.js
CHANGED
|
@@ -1,51 +1,234 @@
|
|
|
1
|
-
const
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
const DEFAULT_MAX_BODY_BYTES = 64 * 1024;
|
|
2
|
+
const MAX_BODY_BYTES = 256 * 1024;
|
|
3
|
+
const REDACTED_VALUE = "[REDACTED]";
|
|
4
|
+
let selectedApiOrigins = new Set();
|
|
5
|
+
let requestSpanFactory = null;
|
|
6
|
+
let bodyCapture = null;
|
|
6
7
|
/**
|
|
7
|
-
* Patches XHR + fetch to inject
|
|
8
|
-
*
|
|
8
|
+
* Patches XHR + fetch to inject W3C trace context only on explicitly selected
|
|
9
|
+
* API origins. Session correlation is carried by exported spans, not request
|
|
10
|
+
* headers.
|
|
9
11
|
*/
|
|
10
|
-
export function initializeHttpInterceptor(
|
|
11
|
-
|
|
12
|
+
export function initializeHttpInterceptor(options = {}) {
|
|
13
|
+
selectedApiOrigins = normalizeApiOrigins(options.apiOrigins ?? []);
|
|
14
|
+
requestSpanFactory = options.createRequestSpan ?? null;
|
|
15
|
+
bodyCapture = normalizeBodyCapture(options.httpBodyCapture);
|
|
12
16
|
patchXMLHttpRequest();
|
|
13
17
|
patchFetchAPI();
|
|
14
18
|
}
|
|
15
|
-
|
|
16
|
-
|
|
19
|
+
function normalizeApiOrigins(origins) {
|
|
20
|
+
const result = new Set();
|
|
21
|
+
for (const candidate of origins) {
|
|
22
|
+
try {
|
|
23
|
+
const parsed = new URL(candidate);
|
|
24
|
+
if ((parsed.protocol === "https:" || parsed.protocol === "http:") &&
|
|
25
|
+
!parsed.username &&
|
|
26
|
+
!parsed.password &&
|
|
27
|
+
parsed.pathname === "/" &&
|
|
28
|
+
!parsed.search &&
|
|
29
|
+
!parsed.hash) {
|
|
30
|
+
result.add(parsed.origin);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// Invalid entries never widen trace-context injection.
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return result;
|
|
17
38
|
}
|
|
18
|
-
function
|
|
19
|
-
|
|
39
|
+
function resourceUrl(resource) {
|
|
40
|
+
if (typeof Request !== "undefined" && resource instanceof Request) {
|
|
41
|
+
return resource.url;
|
|
42
|
+
}
|
|
43
|
+
return resource instanceof URL ? resource.href : String(resource);
|
|
20
44
|
}
|
|
21
|
-
|
|
22
|
-
export function isSameOriginRequest(resource) {
|
|
45
|
+
function selectedOriginFor(resource) {
|
|
23
46
|
try {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
47
|
+
const href = resourceUrl(resource);
|
|
48
|
+
const base = typeof location !== "undefined" ? location.href : undefined;
|
|
49
|
+
const parsed = base ? new URL(href, base) : new URL(href);
|
|
50
|
+
return selectedApiOrigins.has(parsed.origin) ? parsed.origin : null;
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function createRequestTrace(resource, method) {
|
|
57
|
+
if (!requestSpanFactory || !selectedOriginFor(resource))
|
|
58
|
+
return null;
|
|
59
|
+
try {
|
|
60
|
+
return requestSpanFactory(method.toUpperCase(), resourceUrl(resource));
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function normalizeBodyCapture(options) {
|
|
67
|
+
if (!options || !Array.isArray(options.routes))
|
|
68
|
+
return null;
|
|
69
|
+
const maxBodyBytes = options.maxBodyBytes ?? DEFAULT_MAX_BODY_BYTES;
|
|
70
|
+
if (!Number.isInteger(maxBodyBytes) || maxBodyBytes <= 0 || maxBodyBytes > MAX_BODY_BYTES) {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
const routes = new Map();
|
|
74
|
+
for (const candidate of options.routes) {
|
|
75
|
+
if (!candidate || typeof candidate !== "object")
|
|
76
|
+
continue;
|
|
77
|
+
const method = typeof candidate.method === "string" ? candidate.method.trim().toUpperCase() : "";
|
|
78
|
+
const path = typeof candidate.path === "string" ? candidate.path.trim() : "";
|
|
79
|
+
if (!/^[A-Z]+$/.test(method) || !path.startsWith("/") || path.includes("?") || path.includes("#")) {
|
|
80
|
+
continue;
|
|
27
81
|
}
|
|
28
|
-
|
|
29
|
-
|
|
82
|
+
let origin;
|
|
83
|
+
try {
|
|
84
|
+
const parsed = new URL(candidate.origin);
|
|
85
|
+
if ((parsed.protocol !== "https:" && parsed.protocol !== "http:") ||
|
|
86
|
+
parsed.username || parsed.password || parsed.pathname !== "/" ||
|
|
87
|
+
parsed.search || parsed.hash) {
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
origin = parsed.origin;
|
|
30
91
|
}
|
|
31
|
-
|
|
32
|
-
|
|
92
|
+
catch {
|
|
93
|
+
continue;
|
|
33
94
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
95
|
+
const redactionPaths = candidate.redactJsonPaths ?? [];
|
|
96
|
+
if (!Array.isArray(redactionPaths))
|
|
97
|
+
continue;
|
|
98
|
+
const parsedPaths = redactionPaths.map(parseRedactionPath);
|
|
99
|
+
if (parsedPaths.some((parts) => parts === null))
|
|
100
|
+
continue;
|
|
101
|
+
const route = {
|
|
102
|
+
origin,
|
|
103
|
+
method,
|
|
104
|
+
path,
|
|
105
|
+
redactionPaths: parsedPaths,
|
|
106
|
+
};
|
|
107
|
+
routes.set(bodyCaptureRouteKey(origin, method, path), route);
|
|
108
|
+
}
|
|
109
|
+
return routes.size > 0 ? { maxBodyBytes, routes } : null;
|
|
110
|
+
}
|
|
111
|
+
function parseRedactionPath(path) {
|
|
112
|
+
if (typeof path !== "string" || !path.startsWith("$."))
|
|
113
|
+
return null;
|
|
114
|
+
const parts = path.slice(2).split(".");
|
|
115
|
+
if (parts.length === 0 || parts.some((part) => !/^[A-Za-z_][A-Za-z0-9_-]*$/.test(part) ||
|
|
116
|
+
part === "__proto__" || part === "prototype" || part === "constructor"))
|
|
117
|
+
return null;
|
|
118
|
+
return parts;
|
|
119
|
+
}
|
|
120
|
+
function bodyCaptureRouteFor(resource, method) {
|
|
121
|
+
if (!bodyCapture || !selectedOriginFor(resource))
|
|
122
|
+
return null;
|
|
123
|
+
try {
|
|
124
|
+
const base = typeof location !== "undefined" ? location.href : undefined;
|
|
125
|
+
const parsed = new URL(typeof resource === "string" ? resource : resourceUrl(resource), base);
|
|
126
|
+
return bodyCapture.routes.get(bodyCaptureRouteKey(parsed.origin, method.toUpperCase(), parsed.pathname)) ?? null;
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
function bodyCaptureRouteKey(origin, method, path) {
|
|
133
|
+
return `${origin}\n${method}\n${path}`;
|
|
134
|
+
}
|
|
135
|
+
function isJsonContentType(contentType) {
|
|
136
|
+
return contentType !== null && /^application\/(?:[a-z0-9._-]+\+)?json(?:\s*;|$)/i.test(contentType.trim());
|
|
137
|
+
}
|
|
138
|
+
function sanitizedJsonBody(text, route, maxBodyBytes) {
|
|
139
|
+
if (new TextEncoder().encode(text).byteLength > maxBodyBytes)
|
|
140
|
+
return undefined;
|
|
141
|
+
let value;
|
|
142
|
+
try {
|
|
143
|
+
value = JSON.parse(text);
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
return undefined;
|
|
147
|
+
}
|
|
148
|
+
for (const path of route.redactionPaths)
|
|
149
|
+
redactJsonPath(value, path);
|
|
150
|
+
const sanitized = JSON.stringify(value);
|
|
151
|
+
return new TextEncoder().encode(sanitized).byteLength <= maxBodyBytes ? sanitized : undefined;
|
|
152
|
+
}
|
|
153
|
+
function redactJsonPath(value, path, index = 0) {
|
|
154
|
+
if (value === null || typeof value !== "object")
|
|
155
|
+
return;
|
|
156
|
+
const key = path[index];
|
|
157
|
+
if (!Object.hasOwn(value, key))
|
|
158
|
+
return;
|
|
159
|
+
if (index === path.length - 1) {
|
|
160
|
+
value[key] = REDACTED_VALUE;
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
redactJsonPath(value[key], path, index + 1);
|
|
164
|
+
}
|
|
165
|
+
async function readBoundedJsonStream(stream, contentType, route, maxBodyBytes) {
|
|
166
|
+
if (!stream || !isJsonContentType(contentType))
|
|
167
|
+
return undefined;
|
|
168
|
+
let reader;
|
|
169
|
+
try {
|
|
170
|
+
reader = stream.getReader();
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
return undefined;
|
|
174
|
+
}
|
|
175
|
+
const chunks = [];
|
|
176
|
+
let size = 0;
|
|
177
|
+
try {
|
|
178
|
+
while (true) {
|
|
179
|
+
const part = await reader.read();
|
|
180
|
+
if (part.done)
|
|
181
|
+
break;
|
|
182
|
+
size += part.value.byteLength;
|
|
183
|
+
if (size > maxBodyBytes) {
|
|
184
|
+
void reader.cancel().catch(() => undefined);
|
|
185
|
+
return undefined;
|
|
41
186
|
}
|
|
42
|
-
|
|
187
|
+
chunks.push(part.value);
|
|
43
188
|
}
|
|
44
|
-
const resolved = new URL(href, location.href);
|
|
45
|
-
return resolved.origin === location.origin;
|
|
46
189
|
}
|
|
47
190
|
catch {
|
|
48
|
-
return
|
|
191
|
+
return undefined;
|
|
192
|
+
}
|
|
193
|
+
finally {
|
|
194
|
+
try {
|
|
195
|
+
reader.releaseLock();
|
|
196
|
+
}
|
|
197
|
+
catch { /* a canceled stream may still hold its lock */ }
|
|
198
|
+
}
|
|
199
|
+
const bytes = new Uint8Array(size);
|
|
200
|
+
let offset = 0;
|
|
201
|
+
for (const chunk of chunks) {
|
|
202
|
+
bytes.set(chunk, offset);
|
|
203
|
+
offset += chunk.byteLength;
|
|
204
|
+
}
|
|
205
|
+
return sanitizedJsonBody(new TextDecoder().decode(bytes), route, maxBodyBytes);
|
|
206
|
+
}
|
|
207
|
+
function captureFetchRequestBody(resource, options, headers, route, maxBodyBytes) {
|
|
208
|
+
if (!isJsonContentType(headers.get("content-type")))
|
|
209
|
+
return Promise.resolve(undefined);
|
|
210
|
+
if (options && Object.hasOwn(options, "body")) {
|
|
211
|
+
return Promise.resolve(typeof options.body === "string"
|
|
212
|
+
? sanitizedJsonBody(options.body, route, maxBodyBytes)
|
|
213
|
+
: undefined);
|
|
214
|
+
}
|
|
215
|
+
if (typeof Request === "undefined" || !(resource instanceof Request) || !resource.body) {
|
|
216
|
+
return Promise.resolve(undefined);
|
|
217
|
+
}
|
|
218
|
+
try {
|
|
219
|
+
const clone = resource.clone();
|
|
220
|
+
return readBoundedJsonStream(clone.body, headers.get("content-type"), route, maxBodyBytes);
|
|
221
|
+
}
|
|
222
|
+
catch {
|
|
223
|
+
return Promise.resolve(undefined);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
function finishRequestTrace(span, status, error, bodies) {
|
|
227
|
+
try {
|
|
228
|
+
span?.finish(status, error, bodies);
|
|
229
|
+
}
|
|
230
|
+
catch {
|
|
231
|
+
// Tracing must never change application request behavior.
|
|
49
232
|
}
|
|
50
233
|
}
|
|
51
234
|
function patchXMLHttpRequest() {
|
|
@@ -56,21 +239,84 @@ function patchXMLHttpRequest() {
|
|
|
56
239
|
}
|
|
57
240
|
const originalOpen = XMLHttpRequest.prototype.open;
|
|
58
241
|
const originalSend = XMLHttpRequest.prototype.send;
|
|
242
|
+
const originalSetRequestHeader = XMLHttpRequest.prototype.setRequestHeader;
|
|
243
|
+
XMLHttpRequest.prototype.setRequestHeader = function (name, value) {
|
|
244
|
+
const result = originalSetRequestHeader.call(this, name, value);
|
|
245
|
+
const traced = this;
|
|
246
|
+
try {
|
|
247
|
+
traced.__sp_request_headers ??= new Headers();
|
|
248
|
+
traced.__sp_request_headers.append(name, value);
|
|
249
|
+
}
|
|
250
|
+
catch {
|
|
251
|
+
// Header observation must not change the application request.
|
|
252
|
+
}
|
|
253
|
+
return result;
|
|
254
|
+
};
|
|
59
255
|
XMLHttpRequest.prototype.open = function (method, url, async, username, password) {
|
|
60
|
-
|
|
61
|
-
|
|
256
|
+
const traced = this;
|
|
257
|
+
traced.__sp_request_url = url;
|
|
258
|
+
traced.__sp_request_method = method;
|
|
259
|
+
traced.__sp_request_headers = new Headers();
|
|
62
260
|
return originalOpen.call(this, method, url, async ?? true, username, password);
|
|
63
261
|
};
|
|
64
262
|
XMLHttpRequest.prototype.send = function (body) {
|
|
65
|
-
const
|
|
66
|
-
const url =
|
|
67
|
-
|
|
68
|
-
|
|
263
|
+
const traced = this;
|
|
264
|
+
const url = traced.__sp_request_url;
|
|
265
|
+
const method = traced.__sp_request_method ?? "GET";
|
|
266
|
+
const span = url === undefined
|
|
267
|
+
? null
|
|
268
|
+
: createRequestTrace(url, method);
|
|
269
|
+
const route = url === undefined ? null : bodyCaptureRouteFor(url, method);
|
|
270
|
+
const requestBody = route && bodyCapture
|
|
271
|
+
&& isJsonContentType(traced.__sp_request_headers?.get("content-type") ?? null)
|
|
272
|
+
&& typeof body === "string"
|
|
273
|
+
? sanitizedJsonBody(body, route, bodyCapture.maxBodyBytes)
|
|
274
|
+
: undefined;
|
|
275
|
+
if (span) {
|
|
69
276
|
try {
|
|
70
|
-
this.setRequestHeader(
|
|
277
|
+
this.setRequestHeader("traceparent", span.traceparent);
|
|
278
|
+
if (span.tracestate)
|
|
279
|
+
this.setRequestHeader("tracestate", span.tracestate);
|
|
71
280
|
}
|
|
72
281
|
catch {
|
|
73
|
-
//
|
|
282
|
+
// A failed propagation header must not block the application request.
|
|
283
|
+
}
|
|
284
|
+
let finished = false;
|
|
285
|
+
const finish = () => {
|
|
286
|
+
if (finished)
|
|
287
|
+
return;
|
|
288
|
+
finished = true;
|
|
289
|
+
const status = this.status;
|
|
290
|
+
let responseBody;
|
|
291
|
+
let responseContentType = null;
|
|
292
|
+
try {
|
|
293
|
+
responseContentType = this.getResponseHeader("content-type");
|
|
294
|
+
}
|
|
295
|
+
catch { /* Failed requests may have no response headers. */ }
|
|
296
|
+
if (route && bodyCapture && isJsonContentType(responseContentType)) {
|
|
297
|
+
try {
|
|
298
|
+
const raw = this.responseType === "json"
|
|
299
|
+
? JSON.stringify(this.response)
|
|
300
|
+
: this.responseType === "" || this.responseType === "text"
|
|
301
|
+
? this.responseText
|
|
302
|
+
: undefined;
|
|
303
|
+
if (typeof raw === "string") {
|
|
304
|
+
responseBody = sanitizedJsonBody(raw, route, bodyCapture.maxBodyBytes);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
catch {
|
|
308
|
+
responseBody = undefined;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
finishRequestTrace(span, status, status === 0 ? new Error("XHR request did not receive a response") : undefined, route ? { requestBody, responseBody } : undefined);
|
|
312
|
+
};
|
|
313
|
+
this.addEventListener("loadend", finish, { once: true });
|
|
314
|
+
try {
|
|
315
|
+
return originalSend.call(this, body);
|
|
316
|
+
}
|
|
317
|
+
catch (error) {
|
|
318
|
+
finishRequestTrace(span, 0, error, route ? { requestBody } : undefined);
|
|
319
|
+
throw error;
|
|
74
320
|
}
|
|
75
321
|
}
|
|
76
322
|
return originalSend.call(this, body);
|
|
@@ -85,40 +331,61 @@ function patchFetchAPI() {
|
|
|
85
331
|
return;
|
|
86
332
|
const originalFetch = g.fetch.bind(globalThis);
|
|
87
333
|
g.fetch = (async function patchedFetch(resource, options) {
|
|
88
|
-
const
|
|
89
|
-
|
|
334
|
+
const method = options?.method ??
|
|
335
|
+
(typeof Request !== "undefined" && resource instanceof Request
|
|
336
|
+
? resource.method
|
|
337
|
+
: "GET");
|
|
338
|
+
const span = createRequestTrace(resource, method);
|
|
339
|
+
if (!span)
|
|
90
340
|
return originalFetch(resource, options);
|
|
91
|
-
|
|
341
|
+
const route = bodyCaptureRouteFor(resource, method);
|
|
342
|
+
let requestOptions = options;
|
|
343
|
+
let headers;
|
|
92
344
|
try {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
headers.set(HEADER_X_SP_SESSION_ID, sid);
|
|
101
|
-
return originalFetch(resource, { ...options, headers });
|
|
345
|
+
headers = new Headers(typeof Request !== "undefined" && resource instanceof Request
|
|
346
|
+
? resource.headers
|
|
347
|
+
: options?.headers);
|
|
348
|
+
if (typeof Request !== "undefined" && resource instanceof Request && options?.headers) {
|
|
349
|
+
new Headers(options.headers).forEach((value, key) => headers.set(key, value));
|
|
102
350
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
next.headers = headers;
|
|
351
|
+
if (span) {
|
|
352
|
+
headers.set("traceparent", span.traceparent);
|
|
353
|
+
if (span.tracestate)
|
|
354
|
+
headers.set("tracestate", span.tracestate);
|
|
108
355
|
}
|
|
109
|
-
|
|
110
|
-
|
|
356
|
+
requestOptions = { ...(options ?? {}), headers };
|
|
357
|
+
}
|
|
358
|
+
catch {
|
|
359
|
+
// Invalid or unsupported header input should not block the application request.
|
|
360
|
+
finishRequestTrace(span, 0, new Error("Unable to inject request headers"));
|
|
361
|
+
return originalFetch(resource, options);
|
|
362
|
+
}
|
|
363
|
+
const requestCapture = route && bodyCapture
|
|
364
|
+
? captureFetchRequestBody(resource, requestOptions, headers, route, bodyCapture.maxBodyBytes)
|
|
365
|
+
: Promise.resolve(undefined);
|
|
366
|
+
try {
|
|
367
|
+
const response = await originalFetch(resource, requestOptions);
|
|
368
|
+
if (route && bodyCapture) {
|
|
369
|
+
const responseCapture = readBoundedJsonStream(response.clone().body, response.headers.get("content-type"), route, bodyCapture.maxBodyBytes);
|
|
370
|
+
void Promise.all([requestCapture, responseCapture]).then(([requestBody, responseBody]) => {
|
|
371
|
+
finishRequestTrace(span, response.status, undefined, { requestBody, responseBody });
|
|
372
|
+
}, (error) => {
|
|
373
|
+
finishRequestTrace(span, response.status, error);
|
|
374
|
+
});
|
|
111
375
|
}
|
|
112
376
|
else {
|
|
113
|
-
|
|
114
|
-
...headers,
|
|
115
|
-
[HEADER_X_SP_SESSION_ID]: sid,
|
|
116
|
-
};
|
|
377
|
+
finishRequestTrace(span, response.status);
|
|
117
378
|
}
|
|
118
|
-
return
|
|
379
|
+
return response;
|
|
119
380
|
}
|
|
120
|
-
catch {
|
|
121
|
-
|
|
381
|
+
catch (error) {
|
|
382
|
+
if (route && bodyCapture) {
|
|
383
|
+
void requestCapture.then((requestBody) => finishRequestTrace(span, 0, error, { requestBody }), () => finishRequestTrace(span, 0, error));
|
|
384
|
+
}
|
|
385
|
+
else {
|
|
386
|
+
finishRequestTrace(span, 0, error);
|
|
387
|
+
}
|
|
388
|
+
throw error;
|
|
122
389
|
}
|
|
123
390
|
});
|
|
124
391
|
g.fetch.__sp_sdk_patched_fetch = true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-interceptor.js","sourceRoot":"","sources":["../src/http-interceptor.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"http-interceptor.js","sourceRoot":"","sources":["../src/http-interceptor.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
export { RecordSdk } from "./sdk.js";
|
|
2
|
-
export { buildRecordingExport, msToUnixNano, randomHexId, EVENT_NAME, EVENTS_ATTR, SPAN_NAME, } from "./otlp.js";
|
|
3
|
-
export {
|
|
4
|
-
export
|
|
2
|
+
export { buildRecordingExport, msToUnixNano, randomHexId, EVENT_NAME, EVENTS_ATTR, buildClientRequestExport, SPAN_NAME, } from "./otlp.js";
|
|
3
|
+
export type { BuildClientRequestSpanInput } from "./otlp.js";
|
|
4
|
+
export { initializeHttpInterceptor, } from "./http-interceptor.js";
|
|
5
|
+
export type { CapturedHttpBodies, HttpInterceptorOptions, RequestSpanFactory, RequestTraceHandle, } from "./http-interceptor.js";
|
|
6
|
+
export type { CompressedRrwebEvent, HttpBodyCaptureOptions, HttpBodyCaptureRoute, RecordingHandle, RrwebEventBatchItem, RecordingUploadStatus, SystemInfo, Tags, WebRecordController, WebRecordCredentials, WebRecordInitOptions, } from "./types.js";
|
|
5
7
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EACL,oBAAoB,EACpB,YAAY,EACZ,WAAW,EACX,UAAU,EACV,WAAW,EACX,SAAS,GACV,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,sBAAsB,EACtB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EACL,oBAAoB,EACpB,YAAY,EACZ,WAAW,EACX,UAAU,EACV,WAAW,EACX,wBAAwB,EACxB,SAAS,GACV,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,2BAA2B,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EACL,yBAAyB,GAC1B,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,oBAAoB,EACpB,sBAAsB,EACtB,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EACnB,qBAAqB,EACrB,UAAU,EACV,IAAI,EACJ,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { RecordSdk } from "./sdk.js";
|
|
2
|
-
export { buildRecordingExport, msToUnixNano, randomHexId, EVENT_NAME, EVENTS_ATTR, SPAN_NAME, } from "./otlp.js";
|
|
3
|
-
export {
|
|
2
|
+
export { buildRecordingExport, msToUnixNano, randomHexId, EVENT_NAME, EVENTS_ATTR, buildClientRequestExport, SPAN_NAME, } from "./otlp.js";
|
|
3
|
+
export { initializeHttpInterceptor, } from "./http-interceptor.js";
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EACL,oBAAoB,EACpB,YAAY,EACZ,WAAW,EACX,UAAU,EACV,WAAW,EACX,SAAS,GACV,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EACL,oBAAoB,EACpB,YAAY,EACZ,WAAW,EACX,UAAU,EACV,WAAW,EACX,wBAAwB,EACxB,SAAS,GACV,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,yBAAyB,GAC1B,MAAM,uBAAuB,CAAC"}
|