export function getItemKeyList(): Array<string> { const keyList = []; for (let i = 0; i < localStorage.length; i += 1) { const key = localStorage.key(i); if (key) { keyList.push(`${key}`); } } return keyList; } export function clearExpiredKeys() { const keyList = getItemKeyList(); keyList.forEach(key => { const match = key.match(/|||(d{13})$/); if (match) { // const uselessPart = match[0]; const expiresAt = Number(match[1]); if (new Date().getTime() > expiresAt) { localStorage.removeItem(key); } } }); } function clearKeysOf(unwrappedKey: string) { const keyList = getItemKeyList(); const regExp = new RegExp(`${unwrappedKey}\|\|\|`); keyList.forEach(fullKey => { if (regExp.test(fullKey)) { localStorage.removeItem(fullKey); } }); } function getTargetFullKey(unwrappedKey: string): string { const keyList = getItemKeyList(); let result = ''; keyList.forEach(fullKey => { const regExp = new RegExp(`^${unwrappedKey}\|\|\|`); if ( regExp.test(fullKey) ) { result = fullKey; } }); return result; } export function setItem(options: { key: string; value: string; expiresAt?: number; }): void { clearExpiredKeys(); clearKeysOf(options.key); let expiresAtString = ''; if (options.expiresAt) { expiresAtString = `${options.expiresAt}`; if (expiresAtString.length !== 13) { throw new Error(`Invalid expiresAt value: ${expiresAtString}`); } } const fullKey = `${options.key}|||${expiresAtString}`; localStorage.setItem(fullKey, options.value); } export function getItem(unwrappedKey: string): string|null { clearExpiredKeys(); const targetFullKey = getTargetFullKey(unwrappedKey); return localStorage.getItem(targetFullKey); } export function removeItem(unwrappedKey: string): void { clearExpiredKeys(); const targetFullKey = getTargetFullKey(unwrappedKey); localStorage.removeItem(targetFullKey); }