mirror of
https://github.com/ikun0014/lx-music-mobile.git
synced 2025-07-04 04:32:09 +08:00
修复自定义源逻辑问题
This commit is contained in:
parent
3bfe0623b3
commit
6f870e9d7c
@ -1,4 +1,4 @@
|
|||||||
import { type InitParams, onScriptAction, sendAction, type ResponseParams, type UpdateInfoParams } from '@/utils/nativeModules/userApi'
|
import { type InitParams, onScriptAction, sendAction, type ResponseParams, type UpdateInfoParams, type RequestParams } from '@/utils/nativeModules/userApi'
|
||||||
import { log, setUserApiList, setUserApiStatus } from '@/core/userApi'
|
import { log, setUserApiList, setUserApiStatus } from '@/core/userApi'
|
||||||
import settingState from '@/store/setting/state'
|
import settingState from '@/store/setting/state'
|
||||||
import BackgroundTimer from 'react-native-background-timer'
|
import BackgroundTimer from 'react-native-background-timer'
|
||||||
@ -8,32 +8,65 @@ import { confirmDialog, openUrl, tipDialog } from '@/utils/tools'
|
|||||||
|
|
||||||
|
|
||||||
export default async(setting: LX.AppSetting) => {
|
export default async(setting: LX.AppSetting) => {
|
||||||
const requestQueue = new Map<string, { resolve: (value: ResponseParams['result']) => void, reject: (error: Error) => void, timeout: number }>()
|
const userApiRequestMap = new Map<string, { resolve: (value: ResponseParams['result']) => void, reject: (error: Error) => void, timeout: number }>()
|
||||||
|
const scriptRequestMap = new Map<string, { request: Promise<any>, abort: () => void }>()
|
||||||
|
|
||||||
const cancelRequest = (requestKey: string, message: string) => {
|
const cancelRequest = (requestKey: string, message: string) => {
|
||||||
const target = requestQueue.get(requestKey)
|
const target = scriptRequestMap.get(requestKey)
|
||||||
if (!target) return
|
if (!target) return
|
||||||
requestQueue.delete(requestKey)
|
scriptRequestMap.delete(requestKey)
|
||||||
BackgroundTimer.clearTimeout(target.timeout)
|
target.abort()
|
||||||
target.reject(new Error(message))
|
|
||||||
}
|
}
|
||||||
const sendUserApiRequest = async(data: LX.UserApi.UserApiRequestParams) => new Promise<ResponseParams['result']>((resolve, reject) => {
|
const sendScriptRequest = (requestKey: string, url: string, options: RequestParams['options']) => {
|
||||||
requestQueue.set(data.requestKey, {
|
let req = fetchData(url, options)
|
||||||
resolve,
|
req.request.then(response => {
|
||||||
reject,
|
// console.log(response)
|
||||||
timeout: BackgroundTimer.setTimeout(() => {
|
sendAction('response', {
|
||||||
const target = requestQueue.get(data.requestKey)
|
error: null,
|
||||||
if (!target) return
|
requestKey,
|
||||||
requestQueue.delete(data.requestKey)
|
response,
|
||||||
target.reject(new Error('request timeout'))
|
})
|
||||||
}, 25_000),
|
}).catch(err => {
|
||||||
|
sendAction('response', {
|
||||||
|
error: err.message,
|
||||||
|
requestKey,
|
||||||
|
response: null,
|
||||||
|
})
|
||||||
|
}).finally(() => {
|
||||||
|
scriptRequestMap.delete(requestKey)
|
||||||
})
|
})
|
||||||
sendAction('request', data)
|
scriptRequestMap.set(requestKey, req)
|
||||||
})
|
}
|
||||||
|
const sendUserApiRequest = async(data: LX.UserApi.UserApiRequestParams) => {
|
||||||
|
const handleApiUpdate = () => {
|
||||||
|
const target = userApiRequestMap.get(data.requestKey)
|
||||||
|
if (!target) return
|
||||||
|
userApiRequestMap.delete(data.requestKey)
|
||||||
|
BackgroundTimer.clearTimeout(target.timeout)
|
||||||
|
target.reject(new Error('request failed'))
|
||||||
|
}
|
||||||
|
const requestPromise = new Promise<ResponseParams['result']>((resolve, reject) => {
|
||||||
|
userApiRequestMap.set(data.requestKey, {
|
||||||
|
resolve,
|
||||||
|
reject,
|
||||||
|
timeout: BackgroundTimer.setTimeout(() => {
|
||||||
|
const target = userApiRequestMap.get(data.requestKey)
|
||||||
|
if (!target) return
|
||||||
|
userApiRequestMap.delete(data.requestKey)
|
||||||
|
target.reject(new Error('request timeout'))
|
||||||
|
}, 20_000),
|
||||||
|
})
|
||||||
|
sendAction('request', data)
|
||||||
|
}).finally(() => {
|
||||||
|
global.state_event.off('apiSourceUpdated', handleApiUpdate)
|
||||||
|
})
|
||||||
|
global.state_event.on('apiSourceUpdated', handleApiUpdate)
|
||||||
|
return requestPromise
|
||||||
|
}
|
||||||
const handleUserApiResponse = ({ status, result, requestKey, errorMessage }: ResponseParams) => {
|
const handleUserApiResponse = ({ status, result, requestKey, errorMessage }: ResponseParams) => {
|
||||||
const target = requestQueue.get(requestKey)
|
const target = userApiRequestMap.get(requestKey)
|
||||||
if (!target) return
|
if (!target) return
|
||||||
requestQueue.delete(requestKey)
|
userApiRequestMap.delete(requestKey)
|
||||||
BackgroundTimer.clearTimeout(target.timeout)
|
BackgroundTimer.clearTimeout(target.timeout)
|
||||||
if (status) target.resolve(result)
|
if (status) target.resolve(result)
|
||||||
else target.reject(new Error(errorMessage ?? 'failed'))
|
else target.reject(new Error(errorMessage ?? 'failed'))
|
||||||
@ -71,11 +104,11 @@ export default async(setting: LX.AppSetting) => {
|
|||||||
// eslint-disable-next-line @typescript-eslint/promise-function-async
|
// eslint-disable-next-line @typescript-eslint/promise-function-async
|
||||||
}).then(res => {
|
}).then(res => {
|
||||||
// console.log(res)
|
// console.log(res)
|
||||||
if (!/^https?:/.test(res.data.url as string)) return Promise.reject(new Error('Get url failed'))
|
if (!/^https?:/.test(res.data.url as string)) throw new Error('Get url failed')
|
||||||
return { type, url: res.data.url }
|
return { type, url: res.data.url }
|
||||||
}).catch(async err => {
|
}).catch(err => {
|
||||||
console.log(err.message)
|
console.log(err.message)
|
||||||
return Promise.reject(err)
|
throw err
|
||||||
}),
|
}),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -135,20 +168,7 @@ export default async(setting: LX.AppSetting) => {
|
|||||||
handleUserApiResponse(event.data)
|
handleUserApiResponse(event.data)
|
||||||
break
|
break
|
||||||
case 'request':
|
case 'request':
|
||||||
fetchData(event.data.url, event.data.options).request.then(response => {
|
sendScriptRequest(event.data.requestKey, event.data.url, event.data.options)
|
||||||
// console.log(response)
|
|
||||||
sendAction('response', {
|
|
||||||
error: null,
|
|
||||||
requestKey: event.data.requestKey,
|
|
||||||
response,
|
|
||||||
})
|
|
||||||
}).catch(err => {
|
|
||||||
sendAction('response', {
|
|
||||||
error: err.message,
|
|
||||||
requestKey: event.data.requestKey,
|
|
||||||
response: null,
|
|
||||||
})
|
|
||||||
})
|
|
||||||
break
|
break
|
||||||
case 'cancelRequest':
|
case 'cancelRequest':
|
||||||
cancelRequest(event.data, 'request canceled')
|
cancelRequest(event.data, 'request canceled')
|
||||||
|
Loading…
x
Reference in New Issue
Block a user