86 lines
2.2 KiB
JavaScript
86 lines
2.2 KiB
JavaScript
import { promises } from 'fs';
|
|
import { createHash } from 'crypto';
|
|
import { scanDirectory } from '../../misc/scan.mjs';
|
|
|
|
const cacheVersion = 1;
|
|
const storedFiles = /* @__PURE__ */ Object.create(null);
|
|
function apiCacheKey(query) {
|
|
const item = JSON.stringify({
|
|
uri: query.uri,
|
|
params: query.params?.toString(),
|
|
headers: query.headers
|
|
});
|
|
return createHash("md5").update(item).digest("hex");
|
|
}
|
|
async function storeAPICache(options, key, data) {
|
|
const expires = Date.now() + options.ttl * 1e3;
|
|
const filename = options.dir + "/" + key + "." + expires.toString() + ".json";
|
|
if (!storedFiles[options.dir]) {
|
|
await getStoredFiles(options.dir);
|
|
}
|
|
const content = {
|
|
version: cacheVersion,
|
|
expires,
|
|
data
|
|
};
|
|
await promises.writeFile(filename, JSON.stringify(content, null, 4), "utf8");
|
|
storedFiles[options.dir][key] = {
|
|
filename,
|
|
expires
|
|
};
|
|
}
|
|
async function getAPICache(dir, key) {
|
|
if (!storedFiles[dir]) {
|
|
await getStoredFiles(dir);
|
|
}
|
|
const item = storedFiles[dir][key];
|
|
if (!item) {
|
|
return null;
|
|
}
|
|
const time = Date.now();
|
|
try {
|
|
const content = JSON.parse(
|
|
await promises.readFile(item.filename, "utf8")
|
|
);
|
|
return content.version === cacheVersion && content.expires > time ? content.data : null;
|
|
} catch (err) {
|
|
return null;
|
|
}
|
|
}
|
|
function clearAPICache(dir) {
|
|
return getStoredFiles(dir, true);
|
|
}
|
|
async function getStoredFiles(dir, clear = false) {
|
|
const storage = !clear && storedFiles[dir] || /* @__PURE__ */ Object.create(null);
|
|
const time = Date.now();
|
|
storedFiles[dir] = storage;
|
|
try {
|
|
await promises.mkdir(dir, {
|
|
recursive: true
|
|
});
|
|
} catch (err) {
|
|
}
|
|
await scanDirectory(
|
|
dir,
|
|
async (ext, file, subdir, path) => {
|
|
if (ext !== ".json") {
|
|
return false;
|
|
}
|
|
const filename = path + subdir + file + ext;
|
|
const parts = file.split(".");
|
|
const expires = parseInt(parts.pop());
|
|
if (clear || expires < time || parts.length !== 1) {
|
|
await promises.unlink(filename);
|
|
return false;
|
|
}
|
|
const cacheKey = parts[0];
|
|
storage[cacheKey] = {
|
|
filename,
|
|
expires
|
|
};
|
|
},
|
|
false
|
|
);
|
|
}
|
|
|
|
export { apiCacheKey, clearAPICache, getAPICache, storeAPICache };
|