| import { deCrypto, enCrypto } from '../crypto' |
|
|
| interface StorageData<T = any> { |
| data: T |
| expire: number | null |
| } |
|
|
| export function createLocalStorage(options?: { expire?: number | null; crypto?: boolean }) { |
| const DEFAULT_CACHE_TIME = 60 * 60 * 24 * 7 |
|
|
| const { expire, crypto } = Object.assign( |
| { |
| expire: DEFAULT_CACHE_TIME, |
| crypto: true, |
| }, |
| options, |
| ) |
|
|
| function set<T = any>(key: string, data: T) { |
| const storageData: StorageData<T> = { |
| data, |
| expire: expire !== null ? new Date().getTime() + expire * 1000 : null, |
| } |
|
|
| const json = crypto ? enCrypto(storageData) : JSON.stringify(storageData) |
| window.localStorage.setItem(key, json) |
| } |
|
|
| function get(key: string) { |
| const json = window.localStorage.getItem(key) |
| if (json) { |
| let storageData: StorageData | null = null |
|
|
| try { |
| storageData = crypto ? deCrypto(json) : JSON.parse(json) |
| } |
| catch { |
| |
| } |
|
|
| if (storageData) { |
| const { data, expire } = storageData |
| if (expire === null || expire >= Date.now()) |
| return data |
| } |
|
|
| remove(key) |
| return null |
| } |
| } |
|
|
| function remove(key: string) { |
| window.localStorage.removeItem(key) |
| } |
|
|
| function clear() { |
| window.localStorage.clear() |
| } |
|
|
| return { |
| set, |
| get, |
| remove, |
| clear, |
| } |
| } |
|
|
| export const ls = createLocalStorage() |
|
|
| export const ss = createLocalStorage({ expire: null, crypto: false }) |
|
|