Files

55 lines
1.8 KiB
JavaScript

import { API_ROOT } from '@/config/runtime.js'
function authRequest(path, data, options = {}) {
return new Promise((resolve, reject) => {
uni.request({
url: `${API_ROOT}${path}`,
method: 'POST',
data,
header: options.header,
timeout: options.timeout || 15000,
success(response) {
const body = response.data || {}
if (response.statusCode !== 200 || String(body.code ?? response.statusCode) !== '200') {
const error = new Error(body.message || '认证服务请求失败')
error.code = body.code || response.statusCode
error.statusCode = response.statusCode
error.requestId = body.requestId || response.header?.['X-Request-Id'] || response.header?.['x-request-id']
error.traceId = body.traceId || response.header?.['X-Trace-Id'] || response.header?.['x-trace-id']
reject(error)
return
}
resolve(body.data)
},
fail(error) {
const next = new Error(error.errMsg || '网络连接失败')
next.network = true
reject(next)
}
})
})
}
export function login(loginId, password) {
return authRequest('/auth/login', { loginId, password })
}
const pendingRefreshes = new Map()
export function refresh(refreshToken) {
if (pendingRefreshes.has(refreshToken)) return pendingRefreshes.get(refreshToken)
const pending = authRequest('/auth/refresh', { refreshToken }).finally(() => {
if (pendingRefreshes.get(refreshToken) === pending) pendingRefreshes.delete(refreshToken)
})
pendingRefreshes.set(refreshToken, pending)
return pending
}
export function getPendingRefresh(refreshToken) { return pendingRefreshes.get(refreshToken) || null }
export function logout(refreshToken, accessToken) {
return authRequest('/auth/logout', { refreshToken }, {
header: accessToken ? { Authorization: `Bearer ${accessToken}` } : undefined,
timeout: 5000
})
}