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":"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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"}
|
package/dist/vitals.d.ts
ADDED
|
@@ -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
|
+
}
|