/**
|
* Pinia Persist Plugin
|
* Pinia 持久化插件
|
* @link https://prazdevs.github.io/pinia-plugin-persistedstate/zh/guide/
|
*
|
*/
|
import type { Pinia } from 'pinia';
|
import { createPersistedState, Serializer } from 'pinia-plugin-persistedstate';
|
import type { PersistedStateFactoryOptions } from 'pinia-plugin-persistedstate';
|
import { getCommonStoragePrefix } from '@/utils/env';
|
import { Encryption, EncryptionFactory } from '@/utils/cipher';
|
import { cacheCipher, SHOULD_ENABLE_STORAGE_ENCRYPTION } from '@/settings/encryptionSetting';
|
|
export const PERSIST_KEY_PREFIX = getCommonStoragePrefix();
|
|
const persistEncryption: Encryption = EncryptionFactory.createAesEncryption({
|
key: cacheCipher.key,
|
iv: cacheCipher.iv,
|
});
|
|
/**
|
* Custom serializer for serialization and deserialization of storage data
|
* 自定义序列化器,用于序列化和反序列化存储数据
|
*
|
* @param shouldEnableEncryption whether to enable encryption for storage data 是否启用存储数据加密
|
* @returns serializer
|
*/
|
function customSerializer(shouldEnableEncryption: boolean): Serializer {
|
if (shouldEnableEncryption) {
|
return {
|
deserialize: (value) => {
|
const decrypted = persistEncryption.decrypt(value);
|
return JSON.parse(decrypted);
|
},
|
serialize: (value) => {
|
const serialized = JSON.stringify(value);
|
return persistEncryption.encrypt(serialized);
|
},
|
};
|
} else {
|
return {
|
deserialize: (value) => {
|
return JSON.parse(value);
|
},
|
serialize: (value) => {
|
return JSON.stringify(value);
|
},
|
};
|
}
|
}
|
|
/**
|
* Register Pinia Persist Plugin
|
* 注册 Pinia 持久化插件
|
*
|
* @param pinia Pinia instance Pinia 实例
|
*/
|
export function registerPiniaPersistPlugin(pinia: Pinia) {
|
pinia.use(createPersistedState(createPersistedStateOptions(PERSIST_KEY_PREFIX)));
|
}
|
|
/**
|
* Create Persisted State Options
|
* 创建持久化状态选项
|
*
|
* @param keyPrefix prefix for storage key 储存键前缀
|
* @returns persisted state factory options
|
*/
|
export function createPersistedStateOptions(keyPrefix: string): PersistedStateFactoryOptions {
|
return {
|
storage: localStorage,
|
key: (id) => `${keyPrefix}__${id}`,
|
serializer: customSerializer(SHOULD_ENABLE_STORAGE_ENCRYPTION),
|
};
|
}
|