@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
JavaScript
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