text: async function conditionPromise(
    condition,
    description = 'anonymous condition'
  ) {
    const startTime = Date.now();
  
    while (true) {
      await timeoutPromise(100);
  
      if (await condition()) {
        return;
      }
  
      if (Date.now() - startTime > 5000) {
        throw new Error('Timed out waiting on ' + description);
      }
    }
  }
  
  function timeoutPromise(timeout) {
    return new Promise(resolve => {
      global.setTimeout(resolve, timeout);
    });
  }
  
  function emitterEventPromise(emitter, event, timeout = 15000) {
    return new Promise((resolve, reject) => {
      const timeoutHandle = setTimeout(() => {
        reject(new Error(`Timed out waiting for '${event}' event`));
      }, timeout);
      emitter.once(event, () => {
        clearTimeout(timeoutHandle);
        resolve();
      });
    });
  }
  
  exports.conditionPromise = conditionPromise;
  exports.emitterEventPromise = emitterEventPromise;
  exports.timeoutPromise = timeoutPromise;
  