@deno/kv
Version:
A Deno KV client library optimized for Node.js.
72 lines (71 loc) • 2.46 kB
JavaScript
;
// 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;