feat:加密图片重复刷新问题

This commit is contained in:
dzc committed 2026-10-29 18:47:31 +08:00
1 parent 44444c3b1b
commit 81ffd2dab8
4 files changed
+193 -18

No files matched your search

+7 -2
View File
@@ -124,9 +124,14 @@ export function createFileAccess(options: FileAccessOptions) {
if (!Number.isFinite(serverTime) || serverTime <= 0) return
offset = serverTime + roundTripMs / 2 - now()
if (Number.isFinite(ttlSeconds) && ttlSeconds > 300 && ttlSeconds <= 86400) ttl = ttlSeconds
cache.clear()
// url() checks cached timestamps against the corrected clock. Preserve usable
// signatures so routine calibration does not change every image's src.
}
return { uploadHeaders, uploadTarget, url, resolve, strip, protected: (s?: string | null) => !!parse(s), synchronize, clear: () => cache.clear(), ttl: () => ttl }
function invalidate(source?: string | null) {
const parsed = parse(source)
if (parsed) cache.delete(parsed.unsigned)
}
return { uploadHeaders, uploadTarget, url, resolve, strip, protected: (s?: string | null) => !!parse(s), synchronize, invalidate, clear: () => cache.clear(), ttl: () => ttl }
}
const unescapeAttribute = (s: string) => s.replace(/&amp;/gi, '&').replace(/&quot;/gi, '"').replace(/&#(?:39|x27);/gi, "'").replace(/&#(x[0-9a-f]+|\d+);/gi, (_, n) => { const code = n[0].toLowerCase() === 'x' ? parseInt(n.slice(1), 16) : Number(n); return code <= 0x10ffff ? String.fromCodePoint(code) : ''; })
+19 -12
View File
@@ -14,6 +14,7 @@ let timer: ReturnType<typeof setInterval> | undefined
let pending: Promise<void> | undefined
let lastSync = 0
const retried = new Map<string, number>()
const retrying = new Map<string, Promise<boolean>>()
export function fileUrl(source?: string | null): string {
void fileAccessRevision.value
try { return client.url(source) } catch { return '' }
@@ -47,21 +48,27 @@ export function startFileAccess() {
void refreshFileAccess()
}
export function stopFileAccess() { if (timer) clearInterval(timer); timer = undefined }
export async function retryFileAccess(source?: string | null) {
export async function retryFileAccess(source?: string | null): Promise<boolean> {
if (!isProtectedFile(source)) return false
const raw = originalFileUrl(source), previous = retried.get(raw) || 0
const raw = resolveFileUrl(originalFileUrl(source)), previous = retried.get(raw) || 0
const active = retrying.get(raw)
if (active) return active
if (Date.now() - previous < 30 * 60 * 1000) return false
if (retried.size >= 2048) retried.clear()
retried.set(raw, Date.now())
const previousUrl = fileUrl(source)
await refreshFileAccess(true)
client.clear()
if (fileUrl(source) === previousUrl) {
await new Promise(resolve => setTimeout(resolve, 1100))
client.clear()
}
fileAccessRevision.value++
return true
const task = (async () => {
const previousUrl = fileUrl(source)
await refreshFileAccess(true)
client.invalidate(source)
if (fileUrl(source) === previousUrl) {
await new Promise(resolve => setTimeout(resolve, 1100))
client.invalidate(source)
}
fileAccessRevision.value++
return true
})()
retrying.set(raw, task)
try { return await task } finally { retrying.delete(raw) }
}
export function installFileAccess(app: any) {
if (typeof uni.addInterceptor === 'function') {
@@ -112,7 +119,7 @@ export function downloadFile(options: any) {
success: async (response: any) => {
if (response.statusCode === 200) { options.success?.(response); options.complete?.(response); return }
if (retry && response.statusCode === 403 && isProtectedFile(options.url)) {
await refreshFileAccess(true); client.clear(); run(false); return
await refreshFileAccess(true); client.invalidate(options.url); run(false); return
}
const error = { errMsg: '文件下载失败', statusCode: response.statusCode }
options.fail?.(error); options.complete?.(error)