UNPKG

@deno/kv

Version:

A Deno KV client library optimized for Node.js.

72 lines (71 loc) 2.46 kB
"use strict"; // Copyright 2023 the Deno authors. All rights reserved. MIT license. Object.defineProperty(exports, "__esModule", { value: true }); exports.makeUnrawWatchStream = void 0; const observer_js_1 = require("./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 function makeUnrawWatchStream(rawWatchStream, onCancel) { let pulled; let latest; let signal = (0, observer_js_1.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 = (0, observer_js_1.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 }); } exports.makeUnrawWatchStream = makeUnrawWatchStream;