Files
core/src/modules/configs/configs.encrypt.util.ts
Innei 44286f2bff chore: update lru
Signed-off-by: Innei <tukon479@gmail.com>
2023-04-25 21:35:13 +08:00

66 lines
1.7 KiB
TypeScript

import { isArrayLike, isObject } from 'lodash'
import { LRUCache } from 'lru-cache'
import { EncryptUtil } from '~/utils/encrypt.util'
const metaKey = 'configs:encrypt'
export const Encrypt: PropertyDecorator = (target: any, key: string) => {
Reflect.defineMetadata(metaKey, true, target, key)
}
export const isEncryptProperty = (target: any, key: string) => {
return (
typeof target[key] == 'string' &&
!!Reflect.getMetadata(metaKey, target, key)
)
}
const decryptLRU = new LRUCache({
max: 100,
ttl: 1000 * 60 * 5,
})
export const decryptProperty = (target: any, key: string, value: any) => {
if (isEncryptProperty(target, key)) {
if (decryptLRU.has(value)) {
return decryptLRU.get(value)
}
const decryptValue = EncryptUtil.decrypt(value)
decryptLRU.set(value, decryptValue)
return decryptValue
}
return value
}
export const decryptObject = (target: any) => {
const keys = Object.keys(target)
for (const key of keys) {
const value = target[key]
if (isObject(value) && !isArrayLike(value)) {
target[key] = decryptObject(value)
continue
}
target[key] = decryptProperty(target, key, target[key])
}
return target
}
export const encryptProperty = (target: any, key: string, value: any) => {
if (isEncryptProperty(target, key)) {
return EncryptUtil.encrypt(value)
}
return value
}
export const encryptObject = (target: any) => {
const keys = Object.keys(target)
for (const key of keys) {
const value = target[key]
if (isObject(value) && !isArrayLike(value)) {
target[key] = encryptObject(value)
continue
}
target[key] = encryptProperty(target, key, target[key])
}
return target
}