export type TkvEntry = { key: readonly [...K]; value: T; versionstamp: string; }; export type TkvEntryMaybe = TkvEntry | { key: readonly [...K]; value: null; versionstamp: null; }; export type TkvListSelector = | { prefix: KvKeyPrefix } | { prefix: KvKeyPrefix; start: readonly [...K] } | { prefix: KvKeyPrefix; end: readonly [...K] } | { start: readonly [...K]; end: readonly [...K] }; export type KvKeyPrefix = Key extends readonly [infer Prefix, ...infer Rest] ? readonly [Prefix] | readonly [Prefix, ...Rest] : never; /** * Typed wrapper for {@link Deno.Kv} */ export class Tkv { constructor(readonly db: Deno.Kv) {} get( key: readonly [...K], options: Parameters[1] = {}, ): Promise> { return this.db.get(key, options) as any; } set( key: readonly [...K], value: T, options: Parameters[2] = {}, ): ReturnType { return this.db.set(key, value, options); } atomicSet( key: readonly [...K], versionstamp: Parameters[0]["versionstamp"], value: T, options: Parameters[2] = {}, ): ReturnType { return this.db.atomic() .check({ key, versionstamp }) .set(key, value, options) .commit(); } delete(key: readonly [...K]): ReturnType { return this.db.delete(key); } atomicDelete( key: readonly [...K], versionstamp: Parameters[0]["versionstamp"], ): ReturnType { return this.db.atomic() .check({ key, versionstamp }) .delete(key) .commit(); } list( selector: TkvListSelector, options: Parameters[1] = {}, ): AsyncIterableIterator> { return this.db.list(selector as Deno.KvListSelector, options) as any; } }