feed-list-cache.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import { STORAGE } from '@/core/constants/storage-keys'
  2. const MEMO_KEY = '__feed_list_memo__'
  3. const DISK_KEY = STORAGE.feedList || 'hl88app:feed_list'
  4. const TTL_MS = 5 * 60 * 1000
  5. const MAX_PAGES = 8
  6. /** 进程内分页缓存 */
  7. const memo = {
  8. pages: new Map(),
  9. updatedAt: 0
  10. }
  11. function pageKey(page) {
  12. return `p${Number(page) || 1}`
  13. }
  14. function fresh(ts) {
  15. return Date.now() - ts < TTL_MS
  16. }
  17. export function readFeedPage(page) {
  18. const key = pageKey(page)
  19. const hit = memo.pages.get(key)
  20. if (hit && fresh(hit.ts)) {
  21. return { ...hit.data, fromCache: true }
  22. }
  23. try {
  24. const disk = uni.getStorageSync(DISK_KEY)
  25. if (!disk || !disk.pages) return null
  26. const row = disk.pages[key]
  27. if (row && fresh(row.ts)) {
  28. memo.pages.set(key, row)
  29. return { ...row.data, fromCache: true }
  30. }
  31. } catch (_) {}
  32. return null
  33. }
  34. export function writeFeedPage(page, pack) {
  35. const key = pageKey(page)
  36. const row = { ts: Date.now(), data: pack }
  37. memo.pages.set(key, row)
  38. memo.updatedAt = Date.now()
  39. const keys = [...memo.pages.keys()]
  40. if (keys.length > MAX_PAGES) {
  41. const drop = keys.sort((a, b) => {
  42. const ta = memo.pages.get(a)?.ts || 0
  43. const tb = memo.pages.get(b)?.ts || 0
  44. return ta - tb
  45. })[0]
  46. if (drop) memo.pages.delete(drop)
  47. }
  48. try {
  49. const disk = uni.getStorageSync(DISK_KEY) || { pages: {} }
  50. disk.pages = disk.pages || {}
  51. disk.pages[key] = row
  52. const diskKeys = Object.keys(disk.pages)
  53. if (diskKeys.length > MAX_PAGES) {
  54. const oldest = diskKeys.sort(
  55. (a, b) => (disk.pages[a]?.ts || 0) - (disk.pages[b]?.ts || 0)
  56. )[0]
  57. delete disk.pages[oldest]
  58. }
  59. disk.updatedAt = Date.now()
  60. uni.setStorageSync(DISK_KEY, disk)
  61. } catch (_) {}
  62. }
  63. export function clearFeedListCache() {
  64. memo.pages.clear()
  65. memo.updatedAt = 0
  66. try {
  67. uni.removeStorageSync(DISK_KEY)
  68. } catch (_) {}
  69. }