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
JavaScript
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 };