/// import { KV, KvKey } from "$sb/types.ts"; import { KvPrimitives, KvQueryOptions } from "./kv_primitives.ts"; const kvBatchSize = 100; export class DenoKvPrimitives implements KvPrimitives { constructor(private db: Deno.Kv) { } async batchGet(keys: KvKey[]): Promise { const results: any[] = []; const batches: Deno.KvKey[][] = []; for (let i = 0; i < keys.length; i += kvBatchSize) { batches.push(keys.slice(i, i + kvBatchSize)); } for (const batch of batches) { const res = await this.db.getMany(batch); results.push(...res.map((r) => r.value === null ? undefined : r.value)); } return results; } async batchSet(entries: KV[]): Promise { // Split into batches of kvBatchSize const batches: KV[][] = []; for (let i = 0; i < entries.length; i += kvBatchSize) { batches.push(entries.slice(i, i + kvBatchSize)); } for (const batch of batches) { let batchOp = this.db.atomic(); for (const { key, value } of batch) { batchOp = batchOp.set(key, value); } const res = await batchOp.commit(); if (!res.ok) { throw res; } } } async batchDelete(keys: KvKey[]): Promise { const batches: KvKey[][] = []; for (let i = 0; i < keys.length; i += kvBatchSize) { batches.push(keys.slice(i, i + kvBatchSize)); } for (const batch of batches) { let batchOp = this.db.atomic(); for (const key of batch) { batchOp = batchOp.delete(key); } const res = await batchOp.commit(); if (!res.ok) { throw res; } } } async *query({ prefix }: KvQueryOptions): AsyncIterableIterator { prefix = prefix || []; for await ( const result of this.db.list({ prefix: prefix as Deno.KvKey }) ) { yield { key: result.key as KvKey, value: result.value as any }; } } close() { this.db.close(); } }