ram64
Version:
Multi-threaded 64bit memory cache database inspired by redis-like features
53 lines (42 loc) • 1.71 kB
text/typescript
import { readFile } from 'fs/promises';
import { getHash } from './util/hash';
import { CacheObject } from './types';
export type RAMFunctionHandler = (obj: CacheObject|undefined, params: any) => CacheObject;
export class RAMFunction {
constructor(id: number, code: string, fn: RAMFunctionHandler) {
this.#id = id;
this.#code = code;
this.#fn = fn;
}
#id: number;
#code: string;
#fn: RAMFunctionHandler;
get id(): number {
return this.#id;
}
get code(): string {
return this.#code;
}
get fn(): RAMFunctionHandler {
return this.#fn;
}
static fromFile(filePath: string, testCache?: CacheObject, testParams?: any): Promise<RAMFunction> {
return readFile(filePath, 'utf8').then(code => RAMFunction.fromString(code, testCache, testParams));
}
static fromString(code: string, testCache?: CacheObject, testParams?: any): RAMFunction {
let fnHandler;
try {
fnHandler = new Function('cacheObject', 'params', code) as RAMFunctionHandler;
fnHandler(undefined, undefined);
fnHandler(undefined, {});
const frozenCache: CacheObject = { value: null };
Object.freeze(frozenCache); // throw (only on strict mode) if input is attempted to mutate
fnHandler(frozenCache, undefined);
fnHandler(testCache, testParams);
} catch (ex) {
throw new Error(`RAMFunction did not pass validation: ${(ex as Error).message}`);
}
const id: number = getHash(code);
return new RAMFunction(id, code, fnHandler);
}
}