import { getHardwareFingerprint } from '@/lib/fingerprint' import { getDB } from '@/server/db' import { deviceInfoTable } from '@/server/db/schema' let initPromise: Promise | null = null /** * 确保设备信息已在数据库中初始化 * 使用单例模式防止并发重复初始化 */ export async function ensureDeviceInitialized(): Promise { if (initPromise) { return initPromise } initPromise = (async () => { try { const db = getDB() // 获取硬件指纹 let result: { fingerprint: string; quality: 'strong' | 'medium' | 'weak' } try { result = await getHardwareFingerprint({ cacheTtlMs: 10 * 60 * 1000, includePrimaryDisk: true, }) } catch (error) { console.error('Failed to get hardware fingerprint:', error) // 回退逻辑 result = { fingerprint: `unknown-${Date.now()}`, quality: 'weak' as const, } } // 使用 UPSERT 逻辑更新或插入设备信息 await db .insert(deviceInfoTable) .values({ fingerprint: result.fingerprint, fingerprintQuality: result.quality, license: null, licenseActivatedAt: null, }) .onConflictDoUpdate({ target: deviceInfoTable.fingerprint, set: { fingerprintQuality: result.quality, updatedAt: new Date(), }, }) } catch (error) { console.error('Failed to initialize device info:', error) // 重置 promise 以允许重试 initPromise = null throw error } })() return initPromise }