1414
1515#pragma once
1616
17- #include < google/protobuf/message.h>
18- #include < grpcpp/generic/generic_stub.h>
19- #include < grpcpp/grpcpp.h>
20-
17+ #include < functional>
2118#include < memory>
2219
23- #include " source/utils/circular_buffer.h"
24-
25- using google::protobuf::Message;
20+ #include " google/protobuf/message.h"
21+ #include " grpcpp/generic/generic_stub.h"
22+ #include " grpcpp/grpcpp.h"
23+ #include " language-agent/Tracing.pb.h"
2624
2725namespace cpp2sky {
2826
27+ /* *
28+ * Template base class for gRPC async client.
29+ */
2930template <class RequestType , class ResponseType >
3031class AsyncClient {
3132 public:
@@ -37,108 +38,78 @@ class AsyncClient {
3738 virtual void sendMessage (RequestType message) = 0;
3839
3940 /* *
40- * Pending message queue reference.
41- */
42- virtual CircularBuffer<RequestType>& pendingMessages () = 0;
43-
44- /* *
45- * Start stream if there is no living stream.
46- */
47- virtual void startStream () = 0;
48-
49- /* *
50- * Completion queue.
41+ * Reset the client. This should be called when the client is no longer
42+ * needed.
5143 */
52- virtual grpc::CompletionQueue& completionQueue () = 0;
53-
54- /* *
55- * gRPC Stub
56- */
57- virtual grpc::TemplatedGenericStub<RequestType, ResponseType>& stub () = 0;
44+ virtual void resetClient () = 0;
5845};
5946
6047template <class RequestType , class ResponseType >
6148using AsyncClientPtr = std::unique_ptr<AsyncClient<RequestType, ResponseType>>;
6249
50+ /* *
51+ * Template base class for gRPC async stream. The stream is used to represent
52+ * a single gRPC stream/request.
53+ */
6354template <class RequestType , class ResponseType >
6455class AsyncStream {
6556 public:
6657 virtual ~AsyncStream () = default ;
6758
6859 /* *
69- * Send message. It will move the state from Init to Write .
60+ * Send the specified protobuf message .
7061 */
7162 virtual void sendMessage (RequestType message) = 0;
7263};
7364
74- enum class StreamState : uint8_t {
75- Initialized = 0 ,
76- Ready = 1 ,
77- Idle = 2 ,
78- WriteDone = 3 ,
79- ReadDone = 4 ,
65+ template <class RequestType , class ResponseType >
66+ using AsyncStreamPtr = std::unique_ptr<AsyncStream<RequestType, ResponseType>>;
67+
68+ /* *
69+ * Tag for async operation. The callback should be called when the operation is
70+ * done.
71+ */
72+ struct AsyncEventTag {
73+ std::function<void (bool )> callback;
8074};
75+ using AsyncEventTagPtr = std::unique_ptr<AsyncEventTag>;
76+
77+ using GrpcClientContextPtr = std::unique_ptr<grpc::ClientContext>;
78+ using GrpcCompletionQueue = grpc::CompletionQueue;
8179
82- class AsyncStreamCallback {
80+ /* *
81+ * Factory for creating async stream.
82+ */
83+ template <class RequestType , class ResponseType >
84+ class AsyncStreamFactory {
8385 public:
84- /* *
85- * Callback when stream ready event occured.
86- */
87- virtual void onReady () = 0;
86+ virtual ~AsyncStreamFactory () = default ;
8887
89- /* *
90- * Callback when idle event occured.
91- */
92- virtual void onIdle () = 0;
88+ using StreamPtr = AsyncStreamPtr<RequestType, ResponseType>;
89+ using GrpcStub = grpc::TemplatedGenericStub<RequestType, ResponseType>;
9390
94- /* *
95- * Callback when write done event occured.
96- */
97- virtual void onWriteDone () = 0;
91+ virtual StreamPtr createStream (GrpcClientContextPtr client_ctx,
92+ GrpcStub& stub, GrpcCompletionQueue& cq,
93+ AsyncEventTag& basic_event_tag,
94+ AsyncEventTag& write_event_tag) = 0;
95+ };
9896
99- /* *
100- * Callback when read done event occured.
101- */
102- virtual void onReadDone () = 0;
97+ template <class RequestType , class ResponseType >
98+ using AsyncStreamFactoryPtr =
99+ std::unique_ptr<AsyncStreamFactory<RequestType, ResponseType>>;
103100
104- /* *
105- * Callback when stream had finished with arbitrary error.
106- */
107- virtual void onStreamFinish () = 0;
108- };
101+ using TraceRequestType = skywalking::v3::SegmentObject;
102+ using TraceResponseType = skywalking::v3::Commands;
109103
110- struct StreamCallbackTag {
111- public:
112- void callback (bool stream_finished) {
113- if (stream_finished) {
114- callback_->onStreamFinish ();
115- return ;
116- }
117-
118- switch (state_) {
119- case StreamState::Ready:
120- callback_->onReady ();
121- break ;
122- case StreamState::WriteDone:
123- callback_->onWriteDone ();
124- break ;
125- case StreamState::Idle:
126- callback_->onIdle ();
127- break ;
128- case StreamState::ReadDone:
129- callback_->onReadDone ();
130- break ;
131- default :
132- break ;
133- }
134- }
135-
136- StreamState state_;
137- AsyncStreamCallback* callback_;
138- };
104+ using TraceAsyncStream = AsyncStream<TraceRequestType, TraceResponseType>;
105+ using TraceAsyncStreamPtr = AsyncStreamPtr<TraceRequestType, TraceResponseType>;
139106
140- template <class RequestType , class ResponseType >
141- using AsyncStreamSharedPtr =
142- std::shared_ptr<AsyncStream<RequestType, ResponseType>>;
107+ using TraceAsyncStreamFactory =
108+ AsyncStreamFactory<TraceRequestType, TraceResponseType>;
109+ using TraceAsyncStreamFactoryPtr =
110+ AsyncStreamFactoryPtr<TraceRequestType, TraceResponseType>;
111+
112+ using TraceAsyncClient = AsyncClient<TraceRequestType, TraceResponseType>;
113+ using TraceAsyncClientPtr = std::unique_ptr<TraceAsyncClient>;
143114
144115} // namespace cpp2sky
0 commit comments