@debugbundle/sdk-browser 0.1.0-next.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.
@@ -0,0 +1,14 @@
1
+ import type { ActiveConfig, BrowserBreadcrumb, BrowserDeviceInfo, BrowserFetch, BrowserXmlHttpRequestConstructor } from "./types.js";
2
+ interface ConsoleHookInstallResult {
3
+ originalConsoleError: ((...args: unknown[]) => void) | null;
4
+ originalConsoleWarn: ((...args: unknown[]) => void) | null;
5
+ }
6
+ interface NetworkHookInstallResult {
7
+ originalFetch: BrowserFetch | null;
8
+ originalXmlHttpRequest: BrowserXmlHttpRequestConstructor | null;
9
+ }
10
+ export declare function installConsoleHook(config: ActiveConfig | null, addBreadcrumb: (breadcrumb: BrowserBreadcrumb) => void): ConsoleHookInstallResult;
11
+ export declare function installNetworkHook(config: ActiveConfig | null, addBreadcrumb: (breadcrumb: BrowserBreadcrumb) => void, shouldCaptureNetworkRequest: (url: string, statusCode: number, durationMs: number) => boolean, getCurrentRoute: () => string | null): NetworkHookInstallResult;
12
+ export declare function collectDeviceInfo(): BrowserDeviceInfo;
13
+ export {};
14
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EAIZ,gCAAgC,EACjC,MAAM,YAAY,CAAC;AA8GpB,UAAU,wBAAwB;IAChC,oBAAoB,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;IAC5D,mBAAmB,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;CAC5D;AAED,UAAU,wBAAwB;IAChC,aAAa,EAAE,YAAY,GAAG,IAAI,CAAC;IACnC,sBAAsB,EAAE,gCAAgC,GAAG,IAAI,CAAC;CACjE;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,YAAY,GAAG,IAAI,EAC3B,aAAa,EAAE,CAAC,UAAU,EAAE,iBAAiB,KAAK,IAAI,GACrD,wBAAwB,CA8C1B;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,YAAY,GAAG,IAAI,EAC3B,aAAa,EAAE,CAAC,UAAU,EAAE,iBAAiB,KAAK,IAAI,EACtD,2BAA2B,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,EAC7F,eAAe,EAAE,MAAM,MAAM,GAAG,IAAI,GACnC,wBAAwB,CAuI1B;AAED,wBAAgB,iBAAiB,IAAI,iBAAiB,CAiDrD"}
package/dist/hooks.js ADDED
@@ -0,0 +1,295 @@
1
+ import { captureCallerTrace, createBrowserTraceId, deriveSdkConfigEndpoint, detectDeviceType, getConsoleSource, getFetchSource, getMatchMedia, getNavigatorSource, getScreenSource, getWindowSource, getXmlHttpRequestConstructor, parseBrowserIdentity, parseOsIdentity, shouldInjectTraceHeader, stringifyConsoleArgs } from "./runtime.js";
2
+ import { MAX_BODY_CAPTURE_BYTES } from "./types.js";
3
+ const MUTATING_METHODS = new Set(["POST", "PUT", "PATCH", "DELETE"]);
4
+ const INTERESTING_RESPONSE_HEADERS = [
5
+ "content-type",
6
+ "x-debugbundle-trace-id",
7
+ "retry-after",
8
+ "x-ratelimit-limit",
9
+ "x-ratelimit-remaining",
10
+ "x-ratelimit-reset",
11
+ "x-request-id",
12
+ "www-authenticate",
13
+ "location"
14
+ ];
15
+ function truncateBody(body) {
16
+ if (body.length <= MAX_BODY_CAPTURE_BYTES)
17
+ return body;
18
+ return body.slice(0, MAX_BODY_CAPTURE_BYTES) + "...[truncated]";
19
+ }
20
+ function tryParseJsonBody(raw) {
21
+ try {
22
+ return JSON.parse(raw);
23
+ }
24
+ catch {
25
+ return raw;
26
+ }
27
+ }
28
+ function extractResponseHeaders(response) {
29
+ if (!response.headers || typeof response.headers.get !== "function")
30
+ return undefined;
31
+ const extracted = {};
32
+ for (const name of INTERESTING_RESPONSE_HEADERS) {
33
+ const value = response.headers.get(name);
34
+ if (value !== null) {
35
+ extracted[name] = value;
36
+ }
37
+ }
38
+ return Object.keys(extracted).length > 0 ? extracted : undefined;
39
+ }
40
+ async function captureResponseBody(response) {
41
+ if (response.status >= 200 && response.status < 300)
42
+ return undefined;
43
+ if (typeof response.clone !== "function" || typeof response.text !== "function")
44
+ return undefined;
45
+ try {
46
+ const cloned = response.clone();
47
+ if (typeof cloned.text !== "function")
48
+ return undefined;
49
+ const text = await cloned.text();
50
+ if (text.length === 0)
51
+ return undefined;
52
+ return truncateBody(text);
53
+ }
54
+ catch {
55
+ return undefined;
56
+ }
57
+ }
58
+ function captureRequestBody(init) {
59
+ const method = (typeof init.method === "string" ? init.method : "GET").toUpperCase();
60
+ if (!MUTATING_METHODS.has(method))
61
+ return undefined;
62
+ if (typeof init.body !== "string" || init.body.length === 0)
63
+ return undefined;
64
+ return tryParseJsonBody(truncateBody(init.body));
65
+ }
66
+ function buildNetworkBreadcrumbData(url, method, statusCode, durationMs, callerTrace, extras) {
67
+ const data = {
68
+ url,
69
+ method,
70
+ status_code: statusCode,
71
+ duration_ms: durationMs
72
+ };
73
+ if (callerTrace.length > 0)
74
+ data["caller_trace"] = callerTrace;
75
+ if (extras.responseBody !== undefined) {
76
+ data["response_body"] = tryParseJsonBody(extras.responseBody);
77
+ }
78
+ if (extras.requestBody !== undefined) {
79
+ data["request_body"] = extras.requestBody;
80
+ }
81
+ if (extras.responseHeaders !== undefined) {
82
+ data["response_headers"] = extras.responseHeaders;
83
+ }
84
+ if (extras.responseContentLength !== undefined) {
85
+ data["response_content_length"] = extras.responseContentLength;
86
+ }
87
+ const meta = extras.requestMetadata;
88
+ if (meta?.operation !== undefined)
89
+ data["operation"] = meta.operation;
90
+ if (meta?.initiator !== undefined)
91
+ data["initiator"] = meta.initiator;
92
+ if (meta?.feature !== undefined)
93
+ data["feature"] = meta.feature;
94
+ return data;
95
+ }
96
+ export function installConsoleHook(config, addBreadcrumb) {
97
+ const consoleSource = getConsoleSource();
98
+ if (config === null || consoleSource === null || config.captureConsole !== true) {
99
+ return {
100
+ originalConsoleError: null,
101
+ originalConsoleWarn: null
102
+ };
103
+ }
104
+ let originalConsoleError = null;
105
+ let originalConsoleWarn = null;
106
+ if (typeof consoleSource.error === "function") {
107
+ originalConsoleError = consoleSource.error.bind(consoleSource);
108
+ consoleSource.error = (...args) => {
109
+ originalConsoleError?.(...args);
110
+ addBreadcrumb({
111
+ ts: new Date().toISOString(),
112
+ breadcrumb_type: "console_log",
113
+ data: {
114
+ level: "error",
115
+ message: stringifyConsoleArgs(args)
116
+ }
117
+ });
118
+ };
119
+ }
120
+ if (typeof consoleSource.warn === "function") {
121
+ originalConsoleWarn = consoleSource.warn.bind(consoleSource);
122
+ consoleSource.warn = (...args) => {
123
+ originalConsoleWarn?.(...args);
124
+ addBreadcrumb({
125
+ ts: new Date().toISOString(),
126
+ breadcrumb_type: "console_log",
127
+ data: {
128
+ level: "warning",
129
+ message: stringifyConsoleArgs(args)
130
+ }
131
+ });
132
+ };
133
+ }
134
+ return {
135
+ originalConsoleError,
136
+ originalConsoleWarn
137
+ };
138
+ }
139
+ export function installNetworkHook(config, addBreadcrumb, shouldCaptureNetworkRequest, getCurrentRoute) {
140
+ const fetchSource = getFetchSource();
141
+ const xmlHttpRequestConstructor = getXmlHttpRequestConstructor();
142
+ if (config === null || (fetchSource === null && xmlHttpRequestConstructor === null)) {
143
+ return {
144
+ originalFetch: null,
145
+ originalXmlHttpRequest: null
146
+ };
147
+ }
148
+ const configEndpoint = deriveSdkConfigEndpoint(config.endpoint);
149
+ if (fetchSource !== null) {
150
+ globalThis["fetch"] = async (input, init) => {
151
+ const inputInit = (init ?? {});
152
+ const { debugbundle: requestMetadata, headers: requestHeaders, ...forwardedInit } = inputInit;
153
+ const callerTrace = captureCallerTrace(1, 5);
154
+ const injectTraceHeader = shouldInjectTraceHeader(input, config.tracePropagationTargets);
155
+ const traceId = injectTraceHeader ? createBrowserTraceId() : null;
156
+ const startedAt = Date.now();
157
+ const response = await fetchSource(input, {
158
+ ...forwardedInit,
159
+ headers: {
160
+ ...(requestHeaders ?? {}),
161
+ ...(traceId === null ? {} : { "X-DebugBundle-Trace-Id": traceId })
162
+ }
163
+ });
164
+ const durationMs = Date.now() - startedAt;
165
+ if (config.captureNetwork === true &&
166
+ input !== config.endpoint &&
167
+ input !== configEndpoint &&
168
+ shouldCaptureNetworkRequest(input, response.status, durationMs)) {
169
+ const responseBody = await captureResponseBody(response);
170
+ const requestBody = captureRequestBody(inputInit);
171
+ const responseHeaders = extractResponseHeaders(response);
172
+ const contentLengthHeader = response.headers?.get("content-length");
173
+ const responseContentLength = contentLengthHeader !== null && contentLengthHeader !== undefined
174
+ ? parseInt(contentLengthHeader, 10)
175
+ : undefined;
176
+ addBreadcrumb({
177
+ ts: new Date().toISOString(),
178
+ breadcrumb_type: "network_request",
179
+ route: getCurrentRoute(),
180
+ data: buildNetworkBreadcrumbData(input, typeof inputInit.method === "string" ? inputInit.method : "GET", response.status, durationMs, callerTrace, {
181
+ requestMetadata,
182
+ responseBody,
183
+ requestBody,
184
+ responseHeaders,
185
+ responseContentLength: Number.isFinite(responseContentLength) ? responseContentLength : undefined
186
+ })
187
+ });
188
+ }
189
+ return response;
190
+ };
191
+ }
192
+ if (xmlHttpRequestConstructor !== null) {
193
+ const activeConfig = config;
194
+ const activeXmlHttpRequestConstructor = xmlHttpRequestConstructor;
195
+ const captureXmlHttpRequest = (url, method, statusCode, durationMs) => {
196
+ if (activeConfig.captureNetwork === true &&
197
+ url !== activeConfig.endpoint &&
198
+ url !== configEndpoint &&
199
+ shouldCaptureNetworkRequest(url, statusCode, durationMs)) {
200
+ addBreadcrumb({
201
+ ts: new Date().toISOString(),
202
+ breadcrumb_type: "network_request",
203
+ route: getCurrentRoute(),
204
+ data: {
205
+ url,
206
+ method,
207
+ status_code: statusCode,
208
+ duration_ms: durationMs
209
+ }
210
+ });
211
+ }
212
+ };
213
+ globalThis["XMLHttpRequest"] = class WrappedXmlHttpRequest {
214
+ constructor() {
215
+ const request = new activeXmlHttpRequestConstructor();
216
+ let method = "GET";
217
+ let url = "";
218
+ let startedAt = 0;
219
+ const originalOpen = request.open.bind(request);
220
+ request.open = (nextMethod, nextUrl, async) => {
221
+ method = nextMethod;
222
+ url = nextUrl;
223
+ originalOpen(nextMethod, nextUrl, async);
224
+ if (shouldInjectTraceHeader(nextUrl, activeConfig.tracePropagationTargets)) {
225
+ request.setRequestHeader("X-DebugBundle-Trace-Id", createBrowserTraceId());
226
+ }
227
+ };
228
+ const originalSend = request.send.bind(request);
229
+ request.send = (body) => {
230
+ startedAt = Date.now();
231
+ const onLoadEnd = () => {
232
+ request.removeEventListener("loadend", onLoadEnd);
233
+ const statusCode = typeof request.status === "number" ? request.status : 0;
234
+ const durationMs = Date.now() - startedAt;
235
+ captureXmlHttpRequest(url, method, statusCode, durationMs);
236
+ };
237
+ request.addEventListener("loadend", onLoadEnd);
238
+ originalSend(body);
239
+ };
240
+ return request;
241
+ }
242
+ };
243
+ }
244
+ return {
245
+ originalFetch: fetchSource,
246
+ originalXmlHttpRequest: xmlHttpRequestConstructor
247
+ };
248
+ }
249
+ export function collectDeviceInfo() {
250
+ const navigatorObject = getNavigatorSource();
251
+ const screenObject = getScreenSource();
252
+ const windowSource = getWindowSource();
253
+ const userAgent = navigatorObject?.userAgent ?? null;
254
+ const browser = parseBrowserIdentity(userAgent);
255
+ const matchMedia = getMatchMedia();
256
+ const colorSchemePreference = matchMedia !== null
257
+ ? matchMedia("(prefers-color-scheme: dark)").matches
258
+ ? "dark"
259
+ : "light"
260
+ : null;
261
+ return {
262
+ user_agent: userAgent,
263
+ os: parseOsIdentity(userAgent),
264
+ browser,
265
+ device_type: detectDeviceType(userAgent),
266
+ screen: {
267
+ width: typeof screenObject?.width === "number" ? screenObject.width : 0,
268
+ height: typeof screenObject?.height === "number" ? screenObject.height : 0
269
+ },
270
+ viewport: {
271
+ width: typeof windowSource?.innerWidth === "number"
272
+ ? (windowSource.innerWidth ?? 0)
273
+ : typeof screenObject?.width === "number"
274
+ ? screenObject.width
275
+ : 0,
276
+ height: typeof windowSource?.innerHeight === "number"
277
+ ? (windowSource.innerHeight ?? 0)
278
+ : typeof screenObject?.height === "number"
279
+ ? screenObject.height
280
+ : 0
281
+ },
282
+ device_pixel_ratio: typeof windowSource?.devicePixelRatio === "number"
283
+ ? (windowSource.devicePixelRatio ?? null)
284
+ : null,
285
+ touch_capable: typeof navigatorObject?.maxTouchPoints === "number" ? navigatorObject.maxTouchPoints > 0 : null,
286
+ language: navigatorObject?.language ?? null,
287
+ connection_type: typeof navigatorObject?.connection === "object" && navigatorObject.connection !== null
288
+ ? typeof navigatorObject.connection.effectiveType === "string"
289
+ ? navigatorObject.connection.effectiveType
290
+ : null
291
+ : null,
292
+ color_scheme_preference: colorSchemePreference
293
+ };
294
+ }
295
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ import { type BrowserLogLevel, type CaptureBrowserExceptionContext, type DebugBundleBrowserInitConfig, type DebugBundleBrowserSdk } from "./types.js";
2
+ export type { CaptureBrowserExceptionContext, DebugBundleBrowserInitConfig, DebugBundleBrowserSdk, BrowserRequestMetadata, DebugBundleBrowserTransport, DebugBundleBrowserTransportRequest, DebugBundleBrowserTransportResponse } from "./types.js";
3
+ export declare class BrowserSdk implements DebugBundleBrowserSdk {
4
+ private config;
5
+ private bufferedEvents;
6
+ private breadcrumbs;
7
+ private persistentContext;
8
+ private deviceInfo;
9
+ private flushPromise;
10
+ private flushTimer;
11
+ private nextRetryAt;
12
+ private _lastEventAt;
13
+ private _consecutiveFailures;
14
+ private registeredListeners;
15
+ private originalPushState;
16
+ private originalReplaceState;
17
+ private originalFetch;
18
+ private originalXmlHttpRequest;
19
+ private originalConsoleError;
20
+ private originalConsoleWarn;
21
+ private sessionSampledIn;
22
+ private sessionEventCount;
23
+ private probeBuffers;
24
+ private readonly suppressionTracker;
25
+ private remoteProbeState;
26
+ private pendingTriggerToken;
27
+ private activeTriggerDirective;
28
+ get status(): "healthy" | "degraded" | "disconnected";
29
+ get lastEventAt(): number | null;
30
+ init(config: DebugBundleBrowserInitConfig): void;
31
+ captureException(error: unknown, context?: CaptureBrowserExceptionContext): void;
32
+ captureError(error: unknown, context?: CaptureBrowserExceptionContext): void;
33
+ captureLog(message: string, level: BrowserLogLevel, context?: Record<string, unknown>): void;
34
+ captureRequest(request: unknown, response?: unknown, context?: Record<string, unknown>): void;
35
+ captureMessage(message: string, level?: BrowserLogLevel, context?: Record<string, unknown>): void;
36
+ setContext(key: string, value: unknown): void;
37
+ probe(label: string, data: unknown): void;
38
+ flush(): Promise<void>;
39
+ dispose(): void;
40
+ private installBrowserHooks;
41
+ private createCorrelation;
42
+ private addBreadcrumb;
43
+ private bufferProbe;
44
+ private consumeProbeData;
45
+ private consumeBreadcrumbs;
46
+ private captureRouteChange;
47
+ private createBreadcrumbEvent;
48
+ private getCurrentRoute;
49
+ private enqueueEvent;
50
+ private enqueueInternalEvent;
51
+ private buildSuppressionKey;
52
+ private shouldCaptureBySampleRate;
53
+ private scheduleFlush;
54
+ private clearFlushTimer;
55
+ private flushViaBeacon;
56
+ private sameLeadingEvents;
57
+ private shouldCaptureNonExceptionEvent;
58
+ private shouldCaptureBreadcrumb;
59
+ private getProjectTokenFields;
60
+ private getTransportHeaders;
61
+ private createSdkEventEnvelope;
62
+ private removeEmptyProjectToken;
63
+ private enqueueSuppressionAggregates;
64
+ private shouldCaptureNetworkRequest;
65
+ private pruneExpiredRemoteProbeDirectives;
66
+ private refreshRemoteProbeConfig;
67
+ private updateRemoteProbeStateFromIngestionResponse;
68
+ private consumeTriggerTokenFromLocation;
69
+ private activatePendingTriggerTokenIfPossible;
70
+ private normalizeProbeInput;
71
+ private getMatchingRemoteProbeDirectives;
72
+ private matchesProbeLabelPattern;
73
+ }
74
+ export declare function createDebugBundleBrowserSdk(): DebugBundleBrowserSdk;
75
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}