import { getPywebviewApi } from '@/shared/bridges/pywebview' import { setUserTokenPushTarget, syncUserTokenToBridge } from '@/shared/auth/user-token-bridge' /** * 把登录态令牌持续同步给桌面端 Python(A1/A3)。 * * 触发点:应用启动(桥可能未就绪,监听 pywebviewready 后补推)、localStorage 变化(登录/登出)、 * 以及每 60 秒兜底轮询(同标签页内 localStorage 变化不触发 storage 事件)。 * 网页形态(无桥)静默跳过。 */ const AUTH_TOKEN_KEY = 'aiimage_auth_token' const POLL_INTERVAL_MS = 60_000 let installed = false function readToken(): string { try { return window.localStorage.getItem(AUTH_TOKEN_KEY) || '' } catch { return '' } } function pushNow(): void { syncUserTokenToBridge(readToken()) } export function installUserTokenSync(): void { if (installed || typeof window === 'undefined') { return } installed = true const apply = () => { const api = getPywebviewApi() setUserTokenPushTarget( api && typeof api.set_user_token === 'function' ? { push: (value: string) => { void Promise.resolve(api.set_user_token?.(value)).catch(() => { /* 桥调用失败不影响页面 */ }) }, } : null, ) pushNow() } // 桥可能晚于脚本就绪:先尝试一次,再在 ready 事件与轮询里补 apply() window.addEventListener('pywebviewready', apply) window.addEventListener('storage', (event) => { if (!event.key || event.key === AUTH_TOKEN_KEY) { pushNow() } }) window.setInterval(pushNow, POLL_INTERVAL_MS) }