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":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAE3C,MAAM,MAAM,eAAe,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;CACrB,CAAA;AAKD,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe;qBAgF9B,QAAQ,KAAG,IAAI;iBAlEf,OAAO,CAAC,IAAI,CAAC;uBAiCb,IAAI;EA8D5B;AAED,MAAM,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAA"}
@@ -0,0 +1,101 @@
1
+ const DEFAULT_FLUSH_INTERVAL = 5000;
2
+ const DEFAULT_MAX_BATCH_SIZE = 10;
3
+ export function createTransport(config) {
4
+ const queue = [];
5
+ let flushTimer = null;
6
+ const flushInterval = config.flushInterval ?? DEFAULT_FLUSH_INTERVAL;
7
+ const maxBatchSize = config.maxBatchSize ?? DEFAULT_MAX_BATCH_SIZE;
8
+ function scheduleFlush() {
9
+ if (flushTimer)
10
+ return;
11
+ flushTimer = setTimeout(() => {
12
+ flushTimer = null;
13
+ flush();
14
+ }, flushInterval);
15
+ }
16
+ async function flush() {
17
+ if (queue.length === 0)
18
+ return;
19
+ const batch = queue.splice(0, maxBatchSize);
20
+ try {
21
+ const response = await fetch(`${config.baseUrl}/v1/ingest/rum`, {
22
+ method: "POST",
23
+ headers: {
24
+ "Content-Type": "application/json",
25
+ "x-api-key": config.apiKey,
26
+ },
27
+ body: JSON.stringify({
28
+ appName: config.appName,
29
+ events: batch,
30
+ }),
31
+ keepalive: true,
32
+ });
33
+ if (!response.ok) {
34
+ // Re-queue failed events (but limit retries)
35
+ console.warn("[Vident RUM] Failed to send events:", response.status);
36
+ }
37
+ }
38
+ catch (error) {
39
+ console.warn("[Vident RUM] Failed to send events:", error);
40
+ }
41
+ // Continue flushing if more events in queue
42
+ if (queue.length > 0) {
43
+ scheduleFlush();
44
+ }
45
+ }
46
+ function flushBeacon() {
47
+ if (queue.length === 0)
48
+ return;
49
+ const batch = queue.splice(0);
50
+ const body = JSON.stringify({
51
+ appName: config.appName,
52
+ events: batch,
53
+ });
54
+ // Use fetch with keepalive for better reliability during page unload
55
+ // Falls back to sendBeacon if fetch fails
56
+ try {
57
+ fetch(`${config.baseUrl}/v1/ingest/rum`, {
58
+ method: "POST",
59
+ headers: {
60
+ "Content-Type": "application/json",
61
+ "x-api-key": config.apiKey,
62
+ },
63
+ body,
64
+ keepalive: true,
65
+ }).catch(() => {
66
+ // Silently ignore - page is likely unloading
67
+ });
68
+ }
69
+ catch {
70
+ // Fallback to sendBeacon
71
+ const blob = new Blob([body], { type: "application/json" });
72
+ navigator.sendBeacon(`${config.baseUrl}/v1/ingest/rum?key=${config.apiKey}`, blob);
73
+ }
74
+ }
75
+ function enqueue(event) {
76
+ queue.push(event);
77
+ if (queue.length >= maxBatchSize) {
78
+ flush();
79
+ }
80
+ else {
81
+ scheduleFlush();
82
+ }
83
+ }
84
+ function setupUnloadHandler() {
85
+ window.addEventListener("visibilitychange", () => {
86
+ if (document.visibilityState === "hidden") {
87
+ flushBeacon();
88
+ }
89
+ });
90
+ window.addEventListener("pagehide", () => {
91
+ flushBeacon();
92
+ });
93
+ }
94
+ setupUnloadHandler();
95
+ return {
96
+ enqueue,
97
+ flush,
98
+ flushBeacon,
99
+ };
100
+ }
101
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { VitalsEvent } from "./events.js";
2
+ export type VitalsData = {
3
+ lcp?: number;
4
+ fid?: number;
5
+ cls?: number;
6
+ inp?: number;
7
+ ttfb?: number;
8
+ fcp?: number;
9
+ };
10
+ export type VitalsCallback = (event: VitalsEvent) => void;
11
+ export declare function setupVitalsTracking(sessionId: string, userId: string | undefined, onVitals: VitalsCallback, onFlush?: () => void): void;
12
+ //# sourceMappingURL=vitals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitals.d.ts","sourceRoot":"","sources":["../src/vitals.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAG9C,MAAM,MAAM,UAAU,GAAG;IACxB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAA;AAEzD,wBAAgB,mBAAmB,CAClC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,QAAQ,EAAE,cAAc,EACxB,OAAO,CAAC,EAAE,MAAM,IAAI,GAClB,IAAI,CA8CN"}
package/dist/vitals.js ADDED
@@ -0,0 +1,48 @@
1
+ import { onCLS, onFCP, onFID, onINP, onLCP, onTTFB } from "web-vitals";
2
+ import { createBaseEvent } from "./events.js";
3
+ export function setupVitalsTracking(sessionId, userId, onVitals, onFlush) {
4
+ const vitalsData = {};
5
+ let sent = false;
6
+ // Send all accumulated vitals once
7
+ function sendVitals() {
8
+ if (sent)
9
+ return;
10
+ if (Object.keys(vitalsData).length === 0)
11
+ return;
12
+ sent = true;
13
+ const event = {
14
+ ...createBaseEvent("vitals", sessionId, userId),
15
+ type: "vitals",
16
+ data: { ...vitalsData },
17
+ };
18
+ onVitals(event);
19
+ onFlush?.();
20
+ }
21
+ // Register web-vitals callbacks FIRST - they add internal visibilitychange
22
+ // listeners that will fire before ours and populate vitalsData
23
+ onLCP((metric) => {
24
+ vitalsData.lcp = metric.value;
25
+ });
26
+ onFID((metric) => {
27
+ vitalsData.fid = metric.value;
28
+ });
29
+ onCLS((metric) => {
30
+ vitalsData.cls = metric.value;
31
+ });
32
+ onINP((metric) => {
33
+ vitalsData.inp = metric.value;
34
+ });
35
+ onTTFB((metric) => {
36
+ vitalsData.ttfb = metric.value;
37
+ });
38
+ onFCP((metric) => {
39
+ vitalsData.fcp = metric.value;
40
+ });
41
+ // Register our listener AFTER web-vitals - fires after their callbacks populate data
42
+ document.addEventListener("visibilitychange", () => {
43
+ if (document.visibilityState === "hidden") {
44
+ sendVitals();
45
+ }
46
+ });
47
+ }
48
+ //# sourceMappingURL=vitals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitals.js","sourceRoot":"","sources":["../src/vitals.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAEtE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAa7C,MAAM,UAAU,mBAAmB,CAClC,SAAiB,EACjB,MAA0B,EAC1B,QAAwB,EACxB,OAAoB;IAEpB,MAAM,UAAU,GAAe,EAAE,CAAA;IACjC,IAAI,IAAI,GAAG,KAAK,CAAA;IAEhB,mCAAmC;IACnC,SAAS,UAAU;QAClB,IAAI,IAAI;YAAE,OAAM;QAChB,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE,OAAM;QAEhD,IAAI,GAAG,IAAI,CAAA;QACX,MAAM,KAAK,GAAgB;YAC1B,GAAG,eAAe,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC;YAC/C,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,EAAE,GAAG,UAAU,EAAE;SACvB,CAAA;QACD,QAAQ,CAAC,KAAK,CAAC,CAAA;QACf,OAAO,EAAE,EAAE,CAAA;IACZ,CAAC;IAED,2EAA2E;IAC3E,+DAA+D;IAC/D,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE;QAChB,UAAU,CAAC,GAAG,GAAG,MAAM,CAAC,KAAK,CAAA;IAC9B,CAAC,CAAC,CAAA;IACF,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE;QAChB,UAAU,CAAC,GAAG,GAAG,MAAM,CAAC,KAAK,CAAA;IAC9B,CAAC,CAAC,CAAA;IACF,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE;QAChB,UAAU,CAAC,GAAG,GAAG,MAAM,CAAC,KAAK,CAAA;IAC9B,CAAC,CAAC,CAAA;IACF,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE;QAChB,UAAU,CAAC,GAAG,GAAG,MAAM,CAAC,KAAK,CAAA;IAC9B,CAAC,CAAC,CAAA;IACF,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;QACjB,UAAU,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK,CAAA;IAC/B,CAAC,CAAC,CAAA;IACF,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE;QAChB,UAAU,CAAC,GAAG,GAAG,MAAM,CAAC,KAAK,CAAA;IAC9B,CAAC,CAAC,CAAA;IAEF,qFAAqF;IACrF,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAClD,IAAI,QAAQ,CAAC,eAAe,KAAK,QAAQ,EAAE,CAAC;YAC3C,UAAU,EAAE,CAAA;QACb,CAAC;IACF,CAAC,CAAC,CAAA;AACH,CAAC"}
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "vident-rum",
3
+ "version": "0.8.0",
4
+ "description": "Real User Monitoring SDK for Vident - track sessions, page views, clicks, and Core Web Vitals",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "publishConfig": {
9
+ "access": "public"
10
+ },
11
+ "exports": {
12
+ ".": {
13
+ "import": "./dist/index.js",
14
+ "types": "./dist/index.d.ts"
15
+ }
16
+ },
17
+ "files": ["dist"],
18
+ "scripts": {
19
+ "build": "tsc",
20
+ "dev": "tsc --watch",
21
+ "clean": "rm -rf dist"
22
+ },
23
+ "keywords": ["vident", "rum", "monitoring", "apm", "web-vitals", "analytics"],
24
+ "license": "MIT",
25
+ "dependencies": {
26
+ "@rrweb/types": "2.0.0-alpha.18",
27
+ "fflate": "^0.8.2",
28
+ "rrweb": "2.0.0-alpha.18",
29
+ "web-vitals": "^4.2.4"
30
+ },
31
+ "devDependencies": {
32
+ "typescript": "^5.7.2"
33
+ }
34
+ }