bankcode-bic
Version:
Convert bank codes from IBAN to BICs, Name of bank. Currently supports only some selected EU countries.
62 lines (61 loc) • 1.83 kB
JavaScript
//#region src/libs/cache.browser.ts
const META_KEY = "localcache-meta";
function getMeta(localStorage) {
const raw = localStorage.getItem(META_KEY);
if (!raw) return {};
try {
return JSON.parse(raw);
} catch {
return {};
}
}
function setMeta(meta, localStorage) {
localStorage.setItem(META_KEY, JSON.stringify(meta));
}
function clearMeta(localStorage) {
localStorage.removeItem(META_KEY);
}
async function hashKey(key) {
const encoder = new TextEncoder();
const data = encoder.encode(key);
const hashBuffer = await (globalThis.crypto?.subtle?.digest("SHA-256", data) ?? Promise.resolve(/* @__PURE__ */ new ArrayBuffer(0)));
const hashArray = Array.from(new Uint8Array(hashBuffer));
const hashHex = hashArray.map((b) => b.toString(16).padStart(2, "0")).join("");
return `cache_${hashHex}`;
}
var LocalStorageCache = class {
localStorage;
constructor(win) {
this.localStorage = win?.localStorage ?? globalThis.localStorage;
}
async get(key, transformer) {
const meta = getMeta(this.localStorage);
const entry = meta[key];
if (!entry) return null;
if (Date.now() > entry.expiry) {
delete meta[key];
setMeta(meta, this.localStorage);
this.localStorage.removeItem(entry.file);
return null;
}
const file = entry.file ?? await hashKey(key);
const value = this.localStorage.getItem(file);
if (value === null) return null;
return transformer ? transformer(value) : value;
}
async set(key, value, ttlMs, transformer) {
const meta = getMeta(this.localStorage);
const file = await hashKey(key);
this.localStorage.setItem(file, transformer ? transformer(value) : value);
meta[key] = {
file,
expiry: Date.now() + ttlMs
};
setMeta(meta, this.localStorage);
}
async clear() {
await clearMeta(this.localStorage);
}
};
//#endregion
export { LocalStorageCache, hashKey };