vue-vben-admin/src/utils/cache/storageCache.ts

112 lines
2.9 KiB
TypeScript
Raw Normal View History

import { cacheCipher } from '/@/settings/encryptionSetting';
import { isNullOrUnDef } from '/@/utils/is';
2023-11-07 10:13:42 +08:00
import { Encryption, EncryptionFactory, EncryptionParams } from '@/utils/cipher';
export interface CreateStorageParams extends EncryptionParams {
2021-02-26 00:15:18 +08:00
prefixKey: string;
storage: Storage;
hasEncrypt: boolean;
2021-02-26 00:15:18 +08:00
timeout?: Nullable<number>;
}
// TODO 移除此文件夹下全部代码
export const createStorage = ({
prefixKey = '',
storage = sessionStorage,
key = cacheCipher.key,
iv = cacheCipher.iv,
2021-02-26 00:15:18 +08:00
timeout = null,
hasEncrypt = true,
2021-02-26 00:15:18 +08:00
}: Partial<CreateStorageParams> = {}) => {
if (hasEncrypt && [key.length, iv.length].some((item) => item !== 16)) {
throw new Error('When hasEncrypt is true, the key or iv must be 16 bits!');
}
2023-11-07 10:13:42 +08:00
const persistEncryption: Encryption = EncryptionFactory.createAesEncryption({
key: cacheCipher.key,
iv: cacheCipher.iv,
});
/**
* Cache class
* Construction parameters can be passed into sessionStorage, localStorage,
* @class Cache
* @example
*/
const WebStorage = class WebStorage {
private storage: Storage;
private prefixKey?: string;
2023-11-07 10:13:42 +08:00
private encryption: Encryption;
private hasEncrypt: boolean;
/**
*
* @param {*} storage
*/
constructor() {
this.storage = storage;
this.prefixKey = prefixKey;
2023-11-07 10:13:42 +08:00
this.encryption = persistEncryption;
this.hasEncrypt = hasEncrypt;
}
private getKey(key: string) {
return `${this.prefixKey}${key}`.toUpperCase();
}
/**
* Set cache
* @param {string} key
* @param {*} value
* @param {*} expire Expiration time in seconds
* @memberof Cache
*/
2021-02-26 00:15:18 +08:00
set(key: string, value: any, expire: number | null = timeout) {
const stringData = JSON.stringify({
value,
time: Date.now(),
expire: !isNullOrUnDef(expire) ? new Date().getTime() + expire * 1000 : null,
});
2023-11-07 10:13:42 +08:00
const stringifyValue = this.hasEncrypt ? this.encryption.encrypt(stringData) : stringData;
this.storage.setItem(this.getKey(key), stringifyValue);
}
/**
* Read cache
* @param {string} key
* @param {*} def
* @memberof Cache
*/
get(key: string, def: any = null): any {
const val = this.storage.getItem(this.getKey(key));
if (!val) return def;
try {
2023-11-07 10:13:42 +08:00
const decVal = this.hasEncrypt ? this.encryption.decrypt(val) : val;
const data = JSON.parse(decVal);
const { value, expire } = data;
if (isNullOrUnDef(expire) || expire >= new Date().getTime()) {
return value;
}
this.remove(key);
} catch (e) {
return def;
}
}
/**
* Delete cache based on key
* @param {string} key
* @memberof Cache
*/
remove(key: string) {
this.storage.removeItem(this.getKey(key));
}
/**
* Delete all caches of this instance
*/
clear(): void {
this.storage.clear();
}
};
return new WebStorage();
};