UNPKG

@deno/kv

Version:

A Deno KV client library optimized for Node.js.

68 lines (67 loc) 2.26 kB
// Copyright 2023 the Deno authors. All rights reserved. MIT license. import { defer } from "./proto/runtime/async/observer.js"; // take an underlying raw kv watch stream, and create a deferred stream that dedups (by key+versionstamp) based on when it's pulled export function makeUnrawWatchStream(rawWatchStream, onCancel) { let pulled; let latest; let signal = defer(); let cancelled = false; return new ReadableStream({ start(controller) { (async () => { const reader = rawWatchStream.getReader(); while (true) { const { done, value: entries } = await reader.read(); if (done) break; if (cancelled) break; latest = entries; signal.resolve(); signal = defer(); } await reader.cancel(); signal.resolve(); try { controller.close(); } catch { /* noop */ } })(); }, async pull(controller) { if (!latest) await signal; if (!latest) return; while (true) { let changed = false; if (pulled) { for (let i = 0; i < latest.length; i++) { if (latest[i].versionstamp === pulled[i].versionstamp) continue; changed = true; break; } } else { pulled = latest; changed = pulled.some((v) => v.versionstamp !== null); } if (changed) { pulled = latest; controller.enqueue(pulled); return; } else { await signal; } } }, async cancel() { cancelled = true; await onCancel(); }, }, { highWaterMark: 0, // ensure all pulls are user-initiated }); }