vident-rum 0.8.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.
- package/README.md +424 -0
- package/dist/client.d.ts +67 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +207 -0
- package/dist/client.js.map +1 -0
- package/dist/errors.d.ts +8 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +67 -0
- package/dist/errors.js.map +1 -0
- package/dist/events.d.ts +78 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +11 -0
- package/dist/events.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/instrumentation/fetch.d.ts +16 -0
- package/dist/instrumentation/fetch.d.ts.map +1 -0
- package/dist/instrumentation/fetch.js +109 -0
- package/dist/instrumentation/fetch.js.map +1 -0
- package/dist/instrumentation/xhr.d.ts +16 -0
- package/dist/instrumentation/xhr.d.ts.map +1 -0
- package/dist/instrumentation/xhr.js +129 -0
- package/dist/instrumentation/xhr.js.map +1 -0
- package/dist/replay.d.ts +66 -0
- package/dist/replay.d.ts.map +1 -0
- package/dist/replay.js +289 -0
- package/dist/replay.js.map +1 -0
- package/dist/session.d.ts +11 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +176 -0
- package/dist/session.js.map +1 -0
- package/dist/trace-context.d.ts +37 -0
- package/dist/trace-context.d.ts.map +1 -0
- package/dist/trace-context.js +113 -0
- package/dist/trace-context.js.map +1 -0
- package/dist/transport.d.ts +15 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +101 -0
- package/dist/transport.js.map +1 -0
- package/dist/vitals.d.ts +12 -0
- package/dist/vitals.d.ts.map +1 -0
- package/dist/vitals.js +48 -0
- package/dist/vitals.js.map +1 -0
- package/package.json +34 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ErrorEvent } from "./events.js";
|
|
2
|
+
export type ErrorCallback = (event: ErrorEvent) => void;
|
|
3
|
+
export declare function setupErrorTracking(sessionId: string, userId: string | undefined, onError: ErrorCallback): void;
|
|
4
|
+
export declare function captureError(error: Error, sessionId: string, userId: string | undefined, options?: {
|
|
5
|
+
requestId?: string;
|
|
6
|
+
traceId?: string;
|
|
7
|
+
}): ErrorEvent;
|
|
8
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAG7C,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAA;AAkBvD,wBAAgB,kBAAkB,CACjC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,OAAO,EAAE,aAAa,GACpB,IAAI,CAuCN;AAED,wBAAgB,YAAY,CAC3B,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,OAAO,CAAC,EAAE;IACT,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;CAChB,GACC,UAAU,CAWZ"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { createBaseEvent } from "./events.js";
|
|
2
|
+
function getSelector(element) {
|
|
3
|
+
if (element.id)
|
|
4
|
+
return `#${element.id}`;
|
|
5
|
+
const tag = element.tagName.toLowerCase();
|
|
6
|
+
const classes = Array.from(element.classList).join(".");
|
|
7
|
+
if (classes)
|
|
8
|
+
return `${tag}.${classes}`;
|
|
9
|
+
return tag;
|
|
10
|
+
}
|
|
11
|
+
function getStackTrace(error) {
|
|
12
|
+
if (!error.stack)
|
|
13
|
+
return undefined;
|
|
14
|
+
// Limit stack trace length
|
|
15
|
+
return error.stack.slice(0, 2000);
|
|
16
|
+
}
|
|
17
|
+
export function setupErrorTracking(sessionId, userId, onError) {
|
|
18
|
+
// Capture unhandled errors
|
|
19
|
+
window.addEventListener("error", (event) => {
|
|
20
|
+
const errorEvent = {
|
|
21
|
+
...createBaseEvent("error", sessionId, userId),
|
|
22
|
+
type: "error",
|
|
23
|
+
data: {
|
|
24
|
+
message: event.message || "Unknown error",
|
|
25
|
+
stack: event.error ? getStackTrace(event.error) : undefined,
|
|
26
|
+
filename: event.filename,
|
|
27
|
+
lineno: event.lineno,
|
|
28
|
+
colno: event.colno,
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
onError(errorEvent);
|
|
32
|
+
});
|
|
33
|
+
// Capture unhandled promise rejections
|
|
34
|
+
window.addEventListener("unhandledrejection", (event) => {
|
|
35
|
+
let message = "Unhandled Promise Rejection";
|
|
36
|
+
let stack;
|
|
37
|
+
if (event.reason instanceof Error) {
|
|
38
|
+
message = event.reason.message;
|
|
39
|
+
stack = getStackTrace(event.reason);
|
|
40
|
+
}
|
|
41
|
+
else if (typeof event.reason === "string") {
|
|
42
|
+
message = event.reason;
|
|
43
|
+
}
|
|
44
|
+
const errorEvent = {
|
|
45
|
+
...createBaseEvent("error", sessionId, userId),
|
|
46
|
+
type: "error",
|
|
47
|
+
data: {
|
|
48
|
+
message,
|
|
49
|
+
stack,
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
onError(errorEvent);
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
export function captureError(error, sessionId, userId, options) {
|
|
56
|
+
return {
|
|
57
|
+
...createBaseEvent("error", sessionId, userId),
|
|
58
|
+
type: "error",
|
|
59
|
+
data: {
|
|
60
|
+
message: error.message,
|
|
61
|
+
stack: getStackTrace(error),
|
|
62
|
+
requestId: options?.requestId,
|
|
63
|
+
traceId: options?.traceId,
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAI7C,SAAS,WAAW,CAAC,OAAgB;IACpC,IAAI,OAAO,CAAC,EAAE;QAAE,OAAO,IAAI,OAAO,CAAC,EAAE,EAAE,CAAA;IAEvC,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,CAAA;IACzC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACvD,IAAI,OAAO;QAAE,OAAO,GAAG,GAAG,IAAI,OAAO,EAAE,CAAA;IAEvC,OAAO,GAAG,CAAA;AACX,CAAC;AAED,SAAS,aAAa,CAAC,KAAY;IAClC,IAAI,CAAC,KAAK,CAAC,KAAK;QAAE,OAAO,SAAS,CAAA;IAClC,2BAA2B;IAC3B,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;AAClC,CAAC;AAED,MAAM,UAAU,kBAAkB,CACjC,SAAiB,EACjB,MAA0B,EAC1B,OAAsB;IAEtB,2BAA2B;IAC3B,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;QAC1C,MAAM,UAAU,GAAe;YAC9B,GAAG,eAAe,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC;YAC9C,IAAI,EAAE,OAAO;YACb,IAAI,EAAE;gBACL,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,eAAe;gBACzC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;gBAC3D,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,KAAK,EAAE,KAAK,CAAC,KAAK;aAClB;SACD,CAAA;QACD,OAAO,CAAC,UAAU,CAAC,CAAA;IACpB,CAAC,CAAC,CAAA;IAEF,uCAAuC;IACvC,MAAM,CAAC,gBAAgB,CAAC,oBAAoB,EAAE,CAAC,KAAK,EAAE,EAAE;QACvD,IAAI,OAAO,GAAG,6BAA6B,CAAA;QAC3C,IAAI,KAAyB,CAAA;QAE7B,IAAI,KAAK,CAAC,MAAM,YAAY,KAAK,EAAE,CAAC;YACnC,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAA;YAC9B,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QACpC,CAAC;aAAM,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC7C,OAAO,GAAG,KAAK,CAAC,MAAM,CAAA;QACvB,CAAC;QAED,MAAM,UAAU,GAAe;YAC9B,GAAG,eAAe,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC;YAC9C,IAAI,EAAE,OAAO;YACb,IAAI,EAAE;gBACL,OAAO;gBACP,KAAK;aACL;SACD,CAAA;QACD,OAAO,CAAC,UAAU,CAAC,CAAA;IACpB,CAAC,CAAC,CAAA;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAC3B,KAAY,EACZ,SAAiB,EACjB,MAA0B,EAC1B,OAGC;IAED,OAAO;QACN,GAAG,eAAe,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC;QAC9C,IAAI,EAAE,OAAO;QACb,IAAI,EAAE;YACL,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC;YAC3B,SAAS,EAAE,OAAO,EAAE,SAAS;YAC7B,OAAO,EAAE,OAAO,EAAE,OAAO;SACzB;KACD,CAAA;AACF,CAAC"}
|
package/dist/events.d.ts
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
export type RumEventType = "page_view" | "click" | "vitals" | "error" | "custom" | "resource";
|
|
2
|
+
export type BaseEvent = {
|
|
3
|
+
type: RumEventType;
|
|
4
|
+
sessionId: string;
|
|
5
|
+
userId?: string;
|
|
6
|
+
timestamp: number;
|
|
7
|
+
url: string;
|
|
8
|
+
userAgent: string;
|
|
9
|
+
};
|
|
10
|
+
export type PageViewEvent = BaseEvent & {
|
|
11
|
+
type: "page_view";
|
|
12
|
+
data: {
|
|
13
|
+
referrer?: string;
|
|
14
|
+
title: string;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
export type ClickEvent = BaseEvent & {
|
|
18
|
+
type: "click";
|
|
19
|
+
data: {
|
|
20
|
+
target: string;
|
|
21
|
+
text?: string;
|
|
22
|
+
x: number;
|
|
23
|
+
y: number;
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
export type VitalsEvent = BaseEvent & {
|
|
27
|
+
type: "vitals";
|
|
28
|
+
data: {
|
|
29
|
+
lcp?: number;
|
|
30
|
+
fid?: number;
|
|
31
|
+
cls?: number;
|
|
32
|
+
inp?: number;
|
|
33
|
+
ttfb?: number;
|
|
34
|
+
fcp?: number;
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
export type ErrorEvent = BaseEvent & {
|
|
38
|
+
type: "error";
|
|
39
|
+
data: {
|
|
40
|
+
message: string;
|
|
41
|
+
stack?: string;
|
|
42
|
+
filename?: string;
|
|
43
|
+
lineno?: number;
|
|
44
|
+
colno?: number;
|
|
45
|
+
requestId?: string;
|
|
46
|
+
/** Trace ID for correlation with backend traces */
|
|
47
|
+
traceId?: string;
|
|
48
|
+
/** URL that failed (for fetch/network errors) */
|
|
49
|
+
failedUrl?: string;
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
export type CustomEvent = BaseEvent & {
|
|
53
|
+
type: "custom";
|
|
54
|
+
data: {
|
|
55
|
+
name: string;
|
|
56
|
+
properties?: Record<string, unknown>;
|
|
57
|
+
};
|
|
58
|
+
};
|
|
59
|
+
export type ResourceEvent = BaseEvent & {
|
|
60
|
+
type: "resource";
|
|
61
|
+
data: {
|
|
62
|
+
/** Request URL */
|
|
63
|
+
resourceUrl: string;
|
|
64
|
+
/** HTTP method */
|
|
65
|
+
method: string;
|
|
66
|
+
/** HTTP status code */
|
|
67
|
+
status?: number;
|
|
68
|
+
/** Duration in milliseconds */
|
|
69
|
+
duration: number;
|
|
70
|
+
/** Initiator type */
|
|
71
|
+
initiatorType: "fetch" | "xhr";
|
|
72
|
+
/** Trace ID for correlation with backend traces */
|
|
73
|
+
traceId?: string;
|
|
74
|
+
};
|
|
75
|
+
};
|
|
76
|
+
export type RumEvent = PageViewEvent | ClickEvent | VitalsEvent | ErrorEvent | CustomEvent | ResourceEvent;
|
|
77
|
+
export declare function createBaseEvent(type: RumEventType, sessionId: string, userId?: string): BaseEvent;
|
|
78
|
+
//# sourceMappingURL=events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GACrB,WAAW,GACX,OAAO,GACP,QAAQ,GACR,OAAO,GACP,QAAQ,GACR,UAAU,CAAA;AAEb,MAAM,MAAM,SAAS,GAAG;IACvB,IAAI,EAAE,YAAY,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG;IACvC,IAAI,EAAE,WAAW,CAAA;IACjB,IAAI,EAAE;QACL,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,KAAK,EAAE,MAAM,CAAA;KACb,CAAA;CACD,CAAA;AAED,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG;IACpC,IAAI,EAAE,OAAO,CAAA;IACb,IAAI,EAAE;QACL,MAAM,EAAE,MAAM,CAAA;QACd,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,CAAC,EAAE,MAAM,CAAA;QACT,CAAC,EAAE,MAAM,CAAA;KACT,CAAA;CACD,CAAA;AAED,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG;IACrC,IAAI,EAAE,QAAQ,CAAA;IACd,IAAI,EAAE;QACL,GAAG,CAAC,EAAE,MAAM,CAAA;QACZ,GAAG,CAAC,EAAE,MAAM,CAAA;QACZ,GAAG,CAAC,EAAE,MAAM,CAAA;QACZ,GAAG,CAAC,EAAE,MAAM,CAAA;QACZ,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,GAAG,CAAC,EAAE,MAAM,CAAA;KACZ,CAAA;CACD,CAAA;AAED,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG;IACpC,IAAI,EAAE,OAAO,CAAA;IACb,IAAI,EAAE;QACL,OAAO,EAAE,MAAM,CAAA;QACf,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,mDAAmD;QACnD,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,iDAAiD;QACjD,SAAS,CAAC,EAAE,MAAM,CAAA;KAClB,CAAA;CACD,CAAA;AAED,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG;IACrC,IAAI,EAAE,QAAQ,CAAA;IACd,IAAI,EAAE;QACL,IAAI,EAAE,MAAM,CAAA;QACZ,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KACpC,CAAA;CACD,CAAA;AAED,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG;IACvC,IAAI,EAAE,UAAU,CAAA;IAChB,IAAI,EAAE;QACL,kBAAkB;QAClB,WAAW,EAAE,MAAM,CAAA;QACnB,kBAAkB;QAClB,MAAM,EAAE,MAAM,CAAA;QACd,uBAAuB;QACvB,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,+BAA+B;QAC/B,QAAQ,EAAE,MAAM,CAAA;QAChB,qBAAqB;QACrB,aAAa,EAAE,OAAO,GAAG,KAAK,CAAA;QAC9B,mDAAmD;QACnD,OAAO,CAAC,EAAE,MAAM,CAAA;KAChB,CAAA;CACD,CAAA;AAED,MAAM,MAAM,QAAQ,GACjB,aAAa,GACb,UAAU,GACV,WAAW,GACX,UAAU,GACV,WAAW,GACX,aAAa,CAAA;AAEhB,wBAAgB,eAAe,CAC9B,IAAI,EAAE,YAAY,EAClB,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,GACb,SAAS,CASX"}
|
package/dist/events.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAiGA,MAAM,UAAU,eAAe,CAC9B,IAAkB,EAClB,SAAiB,EACjB,MAAe;IAEf,OAAO;QACN,IAAI;QACJ,SAAS;QACT,MAAM;QACN,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI;QACzB,SAAS,EAAE,SAAS,CAAC,SAAS;KAC9B,CAAA;AACF,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { createVidentBrowser, type BrowserConfig, type VidentBrowser, type TracingConfig, } from "./client.js";
|
|
2
|
+
export type { ReplayConfig, PrivacyMode } from "./replay.js";
|
|
3
|
+
export type { RumEvent, RumEventType, PageViewEvent, ClickEvent, VitalsEvent, ErrorEvent, CustomEvent, ResourceEvent, } from "./events.js";
|
|
4
|
+
export { getSessionId, endSession, type StorageMode } from "./session.js";
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,mBAAmB,EACnB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,aAAa,GAClB,MAAM,aAAa,CAAA;AACpB,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC5D,YAAY,EACX,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,UAAU,EACV,WAAW,EACX,UAAU,EACV,WAAW,EACX,aAAa,GACb,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,mBAAmB,GAInB,MAAM,aAAa,CAAA;AAYpB,OAAO,EAAE,YAAY,EAAE,UAAU,EAAoB,MAAM,cAAc,CAAA"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fetch instrumentation for browser-side resource tracking.
|
|
3
|
+
* Intercepts fetch calls to inject traceparent headers and capture timing.
|
|
4
|
+
*/
|
|
5
|
+
import type { ErrorEvent, ResourceEvent } from "../events.js";
|
|
6
|
+
export type FetchInstrumentationConfig = {
|
|
7
|
+
propagateToOrigins?: (string | RegExp)[];
|
|
8
|
+
sessionId: string;
|
|
9
|
+
userId?: string;
|
|
10
|
+
ingestUrl?: string;
|
|
11
|
+
};
|
|
12
|
+
export type FetchErrorCallback = (event: ErrorEvent) => void;
|
|
13
|
+
export declare function instrumentFetch(config: FetchInstrumentationConfig, onResource: (event: ResourceEvent) => void, onError?: FetchErrorCallback): void;
|
|
14
|
+
export declare function updateFetchConfig(userId?: string): void;
|
|
15
|
+
export declare function restoreFetch(): void;
|
|
16
|
+
//# sourceMappingURL=fetch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../src/instrumentation/fetch.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAS7D,MAAM,MAAM,0BAA0B,GAAG;IACxC,kBAAkB,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;IACxC,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAA;AAkC5D,wBAAgB,eAAe,CAC9B,MAAM,EAAE,0BAA0B,EAClC,UAAU,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,EAC1C,OAAO,CAAC,EAAE,kBAAkB,GAC1B,IAAI,CAmGN;AAED,wBAAgB,iBAAiB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAIvD;AAED,wBAAgB,YAAY,IAAI,IAAI,CAOnC"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fetch instrumentation for browser-side resource tracking.
|
|
3
|
+
* Intercepts fetch calls to inject traceparent headers and capture timing.
|
|
4
|
+
*/
|
|
5
|
+
import { createBaseEvent } from "../events.js";
|
|
6
|
+
import { createTraceparent, generateSpanId, generateTraceId, shouldPropagate, } from "../trace-context.js";
|
|
7
|
+
// Module state for monkey-patching. Only one instrumentation instance supported.
|
|
8
|
+
let originalFetch = null;
|
|
9
|
+
let currentConfig = null;
|
|
10
|
+
let onFetchError = null;
|
|
11
|
+
function createResourceEvent(config, url, method, traceId, startTime, duration, status) {
|
|
12
|
+
return {
|
|
13
|
+
type: "resource",
|
|
14
|
+
sessionId: config.sessionId,
|
|
15
|
+
userId: config.userId,
|
|
16
|
+
timestamp: startTime,
|
|
17
|
+
url: window.location.href,
|
|
18
|
+
userAgent: navigator.userAgent,
|
|
19
|
+
data: {
|
|
20
|
+
resourceUrl: url,
|
|
21
|
+
method,
|
|
22
|
+
status,
|
|
23
|
+
duration,
|
|
24
|
+
initiatorType: "fetch",
|
|
25
|
+
traceId,
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export function instrumentFetch(config, onResource, onError) {
|
|
30
|
+
if (originalFetch)
|
|
31
|
+
return;
|
|
32
|
+
originalFetch = window.fetch;
|
|
33
|
+
currentConfig = config;
|
|
34
|
+
onFetchError = onError ?? null;
|
|
35
|
+
window.fetch = async function instrumentedFetch(input, init) {
|
|
36
|
+
const url = typeof input === "string"
|
|
37
|
+
? input
|
|
38
|
+
: input instanceof URL
|
|
39
|
+
? input.toString()
|
|
40
|
+
: input.url;
|
|
41
|
+
// Skip internal requests (Next.js RSC, SDK telemetry)
|
|
42
|
+
if (url.includes("_rsc=") ||
|
|
43
|
+
(currentConfig?.ingestUrl && url.startsWith(currentConfig.ingestUrl))) {
|
|
44
|
+
// biome-ignore lint/style/noNonNullAssertion: checked at function entry
|
|
45
|
+
return originalFetch(input, init);
|
|
46
|
+
}
|
|
47
|
+
const method = init?.method ??
|
|
48
|
+
(typeof input !== "string" && !(input instanceof URL)
|
|
49
|
+
? (input.method ?? "GET")
|
|
50
|
+
: "GET");
|
|
51
|
+
// Only inject traceparent for allowed origins
|
|
52
|
+
const shouldInjectTrace = shouldPropagate(url, currentConfig?.propagateToOrigins);
|
|
53
|
+
let traceId;
|
|
54
|
+
let modifiedInit = init;
|
|
55
|
+
if (shouldInjectTrace) {
|
|
56
|
+
traceId = generateTraceId();
|
|
57
|
+
const spanId = generateSpanId();
|
|
58
|
+
const traceparent = createTraceparent(traceId, spanId, true);
|
|
59
|
+
const headers = new Headers(init?.headers);
|
|
60
|
+
headers.set("traceparent", traceparent);
|
|
61
|
+
modifiedInit = { ...init, headers };
|
|
62
|
+
}
|
|
63
|
+
const startTime = Date.now();
|
|
64
|
+
try {
|
|
65
|
+
// biome-ignore lint/style/noNonNullAssertion: checked at function entry
|
|
66
|
+
const response = await originalFetch(input, modifiedInit);
|
|
67
|
+
const duration = Date.now() - startTime;
|
|
68
|
+
// biome-ignore lint/style/noNonNullAssertion: config set at function entry
|
|
69
|
+
const config = currentConfig;
|
|
70
|
+
onResource(createResourceEvent(config, url, method, traceId, startTime, duration, response.status));
|
|
71
|
+
return response;
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
const duration = Date.now() - startTime;
|
|
75
|
+
// biome-ignore lint/style/noNonNullAssertion: config set at function entry
|
|
76
|
+
const config = currentConfig;
|
|
77
|
+
onResource(createResourceEvent(config, url, method, traceId, startTime, duration));
|
|
78
|
+
// Emit error event with the failed URL for better debugging
|
|
79
|
+
if (onFetchError && error instanceof Error) {
|
|
80
|
+
const errorEvent = {
|
|
81
|
+
...createBaseEvent("error", config.sessionId, config.userId),
|
|
82
|
+
type: "error",
|
|
83
|
+
data: {
|
|
84
|
+
message: error.message,
|
|
85
|
+
stack: error.stack?.slice(0, 2000),
|
|
86
|
+
failedUrl: url,
|
|
87
|
+
traceId,
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
onFetchError(errorEvent);
|
|
91
|
+
}
|
|
92
|
+
throw error;
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
export function updateFetchConfig(userId) {
|
|
97
|
+
if (currentConfig) {
|
|
98
|
+
currentConfig.userId = userId;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
export function restoreFetch() {
|
|
102
|
+
if (originalFetch) {
|
|
103
|
+
window.fetch = originalFetch;
|
|
104
|
+
originalFetch = null;
|
|
105
|
+
currentConfig = null;
|
|
106
|
+
onFetchError = null;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=fetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../src/instrumentation/fetch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* XMLHttpRequest instrumentation for browser-side resource tracking.
|
|
3
|
+
* Intercepts XHR calls to inject traceparent headers and capture timing.
|
|
4
|
+
*/
|
|
5
|
+
import type { ErrorEvent, ResourceEvent } from "../events.js";
|
|
6
|
+
export type XHRInstrumentationConfig = {
|
|
7
|
+
propagateToOrigins?: (string | RegExp)[];
|
|
8
|
+
sessionId: string;
|
|
9
|
+
userId?: string;
|
|
10
|
+
ingestUrl?: string;
|
|
11
|
+
};
|
|
12
|
+
export type XHRErrorCallback = (event: ErrorEvent) => void;
|
|
13
|
+
export declare function instrumentXHR(config: XHRInstrumentationConfig, onResource: (event: ResourceEvent) => void, onError?: XHRErrorCallback): void;
|
|
14
|
+
export declare function updateXHRConfig(userId?: string): void;
|
|
15
|
+
export declare function restoreXHR(): void;
|
|
16
|
+
//# sourceMappingURL=xhr.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xhr.d.ts","sourceRoot":"","sources":["../../src/instrumentation/xhr.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAS7D,MAAM,MAAM,wBAAwB,GAAG;IACtC,kBAAkB,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;IACxC,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAA;AA2C1D,wBAAgB,aAAa,CAC5B,MAAM,EAAE,wBAAwB,EAChC,UAAU,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,EAC1C,OAAO,CAAC,EAAE,gBAAgB,GACxB,IAAI,CA8GN;AAED,wBAAgB,eAAe,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAIrD;AAED,wBAAgB,UAAU,IAAI,IAAI,CAWjC"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* XMLHttpRequest instrumentation for browser-side resource tracking.
|
|
3
|
+
* Intercepts XHR calls to inject traceparent headers and capture timing.
|
|
4
|
+
*/
|
|
5
|
+
import { createBaseEvent } from "../events.js";
|
|
6
|
+
import { createTraceparent, generateSpanId, generateTraceId, shouldPropagate, } from "../trace-context.js";
|
|
7
|
+
// Module state for monkey-patching. Only one instrumentation instance supported.
|
|
8
|
+
let originalOpen = null;
|
|
9
|
+
let originalSend = null;
|
|
10
|
+
let currentConfig = null;
|
|
11
|
+
let onXHRError = null;
|
|
12
|
+
function createResourceEvent(config, data, duration, status) {
|
|
13
|
+
return {
|
|
14
|
+
type: "resource",
|
|
15
|
+
sessionId: config.sessionId,
|
|
16
|
+
userId: config.userId,
|
|
17
|
+
timestamp: data.startTime,
|
|
18
|
+
url: window.location.href,
|
|
19
|
+
userAgent: navigator.userAgent,
|
|
20
|
+
data: {
|
|
21
|
+
resourceUrl: data.url,
|
|
22
|
+
method: data.method,
|
|
23
|
+
status,
|
|
24
|
+
duration,
|
|
25
|
+
initiatorType: "xhr",
|
|
26
|
+
traceId: data.traceId,
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export function instrumentXHR(config, onResource, onError) {
|
|
31
|
+
if (originalOpen)
|
|
32
|
+
return;
|
|
33
|
+
originalOpen = XMLHttpRequest.prototype.open;
|
|
34
|
+
originalSend = XMLHttpRequest.prototype.send;
|
|
35
|
+
currentConfig = config;
|
|
36
|
+
onXHRError = onError ?? null;
|
|
37
|
+
XMLHttpRequest.prototype.open = function (method, url, async, username, password) {
|
|
38
|
+
const urlString = url.toString();
|
|
39
|
+
const shouldInjectTrace = shouldPropagate(urlString, currentConfig?.propagateToOrigins);
|
|
40
|
+
this._vident = {
|
|
41
|
+
method,
|
|
42
|
+
url: urlString,
|
|
43
|
+
traceId: shouldInjectTrace ? generateTraceId() : undefined,
|
|
44
|
+
startTime: 0,
|
|
45
|
+
};
|
|
46
|
+
// biome-ignore lint/style/noNonNullAssertion: checked at function entry
|
|
47
|
+
originalOpen.call(this, method, url, async ?? true, username ?? null, password ?? null);
|
|
48
|
+
};
|
|
49
|
+
XMLHttpRequest.prototype.send = function (body) {
|
|
50
|
+
const data = this._vident;
|
|
51
|
+
// Skip internal requests (Next.js RSC, SDK telemetry) or if no tracking data
|
|
52
|
+
if (!data ||
|
|
53
|
+
data.url.includes("_rsc=") ||
|
|
54
|
+
(currentConfig?.ingestUrl && data.url.startsWith(currentConfig.ingestUrl))) {
|
|
55
|
+
// biome-ignore lint/style/noNonNullAssertion: checked at function entry
|
|
56
|
+
originalSend.call(this, body);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
// Only inject traceparent for allowed origins
|
|
60
|
+
if (data.traceId) {
|
|
61
|
+
const spanId = generateSpanId();
|
|
62
|
+
const traceparent = createTraceparent(data.traceId, spanId, true);
|
|
63
|
+
this.setRequestHeader("traceparent", traceparent);
|
|
64
|
+
}
|
|
65
|
+
data.startTime = Date.now();
|
|
66
|
+
const emitResource = (status) => {
|
|
67
|
+
const duration = Date.now() - data.startTime;
|
|
68
|
+
// biome-ignore lint/style/noNonNullAssertion: config set at function entry
|
|
69
|
+
onResource(createResourceEvent(currentConfig, data, duration, status));
|
|
70
|
+
};
|
|
71
|
+
this.addEventListener("load", () => emitResource(this.status));
|
|
72
|
+
this.addEventListener("error", () => {
|
|
73
|
+
emitResource();
|
|
74
|
+
// Emit error event with the failed URL for better debugging
|
|
75
|
+
if (onXHRError) {
|
|
76
|
+
// biome-ignore lint/style/noNonNullAssertion: config set at function entry
|
|
77
|
+
const config = currentConfig;
|
|
78
|
+
const errorEvent = {
|
|
79
|
+
...createBaseEvent("error", config.sessionId, config.userId),
|
|
80
|
+
type: "error",
|
|
81
|
+
data: {
|
|
82
|
+
message: `XHR request failed: ${data.method} ${data.url}`,
|
|
83
|
+
failedUrl: data.url,
|
|
84
|
+
traceId: data.traceId,
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
onXHRError(errorEvent);
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
this.addEventListener("timeout", () => {
|
|
91
|
+
emitResource();
|
|
92
|
+
if (onXHRError) {
|
|
93
|
+
// biome-ignore lint/style/noNonNullAssertion: config set at function entry
|
|
94
|
+
const config = currentConfig;
|
|
95
|
+
const errorEvent = {
|
|
96
|
+
...createBaseEvent("error", config.sessionId, config.userId),
|
|
97
|
+
type: "error",
|
|
98
|
+
data: {
|
|
99
|
+
message: `XHR request timed out: ${data.method} ${data.url}`,
|
|
100
|
+
failedUrl: data.url,
|
|
101
|
+
traceId: data.traceId,
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
onXHRError(errorEvent);
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
this.addEventListener("abort", () => emitResource());
|
|
108
|
+
// biome-ignore lint/style/noNonNullAssertion: checked at function entry
|
|
109
|
+
originalSend.call(this, body);
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
export function updateXHRConfig(userId) {
|
|
113
|
+
if (currentConfig) {
|
|
114
|
+
currentConfig.userId = userId;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
export function restoreXHR() {
|
|
118
|
+
if (originalOpen) {
|
|
119
|
+
XMLHttpRequest.prototype.open = originalOpen;
|
|
120
|
+
originalOpen = null;
|
|
121
|
+
}
|
|
122
|
+
if (originalSend) {
|
|
123
|
+
XMLHttpRequest.prototype.send = originalSend;
|
|
124
|
+
originalSend = null;
|
|
125
|
+
}
|
|
126
|
+
currentConfig = null;
|
|
127
|
+
onXHRError = null;
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=xhr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xhr.js","sourceRoot":"","sources":["../../src/instrumentation/xhr.ts"],"names":[],"mappings":"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"}
|
package/dist/replay.d.ts
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Privacy mode for session replay recording.
|
|
3
|
+
*
|
|
4
|
+
* - `"strict"` (default): Masks ALL text and input values. Recommended for most apps.
|
|
5
|
+
* Only element structure and interactions are visible.
|
|
6
|
+
*
|
|
7
|
+
* - `"balanced"`: Masks input values only. Text content is visible but form data is protected.
|
|
8
|
+
* Good for marketing sites with minimal user input.
|
|
9
|
+
*
|
|
10
|
+
* - `"permissive"`: Records everything as-is. Only use for internal tools or after
|
|
11
|
+
* explicit user consent. You must ensure no PII is captured.
|
|
12
|
+
*/
|
|
13
|
+
export type PrivacyMode = "strict" | "balanced" | "permissive";
|
|
14
|
+
export type ReplayConfig = {
|
|
15
|
+
/** Enable replay recording (default: false) */
|
|
16
|
+
enabled?: boolean;
|
|
17
|
+
/** Sample rate for immediate upload 0-1 (default: 0.1 = 10%) */
|
|
18
|
+
sampleRate?: number;
|
|
19
|
+
/** Sample rate when error occurs 0-1 (default: 1.0 = 100%) */
|
|
20
|
+
onErrorSampleRate?: number;
|
|
21
|
+
/**
|
|
22
|
+
* Privacy mode controls what data is captured (default: "strict")
|
|
23
|
+
*
|
|
24
|
+
* - "strict": Masks all text and inputs (recommended)
|
|
25
|
+
* - "balanced": Masks inputs only, text is visible
|
|
26
|
+
* - "permissive": Records everything (use with caution)
|
|
27
|
+
*
|
|
28
|
+
* Regardless of mode, you can use HTML attributes for fine-grained control:
|
|
29
|
+
* - `data-sw-block`: Completely hides element (shows placeholder)
|
|
30
|
+
* - `data-sw-mask`: Masks text content with asterisks
|
|
31
|
+
* - `data-sw-unmask`: Shows content even in strict mode
|
|
32
|
+
*
|
|
33
|
+
* rrweb built-in classes are also supported:
|
|
34
|
+
* - `.rr-block`: Same as data-sw-block
|
|
35
|
+
* - `.rr-mask`: Same as data-sw-mask
|
|
36
|
+
*/
|
|
37
|
+
privacyMode?: PrivacyMode;
|
|
38
|
+
};
|
|
39
|
+
type ReplayTransportConfig = {
|
|
40
|
+
apiKey: string;
|
|
41
|
+
baseUrl: string;
|
|
42
|
+
sessionId: string;
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Session Replay Recorder with Rolling Buffer
|
|
46
|
+
*
|
|
47
|
+
* Architecture:
|
|
48
|
+
* - Always records to memory when enabled
|
|
49
|
+
* - If sampled (sampleRate): uploads immediately
|
|
50
|
+
* - If not sampled: keeps 60s rolling buffer in memory
|
|
51
|
+
* - On error: flushes buffer and starts uploading (if onErrorSampleRate passes)
|
|
52
|
+
* - Zero network cost for sessions without errors that weren't sampled
|
|
53
|
+
*/
|
|
54
|
+
export declare function createReplayRecorder(config: ReplayConfig, transportConfig: ReplayTransportConfig, onError?: () => void): {
|
|
55
|
+
start: () => void;
|
|
56
|
+
stop: () => void;
|
|
57
|
+
markError: () => void;
|
|
58
|
+
isRecording: () => boolean;
|
|
59
|
+
isUploading: () => boolean;
|
|
60
|
+
wasUpgradedByError: () => boolean;
|
|
61
|
+
/** Force switch to upload mode (for manual control) */
|
|
62
|
+
startUploading: () => void;
|
|
63
|
+
};
|
|
64
|
+
export type ReplayRecorder = ReturnType<typeof createReplayRecorder>;
|
|
65
|
+
export {};
|
|
66
|
+
//# sourceMappingURL=replay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replay.d.ts","sourceRoot":"","sources":["../src/replay.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,UAAU,GAAG,YAAY,CAAA;AAE9D,MAAM,MAAM,YAAY,GAAG;IAC1B,+CAA+C;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,gEAAgE;IAChE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,8DAA8D;IAC9D,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B;;;;;;;;;;;;;;;OAeG;IACH,WAAW,CAAC,EAAE,WAAW,CAAA;CACzB,CAAA;AAED,KAAK,qBAAqB,GAAG;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;CACjB,CAAA;AAqBD;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CACnC,MAAM,EAAE,YAAY,EACpB,eAAe,EAAE,qBAAqB,EACtC,OAAO,CAAC,EAAE,MAAM,IAAI;iBAoMF,IAAI;gBAuBL,IAAI;qBA6CC,IAAI;;;;IA4BzB,uDAAuD;0BAjHzB,IAAI;EAoHnC;AAED,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAA"}
|