|
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 }) |
|
|