1*cc02d7e2SAndroid Build Coastguard Worker /* 2*cc02d7e2SAndroid Build Coastguard Worker * 3*cc02d7e2SAndroid Build Coastguard Worker * Copyright 2015 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 /** 20*cc02d7e2SAndroid Build Coastguard Worker * \mainpage notitle 21*cc02d7e2SAndroid Build Coastguard Worker * 22*cc02d7e2SAndroid Build Coastguard Worker * The gRPC protocol is an RPC protocol on top of HTTP2. 23*cc02d7e2SAndroid Build Coastguard Worker * 24*cc02d7e2SAndroid Build Coastguard Worker * While the most common type of RPC receives only one request message and returns only one response 25*cc02d7e2SAndroid Build Coastguard Worker * message, the protocol also supports RPCs that return multiple individual messages in a streaming 26*cc02d7e2SAndroid Build Coastguard Worker * fashion, RPCs that accept a stream of request messages, or RPCs with both streaming requests and 27*cc02d7e2SAndroid Build Coastguard Worker * responses. 28*cc02d7e2SAndroid Build Coastguard Worker * 29*cc02d7e2SAndroid Build Coastguard Worker * Conceptually, each gRPC call consists of a bidirectional stream of binary messages, with RPCs of 30*cc02d7e2SAndroid Build Coastguard Worker * the "non-streaming type" sending only one message in the corresponding direction (the protocol 31*cc02d7e2SAndroid Build Coastguard Worker * doesn't make any distinction). 32*cc02d7e2SAndroid Build Coastguard Worker * 33*cc02d7e2SAndroid Build Coastguard Worker * Each RPC uses a different HTTP2 stream, and thus multiple simultaneous RPCs can be multiplexed 34*cc02d7e2SAndroid Build Coastguard Worker * transparently on the same TCP connection. 35*cc02d7e2SAndroid Build Coastguard Worker */ 36*cc02d7e2SAndroid Build Coastguard Worker 37*cc02d7e2SAndroid Build Coastguard Worker #import <Foundation/Foundation.h> 38*cc02d7e2SAndroid Build Coastguard Worker 39*cc02d7e2SAndroid Build Coastguard Worker #import "GRPCCallOptions.h" 40*cc02d7e2SAndroid Build Coastguard Worker #import "GRPCDispatchable.h" 41*cc02d7e2SAndroid Build Coastguard Worker #import "GRPCTypes.h" 42*cc02d7e2SAndroid Build Coastguard Worker 43*cc02d7e2SAndroid Build Coastguard Worker // The legacy header is included for backwards compatibility. Some V1 API users are still using 44*cc02d7e2SAndroid Build Coastguard Worker // GRPCCall by importing GRPCCall.h header so we need this import. 45*cc02d7e2SAndroid Build Coastguard Worker #import "GRPCCallLegacy.h" 46*cc02d7e2SAndroid Build Coastguard Worker 47*cc02d7e2SAndroid Build Coastguard Worker NS_ASSUME_NONNULL_BEGIN 48*cc02d7e2SAndroid Build Coastguard Worker 49*cc02d7e2SAndroid Build Coastguard Worker /** An object can implement this protocol to receive responses from server from a call. */ 50*cc02d7e2SAndroid Build Coastguard Worker @protocol GRPCResponseHandler <NSObject, GRPCDispatchable> 51*cc02d7e2SAndroid Build Coastguard Worker 52*cc02d7e2SAndroid Build Coastguard Worker @optional 53*cc02d7e2SAndroid Build Coastguard Worker 54*cc02d7e2SAndroid Build Coastguard Worker /** 55*cc02d7e2SAndroid Build Coastguard Worker * Issued when initial metadata is received from the server. 56*cc02d7e2SAndroid Build Coastguard Worker */ 57*cc02d7e2SAndroid Build Coastguard Worker - (void)didReceiveInitialMetadata:(nullable NSDictionary *)initialMetadata; 58*cc02d7e2SAndroid Build Coastguard Worker 59*cc02d7e2SAndroid Build Coastguard Worker /** 60*cc02d7e2SAndroid Build Coastguard Worker * Issued when a message is received from the server. The message is the raw data received from the 61*cc02d7e2SAndroid Build Coastguard Worker * server, with decompression and without proto deserialization. 62*cc02d7e2SAndroid Build Coastguard Worker * 63*cc02d7e2SAndroid Build Coastguard Worker * <b> This method is deprecated and does not work with interceptors.</b> To use GRPCCall2 interface 64*cc02d7e2SAndroid Build Coastguard Worker * with interceptor, please implement GRPCResponseHandler::didReceiveData method and leave this 65*cc02d7e2SAndroid Build Coastguard Worker * method unimplemented. If this method and didReceiveRawMessage are implemented at the same time, 66*cc02d7e2SAndroid Build Coastguard Worker * implementation of this method will be ignored. 67*cc02d7e2SAndroid Build Coastguard Worker */ 68*cc02d7e2SAndroid Build Coastguard Worker - (void)didReceiveRawMessage:(nullable NSData *)message; 69*cc02d7e2SAndroid Build Coastguard Worker 70*cc02d7e2SAndroid Build Coastguard Worker /** 71*cc02d7e2SAndroid Build Coastguard Worker * Issued when gRPC message is received from the server. The data is always decompressed with gRPC 72*cc02d7e2SAndroid Build Coastguard Worker * or HTTP compression algorithm specified in the response header. \p data could be any type as 73*cc02d7e2SAndroid Build Coastguard Worker * transport layer and interceptors may modify the type of the data (e.g. a Protobuf interceptor may 74*cc02d7e2SAndroid Build Coastguard Worker * consume NSData typed data and issue GPBMessage typed data to user). Users should interpret \p 75*cc02d7e2SAndroid Build Coastguard Worker * data according to the configuration of their calls. Interceptor authors should not assume the 76*cc02d7e2SAndroid Build Coastguard Worker * type of \p data unless an agreement is made on how it should be used in a particular call 77*cc02d7e2SAndroid Build Coastguard Worker * setting. 78*cc02d7e2SAndroid Build Coastguard Worker */ 79*cc02d7e2SAndroid Build Coastguard Worker - (void)didReceiveData:(id)data; 80*cc02d7e2SAndroid Build Coastguard Worker 81*cc02d7e2SAndroid Build Coastguard Worker /** 82*cc02d7e2SAndroid Build Coastguard Worker * Issued when a call finished. If the call finished successfully, \p error is nil and \p 83*cc02d7e2SAndroid Build Coastguard Worker * trailingMetadata consists any trailing metadata received from the server. Otherwise, \p error 84*cc02d7e2SAndroid Build Coastguard Worker * is non-nil and contains the corresponding error information, including gRPC error codes and 85*cc02d7e2SAndroid Build Coastguard Worker * error descriptions. 86*cc02d7e2SAndroid Build Coastguard Worker */ 87*cc02d7e2SAndroid Build Coastguard Worker - (void)didCloseWithTrailingMetadata:(nullable NSDictionary *)trailingMetadata 88*cc02d7e2SAndroid Build Coastguard Worker error:(nullable NSError *)error; 89*cc02d7e2SAndroid Build Coastguard Worker 90*cc02d7e2SAndroid Build Coastguard Worker /** 91*cc02d7e2SAndroid Build Coastguard Worker * Issued when flow control is enabled for the call and a message written with GRPCCall2::writeData 92*cc02d7e2SAndroid Build Coastguard Worker * is passed to gRPC core with SEND_MESSAGE operation. 93*cc02d7e2SAndroid Build Coastguard Worker */ 94*cc02d7e2SAndroid Build Coastguard Worker - (void)didWriteData; 95*cc02d7e2SAndroid Build Coastguard Worker 96*cc02d7e2SAndroid Build Coastguard Worker @end 97*cc02d7e2SAndroid Build Coastguard Worker 98*cc02d7e2SAndroid Build Coastguard Worker /** 99*cc02d7e2SAndroid Build Coastguard Worker * HTTP request parameters. If Protobuf is used, these parameters are automatically generated by 100*cc02d7e2SAndroid Build Coastguard Worker * Protobuf. If directly using the GRPCCall2 class, users should specify these parameters manually. 101*cc02d7e2SAndroid Build Coastguard Worker */ 102*cc02d7e2SAndroid Build Coastguard Worker @interface GRPCRequestOptions : NSObject <NSCopying> 103*cc02d7e2SAndroid Build Coastguard Worker 104*cc02d7e2SAndroid Build Coastguard Worker - (instancetype)init NS_UNAVAILABLE; 105*cc02d7e2SAndroid Build Coastguard Worker 106*cc02d7e2SAndroid Build Coastguard Worker + (instancetype)new NS_UNAVAILABLE; 107*cc02d7e2SAndroid Build Coastguard Worker 108*cc02d7e2SAndroid Build Coastguard Worker /** Initialize with all properties. */ 109*cc02d7e2SAndroid Build Coastguard Worker - (instancetype)initWithHost:(NSString *)host 110*cc02d7e2SAndroid Build Coastguard Worker path:(NSString *)path 111*cc02d7e2SAndroid Build Coastguard Worker safety:(GRPCCallSafety)safety NS_DESIGNATED_INITIALIZER; 112*cc02d7e2SAndroid Build Coastguard Worker 113*cc02d7e2SAndroid Build Coastguard Worker /** The host serving the RPC service. */ 114*cc02d7e2SAndroid Build Coastguard Worker @property(copy, readonly) NSString *host; 115*cc02d7e2SAndroid Build Coastguard Worker /** The path to the RPC call. */ 116*cc02d7e2SAndroid Build Coastguard Worker @property(copy, readonly) NSString *path; 117*cc02d7e2SAndroid Build Coastguard Worker /** 118*cc02d7e2SAndroid Build Coastguard Worker * Specify whether the call is idempotent or cachable. gRPC may select different HTTP verbs for the 119*cc02d7e2SAndroid Build Coastguard Worker * call based on this information. The default verb used by gRPC is POST. 120*cc02d7e2SAndroid Build Coastguard Worker */ 121*cc02d7e2SAndroid Build Coastguard Worker @property(readonly) GRPCCallSafety safety; 122*cc02d7e2SAndroid Build Coastguard Worker 123*cc02d7e2SAndroid Build Coastguard Worker @end 124*cc02d7e2SAndroid Build Coastguard Worker 125*cc02d7e2SAndroid Build Coastguard Worker #pragma mark GRPCCall 126*cc02d7e2SAndroid Build Coastguard Worker 127*cc02d7e2SAndroid Build Coastguard Worker /** 128*cc02d7e2SAndroid Build Coastguard Worker * A GRPCCall2 object represents an RPC call. 129*cc02d7e2SAndroid Build Coastguard Worker */ 130*cc02d7e2SAndroid Build Coastguard Worker @interface GRPCCall2 : NSObject 131*cc02d7e2SAndroid Build Coastguard Worker 132*cc02d7e2SAndroid Build Coastguard Worker - (instancetype)init NS_UNAVAILABLE; 133*cc02d7e2SAndroid Build Coastguard Worker 134*cc02d7e2SAndroid Build Coastguard Worker + (instancetype)new NS_UNAVAILABLE; 135*cc02d7e2SAndroid Build Coastguard Worker 136*cc02d7e2SAndroid Build Coastguard Worker /** 137*cc02d7e2SAndroid Build Coastguard Worker * Designated initializer for a call. 138*cc02d7e2SAndroid Build Coastguard Worker * \param requestOptions Protobuf generated parameters for the call. 139*cc02d7e2SAndroid Build Coastguard Worker * \param responseHandler The object to which responses should be issued. 140*cc02d7e2SAndroid Build Coastguard Worker * \param callOptions Options for the call. 141*cc02d7e2SAndroid Build Coastguard Worker */ 142*cc02d7e2SAndroid Build Coastguard Worker - (instancetype)initWithRequestOptions:(GRPCRequestOptions *)requestOptions 143*cc02d7e2SAndroid Build Coastguard Worker responseHandler:(id<GRPCResponseHandler>)responseHandler 144*cc02d7e2SAndroid Build Coastguard Worker callOptions:(nullable GRPCCallOptions *)callOptions 145*cc02d7e2SAndroid Build Coastguard Worker NS_DESIGNATED_INITIALIZER; 146*cc02d7e2SAndroid Build Coastguard Worker /** 147*cc02d7e2SAndroid Build Coastguard Worker * Convenience initializer for a call that uses default call options (see GRPCCallOptions.m for 148*cc02d7e2SAndroid Build Coastguard Worker * the default options). 149*cc02d7e2SAndroid Build Coastguard Worker */ 150*cc02d7e2SAndroid Build Coastguard Worker - (instancetype)initWithRequestOptions:(GRPCRequestOptions *)requestOptions 151*cc02d7e2SAndroid Build Coastguard Worker responseHandler:(id<GRPCResponseHandler>)responseHandler; 152*cc02d7e2SAndroid Build Coastguard Worker 153*cc02d7e2SAndroid Build Coastguard Worker /** 154*cc02d7e2SAndroid Build Coastguard Worker * Starts the call. This function must only be called once for each instance. 155*cc02d7e2SAndroid Build Coastguard Worker */ 156*cc02d7e2SAndroid Build Coastguard Worker - (void)start; 157*cc02d7e2SAndroid Build Coastguard Worker 158*cc02d7e2SAndroid Build Coastguard Worker /** 159*cc02d7e2SAndroid Build Coastguard Worker * Cancel the request of this call at best effort. It attempts to notify the server that the RPC 160*cc02d7e2SAndroid Build Coastguard Worker * should be cancelled, and issue didCloseWithTrailingMetadata:error: callback with error code 161*cc02d7e2SAndroid Build Coastguard Worker * CANCELED if no other error code has already been issued. 162*cc02d7e2SAndroid Build Coastguard Worker */ 163*cc02d7e2SAndroid Build Coastguard Worker - (void)cancel; 164*cc02d7e2SAndroid Build Coastguard Worker 165*cc02d7e2SAndroid Build Coastguard Worker /** 166*cc02d7e2SAndroid Build Coastguard Worker * Send a message to the server. The data is subject to marshaller serialization and compression 167*cc02d7e2SAndroid Build Coastguard Worker * (marshaller is work in progress). 168*cc02d7e2SAndroid Build Coastguard Worker */ 169*cc02d7e2SAndroid Build Coastguard Worker - (void)writeData:(id)data; 170*cc02d7e2SAndroid Build Coastguard Worker 171*cc02d7e2SAndroid Build Coastguard Worker /** 172*cc02d7e2SAndroid Build Coastguard Worker * Finish the RPC request and half-close the call. The server may still send messages and/or 173*cc02d7e2SAndroid Build Coastguard Worker * trailers to the client. The method must only be called once and after start is called. 174*cc02d7e2SAndroid Build Coastguard Worker */ 175*cc02d7e2SAndroid Build Coastguard Worker - (void)finish; 176*cc02d7e2SAndroid Build Coastguard Worker 177*cc02d7e2SAndroid Build Coastguard Worker /** 178*cc02d7e2SAndroid Build Coastguard Worker * Tell gRPC to receive the next N gRPC messages. 179*cc02d7e2SAndroid Build Coastguard Worker * 180*cc02d7e2SAndroid Build Coastguard Worker * This method should only be used when flow control is enabled. When flow control is not enabled, 181*cc02d7e2SAndroid Build Coastguard Worker * this method is a no-op. 182*cc02d7e2SAndroid Build Coastguard Worker */ 183*cc02d7e2SAndroid Build Coastguard Worker - (void)receiveNextMessages:(NSUInteger)numberOfMessages; 184*cc02d7e2SAndroid Build Coastguard Worker 185*cc02d7e2SAndroid Build Coastguard Worker /** 186*cc02d7e2SAndroid Build Coastguard Worker * Get a copy of the original call options. 187*cc02d7e2SAndroid Build Coastguard Worker */ 188*cc02d7e2SAndroid Build Coastguard Worker @property(readonly, copy) GRPCCallOptions *callOptions; 189*cc02d7e2SAndroid Build Coastguard Worker 190*cc02d7e2SAndroid Build Coastguard Worker /** Get a copy of the original request options. */ 191*cc02d7e2SAndroid Build Coastguard Worker @property(readonly, copy) GRPCRequestOptions *requestOptions; 192*cc02d7e2SAndroid Build Coastguard Worker 193*cc02d7e2SAndroid Build Coastguard Worker @end 194*cc02d7e2SAndroid Build Coastguard Worker 195*cc02d7e2SAndroid Build Coastguard Worker NS_ASSUME_NONNULL_END 196