// /components/supadb/aksupainstance.uts import AkSupa from './aksupa.uts' import { SUPA_URL, SUPA_KEY } from '@/ak/config.uts' import { AkReq } from '@/uni_modules/ak-req/index.uts' // 创建 AkSupa 实例(在全局复用) const supa = new AkSupa(SUPA_URL, SUPA_KEY) /** * supaReady: 初始化时尝试从持久化 token 恢复会话。 * - 若内存中已有 session 则直接返回 true * - 否则尝试读取 AkReq 中持久化的 refresh token 并调用 `refreshSession()` 恢复 */ const supaReady: Promise = (async () => { try { const cur = supa.getSession() if (cur && cur.session != null && cur.session.access_token) { return true } // 从持久化 storage 读取 token const access = AkReq.getToken() const refresh = AkReq.getRefreshToken() const expiresAt = AkReq.getExpiresAt() ?? 0 if (refresh && refresh !== '') { // 临时注入 session(以便 refreshSession 使用 refresh_token) try { supa.session = { access_token: access ?? '', refresh_token: refresh, expires_at: expiresAt, user: null, token_type: '', expires_in: 0, raw: new UTSJSONObject({}) } } catch (e) { // 在某些环境 UTSJSONObject 构造可能不可用,忽略并继续 try { (supa as any).session = { access_token: access ?? '', refresh_token: refresh, expires_at: expiresAt } } catch (_) {} } const ok = await supa.refreshSession() if (ok) return true // 刷新失败,清空内存 session try { supa.session = null; supa.user = null } catch (_) {} } return true } catch (err) { console.error('Supabase instance init failed', err) return false } })() // 向后兼容:保留 ensureSupabaseReady 接口 export async function ensureSupabaseReady() { return await supaReady } export { supaReady } export default supa