UNPKG

@worker-tools/deno-kv-storage

Version:

An implementation of the StorageArea (1,2,3) interface for Deno with an extensible system for supporting various database backends.

84 lines 2.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MuxAsyncIterator = void 0; // Copyright 2018-2021 the Deno authors. All rights reserved. MIT license. const deferred_js_1 = require("./deferred.js"); /** The MuxAsyncIterator class multiplexes multiple async iterators into a * single stream. It currently makes an assumption: * - The final result (the value returned and not yielded from the iterator) * does not matter; if there is any, it is discarded. */ class MuxAsyncIterator { constructor() { Object.defineProperty(this, "iteratorCount", { enumerable: true, configurable: true, writable: true, value: 0 }); Object.defineProperty(this, "yields", { enumerable: true, configurable: true, writable: true, value: [] }); // deno-lint-ignore no-explicit-any Object.defineProperty(this, "throws", { enumerable: true, configurable: true, writable: true, value: [] }); Object.defineProperty(this, "signal", { enumerable: true, configurable: true, writable: true, value: (0, deferred_js_1.deferred)() }); } add(iterable) { ++this.iteratorCount; this.callIteratorNext(iterable[Symbol.asyncIterator]()); } async callIteratorNext(iterator) { try { const { value, done } = await iterator.next(); if (done) { --this.iteratorCount; } else { this.yields.push({ iterator, value }); } } catch (e) { this.throws.push(e); } this.signal.resolve(); } async *iterate() { while (this.iteratorCount > 0) { // Sleep until any of the wrapped iterators yields. await this.signal; // Note that while we're looping over `yields`, new items may be added. for (let i = 0; i < this.yields.length; i++) { const { iterator, value } = this.yields[i]; yield value; this.callIteratorNext(iterator); } if (this.throws.length) { for (const e of this.throws) { throw e; } this.throws.length = 0; } // Clear the `yields` list and reset the `signal` promise. this.yields.length = 0; this.signal = (0, deferred_js_1.deferred)(); } } [Symbol.asyncIterator]() { return this.iterate(); } } exports.MuxAsyncIterator = MuxAsyncIterator; //# sourceMappingURL=mux_async_iterator.js.map