64 lines
1.8 KiB
Plaintext
64 lines
1.8 KiB
Plaintext
// /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
|