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.
Files changed (46) hide show
  1. package/README.md +424 -0
  2. package/dist/client.d.ts +67 -0
  3. package/dist/client.d.ts.map +1 -0
  4. package/dist/client.js +207 -0
  5. package/dist/client.js.map +1 -0
  6. package/dist/errors.d.ts +8 -0
  7. package/dist/errors.d.ts.map +1 -0
  8. package/dist/errors.js +67 -0
  9. package/dist/errors.js.map +1 -0
  10. package/dist/events.d.ts +78 -0
  11. package/dist/events.d.ts.map +1 -0
  12. package/dist/events.js +11 -0
  13. package/dist/events.js.map +1 -0
  14. package/dist/index.d.ts +5 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +3 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/instrumentation/fetch.d.ts +16 -0
  19. package/dist/instrumentation/fetch.d.ts.map +1 -0
  20. package/dist/instrumentation/fetch.js +109 -0
  21. package/dist/instrumentation/fetch.js.map +1 -0
  22. package/dist/instrumentation/xhr.d.ts +16 -0
  23. package/dist/instrumentation/xhr.d.ts.map +1 -0
  24. package/dist/instrumentation/xhr.js +129 -0
  25. package/dist/instrumentation/xhr.js.map +1 -0
  26. package/dist/replay.d.ts +66 -0
  27. package/dist/replay.d.ts.map +1 -0
  28. package/dist/replay.js +289 -0
  29. package/dist/replay.js.map +1 -0
  30. package/dist/session.d.ts +11 -0
  31. package/dist/session.d.ts.map +1 -0
  32. package/dist/session.js +176 -0
  33. package/dist/session.js.map +1 -0
  34. package/dist/trace-context.d.ts +37 -0
  35. package/dist/trace-context.d.ts.map +1 -0
  36. package/dist/trace-context.js +113 -0
  37. package/dist/trace-context.js.map +1 -0
  38. package/dist/transport.d.ts +15 -0
  39. package/dist/transport.d.ts.map +1 -0
  40. package/dist/transport.js +101 -0
  41. package/dist/transport.js.map +1 -0
  42. package/dist/vitals.d.ts +12 -0
  43. package/dist/vitals.d.ts.map +1 -0
  44. package/dist/vitals.js +48 -0
  45. package/dist/vitals.js.map +1 -0
  46. 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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"}
@@ -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"}
@@ -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,11 @@
1
+ export function createBaseEvent(type, sessionId, userId) {
2
+ return {
3
+ type,
4
+ sessionId,
5
+ userId,
6
+ timestamp: Date.now(),
7
+ url: window.location.href,
8
+ userAgent: navigator.userAgent,
9
+ };
10
+ }
11
+ //# sourceMappingURL=events.js.map
@@ -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"}
@@ -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,3 @@
1
+ export { createVidentBrowser, } from "./client.js";
2
+ export { getSessionId, endSession } from "./session.js";
3
+ //# sourceMappingURL=index.js.map
@@ -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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"}
@@ -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"}