storage.ts 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import localforage from 'localforage';
  2. /** The storage type */
  3. export type StorageType = 'local' | 'session';
  4. export function createStorage<T extends object>(type: StorageType, storagePrefix: string) {
  5. const stg = type === 'session' ? window.sessionStorage : window.localStorage;
  6. const storage = {
  7. /**
  8. * Set session
  9. *
  10. * @param key Session key
  11. * @param value Session value
  12. */
  13. set<K extends keyof T>(key: K, value: T[K]) {
  14. const json = JSON.stringify(value);
  15. stg.setItem(`${storagePrefix}${key as string}`, json);
  16. },
  17. /**
  18. * Get session
  19. *
  20. * @param key Session key
  21. */
  22. get<K extends keyof T>(key: K): T[K] | null {
  23. const json = stg.getItem(`${storagePrefix}${key as string}`);
  24. if (json) {
  25. let storageData: T[K] | null = null;
  26. try {
  27. storageData = JSON.parse(json);
  28. } catch {}
  29. // storageData may be `false` if it is boolean type
  30. if (storageData !== null) {
  31. return storageData as T[K];
  32. }
  33. }
  34. stg.removeItem(`${storagePrefix}${key as string}`);
  35. return null;
  36. },
  37. remove(key: keyof T) {
  38. stg.removeItem(`${storagePrefix}${key as string}`);
  39. },
  40. clear() {
  41. stg.clear();
  42. }
  43. };
  44. return storage;
  45. }
  46. type LocalForage<T extends object> = Omit<typeof localforage, 'getItem' | 'setItem' | 'removeItem'> & {
  47. getItem<K extends keyof T>(key: K, callback?: (err: any, value: T[K] | null) => void): Promise<T[K] | null>;
  48. setItem<K extends keyof T>(key: K, value: T[K], callback?: (err: any, value: T[K]) => void): Promise<T[K]>;
  49. removeItem(key: keyof T, callback?: (err: any) => void): Promise<void>;
  50. };
  51. type LocalforageDriver = 'local' | 'indexedDB' | 'webSQL';
  52. export function createLocalforage<T extends object>(driver: LocalforageDriver) {
  53. const driverMap: Record<LocalforageDriver, string> = {
  54. local: localforage.LOCALSTORAGE,
  55. indexedDB: localforage.INDEXEDDB,
  56. webSQL: localforage.WEBSQL
  57. };
  58. localforage.config({
  59. driver: driverMap[driver]
  60. });
  61. return localforage as LocalForage<T>;
  62. }