storage.web.ts 1.3 KB

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