Files
medical-mall/components/supadb/aksupainstance.uts
2026-02-02 21:41:53 +08:00

64 lines
1.8 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// /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<boolean> = (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