public configure()

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);
                });
            }
        });
    }