From b198d40e35050c8692296f06acedfaf5e3c8a023 Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Fri, 19 Jun 2026 14:07:58 +0200 Subject: lib/io: extend scanner --- ttwhy/io.cppm | 42 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 4 deletions(-) (limited to 'ttwhy/io.cppm') diff --git a/ttwhy/io.cppm b/ttwhy/io.cppm index be87d36..09f16c8 100644 --- a/ttwhy/io.cppm +++ b/ttwhy/io.cppm @@ -1,7 +1,9 @@ module; #include +#include +#include #include #include #include @@ -61,6 +63,12 @@ namespace ttwhy::io export template auto read_events(InputStream & stream, AppRouter & router) -> asio::awaitable { + using namespace asio::experimental::awaitable_operators; + using namespace std::chrono_literals; + + auto executor = co_await asio::this_coro::executor; + auto timer = asio::steady_timer{executor}; + auto queue = std::vector{}; queue.reserve(16); @@ -69,8 +77,36 @@ namespace ttwhy::io while (true) { - auto [error, bytes_read] = - co_await stream.async_read_some(asio::buffer(raw_buffer), asio::as_tuple(asio::use_awaitable)); + auto error = asio::error_code{}; + auto bytes_read = std::size_t{}; + + if (scanner.is_pending()) + { + timer.expires_after(500ms); + + auto result = co_await (stream.async_read_some(asio::buffer(raw_buffer), asio::as_tuple(asio::use_awaitable)) || + timer.async_wait(asio::as_tuple(asio::use_awaitable))); + + if (result.index() == 0) + { + std::tie(error, bytes_read) = std::get<0>(result); + } + else + { + scanner.timeout(); + for (auto const & event : queue) + { + co_await router.process(event); + } + queue.clear(); + continue; + } + } + else + { + std::tie(error, bytes_read) = + co_await stream.async_read_some(asio::buffer(raw_buffer), asio::as_tuple(asio::use_awaitable)); + } if (error) { @@ -82,14 +118,12 @@ namespace ttwhy::io } auto const byte_span = std::span{raw_buffer.data(), bytes_read}; - scanner.process(byte_span); for (auto const & event : queue) { co_await router.process(event); } - queue.clear(); } } -- cgit v1.2.3