@trifrost/core
Version:
Blazingly fast, runtime-agnostic server framework for modern edge and node environments
74 lines (73 loc) • 2.16 kB
JavaScript
import { isIntGt } from '@valkyriestudios/utils/number';
import { isNeString } from '@valkyriestudios/utils/string';
export class Store {
#name;
adapter;
#ctx = null;
constructor(name, adapter, ctx) {
this.#name = name;
this.adapter = adapter;
if (ctx)
this.#ctx = ctx;
}
get name() {
return this.#name;
}
async get(key) {
if (!isNeString(key))
throw new Error(this.#name + '@get: Invalid key');
try {
const val = await this.adapter.get(key);
return Object.prototype.toString.call(val) === '[object Object]' || Array.isArray(val) ? val : null;
}
catch (err) {
this.#ctx?.logger?.error?.(err, { key });
return null;
}
}
async set(key, value, opts) {
if (!isNeString(key))
throw new Error(this.#name + '@set: Invalid key');
if (Object.prototype.toString.call(value) !== '[object Object]' && !Array.isArray(value))
throw new Error(this.#name + '@set: Invalid value');
const TTL = isIntGt(opts?.ttl, 0) ? opts.ttl : 60;
try {
await this.adapter.set(key, value, TTL);
}
catch (err) {
this.#ctx?.logger?.error?.(err, { key, value, opts });
}
}
async del(val) {
if (isNeString(val)) {
try {
await this.adapter.del(val);
}
catch (err) {
this.#ctx?.logger?.error?.(err, { val });
}
}
else if (isNeString(val?.prefix)) {
try {
await this.adapter.delPrefixed(val.prefix);
}
catch (err) {
this.#ctx?.logger?.error?.(err, { val });
}
}
else {
throw new Error(this.#name + '@del: Invalid deletion value');
}
}
async stop() {
try {
await this.adapter.stop();
}
catch (err) {
this.#ctx?.logger?.error?.(err);
}
}
spawn(ctx) {
return new Store(this.name, this.adapter, ctx);
}
}