UNPKG

bankcode-bic

Version:

Convert bank codes from IBAN to BICs, Name of bank. Currently supports only some selected EU countries.

91 lines (89 loc) 2.81 kB
import process from "node:process"; import { promises } from "node:fs"; import { join } from "node:path"; import { createHash } from "node:crypto"; import { deserialize, serialize } from "node:v8"; //#region src/libs/cache.node.ts async function ensureCacheDir(cacheDir, fsFn) { await fsFn.mkdir(cacheDir, { recursive: true }); } const metaFile = (cacheDir) => join(cacheDir, "nodecache-meta.json"); async function readMeta(cacheDir, fsFn) { try { await ensureCacheDir(cacheDir, fsFn); const data = await fsFn.readFile(metaFile(cacheDir), "utf8"); return JSON.parse(data); } catch { return {}; } } async function writeMeta(meta, cacheDir, fsFn) { await ensureCacheDir(cacheDir, fsFn); await fsFn.writeFile(metaFile(cacheDir), JSON.stringify(meta), "utf8"); } async function readCacheValue(file, cacheDir, fsFn, deserializeFn) { try { return deserializeFn(await fsFn.readFile(join(cacheDir, file))); } catch { return null; } } async function writeCacheValue(file, value, cacheDir, fsFn, serializeFn) { await ensureCacheDir(cacheDir, fsFn); await fsFn.writeFile(join(cacheDir, file), serializeFn(value)); } var NodeCache = class { cacheDir; fs; serialize; deserialize; constructor(cacheDir, fsFn = promises, v8toolsFn = { serialize, deserialize }) { this.cacheDir = cacheDir || process.env.CACHE_DIR || join(process.cwd(), ".cache"); this.get = this.get.bind(this); this.set = this.set.bind(this); this.fs = fsFn; this.serialize = v8toolsFn.serialize; this.deserialize = v8toolsFn.deserialize; } get = async (key, transformer) => { const meta = await readMeta(this.cacheDir, this.fs); const entry = meta[key]; if (!entry) return null; if (Date.now() > entry.expiry) { delete meta[key]; await writeMeta(meta, this.cacheDir, this.fs); return null; } const value = await readCacheValue(entry.file, this.cacheDir, this.fs, this.deserialize); if (!value) return null; return transformer ? transformer(value) : value; }; set = async (key, value, ttlMs, transformer) => { const meta = await readMeta(this.cacheDir, this.fs); const file = `${createHash("sha256").update(key).digest("hex")}.cache`; const transformedValue = transformer ? transformer(value) : value; await writeCacheValue(file, transformedValue, this.cacheDir, this.fs, this.serialize); meta[key] = { file, expiry: Date.now() + ttlMs }; await writeMeta(meta, this.cacheDir, this.fs); }; clear = async () => { try { await this.fs.stat(metaFile(this.cacheDir)); } catch { return; } const meta = await readMeta(this.cacheDir, this.fs); for (const { file } of Object.values(meta)) try { await this.fs.unlink(join(this.cacheDir, file)); } catch {} await this.fs.unlink(metaFile(this.cacheDir)); }; }; //#endregion export { NodeCache };