Status RPIServiceImpl::getAsyncEvents()

in src/RPIServiceMethods.cpp [336:373]


Status RPIServiceImpl::getAsyncEvents(ServerContext* context, const Empty*, ServerWriter<AsyncEvent>* writer) {
  asyncEvents.setMaxSize(8);
  auto deadline = std::chrono::steady_clock::now() + ASYNC_EVENT_TIMEOUT;
  std::string cachedText;
  CommandOutput_Type cachedTextType = CommandOutput_Type_STDOUT;
  auto flushCachedText = [&] {
    deadline = std::chrono::steady_clock::now() + ASYNC_EVENT_TIMEOUT;
    if (cachedText.empty()) return;
    AsyncEvent event;
    event.mutable_text()->set_text(std::move(cachedText));
    event.mutable_text()->set_type(cachedTextType);
    cachedText = "";
    writer->Write(event);
  };

  AsyncEvent event;
  while (!context->IsCancelled() && !terminateProceed) {
    if (asyncEvents.popWithDeadline(deadline, event)) {
      if (event.has_text()) {
        if (event.text().type() != cachedTextType) {
          flushCachedText();
          cachedTextType = event.text().type();
        }
        cachedText += event.text().text();
        if (cachedText.length() > CACHED_TEXT_LENGTH_LIMIT) {
          flushCachedText();
        }
      } else {
        flushCachedText();
        writer->Write(event);
      }
    } else {
      flushCachedText();
    }
  }
  flushCachedText();
  return Status::OK;
}