userver: userver/ugrpc/client/middlewares/base.hpp Source File
Loading...
Searching...
No Matches
base.hpp
1#pragma once
2
3/// @file userver/ugrpc/client/middlewares/middleware_base.hpp
4/// @brief @copybrief ugrpc::client::MiddlewareBase
5
6#include <memory>
7#include <vector>
8
9#include <userver/components/component_base.hpp>
10
11#include <userver/ugrpc/client/middlewares/fwd.hpp>
12#include <userver/ugrpc/client/rpc.hpp>
13
14USERVER_NAMESPACE_BEGIN
15
16namespace ugrpc::client {
17
18/// @brief Context for middleware-specific data during gRPC call
19///
20/// It is created for each gRPC Call and it stores aux. data
21/// used by middlewares. Each registered middleware is called by
22/// `Middleware::Handle` with the context passed as an argument.
23/// A middleware may access Call and initial request (if any) using the context.
24class MiddlewareCallContext final {
25 public:
26 /// @cond
27 explicit MiddlewareCallContext(impl::RpcData& data);
28 /// @endcond
29
30 /// @returns the `ClientContext` used for this RPC
31 grpc::ClientContext& GetContext() noexcept;
32
33 /// @returns client name
34 std::string_view GetClientName() const noexcept;
35
36 /// @returns RPC name
37 std::string_view GetCallName() const noexcept;
38
39 /// @returns RPC kind
40 CallKind GetCallKind() const noexcept;
41
42 /// @returns RPC span
43 tracing::Span& GetSpan() noexcept;
44
45 /// @cond
46 // For internal use only
47 impl::RpcData& GetData(ugrpc::impl::InternalTag);
48 /// @endcond
49
50 private:
51 impl::RpcData& data_;
52};
53
54/// @ingroup userver_base_classes
55///
56/// @brief Base class for client gRPC middleware
57class MiddlewareBase {
58 public:
59 virtual ~MiddlewareBase();
60
61 MiddlewareBase(const MiddlewareBase&) = delete;
62
63 MiddlewareBase& operator=(const MiddlewareBase&) = delete;
64 MiddlewareBase& operator=(MiddlewareBase&&) = delete;
65
66 // default implemented methods
67
68 /// called before `StartCall`
69 virtual void PreStartCall(MiddlewareCallContext&) const;
70
71 /// called after Finish
72 /// @note could be not called if `Finish` was not called (eg deadline or
73 /// network problem)
74 /// @see @ref RpcInterruptedError
75 virtual void PostFinish(MiddlewareCallContext&, const grpc::Status&) const;
76
77 /// called before send message
78 /// @note not called for `GenericClient` messages
79 virtual void PreSendMessage(MiddlewareCallContext&,
80 const google::protobuf::Message&) const;
81
82 /// called after receive message
83 /// @note not called for `GenericClient` messages
84 virtual void PostRecvMessage(MiddlewareCallContext&,
85 const google::protobuf::Message&) const;
86
87 protected:
88 MiddlewareBase();
89};
90
91/// @ingroup userver_base_classes
92///
93/// @brief Factory that creates specific client middlewares for clients
95 public:
96 virtual ~MiddlewareFactoryBase();
97
98 virtual std::shared_ptr<const MiddlewareBase> GetMiddleware(
99 std::string_view client_name) const = 0;
100};
101
104
105/// @ingroup userver_base_classes
106///
107/// @brief Base class for client middleware component
109 using components::ComponentBase::ComponentBase;
110
111 public:
112 /// @brief Returns a middleware according to the component's settings
113 virtual std::shared_ptr<const MiddlewareFactoryBase>
115};
116
117namespace impl {
118
119Middlewares InstantiateMiddlewares(const MiddlewareFactories& factories,
120 const std::string& client_name);
121
122} // namespace impl
123
124} // namespace ugrpc::client
125
126USERVER_NAMESPACE_END