_isClientDoneProcessing(timeout) {
    return new utils.SyncPromise(resolve => {
      let ticked = 0;
      const tick = 1;

      const interval = setInterval(() => {
        if (this._numProcessing == 0) {
          clearInterval(interval);
          resolve(true);
        } else {
          ticked += tick;
          if (timeout && ticked >= timeout) {
            clearInterval(interval);
            resolve(false);
          }
        }
      }, tick);
    });
  }
Determine if the client is finished processing. Returns a promise because it will wait `timeout` ms before saying
"no" (resolving to `false`) in order to give the client a chance to potentially finish first.

@param timeout The time, in ms, after which to resolve to `false` if the client is still busy. Passing `0` (or not
passing anything) will make the promise wait as long as it takes for processing to finish before resolving to
`true`.
@returns A promise which will resolve to `true` if processing is already done or finishes before the timeout, and
`false` otherwise