storage.web.ts 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import { createMMKV } from 'react-native-mmkv';
  2. import type { MMKV } from 'react-native-mmkv';
  3. const TTL_KEY = '$__$t_';
  4. export type KVDB = MMKV & {
  5. getObject: <T = any>(key: string) => T | undefined;
  6. setObject: (key: string, value: any, ttlSeconds: number) => void;
  7. };
  8. function attachObjectMethods(mmkv: MMKV): KVDB {
  9. const db = mmkv as KVDB;
  10. db.setObject = (key, value, ttlSeconds) => {
  11. db.set(
  12. key,
  13. JSON.stringify({ [TTL_KEY]: Date.now() + ttlSeconds * 1000, v: value })
  14. );
  15. };
  16. db.getObject = <T>(key: string) => {
  17. const raw = db.getString(key);
  18. if (!raw) return undefined;
  19. try {
  20. const obj = JSON.parse(raw) as { [TTL_KEY]: number; v: T };
  21. if (Date.now() > obj[TTL_KEY]) {
  22. db.remove(key);
  23. return undefined;
  24. }
  25. return obj.v;
  26. } catch {
  27. db.remove(key);
  28. return undefined;
  29. }
  30. };
  31. return db;
  32. }
  33. function makeStore(id: string) {
  34. let instance: KVDB | null = null;
  35. return () => {
  36. if (!instance) instance = attachObjectMethods(createMMKV({ id }));
  37. return instance;
  38. };
  39. }
  40. export const getGlobalStorage = makeStore('global');
  41. export const getCaches = makeStore('caches');
  42. export const getApiCache = makeStore('api_cache');