/* * Copyright (c) 2023 Nordic Semiconductor ASA * * SPDX-License-Identifier: LicenseRef-Nordic-4-Clause */ import { type Logger } from 'winston'; import { packageJson } from '../utils/packageJson'; import flatObject from './flatObject'; import type TelemetryMetadata from './TelemetryMetadata'; import type TelemetrySender from './TelemetrySender'; import TelemetrySenderInMain from './TelemetrySenderInMain'; import TelemetrySenderInRenderer from './TelemetrySenderInRenderer'; const isRenderer = process && process.type === 'renderer'; let cachedSender: TelemetrySender | undefined; const newTelemetrySender = () => { cachedSender = isRenderer ? new TelemetrySenderInRenderer() : new TelemetrySenderInMain(); return cachedSender; }; // We experienced that apps sometimes freeze when closing the window // until the telemetry events are sent. But as far as we observed so // far this only happens in the renderer processes if (isRenderer) { globalThis.addEventListener('beforeunload', () => cachedSender?.flush()); } const getTelemetrySenderUnconditionally = () => cachedSender ?? newTelemetrySender(); const getTelemetrySenderIfEnabled = () => { const sender = getTelemetrySenderUnconditionally(); if (sender.getIsSendingTelemetry()) return sender; return undefined; }; // Functions which can always be called const setLogger = (logger: Logger) => getTelemetrySenderUnconditionally().setLogger(logger); const setUsersAgreedToTelemetry = (hasAgreed: boolean) => getTelemetrySenderUnconditionally().setUsersAgreedToTelemetry(hasAgreed); const getIsSendingTelemetry = () => getTelemetrySenderUnconditionally().getIsSendingTelemetry(); const setUsersWithdrewTelemetryAgreement = () => getTelemetrySenderUnconditionally().setUsersWithdrewTelemetryAgreement(); const enableTelemetry = () => getTelemetrySenderUnconditionally().allowTelemetryForCurrentApp(); // Functions which will be no-ops if telemetry is disabled for some reason const getFriendlyAppName = () => packageJson().name.replace('pc-nrfconnect-', ''); const sendEvent = (action: string, metadata?: TelemetryMetadata) => getTelemetrySenderIfEnabled()?.sendEvent( `${getFriendlyAppName()}: ${action}`, flatObject(metadata), ); const sendPageView = (pageName: string) => getTelemetrySenderIfEnabled()?.sendPageView( `${getFriendlyAppName()} - ${pageName}`, ); const sendMetric = (name: string, average: number) => getTelemetrySenderIfEnabled()?.sendMetric(name, average); const sendTrace = (message: string) => getTelemetrySenderIfEnabled()?.sendTrace(message); const sendErrorReport = (error: string | Error) => getTelemetrySenderIfEnabled()?.sendErrorReport( typeof error === 'string' ? new Error(error) : error, ); export default { setLogger, setUsersAgreedToTelemetry, setUsersWithdrewTelemetryAgreement, getIsSendingTelemetry, sendErrorReport, sendEvent, sendPageView, sendMetric, sendTrace, enableTelemetry, };