@riddance/host
Version:
68 lines • 9.12 kB
JavaScript
export class EventCollector {
#transport;
#logger;
#ids;
#emitted = {};
#size = 0;
#flusher;
#deadline;
#buffered;
#signal;
constructor(transport, logger, ids, timeout, signal) {
this.#transport = transport;
this.#logger = logger;
this.#ids = ids;
this.#deadline = Date.now() + timeout;
this.#buffered = 0;
this.#signal = signal;
}
emit(meta, data) {
const eventTime = new Date();
const timeLeft = this.#deadline - Date.now();
if (this.#buffered / this.#transport.publishRate > timeLeft) {
throw new Error('Event overflow.');
}
const event = data === undefined
? { meta, ids: this.#ids, eventTime }
: { meta, ids: this.#ids, eventTime, json: JSON.stringify(data) };
const events = this.#emitted[meta.topic];
if (events) {
events.push(event);
if (events.length > 64 || this.#size > 64_000) {
// eslint-disable-next-line no-void
void this.flush();
}
}
else {
this.#emitted[meta.topic] = [event];
}
++this.#buffered;
this.#size += event.json?.length ?? 0;
}
async flush() {
this.#startFlush(this.#emitted);
this.#emitted = {};
this.#size = 0;
return await this.#flusher;
}
#startFlush(emitted) {
if (this.#flusher) {
this.#flusher = this.#flusher.then(() => this.#flushEvents(emitted));
}
else {
this.#flusher = this.#flushEvents(emitted);
}
}
async #flushEvents(emitted) {
await Promise.all(Object.entries(emitted).map(async ([topic, events]) => {
try {
await this.#transport.sendEvents(topic, events, this.#signal);
}
catch (e) {
this.#logger.fatal('Error sending events.', e, { events });
}
this.#buffered -= events.length;
}));
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZXZlbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9BLE1BQU0sT0FBTyxjQUFjO0lBQ2QsVUFBVSxDQUFnQjtJQUMxQixPQUFPLENBQVE7SUFDZixJQUFJLENBQVk7SUFDekIsUUFBUSxHQUFlLEVBQUUsQ0FBQTtJQUN6QixLQUFLLEdBQUcsQ0FBQyxDQUFBO0lBQ1QsUUFBUSxDQUFnQjtJQUNmLFNBQVMsQ0FBUTtJQUMxQixTQUFTLENBQVE7SUFDUixPQUFPLENBQWE7SUFFN0IsWUFDSSxTQUF5QixFQUN6QixNQUFjLEVBQ2QsR0FBdUYsRUFDdkYsT0FBZSxFQUNmLE1BQW1CO1FBRW5CLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFBO1FBQzNCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFBO1FBQ3JCLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFBO1FBQ2YsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsT0FBTyxDQUFBO1FBQ3JDLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFBO1FBQ2xCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFBO0lBQ3pCLENBQUM7SUFFRCxJQUFJLENBQUMsSUFBbUIsRUFBRSxJQUFXO1FBQ2pDLE1BQU0sU0FBUyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUE7UUFDNUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUE7UUFDNUMsSUFBSSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxHQUFHLFFBQVEsRUFBRSxDQUFDO1lBQzFELE1BQU0sSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtRQUN0QyxDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQ1AsSUFBSSxLQUFLLFNBQVM7WUFDZCxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFO1lBQ3JDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQTtRQUN6RSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUN4QyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1QsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUNsQixJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsRUFBRSxJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxFQUFFLENBQUM7Z0JBQzVDLG1DQUFtQztnQkFDbkMsS0FBSyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUE7WUFDckIsQ0FBQztRQUNMLENBQUM7YUFBTSxDQUFDO1lBQ0osSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUN2QyxDQUFDO1FBQ0QsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFBO1FBQ2hCLElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFBO0lBQ3pDLENBQUM7SUFFRCxLQUFLLENBQUMsS0FBSztRQUNQLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQy9CLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFBO1FBQ2xCLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFBO1FBQ2QsT0FBTyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUE7SUFDOUIsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFtQjtRQUMzQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQTtRQUN4RSxDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUM5QyxDQUFDO0lBQ0wsQ0FBQztJQUVELEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBbUI7UUFDbEMsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUNiLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFO1lBQ2xELElBQUksQ0FBQztnQkFDRCxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQ2pFLENBQUM7WUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNULElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLHVCQUF1QixFQUFFLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUE7WUFDOUQsQ0FBQztZQUNELElBQUksQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQTtRQUNuQyxDQUFDLENBQUMsQ0FDTCxDQUFBO0lBQ0wsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSnNvbiwgTG9nZ2VyIH0gZnJvbSAnLi4vY29udGV4dC5qcydcbmltcG9ydCB7IEJ1ZmZlcmVkRXZlbnQsIENsaWVudEluZm8sIEV2ZW50TWV0YWRhdGEsIEV2ZW50VHJhbnNwb3J0IH0gZnJvbSAnLi9jb250ZXh0LmpzJ1xuXG50eXBlIEVtaXRCdWZmZXIgPSB7XG4gICAgW3RvcGljOiBzdHJpbmddOiBCdWZmZXJlZEV2ZW50W11cbn1cblxuZXhwb3J0IGNsYXNzIEV2ZW50Q29sbGVjdG9yIHtcbiAgICByZWFkb25seSAjdHJhbnNwb3J0OiBFdmVudFRyYW5zcG9ydFxuICAgIHJlYWRvbmx5ICNsb2dnZXI6IExvZ2dlclxuICAgIHJlYWRvbmx5ICNpZHM6IENsaWVudEluZm9cbiAgICAjZW1pdHRlZDogRW1pdEJ1ZmZlciA9IHt9XG4gICAgI3NpemUgPSAwXG4gICAgI2ZsdXNoZXI/OiBQcm9taXNlPHZvaWQ+XG4gICAgcmVhZG9ubHkgI2RlYWRsaW5lOiBudW1iZXJcbiAgICAjYnVmZmVyZWQ6IG51bWJlclxuICAgIHJlYWRvbmx5ICNzaWduYWw6IEFib3J0U2lnbmFsXG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgdHJhbnNwb3J0OiBFdmVudFRyYW5zcG9ydCxcbiAgICAgICAgbG9nZ2VyOiBMb2dnZXIsXG4gICAgICAgIGlkczogeyBvcGVyYXRpb25JZD86IHN0cmluZzsgY2xpZW50SWQ/OiBzdHJpbmc7IGNsaWVudElwPzogc3RyaW5nOyB1c2VyQWdlbnQ/OiBzdHJpbmcgfSxcbiAgICAgICAgdGltZW91dDogbnVtYmVyLFxuICAgICAgICBzaWduYWw6IEFib3J0U2lnbmFsLFxuICAgICkge1xuICAgICAgICB0aGlzLiN0cmFuc3BvcnQgPSB0cmFuc3BvcnRcbiAgICAgICAgdGhpcy4jbG9nZ2VyID0gbG9nZ2VyXG4gICAgICAgIHRoaXMuI2lkcyA9IGlkc1xuICAgICAgICB0aGlzLiNkZWFkbGluZSA9IERhdGUubm93KCkgKyB0aW1lb3V0XG4gICAgICAgIHRoaXMuI2J1ZmZlcmVkID0gMFxuICAgICAgICB0aGlzLiNzaWduYWwgPSBzaWduYWxcbiAgICB9XG5cbiAgICBlbWl0KG1ldGE6IEV2ZW50TWV0YWRhdGEsIGRhdGE/OiBKc29uKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGV2ZW50VGltZSA9IG5ldyBEYXRlKClcbiAgICAgICAgY29uc3QgdGltZUxlZnQgPSB0aGlzLiNkZWFkbGluZSAtIERhdGUubm93KClcbiAgICAgICAgaWYgKHRoaXMuI2J1ZmZlcmVkIC8gdGhpcy4jdHJhbnNwb3J0LnB1Ymxpc2hSYXRlID4gdGltZUxlZnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXZlbnQgb3ZlcmZsb3cuJylcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBldmVudCA9XG4gICAgICAgICAgICBkYXRhID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICA/IHsgbWV0YSwgaWRzOiB0aGlzLiNpZHMsIGV2ZW50VGltZSB9XG4gICAgICAgICAgICAgICAgOiB7IG1ldGEsIGlkczogdGhpcy4jaWRzLCBldmVudFRpbWUsIGpzb246IEpTT04uc3RyaW5naWZ5KGRhdGEpIH1cbiAgICAgICAgY29uc3QgZXZlbnRzID0gdGhpcy4jZW1pdHRlZFttZXRhLnRvcGljXVxuICAgICAgICBpZiAoZXZlbnRzKSB7XG4gICAgICAgICAgICBldmVudHMucHVzaChldmVudClcbiAgICAgICAgICAgIGlmIChldmVudHMubGVuZ3RoID4gNjQgfHwgdGhpcy4jc2l6ZSA+IDY0XzAwMCkge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby12b2lkXG4gICAgICAgICAgICAgICAgdm9pZCB0aGlzLmZsdXNoKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuI2VtaXR0ZWRbbWV0YS50b3BpY10gPSBbZXZlbnRdXG4gICAgICAgIH1cbiAgICAgICAgKyt0aGlzLiNidWZmZXJlZFxuICAgICAgICB0aGlzLiNzaXplICs9IGV2ZW50Lmpzb24/Lmxlbmd0aCA/PyAwXG4gICAgfVxuXG4gICAgYXN5bmMgZmx1c2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuI3N0YXJ0Rmx1c2godGhpcy4jZW1pdHRlZClcbiAgICAgICAgdGhpcy4jZW1pdHRlZCA9IHt9XG4gICAgICAgIHRoaXMuI3NpemUgPSAwXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNmbHVzaGVyXG4gICAgfVxuXG4gICAgI3N0YXJ0Rmx1c2goZW1pdHRlZDogRW1pdEJ1ZmZlcikge1xuICAgICAgICBpZiAodGhpcy4jZmx1c2hlcikge1xuICAgICAgICAgICAgdGhpcy4jZmx1c2hlciA9IHRoaXMuI2ZsdXNoZXIudGhlbigoKSA9PiB0aGlzLiNmbHVzaEV2ZW50cyhlbWl0dGVkKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuI2ZsdXNoZXIgPSB0aGlzLiNmbHVzaEV2ZW50cyhlbWl0dGVkKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgI2ZsdXNoRXZlbnRzKGVtaXR0ZWQ6IEVtaXRCdWZmZXIpIHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhlbWl0dGVkKS5tYXAoYXN5bmMgKFt0b3BpYywgZXZlbnRzXSkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuI3RyYW5zcG9ydC5zZW5kRXZlbnRzKHRvcGljLCBldmVudHMsIHRoaXMuI3NpZ25hbClcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2xvZ2dlci5mYXRhbCgnRXJyb3Igc2VuZGluZyBldmVudHMuJywgZSwgeyBldmVudHMgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy4jYnVmZmVyZWQgLT0gZXZlbnRzLmxlbmd0aFxuICAgICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICB9XG59XG4iXX0=