export async function ensureLocal(url) { return new Promise((resolve) => { try { const cache = uni.getStorageSync('asset_cache_v1') || {} const hit = cache[url] if (hit && typeof hit === 'string' && hit) { resolve(hit); return } uni.downloadFile({ url, success: (res) => { const tmp = res.tempFilePath || '' if (!tmp) { resolve(url); return } uni.saveFile({ tempFilePath: tmp, success: (s) => { const saved = s.savedFilePath || tmp cache[url] = saved uni.setStorageSync('asset_cache_v1', cache) resolve(saved) }, fail: () => { resolve(tmp) } }) }, fail: () => { resolve(url) } }) } catch (_) { resolve(url) } }) } export async function preloadAssets(urls) { const tasks = urls.map(u => ensureLocal(u)) const results = await Promise.allSettled(tasks) const map = {} results.forEach((r, i) => { map[urls[i]] = r.status === 'fulfilled' ? r.value : urls[i] }) return map }