index.ts 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. import forage from "localforage";
  2. import type { LocalForage, ProxyStorage, ExpiresData } from "./types.d";
  3. class StorageProxy implements ProxyStorage {
  4. protected storage: LocalForage;
  5. constructor(storageModel) {
  6. this.storage = storageModel;
  7. this.storage.config({
  8. // 首选IndexedDB作为第一驱动,不支持IndexedDB会自动降级到localStorage(WebSQL被弃用,详情看https://developer.chrome.com/blog/deprecating-web-sql)
  9. driver: [this.storage.INDEXEDDB, this.storage.LOCALSTORAGE],
  10. name: "pure-admin"
  11. });
  12. }
  13. /**
  14. * @description 将对应键名的数据保存到离线仓库
  15. * @param k 键名
  16. * @param v 键值
  17. * @param m 缓存时间(单位`分`,默认`0`分钟,永久缓存)
  18. */
  19. public async setItem<T>(k: string, v: T, m = 0): Promise<T> {
  20. return new Promise((resolve, reject) => {
  21. this.storage
  22. .setItem(k, {
  23. data: v,
  24. expires: m ? new Date().getTime() + m * 60 * 1000 : 0
  25. })
  26. .then(value => {
  27. resolve(value.data);
  28. })
  29. .catch(err => {
  30. reject(err);
  31. });
  32. });
  33. }
  34. /**
  35. * @description 从离线仓库中获取对应键名的值
  36. * @param k 键名
  37. */
  38. public async getItem<T>(k: string): Promise<T> {
  39. return new Promise((resolve, reject) => {
  40. this.storage
  41. .getItem(k)
  42. .then((value: ExpiresData<T>) => {
  43. value && (value.expires > new Date().getTime() || value.expires === 0)
  44. ? resolve(value.data)
  45. : resolve(null);
  46. })
  47. .catch(err => {
  48. reject(err);
  49. });
  50. });
  51. }
  52. /**
  53. * @description 从离线仓库中删除对应键名的值
  54. * @param k 键名
  55. */
  56. public async removeItem(k: string) {
  57. return new Promise<void>((resolve, reject) => {
  58. this.storage
  59. .removeItem(k)
  60. .then(() => {
  61. resolve();
  62. })
  63. .catch(err => {
  64. reject(err);
  65. });
  66. });
  67. }
  68. /**
  69. * @description 从离线仓库中删除所有的键名,重置数据库
  70. */
  71. public async clear() {
  72. return new Promise<void>((resolve, reject) => {
  73. this.storage
  74. .clear()
  75. .then(() => {
  76. resolve();
  77. })
  78. .catch(err => {
  79. reject(err);
  80. });
  81. });
  82. }
  83. /**
  84. * @description 获取数据仓库中所有的key
  85. */
  86. public async keys() {
  87. return new Promise<string[]>((resolve, reject) => {
  88. this.storage
  89. .keys()
  90. .then(keys => {
  91. resolve(keys);
  92. })
  93. .catch(err => {
  94. reject(err);
  95. });
  96. });
  97. }
  98. }
  99. /**
  100. * 二次封装 [localforage](https://localforage.docschina.org/) 支持设置过期时间,提供完整的类型提示
  101. */
  102. export const localForage = () => new StorageProxy(forage);