156 lines
4.4 KiB
JavaScript
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
|
|
}
|
|
}
|