xref: /aosp_15_r20/external/grpc-grpc/include/grpcpp/server_builder.h (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1*cc02d7e2SAndroid Build Coastguard Worker //
2*cc02d7e2SAndroid Build Coastguard Worker //
3*cc02d7e2SAndroid Build Coastguard Worker // Copyright 2015-2016 gRPC authors.
4*cc02d7e2SAndroid Build Coastguard Worker //
5*cc02d7e2SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
6*cc02d7e2SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
7*cc02d7e2SAndroid Build Coastguard Worker // You may obtain a copy of the License at
8*cc02d7e2SAndroid Build Coastguard Worker //
9*cc02d7e2SAndroid Build Coastguard Worker //     http://www.apache.org/licenses/LICENSE-2.0
10*cc02d7e2SAndroid Build Coastguard Worker //
11*cc02d7e2SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
12*cc02d7e2SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
13*cc02d7e2SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*cc02d7e2SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
15*cc02d7e2SAndroid Build Coastguard Worker // limitations under the License.
16*cc02d7e2SAndroid Build Coastguard Worker //
17*cc02d7e2SAndroid Build Coastguard Worker //
18*cc02d7e2SAndroid Build Coastguard Worker 
19*cc02d7e2SAndroid Build Coastguard Worker #ifndef GRPCPP_SERVER_BUILDER_H
20*cc02d7e2SAndroid Build Coastguard Worker #define GRPCPP_SERVER_BUILDER_H
21*cc02d7e2SAndroid Build Coastguard Worker 
22*cc02d7e2SAndroid Build Coastguard Worker #include <climits>
23*cc02d7e2SAndroid Build Coastguard Worker #include <map>
24*cc02d7e2SAndroid Build Coastguard Worker #include <memory>
25*cc02d7e2SAndroid Build Coastguard Worker #include <vector>
26*cc02d7e2SAndroid Build Coastguard Worker 
27*cc02d7e2SAndroid Build Coastguard Worker #include <grpc/compression.h>
28*cc02d7e2SAndroid Build Coastguard Worker #include <grpc/support/cpu.h>
29*cc02d7e2SAndroid Build Coastguard Worker #include <grpc/support/port_platform.h>
30*cc02d7e2SAndroid Build Coastguard Worker #include <grpc/support/workaround_list.h>
31*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/impl/channel_argument_option.h>
32*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/impl/server_builder_option.h>
33*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/impl/server_builder_plugin.h>
34*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/security/authorization_policy_provider.h>
35*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/server.h>
36*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/support/config.h>
37*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/support/server_interceptor.h>
38*cc02d7e2SAndroid Build Coastguard Worker 
39*cc02d7e2SAndroid Build Coastguard Worker struct grpc_resource_quota;
40*cc02d7e2SAndroid Build Coastguard Worker 
41*cc02d7e2SAndroid Build Coastguard Worker namespace grpc {
42*cc02d7e2SAndroid Build Coastguard Worker 
43*cc02d7e2SAndroid Build Coastguard Worker class CompletionQueue;
44*cc02d7e2SAndroid Build Coastguard Worker class Server;
45*cc02d7e2SAndroid Build Coastguard Worker class ServerCompletionQueue;
46*cc02d7e2SAndroid Build Coastguard Worker class AsyncGenericService;
47*cc02d7e2SAndroid Build Coastguard Worker class ResourceQuota;
48*cc02d7e2SAndroid Build Coastguard Worker class ServerCredentials;
49*cc02d7e2SAndroid Build Coastguard Worker class Service;
50*cc02d7e2SAndroid Build Coastguard Worker namespace testing {
51*cc02d7e2SAndroid Build Coastguard Worker class ServerBuilderPluginTest;
52*cc02d7e2SAndroid Build Coastguard Worker }  // namespace testing
53*cc02d7e2SAndroid Build Coastguard Worker 
54*cc02d7e2SAndroid Build Coastguard Worker namespace internal {
55*cc02d7e2SAndroid Build Coastguard Worker class ExternalConnectionAcceptorImpl;
56*cc02d7e2SAndroid Build Coastguard Worker }  // namespace internal
57*cc02d7e2SAndroid Build Coastguard Worker 
58*cc02d7e2SAndroid Build Coastguard Worker class CallbackGenericService;
59*cc02d7e2SAndroid Build Coastguard Worker 
60*cc02d7e2SAndroid Build Coastguard Worker namespace experimental {
61*cc02d7e2SAndroid Build Coastguard Worker // EXPERIMENTAL API:
62*cc02d7e2SAndroid Build Coastguard Worker // Interface for a grpc server to build transports with connections created out
63*cc02d7e2SAndroid Build Coastguard Worker // of band.
64*cc02d7e2SAndroid Build Coastguard Worker // See ServerBuilder's AddExternalConnectionAcceptor API.
65*cc02d7e2SAndroid Build Coastguard Worker class ExternalConnectionAcceptor {
66*cc02d7e2SAndroid Build Coastguard Worker  public:
67*cc02d7e2SAndroid Build Coastguard Worker   struct NewConnectionParameters {
68*cc02d7e2SAndroid Build Coastguard Worker     int listener_fd = -1;
69*cc02d7e2SAndroid Build Coastguard Worker     int fd = -1;
70*cc02d7e2SAndroid Build Coastguard Worker     ByteBuffer read_buffer;  // data intended for the grpc server
71*cc02d7e2SAndroid Build Coastguard Worker   };
~ExternalConnectionAcceptor()72*cc02d7e2SAndroid Build Coastguard Worker   virtual ~ExternalConnectionAcceptor() {}
73*cc02d7e2SAndroid Build Coastguard Worker   // If called before grpc::Server is started or after it is shut down, the new
74*cc02d7e2SAndroid Build Coastguard Worker   // connection will be closed.
75*cc02d7e2SAndroid Build Coastguard Worker   virtual void HandleNewConnection(NewConnectionParameters* p) = 0;
76*cc02d7e2SAndroid Build Coastguard Worker };
77*cc02d7e2SAndroid Build Coastguard Worker 
78*cc02d7e2SAndroid Build Coastguard Worker }  // namespace experimental
79*cc02d7e2SAndroid Build Coastguard Worker }  // namespace grpc
80*cc02d7e2SAndroid Build Coastguard Worker 
81*cc02d7e2SAndroid Build Coastguard Worker namespace grpc {
82*cc02d7e2SAndroid Build Coastguard Worker 
83*cc02d7e2SAndroid Build Coastguard Worker /// A builder class for the creation and startup of \a grpc::Server instances.
84*cc02d7e2SAndroid Build Coastguard Worker class ServerBuilder {
85*cc02d7e2SAndroid Build Coastguard Worker  public:
86*cc02d7e2SAndroid Build Coastguard Worker   ServerBuilder();
87*cc02d7e2SAndroid Build Coastguard Worker   virtual ~ServerBuilder();
88*cc02d7e2SAndroid Build Coastguard Worker 
89*cc02d7e2SAndroid Build Coastguard Worker   //////////////////////////////////////////////////////////////////////////////
90*cc02d7e2SAndroid Build Coastguard Worker   // Primary API's
91*cc02d7e2SAndroid Build Coastguard Worker 
92*cc02d7e2SAndroid Build Coastguard Worker   /// Return a running server which is ready for processing calls.
93*cc02d7e2SAndroid Build Coastguard Worker   /// Before calling, one typically needs to ensure that:
94*cc02d7e2SAndroid Build Coastguard Worker   ///  1. a service is registered - so that the server knows what to serve
95*cc02d7e2SAndroid Build Coastguard Worker   ///     (via RegisterService, or RegisterAsyncGenericService)
96*cc02d7e2SAndroid Build Coastguard Worker   ///  2. a listening port has been added - so the server knows where to receive
97*cc02d7e2SAndroid Build Coastguard Worker   ///     traffic (via AddListeningPort)
98*cc02d7e2SAndroid Build Coastguard Worker   ///  3. [for async api only] completion queues have been added via
99*cc02d7e2SAndroid Build Coastguard Worker   ///     AddCompletionQueue
100*cc02d7e2SAndroid Build Coastguard Worker   ///
101*cc02d7e2SAndroid Build Coastguard Worker   ///  Will return a nullptr on errors.
102*cc02d7e2SAndroid Build Coastguard Worker   virtual std::unique_ptr<grpc::Server> BuildAndStart();
103*cc02d7e2SAndroid Build Coastguard Worker 
104*cc02d7e2SAndroid Build Coastguard Worker   /// Register a service. This call does not take ownership of the service.
105*cc02d7e2SAndroid Build Coastguard Worker   /// The service must exist for the lifetime of the \a Server instance returned
106*cc02d7e2SAndroid Build Coastguard Worker   /// by \a BuildAndStart().
107*cc02d7e2SAndroid Build Coastguard Worker   /// Matches requests with any :authority
108*cc02d7e2SAndroid Build Coastguard Worker   ServerBuilder& RegisterService(grpc::Service* service);
109*cc02d7e2SAndroid Build Coastguard Worker 
110*cc02d7e2SAndroid Build Coastguard Worker   /// Enlists an endpoint \a addr (port with an optional IP address) to
111*cc02d7e2SAndroid Build Coastguard Worker   /// bind the \a grpc::Server object to be created to.
112*cc02d7e2SAndroid Build Coastguard Worker   ///
113*cc02d7e2SAndroid Build Coastguard Worker   /// It can be invoked multiple times.
114*cc02d7e2SAndroid Build Coastguard Worker   ///
115*cc02d7e2SAndroid Build Coastguard Worker   /// \param addr_uri The address to try to bind to the server in URI form. If
116*cc02d7e2SAndroid Build Coastguard Worker   /// the scheme name is omitted, "dns:///" is assumed. To bind to any address,
117*cc02d7e2SAndroid Build Coastguard Worker   /// please use IPv6 any, i.e., [::]:<port>, which also accepts IPv4
118*cc02d7e2SAndroid Build Coastguard Worker   /// connections.  Valid values include dns:///localhost:1234,
119*cc02d7e2SAndroid Build Coastguard Worker   /// 192.168.1.1:31416, dns:///[::1]:27182, etc.
120*cc02d7e2SAndroid Build Coastguard Worker   /// \param creds The credentials associated with the server.
121*cc02d7e2SAndroid Build Coastguard Worker   /// \param[out] selected_port If not `nullptr`, gets populated with the port
122*cc02d7e2SAndroid Build Coastguard Worker   /// number bound to the \a grpc::Server for the corresponding endpoint after
123*cc02d7e2SAndroid Build Coastguard Worker   /// it is successfully bound by BuildAndStart(), 0 otherwise. AddListeningPort
124*cc02d7e2SAndroid Build Coastguard Worker   /// does not modify this pointer.
125*cc02d7e2SAndroid Build Coastguard Worker   ServerBuilder& AddListeningPort(
126*cc02d7e2SAndroid Build Coastguard Worker       const std::string& addr_uri,
127*cc02d7e2SAndroid Build Coastguard Worker       std::shared_ptr<grpc::ServerCredentials> creds,
128*cc02d7e2SAndroid Build Coastguard Worker       int* selected_port = nullptr);
129*cc02d7e2SAndroid Build Coastguard Worker 
130*cc02d7e2SAndroid Build Coastguard Worker   /// Add a completion queue for handling asynchronous services.
131*cc02d7e2SAndroid Build Coastguard Worker   ///
132*cc02d7e2SAndroid Build Coastguard Worker   /// Best performance is typically obtained by using one thread per polling
133*cc02d7e2SAndroid Build Coastguard Worker   /// completion queue.
134*cc02d7e2SAndroid Build Coastguard Worker   ///
135*cc02d7e2SAndroid Build Coastguard Worker   /// Caller is required to shutdown the server prior to shutting down the
136*cc02d7e2SAndroid Build Coastguard Worker   /// returned completion queue. Caller is also required to drain the
137*cc02d7e2SAndroid Build Coastguard Worker   /// completion queue after shutting it down. A typical usage scenario:
138*cc02d7e2SAndroid Build Coastguard Worker   ///
139*cc02d7e2SAndroid Build Coastguard Worker   /// // While building the server:
140*cc02d7e2SAndroid Build Coastguard Worker   /// ServerBuilder builder;
141*cc02d7e2SAndroid Build Coastguard Worker   /// ...
142*cc02d7e2SAndroid Build Coastguard Worker   /// cq_ = builder.AddCompletionQueue();
143*cc02d7e2SAndroid Build Coastguard Worker   /// server_ = builder.BuildAndStart();
144*cc02d7e2SAndroid Build Coastguard Worker   ///
145*cc02d7e2SAndroid Build Coastguard Worker   /// // While shutting down the server;
146*cc02d7e2SAndroid Build Coastguard Worker   /// server_->Shutdown();
147*cc02d7e2SAndroid Build Coastguard Worker   /// cq_->Shutdown();  // Always *after* the associated server's Shutdown()!
148*cc02d7e2SAndroid Build Coastguard Worker   /// // Drain the cq_ that was created
149*cc02d7e2SAndroid Build Coastguard Worker   /// void* ignored_tag;
150*cc02d7e2SAndroid Build Coastguard Worker   /// bool ignored_ok;
151*cc02d7e2SAndroid Build Coastguard Worker   /// while (cq_->Next(&ignored_tag, &ignored_ok)) { }
152*cc02d7e2SAndroid Build Coastguard Worker   ///
153*cc02d7e2SAndroid Build Coastguard Worker   /// \param is_frequently_polled This is an optional parameter to inform gRPC
154*cc02d7e2SAndroid Build Coastguard Worker   /// library about whether this completion queue would be frequently polled
155*cc02d7e2SAndroid Build Coastguard Worker   /// (i.e. by calling \a Next() or \a AsyncNext()). The default value is
156*cc02d7e2SAndroid Build Coastguard Worker   /// 'true' and is the recommended setting. Setting this to 'false' (i.e.
157*cc02d7e2SAndroid Build Coastguard Worker   /// not polling the completion queue frequently) will have a significantly
158*cc02d7e2SAndroid Build Coastguard Worker   /// negative performance impact and hence should not be used in production
159*cc02d7e2SAndroid Build Coastguard Worker   /// use cases.
160*cc02d7e2SAndroid Build Coastguard Worker   std::unique_ptr<grpc::ServerCompletionQueue> AddCompletionQueue(
161*cc02d7e2SAndroid Build Coastguard Worker       bool is_frequently_polled = true);
162*cc02d7e2SAndroid Build Coastguard Worker 
163*cc02d7e2SAndroid Build Coastguard Worker   //////////////////////////////////////////////////////////////////////////////
164*cc02d7e2SAndroid Build Coastguard Worker   // Less commonly used RegisterService variants
165*cc02d7e2SAndroid Build Coastguard Worker 
166*cc02d7e2SAndroid Build Coastguard Worker   /// Register a service. This call does not take ownership of the service.
167*cc02d7e2SAndroid Build Coastguard Worker   /// The service must exist for the lifetime of the \a Server instance
168*cc02d7e2SAndroid Build Coastguard Worker   /// returned by \a BuildAndStart(). Only matches requests with :authority \a
169*cc02d7e2SAndroid Build Coastguard Worker   /// host
170*cc02d7e2SAndroid Build Coastguard Worker   ServerBuilder& RegisterService(const std::string& host,
171*cc02d7e2SAndroid Build Coastguard Worker                                  grpc::Service* service);
172*cc02d7e2SAndroid Build Coastguard Worker 
173*cc02d7e2SAndroid Build Coastguard Worker   /// Register a generic service.
174*cc02d7e2SAndroid Build Coastguard Worker   /// Matches requests with any :authority
175*cc02d7e2SAndroid Build Coastguard Worker   /// This is mostly useful for writing generic gRPC Proxies where the exact
176*cc02d7e2SAndroid Build Coastguard Worker   /// serialization format is unknown
177*cc02d7e2SAndroid Build Coastguard Worker   ServerBuilder& RegisterAsyncGenericService(
178*cc02d7e2SAndroid Build Coastguard Worker       grpc::AsyncGenericService* service);
179*cc02d7e2SAndroid Build Coastguard Worker 
180*cc02d7e2SAndroid Build Coastguard Worker   //////////////////////////////////////////////////////////////////////////////
181*cc02d7e2SAndroid Build Coastguard Worker   // Fine control knobs
182*cc02d7e2SAndroid Build Coastguard Worker 
183*cc02d7e2SAndroid Build Coastguard Worker   /// Set max receive message size in bytes.
184*cc02d7e2SAndroid Build Coastguard Worker   /// The default is GRPC_DEFAULT_MAX_RECV_MESSAGE_LENGTH.
SetMaxReceiveMessageSize(int max_receive_message_size)185*cc02d7e2SAndroid Build Coastguard Worker   ServerBuilder& SetMaxReceiveMessageSize(int max_receive_message_size) {
186*cc02d7e2SAndroid Build Coastguard Worker     max_receive_message_size_ = max_receive_message_size;
187*cc02d7e2SAndroid Build Coastguard Worker     return *this;
188*cc02d7e2SAndroid Build Coastguard Worker   }
189*cc02d7e2SAndroid Build Coastguard Worker 
190*cc02d7e2SAndroid Build Coastguard Worker   /// Set max send message size in bytes.
191*cc02d7e2SAndroid Build Coastguard Worker   /// The default is GRPC_DEFAULT_MAX_SEND_MESSAGE_LENGTH.
SetMaxSendMessageSize(int max_send_message_size)192*cc02d7e2SAndroid Build Coastguard Worker   ServerBuilder& SetMaxSendMessageSize(int max_send_message_size) {
193*cc02d7e2SAndroid Build Coastguard Worker     max_send_message_size_ = max_send_message_size;
194*cc02d7e2SAndroid Build Coastguard Worker     return *this;
195*cc02d7e2SAndroid Build Coastguard Worker   }
196*cc02d7e2SAndroid Build Coastguard Worker 
197*cc02d7e2SAndroid Build Coastguard Worker   /// \deprecated For backward compatibility.
SetMaxMessageSize(int max_message_size)198*cc02d7e2SAndroid Build Coastguard Worker   ServerBuilder& SetMaxMessageSize(int max_message_size) {
199*cc02d7e2SAndroid Build Coastguard Worker     return SetMaxReceiveMessageSize(max_message_size);
200*cc02d7e2SAndroid Build Coastguard Worker   }
201*cc02d7e2SAndroid Build Coastguard Worker 
202*cc02d7e2SAndroid Build Coastguard Worker   /// Set the support status for compression algorithms. All algorithms are
203*cc02d7e2SAndroid Build Coastguard Worker   /// enabled by default.
204*cc02d7e2SAndroid Build Coastguard Worker   ///
205*cc02d7e2SAndroid Build Coastguard Worker   /// Incoming calls compressed with an unsupported algorithm will fail with
206*cc02d7e2SAndroid Build Coastguard Worker   /// \a GRPC_STATUS_UNIMPLEMENTED.
207*cc02d7e2SAndroid Build Coastguard Worker   ServerBuilder& SetCompressionAlgorithmSupportStatus(
208*cc02d7e2SAndroid Build Coastguard Worker       grpc_compression_algorithm algorithm, bool enabled);
209*cc02d7e2SAndroid Build Coastguard Worker 
210*cc02d7e2SAndroid Build Coastguard Worker   /// The default compression level to use for all channel calls in the
211*cc02d7e2SAndroid Build Coastguard Worker   /// absence of a call-specific level.
212*cc02d7e2SAndroid Build Coastguard Worker   ServerBuilder& SetDefaultCompressionLevel(grpc_compression_level level);
213*cc02d7e2SAndroid Build Coastguard Worker 
214*cc02d7e2SAndroid Build Coastguard Worker   /// The default compression algorithm to use for all channel calls in the
215*cc02d7e2SAndroid Build Coastguard Worker   /// absence of a call-specific level. Note that it overrides any compression
216*cc02d7e2SAndroid Build Coastguard Worker   /// level set by \a SetDefaultCompressionLevel.
217*cc02d7e2SAndroid Build Coastguard Worker   ServerBuilder& SetDefaultCompressionAlgorithm(
218*cc02d7e2SAndroid Build Coastguard Worker       grpc_compression_algorithm algorithm);
219*cc02d7e2SAndroid Build Coastguard Worker 
220*cc02d7e2SAndroid Build Coastguard Worker   /// Set the attached buffer pool for this server
221*cc02d7e2SAndroid Build Coastguard Worker   ServerBuilder& SetResourceQuota(const grpc::ResourceQuota& resource_quota);
222*cc02d7e2SAndroid Build Coastguard Worker 
223*cc02d7e2SAndroid Build Coastguard Worker   ServerBuilder& SetOption(std::unique_ptr<grpc::ServerBuilderOption> option);
224*cc02d7e2SAndroid Build Coastguard Worker 
225*cc02d7e2SAndroid Build Coastguard Worker   /// Options for synchronous servers.
226*cc02d7e2SAndroid Build Coastguard Worker   enum SyncServerOption {
227*cc02d7e2SAndroid Build Coastguard Worker     NUM_CQS,         ///< Number of completion queues.
228*cc02d7e2SAndroid Build Coastguard Worker     MIN_POLLERS,     ///< Minimum number of polling threads.
229*cc02d7e2SAndroid Build Coastguard Worker     MAX_POLLERS,     ///< Maximum number of polling threads.
230*cc02d7e2SAndroid Build Coastguard Worker     CQ_TIMEOUT_MSEC  ///< Completion queue timeout in milliseconds.
231*cc02d7e2SAndroid Build Coastguard Worker   };
232*cc02d7e2SAndroid Build Coastguard Worker 
233*cc02d7e2SAndroid Build Coastguard Worker   /// Only useful if this is a Synchronous server.
234*cc02d7e2SAndroid Build Coastguard Worker   ServerBuilder& SetSyncServerOption(SyncServerOption option, int value);
235*cc02d7e2SAndroid Build Coastguard Worker 
236*cc02d7e2SAndroid Build Coastguard Worker   /// Add a channel argument (an escape hatch to tuning core library parameters
237*cc02d7e2SAndroid Build Coastguard Worker   /// directly)
238*cc02d7e2SAndroid Build Coastguard Worker   template <class T>
AddChannelArgument(const std::string & arg,const T & value)239*cc02d7e2SAndroid Build Coastguard Worker   ServerBuilder& AddChannelArgument(const std::string& arg, const T& value) {
240*cc02d7e2SAndroid Build Coastguard Worker     return SetOption(grpc::MakeChannelArgumentOption(arg, value));
241*cc02d7e2SAndroid Build Coastguard Worker   }
242*cc02d7e2SAndroid Build Coastguard Worker 
243*cc02d7e2SAndroid Build Coastguard Worker   /// For internal use only: Register a ServerBuilderPlugin factory function.
244*cc02d7e2SAndroid Build Coastguard Worker   static void InternalAddPluginFactory(
245*cc02d7e2SAndroid Build Coastguard Worker       std::unique_ptr<grpc::ServerBuilderPlugin> (*CreatePlugin)());
246*cc02d7e2SAndroid Build Coastguard Worker 
247*cc02d7e2SAndroid Build Coastguard Worker   /// Enable a server workaround. Do not use unless you know what the workaround
248*cc02d7e2SAndroid Build Coastguard Worker   /// does. For explanation and detailed descriptions of workarounds, see
249*cc02d7e2SAndroid Build Coastguard Worker   /// doc/workarounds.md.
250*cc02d7e2SAndroid Build Coastguard Worker   ServerBuilder& EnableWorkaround(grpc_workaround_list id);
251*cc02d7e2SAndroid Build Coastguard Worker 
252*cc02d7e2SAndroid Build Coastguard Worker   /// NOTE: class experimental_type is not part of the public API of this class.
253*cc02d7e2SAndroid Build Coastguard Worker   /// TODO(yashykt): Integrate into public API when this is no longer
254*cc02d7e2SAndroid Build Coastguard Worker   /// experimental.
255*cc02d7e2SAndroid Build Coastguard Worker   class experimental_type {
256*cc02d7e2SAndroid Build Coastguard Worker    public:
experimental_type(ServerBuilder * builder)257*cc02d7e2SAndroid Build Coastguard Worker     explicit experimental_type(ServerBuilder* builder) : builder_(builder) {}
258*cc02d7e2SAndroid Build Coastguard Worker 
SetInterceptorCreators(std::vector<std::unique_ptr<grpc::experimental::ServerInterceptorFactoryInterface>> interceptor_creators)259*cc02d7e2SAndroid Build Coastguard Worker     void SetInterceptorCreators(
260*cc02d7e2SAndroid Build Coastguard Worker         std::vector<std::unique_ptr<
261*cc02d7e2SAndroid Build Coastguard Worker             grpc::experimental::ServerInterceptorFactoryInterface>>
262*cc02d7e2SAndroid Build Coastguard Worker             interceptor_creators) {
263*cc02d7e2SAndroid Build Coastguard Worker       builder_->interceptor_creators_ = std::move(interceptor_creators);
264*cc02d7e2SAndroid Build Coastguard Worker     }
265*cc02d7e2SAndroid Build Coastguard Worker 
266*cc02d7e2SAndroid Build Coastguard Worker     enum class ExternalConnectionType {
267*cc02d7e2SAndroid Build Coastguard Worker       FROM_FD = 0  // in the form of a file descriptor
268*cc02d7e2SAndroid Build Coastguard Worker     };
269*cc02d7e2SAndroid Build Coastguard Worker 
270*cc02d7e2SAndroid Build Coastguard Worker     /// Register an acceptor to handle the externally accepted connection in
271*cc02d7e2SAndroid Build Coastguard Worker     /// grpc server. The returned acceptor can be used to pass the connection
272*cc02d7e2SAndroid Build Coastguard Worker     /// to grpc server, where a channel will be created with the provided
273*cc02d7e2SAndroid Build Coastguard Worker     /// server credentials.
274*cc02d7e2SAndroid Build Coastguard Worker     std::unique_ptr<grpc::experimental::ExternalConnectionAcceptor>
275*cc02d7e2SAndroid Build Coastguard Worker     AddExternalConnectionAcceptor(ExternalConnectionType type,
276*cc02d7e2SAndroid Build Coastguard Worker                                   std::shared_ptr<ServerCredentials> creds);
277*cc02d7e2SAndroid Build Coastguard Worker 
278*cc02d7e2SAndroid Build Coastguard Worker     /// Sets server authorization policy provider in
279*cc02d7e2SAndroid Build Coastguard Worker     /// GRPC_ARG_AUTHORIZATION_POLICY_PROVIDER channel argument.
280*cc02d7e2SAndroid Build Coastguard Worker     void SetAuthorizationPolicyProvider(
281*cc02d7e2SAndroid Build Coastguard Worker         std::shared_ptr<experimental::AuthorizationPolicyProviderInterface>
282*cc02d7e2SAndroid Build Coastguard Worker             provider);
283*cc02d7e2SAndroid Build Coastguard Worker 
284*cc02d7e2SAndroid Build Coastguard Worker     /// Enables per-call load reporting. The server will automatically send the
285*cc02d7e2SAndroid Build Coastguard Worker     /// load metrics after each RPC. The caller can report load metrics for the
286*cc02d7e2SAndroid Build Coastguard Worker     /// current call to what ServerContext::ExperimentalGetCallMetricRecorder()
287*cc02d7e2SAndroid Build Coastguard Worker     /// returns. The server merges metrics from the optional
288*cc02d7e2SAndroid Build Coastguard Worker     /// server_metric_recorder when provided where the call metric recorder take
289*cc02d7e2SAndroid Build Coastguard Worker     /// a higher precedence. The caller owns and must ensure the server metric
290*cc02d7e2SAndroid Build Coastguard Worker     /// recorder outlives the server.
291*cc02d7e2SAndroid Build Coastguard Worker     void EnableCallMetricRecording(
292*cc02d7e2SAndroid Build Coastguard Worker         experimental::ServerMetricRecorder* server_metric_recorder = nullptr);
293*cc02d7e2SAndroid Build Coastguard Worker 
294*cc02d7e2SAndroid Build Coastguard Worker    private:
295*cc02d7e2SAndroid Build Coastguard Worker     ServerBuilder* builder_;
296*cc02d7e2SAndroid Build Coastguard Worker   };
297*cc02d7e2SAndroid Build Coastguard Worker 
298*cc02d7e2SAndroid Build Coastguard Worker   /// Set the allocator for creating and releasing callback server context.
299*cc02d7e2SAndroid Build Coastguard Worker   /// Takes the owndership of the allocator.
300*cc02d7e2SAndroid Build Coastguard Worker   ServerBuilder& SetContextAllocator(
301*cc02d7e2SAndroid Build Coastguard Worker       std::unique_ptr<grpc::ContextAllocator> context_allocator);
302*cc02d7e2SAndroid Build Coastguard Worker 
303*cc02d7e2SAndroid Build Coastguard Worker   /// Register a generic service that uses the callback API.
304*cc02d7e2SAndroid Build Coastguard Worker   /// Matches requests with any :authority
305*cc02d7e2SAndroid Build Coastguard Worker   /// This is mostly useful for writing generic gRPC Proxies where the exact
306*cc02d7e2SAndroid Build Coastguard Worker   /// serialization format is unknown
307*cc02d7e2SAndroid Build Coastguard Worker   ServerBuilder& RegisterCallbackGenericService(
308*cc02d7e2SAndroid Build Coastguard Worker       grpc::CallbackGenericService* service);
309*cc02d7e2SAndroid Build Coastguard Worker 
310*cc02d7e2SAndroid Build Coastguard Worker   /// NOTE: The function experimental() is not stable public API. It is a view
311*cc02d7e2SAndroid Build Coastguard Worker   /// to the experimental components of this class. It may be changed or removed
312*cc02d7e2SAndroid Build Coastguard Worker   /// at any time.
experimental()313*cc02d7e2SAndroid Build Coastguard Worker   experimental_type experimental() { return experimental_type(this); }
314*cc02d7e2SAndroid Build Coastguard Worker 
315*cc02d7e2SAndroid Build Coastguard Worker  protected:
316*cc02d7e2SAndroid Build Coastguard Worker   /// Experimental, to be deprecated
317*cc02d7e2SAndroid Build Coastguard Worker   struct Port {
318*cc02d7e2SAndroid Build Coastguard Worker     std::string addr;
319*cc02d7e2SAndroid Build Coastguard Worker     std::shared_ptr<ServerCredentials> creds;
320*cc02d7e2SAndroid Build Coastguard Worker     int* selected_port;
321*cc02d7e2SAndroid Build Coastguard Worker   };
322*cc02d7e2SAndroid Build Coastguard Worker 
323*cc02d7e2SAndroid Build Coastguard Worker   /// Experimental, to be deprecated
324*cc02d7e2SAndroid Build Coastguard Worker   typedef std::unique_ptr<std::string> HostString;
325*cc02d7e2SAndroid Build Coastguard Worker   struct NamedService {
NamedServiceNamedService326*cc02d7e2SAndroid Build Coastguard Worker     explicit NamedService(grpc::Service* s) : service(s) {}
NamedServiceNamedService327*cc02d7e2SAndroid Build Coastguard Worker     NamedService(const std::string& h, grpc::Service* s)
328*cc02d7e2SAndroid Build Coastguard Worker         : host(new std::string(h)), service(s) {}
329*cc02d7e2SAndroid Build Coastguard Worker     HostString host;
330*cc02d7e2SAndroid Build Coastguard Worker     grpc::Service* service;
331*cc02d7e2SAndroid Build Coastguard Worker   };
332*cc02d7e2SAndroid Build Coastguard Worker 
333*cc02d7e2SAndroid Build Coastguard Worker   /// Experimental, to be deprecated
ports()334*cc02d7e2SAndroid Build Coastguard Worker   std::vector<Port> ports() { return ports_; }
335*cc02d7e2SAndroid Build Coastguard Worker 
336*cc02d7e2SAndroid Build Coastguard Worker   /// Experimental, to be deprecated
services()337*cc02d7e2SAndroid Build Coastguard Worker   std::vector<NamedService*> services() {
338*cc02d7e2SAndroid Build Coastguard Worker     std::vector<NamedService*> service_refs;
339*cc02d7e2SAndroid Build Coastguard Worker     service_refs.reserve(services_.size());
340*cc02d7e2SAndroid Build Coastguard Worker     for (auto& ptr : services_) {
341*cc02d7e2SAndroid Build Coastguard Worker       service_refs.push_back(ptr.get());
342*cc02d7e2SAndroid Build Coastguard Worker     }
343*cc02d7e2SAndroid Build Coastguard Worker     return service_refs;
344*cc02d7e2SAndroid Build Coastguard Worker   }
345*cc02d7e2SAndroid Build Coastguard Worker 
346*cc02d7e2SAndroid Build Coastguard Worker   /// Experimental, to be deprecated
options()347*cc02d7e2SAndroid Build Coastguard Worker   std::vector<grpc::ServerBuilderOption*> options() {
348*cc02d7e2SAndroid Build Coastguard Worker     std::vector<grpc::ServerBuilderOption*> option_refs;
349*cc02d7e2SAndroid Build Coastguard Worker     option_refs.reserve(options_.size());
350*cc02d7e2SAndroid Build Coastguard Worker     for (auto& ptr : options_) {
351*cc02d7e2SAndroid Build Coastguard Worker       option_refs.push_back(ptr.get());
352*cc02d7e2SAndroid Build Coastguard Worker     }
353*cc02d7e2SAndroid Build Coastguard Worker     return option_refs;
354*cc02d7e2SAndroid Build Coastguard Worker   }
355*cc02d7e2SAndroid Build Coastguard Worker 
356*cc02d7e2SAndroid Build Coastguard Worker   /// Experimental API, subject to change.
set_fetcher(grpc_server_config_fetcher * server_config_fetcher)357*cc02d7e2SAndroid Build Coastguard Worker   void set_fetcher(grpc_server_config_fetcher* server_config_fetcher) {
358*cc02d7e2SAndroid Build Coastguard Worker     server_config_fetcher_ = server_config_fetcher;
359*cc02d7e2SAndroid Build Coastguard Worker   }
360*cc02d7e2SAndroid Build Coastguard Worker 
361*cc02d7e2SAndroid Build Coastguard Worker   /// Experimental API, subject to change.
362*cc02d7e2SAndroid Build Coastguard Worker   virtual ChannelArguments BuildChannelArgs();
363*cc02d7e2SAndroid Build Coastguard Worker 
364*cc02d7e2SAndroid Build Coastguard Worker  private:
365*cc02d7e2SAndroid Build Coastguard Worker   friend class grpc::testing::ServerBuilderPluginTest;
366*cc02d7e2SAndroid Build Coastguard Worker 
367*cc02d7e2SAndroid Build Coastguard Worker   struct SyncServerSettings {
SyncServerSettingsSyncServerSettings368*cc02d7e2SAndroid Build Coastguard Worker     SyncServerSettings()
369*cc02d7e2SAndroid Build Coastguard Worker         : num_cqs(1), min_pollers(1), max_pollers(2), cq_timeout_msec(10000) {}
370*cc02d7e2SAndroid Build Coastguard Worker 
371*cc02d7e2SAndroid Build Coastguard Worker     /// Number of server completion queues to create to listen to incoming RPCs.
372*cc02d7e2SAndroid Build Coastguard Worker     int num_cqs;
373*cc02d7e2SAndroid Build Coastguard Worker 
374*cc02d7e2SAndroid Build Coastguard Worker     /// Minimum number of threads per completion queue that should be listening
375*cc02d7e2SAndroid Build Coastguard Worker     /// to incoming RPCs.
376*cc02d7e2SAndroid Build Coastguard Worker     int min_pollers;
377*cc02d7e2SAndroid Build Coastguard Worker 
378*cc02d7e2SAndroid Build Coastguard Worker     /// Maximum number of threads per completion queue that can be listening to
379*cc02d7e2SAndroid Build Coastguard Worker     /// incoming RPCs.
380*cc02d7e2SAndroid Build Coastguard Worker     int max_pollers;
381*cc02d7e2SAndroid Build Coastguard Worker 
382*cc02d7e2SAndroid Build Coastguard Worker     /// The timeout for server completion queue's AsyncNext call.
383*cc02d7e2SAndroid Build Coastguard Worker     int cq_timeout_msec;
384*cc02d7e2SAndroid Build Coastguard Worker   };
385*cc02d7e2SAndroid Build Coastguard Worker 
386*cc02d7e2SAndroid Build Coastguard Worker   int max_receive_message_size_;
387*cc02d7e2SAndroid Build Coastguard Worker   int max_send_message_size_;
388*cc02d7e2SAndroid Build Coastguard Worker   std::vector<std::unique_ptr<grpc::ServerBuilderOption>> options_;
389*cc02d7e2SAndroid Build Coastguard Worker   std::vector<std::unique_ptr<NamedService>> services_;
390*cc02d7e2SAndroid Build Coastguard Worker   std::vector<Port> ports_;
391*cc02d7e2SAndroid Build Coastguard Worker 
392*cc02d7e2SAndroid Build Coastguard Worker   SyncServerSettings sync_server_settings_;
393*cc02d7e2SAndroid Build Coastguard Worker 
394*cc02d7e2SAndroid Build Coastguard Worker   /// List of completion queues added via \a AddCompletionQueue method.
395*cc02d7e2SAndroid Build Coastguard Worker   std::vector<grpc::ServerCompletionQueue*> cqs_;
396*cc02d7e2SAndroid Build Coastguard Worker 
397*cc02d7e2SAndroid Build Coastguard Worker   std::shared_ptr<grpc::ServerCredentials> creds_;
398*cc02d7e2SAndroid Build Coastguard Worker   std::vector<std::unique_ptr<grpc::ServerBuilderPlugin>> plugins_;
399*cc02d7e2SAndroid Build Coastguard Worker   grpc_resource_quota* resource_quota_;
400*cc02d7e2SAndroid Build Coastguard Worker   grpc::AsyncGenericService* generic_service_{nullptr};
401*cc02d7e2SAndroid Build Coastguard Worker   std::unique_ptr<ContextAllocator> context_allocator_;
402*cc02d7e2SAndroid Build Coastguard Worker   grpc::CallbackGenericService* callback_generic_service_{nullptr};
403*cc02d7e2SAndroid Build Coastguard Worker 
404*cc02d7e2SAndroid Build Coastguard Worker   struct {
405*cc02d7e2SAndroid Build Coastguard Worker     bool is_set;
406*cc02d7e2SAndroid Build Coastguard Worker     grpc_compression_level level;
407*cc02d7e2SAndroid Build Coastguard Worker   } maybe_default_compression_level_;
408*cc02d7e2SAndroid Build Coastguard Worker   struct {
409*cc02d7e2SAndroid Build Coastguard Worker     bool is_set;
410*cc02d7e2SAndroid Build Coastguard Worker     grpc_compression_algorithm algorithm;
411*cc02d7e2SAndroid Build Coastguard Worker   } maybe_default_compression_algorithm_;
412*cc02d7e2SAndroid Build Coastguard Worker   uint32_t enabled_compression_algorithms_bitset_;
413*cc02d7e2SAndroid Build Coastguard Worker   std::vector<
414*cc02d7e2SAndroid Build Coastguard Worker       std::unique_ptr<grpc::experimental::ServerInterceptorFactoryInterface>>
415*cc02d7e2SAndroid Build Coastguard Worker       interceptor_creators_;
416*cc02d7e2SAndroid Build Coastguard Worker   std::vector<std::shared_ptr<grpc::internal::ExternalConnectionAcceptorImpl>>
417*cc02d7e2SAndroid Build Coastguard Worker       acceptors_;
418*cc02d7e2SAndroid Build Coastguard Worker   grpc_server_config_fetcher* server_config_fetcher_ = nullptr;
419*cc02d7e2SAndroid Build Coastguard Worker   std::shared_ptr<experimental::AuthorizationPolicyProviderInterface>
420*cc02d7e2SAndroid Build Coastguard Worker       authorization_provider_;
421*cc02d7e2SAndroid Build Coastguard Worker   experimental::ServerMetricRecorder* server_metric_recorder_ = nullptr;
422*cc02d7e2SAndroid Build Coastguard Worker };
423*cc02d7e2SAndroid Build Coastguard Worker 
424*cc02d7e2SAndroid Build Coastguard Worker }  // namespace grpc
425*cc02d7e2SAndroid Build Coastguard Worker 
426*cc02d7e2SAndroid Build Coastguard Worker #endif  // GRPCPP_SERVER_BUILDER_H
427