From 8cf79a9c96451f6d3712265e9cddc3d2907e410f Mon Sep 17 00:00:00 2001 From: Ziggy Jonsson Date: Mon, 14 Oct 2024 15:31:13 -0400 Subject: [PATCH] Fix onNext --- lib/client.js | 8 ++++---- lib/event_handler.js | 23 ++++++++++------------- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/lib/client.js b/lib/client.js index be37288..19b2a9f 100644 --- a/lib/client.js +++ b/lib/client.js @@ -645,8 +645,8 @@ export class RealtimeClient extends RealtimeEventHandler { * Utility for waiting for the next `conversation.item.appended` event to be triggered by the server * @returns {Promise<{item: ItemType}>} */ - async waitForNextItem() { - const event = await this.waitForNext('conversation.item.appended'); + async waitForNextItem(timeout = null) { + const event = await this.waitForNext('conversation.item.appended', timeout); const { item } = event; return { item }; } @@ -655,8 +655,8 @@ export class RealtimeClient extends RealtimeEventHandler { * Utility for waiting for the next `conversation.item.completed` event to be triggered by the server * @returns {Promise<{item: ItemType}>} */ - async waitForNextCompletedItem() { - const event = await this.waitForNext('conversation.item.completed'); + async waitForNextCompletedItem(timeout = null) { + const event = await this.waitForNext('conversation.item.completed', timeout); const { item } = event; return { item }; } diff --git a/lib/event_handler.js b/lib/event_handler.js index 8d37dbe..125397e 100644 --- a/lib/event_handler.js +++ b/lib/event_handler.js @@ -50,8 +50,12 @@ export class RealtimeEventHandler { */ onNext(eventName, callback) { this.nextEventHandlers[eventName] = this.nextEventHandlers[eventName] || []; - this.nextEventHandlers[eventName].push(callback); - return callback; + const listener = event => { + this.off(eventName, listener); + callback(event); + } + this.nextEventHandlers[eventName].push(listner); + return listener; } /** @@ -107,19 +111,12 @@ export class RealtimeEventHandler { * @returns {Promise<{[key: string]: any}|null>} */ async waitForNext(eventName, timeout = null) { - const t0 = Date.now(); - let nextEvent; - this.onNext(eventName, (event) => (nextEvent = event)); - while (!nextEvent) { + return new Promise((resolve, reject) => { + this.onNext(eventName, resolve); if (timeout) { - const t1 = Date.now(); - if (t1 - t0 > timeout) { - return null; - } + setTimeout(() => reject(new Error(`Timeout waiting for "${eventName}"`)), timeout); } - await sleep(1); - } - return nextEvent; + }); } /**