astro-web-vitals-pocketbase
Version:
74 lines (59 loc) • 1.41 kB
text/typescript
import type { Metric } from "web-vitals";
import { setupMetricCollection } from "./collect-vitals";
import { reportMetrics } from "./report-metrics";
declare global {
interface Window {
__web_vitals__?: {
url: string;
batchEnabled: boolean;
};
}
}
if (!window.__web_vitals__) {
throw new Error(
"Web Vitals integration is not properly configured. Please check your configuration."
);
}
const queue = new Set<Metric>();
let timer: ReturnType<typeof setTimeout> | undefined;
function addToQueue(metric: Metric): void {
console.log("Adding metric to queue:", metric);
queue.add(metric);
if (timer) {
clearTimeout(timer);
}
timer = setTimeout(() => {
flushQueue();
}, 5000);
}
function flushQueue(): void {
if (queue.size === 0) {
return;
}
const metrics = [...queue];
queue.clear();
console.log("Flushing metrics:", metrics);
reportMetrics(
metrics,
window.__web_vitals__!.url,
window.__web_vitals__!.batchEnabled
);
if (timer) {
clearTimeout(timer);
timer = undefined;
}
}
// Initialize the web vitals collection
setupMetricCollection((metric: Metric) => {
addToQueue(metric);
});
// Listen for events to flush the queue
addEventListener("visibilitychange", () => {
if (document.visibilityState !== "hidden") {
return;
}
flushQueue();
});
addEventListener("pagehide", () => {
flushQueue();
});