aslan-h5/src/utils/useOptimizedAppConnection.js
2025-08-21 16:48:48 +08:00

156 lines
4.4 KiB
JavaScript

import { appConnectionManager, isAppConnected, getAppHeaderInfo } from './appConnectionManager.js'
import { connectApplication, parseAccessOrigin, parseHeader, setHttpHeaders, isInApp } from './appBridge.js'
/**
* 优化的APP连接工具
* 避免重复连接,提升性能
*/
export const useOptimizedAppConnection = () => {
// 优化的连接方法
const connectToAppOptimized = async (router, options = {}) => {
const {
fetchDataCallback = null,
onConnectionSuccess = null,
onConnectionFailed = null
} = options
console.group('🔗 Optimized APP Connection')
console.debug('🚀 Starting connection check...')
// 检查是否在APP环境中
if (!isInApp()) {
console.debug('🌐 Browser environment - skipping APP connection')
if (fetchDataCallback) {
await fetchDataCallback()
}
console.groupEnd()
return { success: true, fromCache: false }
}
// 检查是否已经连接且有效
if (isAppConnected()) {
console.debug('✅ Using existing valid connection')
const headerInfo = getAppHeaderInfo()
if (fetchDataCallback) {
await fetchDataCallback()
}
if (onConnectionSuccess) {
onConnectionSuccess(headerInfo)
}
console.groupEnd()
return { success: true, fromCache: true, headerInfo }
}
// 检查是否有进行中的连接
if (appConnectionManager.isConnecting()) {
console.debug('⏳ Waiting for existing connection...')
try {
await appConnectionManager.getConnectionPromise()
const headerInfo = getAppHeaderInfo()
if (fetchDataCallback) {
await fetchDataCallback()
}
if (onConnectionSuccess) {
onConnectionSuccess(headerInfo)
}
console.groupEnd()
return { success: true, fromCache: true, headerInfo }
} catch (error) {
console.error('❌ Existing connection failed:', error)
if (onConnectionFailed) {
onConnectionFailed(error)
}
console.groupEnd()
return { success: false, error }
}
}
// 建立新连接
console.debug('📱 Establishing new APP connection...')
const connectionPromise = new Promise((resolve, reject) => {
connectApplication(async (access) => {
try {
const result = parseAccessOrigin(access)
if (result.success) {
const headerInfo = parseHeader(result.data)
await setHttpHeaders(headerInfo)
// 更新连接状态
appConnectionManager.setConnected(headerInfo)
console.debug('🎉 New connection established')
if (fetchDataCallback) {
await fetchDataCallback()
}
if (onConnectionSuccess) {
onConnectionSuccess(headerInfo)
}
resolve({ success: true, fromCache: false, headerInfo })
} else {
console.error('❌ Failed to parse access:', result.error)
appConnectionManager.reset()
if (router) {
router.push({ path: '/not_app', query: { message: result.error }})
}
if (onConnectionFailed) {
onConnectionFailed(new Error(result.error))
}
reject(new Error(result.error))
}
} catch (error) {
console.error('❌ Connection process failed:', error)
appConnectionManager.reset()
if (onConnectionFailed) {
onConnectionFailed(error)
}
reject(error)
}
})
})
appConnectionManager.setConnecting(connectionPromise)
try {
const result = await connectionPromise
console.groupEnd()
return result
} catch (error) {
console.groupEnd()
return { success: false, error }
}
}
// 重置连接
const resetConnection = () => {
appConnectionManager.reset()
}
// 检查连接状态
const checkConnectionStatus = () => {
return {
isConnected: isAppConnected(),
isConnecting: appConnectionManager.isConnecting(),
headerInfo: getAppHeaderInfo()
}
}
return {
connectToAppOptimized,
resetConnection,
checkConnectionStatus,
isAppConnected,
getAppHeaderInfo
}
}