in src/telemetry/telemetryConfigurator.ts [39:115]
public configure(): void {
const logger = this.injector.resolve<Logger>("logger");
// Register service worker for network telemetry.
if ("serviceWorker" in navigator) {
navigator.serviceWorker.register("/serviceWorker.js", { scope: "/" }).then(registration => {
console.log("Service Worker registered with scope:", registration.scope);
}).catch(error => {
console.error("Service Worker registration failed:", error);
logger.trackError(error);
});
// Listen for messages from the service worker
navigator.serviceWorker.addEventListener("message", (event) => {
// console.log("Received message from Service Worker:", event.data);
if (event.data) {
logger.trackEvent("NetworkRequest", event.data);
} else {
console.error("No telemetry data received from Service Worker.");
}
});
}
// Init page load telemetry.
window.onload = () => {
if (!logger) {
console.error("Logger is not available");
return;
}
const observer = new PerformanceObserver((list: PerformanceObserverEntryList) => {
const timing = list.getEntriesByType("navigation")[0] as PerformanceNavigationTiming;
if (!timing) {
return;
}
const location = window.location;
const screenSize = {
width: window.innerWidth.toString(),
height: window.innerHeight.toString()
};
const pageLoadTime = timing.loadEventEnd - timing.loadEventStart;
const domRenderingTime = timing.domComplete - timing.domInteractive;
const resources = performance.getEntriesByType("resource") as PerformanceResourceTiming[];
const jsCssResources = resources.filter(resource => {
return resource.initiatorType === "script" || resource.initiatorType === "link";
});
const stats = {
pageLoadTime,
domRenderingTime,
jsCssResources: jsCssResources.map(resource => ({
name: resource.name,
duration: resource.duration
}))
};
logger.trackEvent("PageLoad", { host: location.host, pathName: location.pathname, total: timing.loadEventEnd.toString(), pageLoadStats: JSON.stringify(stats), ...screenSize });
});
observer.observe({ type: "navigation", buffered: true });
}
document.addEventListener(Events.Click, (event) => {
this.processUserInteraction(event).then(() => {
console.log("Click processed");
}).catch((error) => {
console.error("Error processing click user interaction:", error);
});
});
document.addEventListener(Events.KeyDown, (event) => {
if (event.key === "Enter") {
this.processUserInteraction(event).then(() => {
console.log("Enter key processed");
}).catch((error) => {
console.error("Error processing keydown user interaction:", error);
});
}
});
}