53 lines
1.7 KiB
TypeScript
53 lines
1.7 KiB
TypeScript
import { asc } from 'drizzle-orm'
|
|
import { db } from '~/drizzle/db'
|
|
import { systemSettings } from '~/drizzle/schema'
|
|
import { SYSTEM_SETTINGS_DEFAULTS } from './system-settings-defaults'
|
|
import { getServerTimestamp } from './serverTime'
|
|
|
|
let telemetryEnabledCache: boolean | null = null
|
|
let telemetryEnabledCacheExpiresAt = 0
|
|
let pendingTelemetryEnabledPromise: Promise<boolean> | null = null
|
|
|
|
const TELEMETRY_CACHE_TTL_MS = 5 * 60 * 1000
|
|
|
|
const readTelemetryEnabled = async (): Promise<boolean> => {
|
|
const settingsResult = await db
|
|
.select({ telemetryEnabled: systemSettings.telemetryEnabled })
|
|
.from(systemSettings)
|
|
.orderBy(asc(systemSettings.id))
|
|
.limit(1)
|
|
|
|
return settingsResult[0]?.telemetryEnabled ?? SYSTEM_SETTINGS_DEFAULTS.telemetryEnabled
|
|
}
|
|
|
|
export const setTelemetryEnabledCache = (enabled: boolean) => {
|
|
telemetryEnabledCache = enabled
|
|
telemetryEnabledCacheExpiresAt = getServerTimestamp() + TELEMETRY_CACHE_TTL_MS
|
|
}
|
|
|
|
export const isTelemetryEnabledCached = () => telemetryEnabledCache === true
|
|
|
|
export const isTelemetryEnabled = async (): Promise<boolean> => {
|
|
if (telemetryEnabledCache !== null && telemetryEnabledCacheExpiresAt > getServerTimestamp()) {
|
|
return telemetryEnabledCache
|
|
}
|
|
|
|
if (!pendingTelemetryEnabledPromise) {
|
|
pendingTelemetryEnabledPromise = readTelemetryEnabled()
|
|
.then((enabled) => {
|
|
setTelemetryEnabledCache(enabled)
|
|
return enabled
|
|
})
|
|
.catch((error) => {
|
|
console.warn('[Telemetry] Failed to resolve telemetry setting, telemetry disabled:', error)
|
|
setTelemetryEnabledCache(false)
|
|
return false
|
|
})
|
|
.finally(() => {
|
|
pendingTelemetryEnabledPromise = null
|
|
})
|
|
}
|
|
|
|
return pendingTelemetryEnabledPromise
|
|
}
|