UNPKG

@trifrost/core

Version:

Blazingly fast, runtime-agnostic server framework for modern edge and node environments

74 lines (73 loc) 2.16 kB
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); } }