1515#pragma once
1616
1717#include < google/protobuf/message.h>
18+ #include < grpcpp/generic/generic_stub.h>
1819#include < grpcpp/grpcpp.h>
1920
20- #include < condition_variable>
2121#include < memory>
2222
2323using google::protobuf::Message;
2424
2525namespace cpp2sky {
2626
27- template <class RequestType , class ResponseType >
28- class TracerStub {
29- public:
30- virtual ~TracerStub () = default ;
31-
32- /* *
33- * Initialize request writer.
34- */
35- virtual std::unique_ptr<grpc::ClientAsyncWriter<RequestType>> createWriter (
36- grpc::ClientContext* ctx, ResponseType* response,
37- grpc::CompletionQueue* cq, void * tag) = 0;
38- };
39-
40- template <class RequestType , class ResponseType >
41- using TracerStubPtr = std::unique_ptr<TracerStub<RequestType, ResponseType>>;
42-
4327template <class RequestType , class ResponseType >
4428class AsyncClient {
4529 public:
@@ -51,91 +35,105 @@ class AsyncClient {
5135 virtual void sendMessage (RequestType message) = 0;
5236
5337 /* *
54- * Get writer .
38+ * Drain pending message .
5539 */
56- virtual std::unique_ptr<grpc::ClientAsyncWriter<RequestType>> createWriter (
57- grpc::ClientContext* ctx, ResponseType* response, void * tag) = 0;
40+ virtual void drainPendingMessage (RequestType message) = 0;
5841
5942 /* *
60- * Peer address of current gRPC client. .
43+ * Start stream if there is no living stream .
6144 */
62- virtual std::string peerAddress () = 0;
45+ virtual void startStream () = 0;
6346
6447 /* *
65- * Drain pending message .
48+ * Completion queue .
6649 */
67- virtual void drainPendingMessage (RequestType message ) = 0;
50+ virtual grpc::CompletionQueue& completionQueue ( ) = 0;
6851
6952 /* *
70- * Reset stream if it is living.
53+ * gRPC Stub
7154 */
72- virtual void resetStream () = 0;
55+ virtual grpc::TemplatedGenericStub<RequestType, ResponseType>& stub () = 0;
56+ };
7357
74- /* *
75- * Start stream if there is no living stream.
76- */
77- virtual void startStream () = 0;
58+ template <class RequestType , class ResponseType >
59+ using AsyncClientPtr = std::unique_ptr<AsyncClient<RequestType, ResponseType>>;
60+
61+ template <class RequestType , class ResponseType >
62+ class AsyncStream {
63+ public:
64+ virtual ~AsyncStream () = default ;
7865
7966 /* *
80- * The number of drained pending messages .
67+ * Send message. It will move the state from Init to Write .
8168 */
82- virtual size_t numOfMessages ( ) = 0;
69+ virtual void sendMessage (RequestType message ) = 0;
8370};
8471
85- enum class Operation : uint8_t {
72+ enum class StreamState : uint8_t {
8673 Initialized = 0 ,
87- Connected = 1 ,
74+ Ready = 1 ,
8875 Idle = 2 ,
8976 WriteDone = 3 ,
77+ ReadDone = 4 ,
9078};
9179
92- template <class RequestType , class ResponseType >
93- using AsyncClientPtr = std::unique_ptr<AsyncClient<RequestType, ResponseType>>;
94-
95- template <class RequestType >
96- class AsyncStream {
80+ class AsyncStreamCallback {
9781 public:
98- virtual ~AsyncStream () = default ;
82+ /* *
83+ * Callback when stream ready event occured.
84+ */
85+ virtual void onReady () = 0;
9986
10087 /* *
101- * Start stream. It will move the state of stream to Init .
88+ * Callback when idle event occured .
10289 */
103- virtual bool startStream () = 0;
90+ virtual void onIdle () = 0;
10491
10592 /* *
106- * Send message. It will move the state from Init to Write .
93+ * Callback when write done event occured .
10794 */
108- virtual void sendMessage (RequestType message ) = 0;
95+ virtual void onWriteDone ( ) = 0;
10996
11097 /* *
111- * Restore drained message .
98+ * Callback when read done event occured .
11299 */
113- virtual void undrainMessage (RequestType message ) = 0;
100+ virtual void onReadDone ( ) = 0;
114101
115102 /* *
116- * Handle incoming event related to this stream .
103+ * Callback when stream had finished with arbitrary error .
117104 */
118- virtual void handleOperation (Operation incoming_op ) = 0;
105+ virtual void onStreamFinish ( ) = 0;
119106};
120107
121- template <class RequestType >
122- using AsyncStreamPtr = std::shared_ptr<AsyncStream<RequestType>>;
123-
124- template <class RequestType , class ResponseType >
125- class AsyncStreamFactory {
108+ struct StreamCallbackTag {
126109 public:
127- virtual ~AsyncStreamFactory () = default ;
128-
129- /* *
130- * Create async stream entity
131- */
132- virtual AsyncStreamPtr<RequestType> create (
133- AsyncClient<RequestType, ResponseType>* client,
134- std::condition_variable& cv) = 0;
110+ void callback (bool stream_finished) {
111+ if (stream_finished) {
112+ callback_->onStreamFinish ();
113+ return ;
114+ }
115+
116+ switch (state_) {
117+ case StreamState::Ready:
118+ callback_->onReady ();
119+ break ;
120+ case StreamState::WriteDone:
121+ callback_->onWriteDone ();
122+ break ;
123+ case StreamState::Idle:
124+ callback_->onIdle ();
125+ break ;
126+ case StreamState::ReadDone:
127+ callback_->onReadDone ();
128+ break ;
129+ }
130+ }
131+
132+ StreamState state_;
133+ AsyncStreamCallback* callback_;
135134};
136135
137136template <class RequestType , class ResponseType >
138- using AsyncStreamFactoryPtr =
139- std::unique_ptr<AsyncStreamFactory<RequestType, ResponseType>>;
137+ using AsyncStreamPtr = std::shared_ptr<AsyncStream<RequestType, ResponseType>>;
140138
141139} // namespace cpp2sky
0 commit comments