UNPKG

@deno/kv

Version:

A Deno KV client library optimized for Node.js.

75 lines (74 loc) 2.15 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.subscribeFnToAsyncGenerator = exports.createSubscribeFn = exports.defer = void 0; const array_js_1 = require("../array.js"); function defer() { const transit = {}; const result = new Promise((resolve, reject) => Object.assign(transit, { resolve, reject })); return Object.assign(result, transit); } exports.defer = defer; function createSubscribeFn(next, wait = Promise.resolve()) { const observers = []; (async () => { try { await wait; while (observers.length) { const [value, done] = await next(); for (const observer of observers) observer.next(value); if (done) break; } } catch (err) { for (const observer of observers) observer.error(err); } finally { for (const observer of observers) observer.complete(); } })(); return (observer) => { observers.push(observer); return () => { observer.complete(); (0, array_js_1.removeItem)(observers, observer); }; }; } exports.createSubscribeFn = createSubscribeFn; async function* subscribeFnToAsyncGenerator(subscribe) { let finished = false; let deferred = defer(); const observer = { next(value) { const result = deferred; deferred = defer(); result.resolve(value); }, error(exception) { const result = deferred; deferred = defer(); result.reject(exception); }, complete() { finished = true; deferred.resolve(null); }, }; const unsubscribe = subscribe(observer); try { while (true) { const value = await deferred; if (finished) break; yield value; } } finally { unsubscribe(); } } exports.subscribeFnToAsyncGenerator = subscribeFnToAsyncGenerator;