UNPKG

@ydbjs/topic

Version:

YDB Topics client for publish-subscribe messaging. Provides at-least-once delivery, exactly-once publishing, FIFO guarantees, and scalable message processing for unstructured data.

95 lines 2.92 kB
import { EventEmitter } from 'events'; export class AsyncEventEmitter { emitter; eventName; queue = []; resolvers = []; rejecters = []; ended = false; error = null; constructor(emitter, eventName) { this.emitter = emitter; this.eventName = eventName; this.emitter.on(this.eventName, (data) => { if (this.resolvers.length > 0) { const resolve = this.resolvers.shift(); resolve({ value: data, done: false }); } else { this.queue.push(data); } }); this.emitter.once('end', () => { this.ended = true; while (this.resolvers.length > 0) { const resolve = this.resolvers.shift(); resolve({ value: undefined, done: true }); } }); this.emitter.once('error', (err) => { this.error = err; while (this.rejecters.length > 0) { const reject = this.rejecters.shift(); reject(err); } while (this.resolvers.length > 0) { const reject = this.rejecters.shift(); if (reject) reject(err); } }); } next() { if (this.error) { return Promise.reject(this.error); } if (this.queue.length > 0) { return Promise.resolve({ value: this.queue.shift(), done: false }); } if (this.ended) { return Promise.resolve({ value: undefined, done: true }); } return new Promise((resolve, reject) => { this.resolvers.push(resolve); this.rejecters.push(reject); }); } return() { this.ended = true; while (this.resolvers.length > 0) { const resolve = this.resolvers.shift(); resolve({ value: undefined, done: true }); } return Promise.resolve({ value: undefined, done: true }); } throw(err) { this.error = err; while (this.rejecters.length > 0) { const reject = this.rejecters.shift(); reject(err); } while (this.resolvers.length > 0) { const reject = this.rejecters.shift(); if (reject) reject(err); } return Promise.resolve({ value: undefined, done: true }); } [Symbol.asyncIterator]() { return this; } dispose() { this.emitter.removeAllListeners(this.eventName); this.emitter.removeAllListeners('end'); this.emitter.removeAllListeners('error'); this.resolvers.length = 0; this.rejecters.length = 0; this.queue.length = 0; this.ended = true; this.error = null; } [Symbol.dispose]() { this.dispose(); } } //# sourceMappingURL=aee.js.map