252 {
253 co_await asio::post(
GetStrand(), asio::use_awaitable);
254
255 if (is_closed_) {
257 "SocketTransport ReceiveMessage() called after transport was closed");
259 RpcErrorCode::kTransportError,
260 "ReceiveMessage() called after transport was closed");
261 }
262
263 if (!is_started_) {
265 RpcErrorCode::kTransportError,
266 "Transport not started before receiving message");
267 }
268
269 if (!socket_.is_open()) {
270 Logger()->warn(
"SocketTransport ReceiveMessage() socket not open");
272 RpcErrorCode::kTransportError, "Socket not open in ReceiveMessage()");
273 }
274
275 message_buffer_.clear();
276
277 std::error_code ec;
278 size_t bytes_read = co_await socket_.async_read_some(
279 asio::buffer(read_buffer_),
280 asio::redirect_error(asio::use_awaitable, ec));
281
282 if (ec) {
283 if (ec == asio::error::eof) {
285 "SocketTransport EOF received, connection closed by peer");
286 is_connected_ = false;
288 RpcErrorCode::kTransportError, "Connection closed by peer");
289 } else if (ec == asio::error::operation_aborted) {
290 Logger()->debug(
"SocketTransport Read operation aborted");
292 RpcErrorCode::kTransportError, "Receive operation aborted");
293 } else {
295 "SocketTransport ASIO error in ReceiveMessage(): {}", ec.message());
297 RpcErrorCode::kTransportError, "Receive error: " + ec.message());
298 }
299 }
300
301 if (bytes_read == 0) {
303 RpcErrorCode::kTransportError, "Connection closed by peer (no data)");
304 }
305
306 message_buffer_.append(read_buffer_.data(), bytes_read);
307 Logger()->debug(
"SocketTransport received {} bytes", bytes_read);
308 co_return std::move(message_buffer_);
309}
static auto UnexpectedFromCode(RpcErrorCode code, std::string message="") -> std::unexpected< RpcError >