/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ /** * \mainpage notitle * * The gRPC protocol is an RPC protocol on top of HTTP2. * * While the most common type of RPC receives only one request message and returns only one response * message, the protocol also supports RPCs that return multiple individual messages in a streaming * fashion, RPCs that accept a stream of request messages, or RPCs with both streaming requests and * responses. * * Conceptually, each gRPC call consists of a bidirectional stream of binary messages, with RPCs of * the "non-streaming type" sending only one message in the corresponding direction (the protocol * doesn't make any distinction). * * Each RPC uses a different HTTP2 stream, and thus multiple simultaneous RPCs can be multiplexed * transparently on the same TCP connection. */ #import #import "GRPCCallOptions.h" #import "GRPCDispatchable.h" #import "GRPCTypes.h" // The legacy header is included for backwards compatibility. Some V1 API users are still using // GRPCCall by importing GRPCCall.h header so we need this import. #import "GRPCCallLegacy.h" NS_ASSUME_NONNULL_BEGIN /** An object can implement this protocol to receive responses from server from a call. */ @protocol GRPCResponseHandler @optional /** * Issued when initial metadata is received from the server. */ - (void)didReceiveInitialMetadata:(nullable NSDictionary *)initialMetadata; /** * Issued when a message is received from the server. The message is the raw data received from the * server, with decompression and without proto deserialization. * * This method is deprecated and does not work with interceptors. To use GRPCCall2 interface * with interceptor, please implement GRPCResponseHandler::didReceiveData method and leave this * method unimplemented. If this method and didReceiveRawMessage are implemented at the same time, * implementation of this method will be ignored. */ - (void)didReceiveRawMessage:(nullable NSData *)message; /** * Issued when gRPC message is received from the server. The data is always decompressed with gRPC * or HTTP compression algorithm specified in the response header. \p data could be any type as * transport layer and interceptors may modify the type of the data (e.g. a Protobuf interceptor may * consume NSData typed data and issue GPBMessage typed data to user). Users should interpret \p * data according to the configuration of their calls. Interceptor authors should not assume the * type of \p data unless an agreement is made on how it should be used in a particular call * setting. */ - (void)didReceiveData:(id)data; /** * Issued when a call finished. If the call finished successfully, \p error is nil and \p * trailingMetadata consists any trailing metadata received from the server. Otherwise, \p error * is non-nil and contains the corresponding error information, including gRPC error codes and * error descriptions. */ - (void)didCloseWithTrailingMetadata:(nullable NSDictionary *)trailingMetadata error:(nullable NSError *)error; /** * Issued when flow control is enabled for the call and a message written with GRPCCall2::writeData * is passed to gRPC core with SEND_MESSAGE operation. */ - (void)didWriteData; @end /** * HTTP request parameters. If Protobuf is used, these parameters are automatically generated by * Protobuf. If directly using the GRPCCall2 class, users should specify these parameters manually. */ @interface GRPCRequestOptions : NSObject - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; /** Initialize with all properties. */ - (instancetype)initWithHost:(NSString *)host path:(NSString *)path safety:(GRPCCallSafety)safety NS_DESIGNATED_INITIALIZER; /** The host serving the RPC service. */ @property(copy, readonly) NSString *host; /** The path to the RPC call. */ @property(copy, readonly) NSString *path; /** * Specify whether the call is idempotent or cachable. gRPC may select different HTTP verbs for the * call based on this information. The default verb used by gRPC is POST. */ @property(readonly) GRPCCallSafety safety; @end #pragma mark GRPCCall /** * A GRPCCall2 object represents an RPC call. */ @interface GRPCCall2 : NSObject - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; /** * Designated initializer for a call. * \param requestOptions Protobuf generated parameters for the call. * \param responseHandler The object to which responses should be issued. * \param callOptions Options for the call. */ - (instancetype)initWithRequestOptions:(GRPCRequestOptions *)requestOptions responseHandler:(id)responseHandler callOptions:(nullable GRPCCallOptions *)callOptions NS_DESIGNATED_INITIALIZER; /** * Convenience initializer for a call that uses default call options (see GRPCCallOptions.m for * the default options). */ - (instancetype)initWithRequestOptions:(GRPCRequestOptions *)requestOptions responseHandler:(id)responseHandler; /** * Starts the call. This function must only be called once for each instance. */ - (void)start; /** * Cancel the request of this call at best effort. It attempts to notify the server that the RPC * should be cancelled, and issue didCloseWithTrailingMetadata:error: callback with error code * CANCELED if no other error code has already been issued. */ - (void)cancel; /** * Send a message to the server. The data is subject to marshaller serialization and compression * (marshaller is work in progress). */ - (void)writeData:(id)data; /** * Finish the RPC request and half-close the call. The server may still send messages and/or * trailers to the client. The method must only be called once and after start is called. */ - (void)finish; /** * Tell gRPC to receive the next N gRPC messages. * * This method should only be used when flow control is enabled. When flow control is not enabled, * this method is a no-op. */ - (void)receiveNextMessages:(NSUInteger)numberOfMessages; /** * Get a copy of the original call options. */ @property(readonly, copy) GRPCCallOptions *callOptions; /** Get a copy of the original request options. */ @property(readonly, copy) GRPCRequestOptions *requestOptions; @end NS_ASSUME_NONNULL_END