// PowerSync 本地库单例 (0.2.1 离线编辑) // 页面用法: usePowerSyncQuery 等见 src/lib/powersync/react.jsx; 写入用 db.execute/writeTransaction import { PowerSyncDatabase } from '@powersync/web' import { AppSchema } from './schema.js' import { IBoardConnector } from './connector.js' let dbInstance = null export function getPowersyncDb() { if (!dbInstance) { dbInstance = new PowerSyncDatabase({ schema: AppSchema, database: { // 默认 IDBBatchAtomicVFS (IndexedDB), 兼容性最广; WebView2 (Chromium) 后续可切 OPFS 加速 dbFilename: 'iboard-powersync.db', // 关闭多标签支持 —— 否则桌面端 (WebView2/Chromium) 会启用 **共享 IndexedDB worker**: // enableMultiTabs 默认为 true (桌面且有 SharedWorker 时), 该 SharedWorker 会跨页面 // reload 存活; OTA 升级后 reload 的新页面连上去时本地库读取会永久挂起 // (无异常、纯 pending) —— 表现为任务页一直「加载中」, 其它不碰本地库的页面正常。 // Android WebView 不支持 SharedWorker, 因此只有 Windows 外壳命中。 // 本应用是单窗口外壳 (dock.html 不访问本地库), 不需要多标签同步。 enableMultiTabs: false, }, }) } return dbInstance } /** 登录后调用: 建立同步连接 (幂等) */ export async function connectPowersync() { const db = getPowersyncDb() db.connect(new IBoardConnector()) return db } /** 退出登录时调用: 断开同步并清空本地库 */ export async function disconnectAndClearPowersync() { if (!dbInstance) return try { await dbInstance.disconnectAndClear() } catch { /* ignore */ } }