168 lines
14 KiB
JavaScript
168 lines
14 KiB
JavaScript
import { resolve, join } from 'node:path';
|
|
import * as ssri from 'ssri';
|
|
import { get as cache_get, put as cache_put, rm as cache_rm } from 'cacache';
|
|
import { sync as exists } from '@polymech/fs/exists';
|
|
import { sync as mkdir } from '@polymech/fs/dir';
|
|
import { isString, isObject, isArray } from '@polymech/core/primitives';
|
|
import { OSR_CACHE } from '@polymech/commons';
|
|
import { sync as read } from '@polymech/fs/read';
|
|
import { logger } from '../index.js';
|
|
export const cache_path = (_namespace) => `${resolve(join(OSR_CACHE(), _namespace))}`;
|
|
export const fileAsBuffer = (path) => read(path, 'buffer');
|
|
export const file_hash = (path, opts = {}, namespace = "nons") => {
|
|
const hash = { ...opts, ns: namespace };
|
|
delete hash['debug'];
|
|
delete hash['verbose'];
|
|
const buffer = fileAsBuffer(path);
|
|
const ibuffer = Buffer.concat([buffer, Buffer.from(JSON.stringify(hash))]);
|
|
const ret = ssri.fromData(ibuffer).toString();
|
|
return ret;
|
|
};
|
|
export const object_hash = (opts = {}, namespace = "nons") => {
|
|
const hash = { ...opts, ns: namespace };
|
|
const ibuffer = Buffer.concat([Buffer.from(JSON.stringify(hash))]);
|
|
const ret = ssri.fromData(ibuffer).toString();
|
|
return ret;
|
|
};
|
|
export const file_name_hash = (path, opts = {}, namespace = "nons") => {
|
|
const ibuffer = Buffer.concat([Buffer.from(path), Buffer.from(JSON.stringify({ ...opts, ns: namespace }))]);
|
|
const ret = ssri.fromData(ibuffer).toString();
|
|
return ret;
|
|
};
|
|
export const set_cached = async (path, opts = {}, namespace = "nons", data, metadata = {}) => {
|
|
const c_integrity = file_hash(path, opts, namespace);
|
|
const c_dir = cache_path(namespace);
|
|
if (!exists(c_dir)) {
|
|
mkdir(c_dir);
|
|
}
|
|
if (!Buffer.isBuffer(data)) {
|
|
if (!isString(data) && (isArray(data) || isObject(data))) {
|
|
data = JSON.stringify(data, null, 2);
|
|
}
|
|
}
|
|
return await cache_put(c_dir, c_integrity, data, {
|
|
metadata: {
|
|
path: path,
|
|
hash: c_integrity,
|
|
...metadata
|
|
}
|
|
});
|
|
};
|
|
export const set_cached_object = async (opts = {}, namespace = "nons", data, metadata = {}) => {
|
|
const c_integrity = object_hash(opts, namespace);
|
|
const c_dir = cache_path(namespace);
|
|
if (!exists(c_dir)) {
|
|
mkdir(c_dir);
|
|
}
|
|
if (!Buffer.isBuffer(data)) {
|
|
if (!isString(data) && (isArray(data) || isObject(data))) {
|
|
try {
|
|
data = JSON.stringify(data, null, 2);
|
|
}
|
|
catch (e) {
|
|
logger.error(`osr-cache :: error serializing object: ${e}`, opts);
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
return await cache_put(c_dir, c_integrity, data, {
|
|
metadata: {
|
|
hash: c_integrity,
|
|
...metadata
|
|
}
|
|
});
|
|
};
|
|
export const get_cache_key = async (path, opts = {}, namespace = "nons") => {
|
|
const c_integrity = file_hash(path, opts, namespace);
|
|
const c_dir = cache_path(namespace);
|
|
try {
|
|
const cached = await cache_get.info(c_dir, c_integrity);
|
|
if (cached) {
|
|
return cached;
|
|
}
|
|
}
|
|
catch (e) {
|
|
logger.error(e);
|
|
}
|
|
};
|
|
export const get_cached = async (path, opts = {}, namespace = "nons") => {
|
|
const c_integrity = file_hash(path, opts, namespace);
|
|
const c_dir = cache_path(namespace);
|
|
if (!exists(c_dir)) {
|
|
mkdir(c_dir);
|
|
}
|
|
let data;
|
|
try {
|
|
const cached = await cache_get.info(c_dir, c_integrity);
|
|
if (cached) {
|
|
data = (await cache_get(c_dir, c_integrity)).data.toString();
|
|
}
|
|
}
|
|
catch (e) {
|
|
logger.error(e);
|
|
}
|
|
return data;
|
|
};
|
|
export const get_cached_object = async (opts = {}, namespace = "nons") => {
|
|
const c_integrity = object_hash(opts, namespace);
|
|
const c_dir = cache_path(namespace);
|
|
if (!exists(c_dir)) {
|
|
mkdir(c_dir);
|
|
}
|
|
let data;
|
|
try {
|
|
const cached = await cache_get.info(c_dir, c_integrity);
|
|
if (cached) {
|
|
data = (await cache_get(c_dir, c_integrity)).data.toString();
|
|
}
|
|
}
|
|
catch (e) {
|
|
logger.error(e);
|
|
}
|
|
if (data && isString(data)) {
|
|
try {
|
|
data = JSON.parse(data);
|
|
}
|
|
catch (e) {
|
|
logger.error(`Error parsing cached object: ${e.message}`);
|
|
}
|
|
}
|
|
return data;
|
|
};
|
|
export const rm_cached_object = async (opts = {}, namespace = "nons") => {
|
|
const c_integrity = object_hash(opts, namespace);
|
|
const c_dir = cache_path(namespace);
|
|
if (!exists(c_dir)) {
|
|
mkdir(c_dir);
|
|
}
|
|
let data;
|
|
try {
|
|
const cached = await cache_get.info(c_dir, c_integrity);
|
|
if (cached) {
|
|
await cache_rm(c_dir, c_integrity);
|
|
}
|
|
}
|
|
catch (e) {
|
|
logger.error(e);
|
|
}
|
|
return data;
|
|
};
|
|
export const get_path_cached = async (path, opts = {}, namespace = "nons") => {
|
|
const c_integrity = file_hash(path, opts, namespace);
|
|
const c_dir = cache_path(namespace);
|
|
if (!exists(c_dir)) {
|
|
mkdir(c_dir);
|
|
}
|
|
let data;
|
|
try {
|
|
const cached = await cache_get.info(c_dir, c_integrity);
|
|
if (cached) {
|
|
return cached.path;
|
|
}
|
|
}
|
|
catch (e) {
|
|
logger.error(e);
|
|
}
|
|
return data;
|
|
};
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ3pDLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFBO0FBQzVCLE9BQU8sRUFBRSxHQUFHLElBQUksU0FBUyxFQUFFLEdBQUcsSUFBSSxTQUFTLEVBQUUsRUFBRSxJQUFJLFFBQVEsRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUM1RSxPQUFPLEVBQUUsSUFBSSxJQUFJLE1BQU0sRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBQ3BELE9BQU8sRUFBRSxJQUFJLElBQUksS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDaEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sMkJBQTJCLENBQUE7QUFDdkUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBQzdDLE9BQU8sRUFBRSxJQUFJLElBQUksSUFBSSxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFDaEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUVwQyxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxVQUFrQixFQUFFLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFBO0FBQzdGLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxDQUFDLElBQVksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLENBQVcsQ0FBQTtBQUU1RSxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxJQUFZLEVBQUUsT0FBWSxFQUFFLEVBQUUsWUFBb0IsTUFBTSxFQUFFLEVBQUU7SUFDbEYsTUFBTSxJQUFJ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
|