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;
}