asio-grpc v1.4.0
Asynchronous gRPC with Asio/unified executors
agrpc::detail::WritesDoneFn Struct Reference

Client-side function object to signal WritesDone to streaming RPCs. More...

#include <agrpc/rpc.hpp>

Public Member Functions

template<class Request , class CompletionToken = agrpc::DefaultCompletionToken>
auto operator() (grpc::ClientAsyncWriter< Request > &writer, CompletionToken &&token={}) const noexcept(detail::IS_NOTRHOW_GRPC_INITIATE_COMPLETION_TOKEN< CompletionToken >)
 Signal WritesDone to a client stream. More...
 
template<class Request , class Response , class CompletionToken = agrpc::DefaultCompletionToken>
auto operator() (grpc::ClientAsyncReaderWriter< Request, Response > &reader_writer, CompletionToken &&token={}) const noexcept(detail::IS_NOTRHOW_GRPC_INITIATE_COMPLETION_TOKEN< CompletionToken >)
 Signal WritesDone to a bidirectional client stream. More...
 

Detailed Description

Client-side function object to signal WritesDone to streaming RPCs.

The examples below are based on the following .proto file:

syntax = "proto3";
package example.v1;
service Example {
rpc ServerStreaming(Request) returns (stream Response) {}
rpc ClientStreaming(stream Request) returns (Response) {}
rpc BidirectionalStreaming(stream Request) returns (stream Response) {}
rpc Unary(Request) returns (Response) {}
}
message Request {
int32 integer = 1;
}
message Response {
int32 integer = 1;
}
Attention
The completion handler created from the completion token that is provided to the functions described below must have an associated executor that refers to a GrpcContext:
asio::io_context io_context;
asio::co_spawn(
io_context,
[&]() -> asio::awaitable<void>
{
grpc::ServerContext server_context;
grpc::ServerAsyncReader<example::v1::Response, example::v1::Request> reader{&server_context};
// error: asio::this_coro::executor does not refer to a GrpcContext
// co_await agrpc::request(&example::v1::Example::AsyncService::RequestClientStreaming, service,
// server_context, reader, asio::use_awaitable);
// correct:
co_await agrpc::request(&example::v1::Example::AsyncService::RequestClientStreaming, service,
server_context, reader, asio::bind_executor(grpc_context, asio::use_awaitable));
},
asio::detached);
constexpr detail::RequestFn request
Start a new RPC.
Definition: rpc.hpp:1394

Member Function Documentation

◆ operator()() [1/2]

template<class Request , class Response , class CompletionToken = agrpc::DefaultCompletionToken>
auto agrpc::detail::WritesDoneFn::operator() ( grpc::ClientAsyncReaderWriter< Request, Response > &  reader_writer,
CompletionToken &&  token = {} 
) const
inlinenoexcept

Signal WritesDone to a bidirectional client stream.

Signal the client is done with the writes (half-close the client stream). Thread-safe with respect to read.

Example:

bool writes_done_ok = co_await agrpc::writes_done(*reader_writer, asio::use_awaitable);
constexpr detail::WritesDoneFn writes_done
Signal WritesDone to a streaming RPC.
Definition: rpc.hpp:1421
Parameters
tokenA completion token like asio::yield_context or the one created by agrpc::use_sender. The completion signature is void(bool). true means that the data/metadata/status/etc is going to go to the wire. If it is false, it is not going to the wire because the call is already dead (i.e., canceled, deadline expired, other side dropped the channel, etc).

◆ operator()() [2/2]

template<class Request , class CompletionToken = agrpc::DefaultCompletionToken>
auto agrpc::detail::WritesDoneFn::operator() ( grpc::ClientAsyncWriter< Request > &  writer,
CompletionToken &&  token = {} 
) const
inlinenoexcept

Signal WritesDone to a client stream.

Signal the client is done with the writes (half-close the client stream). Thread-safe with respect to read.

Example:

bool writes_done_ok = co_await agrpc::writes_done(*writer, asio::use_awaitable);
Parameters
tokenA completion token like asio::yield_context or the one created by agrpc::use_sender. The completion signature is void(bool). true means that the data/metadata/status/etc is going to go to the wire. If it is false, it is not going to the wire because the call is already dead (i.e., canceled, deadline expired, other side dropped the channel, etc).