1*cc02d7e2SAndroid Build Coastguard Worker /* 2*cc02d7e2SAndroid Build Coastguard Worker * 3*cc02d7e2SAndroid Build Coastguard Worker * Copyright 2019 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 * \file GRPCInterceptor.h 21*cc02d7e2SAndroid Build Coastguard Worker * API for interceptors implementation. This feature is currently EXPERIMENTAL and is subject to 22*cc02d7e2SAndroid Build Coastguard Worker * breaking changes without prior notice. 23*cc02d7e2SAndroid Build Coastguard Worker * 24*cc02d7e2SAndroid Build Coastguard Worker * The interceptors in the gRPC system forms a chain. When a call is made by the user, each 25*cc02d7e2SAndroid Build Coastguard Worker * interceptor on the chain has chances to react to events of the call and make necessary 26*cc02d7e2SAndroid Build Coastguard Worker * modifications to the call's parameters, data, metadata, or flow. 27*cc02d7e2SAndroid Build Coastguard Worker * 28*cc02d7e2SAndroid Build Coastguard Worker * \verbatim 29*cc02d7e2SAndroid Build Coastguard Worker ----------- 30*cc02d7e2SAndroid Build Coastguard Worker | GRPCCall2 | 31*cc02d7e2SAndroid Build Coastguard Worker ----------- 32*cc02d7e2SAndroid Build Coastguard Worker | 33*cc02d7e2SAndroid Build Coastguard Worker | 34*cc02d7e2SAndroid Build Coastguard Worker -------------------------- 35*cc02d7e2SAndroid Build Coastguard Worker | GRPCInterceptorManager 1 | 36*cc02d7e2SAndroid Build Coastguard Worker -------------------------- 37*cc02d7e2SAndroid Build Coastguard Worker | GRPCInterceptor 1 | 38*cc02d7e2SAndroid Build Coastguard Worker -------------------------- 39*cc02d7e2SAndroid Build Coastguard Worker | 40*cc02d7e2SAndroid Build Coastguard Worker ... 41*cc02d7e2SAndroid Build Coastguard Worker | 42*cc02d7e2SAndroid Build Coastguard Worker -------------------------- 43*cc02d7e2SAndroid Build Coastguard Worker | GRPCInterceptorManager N | 44*cc02d7e2SAndroid Build Coastguard Worker -------------------------- 45*cc02d7e2SAndroid Build Coastguard Worker | GRPCInterceptor N | 46*cc02d7e2SAndroid Build Coastguard Worker -------------------------- 47*cc02d7e2SAndroid Build Coastguard Worker | 48*cc02d7e2SAndroid Build Coastguard Worker | 49*cc02d7e2SAndroid Build Coastguard Worker ------------------ 50*cc02d7e2SAndroid Build Coastguard Worker | GRPCCallInternal | 51*cc02d7e2SAndroid Build Coastguard Worker ------------------ 52*cc02d7e2SAndroid Build Coastguard Worker \endverbatim 53*cc02d7e2SAndroid Build Coastguard Worker * 54*cc02d7e2SAndroid Build Coastguard Worker * The chain of interceptors is initialized when the corresponding GRPCCall2 object or proto call 55*cc02d7e2SAndroid Build Coastguard Worker * object (GRPCUnaryProtoCall and GRPCStreamingProtoCall) is initialized. The initialization of the 56*cc02d7e2SAndroid Build Coastguard Worker * chain is controlled by the property interceptorFactories in the callOptions parameter of the 57*cc02d7e2SAndroid Build Coastguard Worker * corresponding call object. Property interceptorFactories is an array of 58*cc02d7e2SAndroid Build Coastguard Worker * id<GRPCInterceptorFactory> objects provided by the user. When a call object is initialized, each 59*cc02d7e2SAndroid Build Coastguard Worker * interceptor factory generates an interceptor object for the call. gRPC internally links the 60*cc02d7e2SAndroid Build Coastguard Worker * interceptors with each other and with the actual call object. The order of the interceptors in 61*cc02d7e2SAndroid Build Coastguard Worker * the chain is exactly the same as the order of factory objects in interceptorFactories property. 62*cc02d7e2SAndroid Build Coastguard Worker * All requests (start, write, finish, cancel, receive next) initiated by the user will be processed 63*cc02d7e2SAndroid Build Coastguard Worker * in the order of interceptors, and all responses (initial metadata, data, trailing metadata, write 64*cc02d7e2SAndroid Build Coastguard Worker * data done) are processed in the reverse order. 65*cc02d7e2SAndroid Build Coastguard Worker * 66*cc02d7e2SAndroid Build Coastguard Worker * Each interceptor in the interceptor chain should behave as a user of the next interceptor, and at 67*cc02d7e2SAndroid Build Coastguard Worker * the same time behave as a call to the previous interceptor. Therefore interceptor implementations 68*cc02d7e2SAndroid Build Coastguard Worker * must follow the state transition of gRPC calls and must also forward events that are consistent 69*cc02d7e2SAndroid Build Coastguard Worker * with the current state of the next/previous interceptor. They should also make sure that the 70*cc02d7e2SAndroid Build Coastguard Worker * events they forwarded to the next and previous interceptors will, in the end, make the neighbour 71*cc02d7e2SAndroid Build Coastguard Worker * interceptor terminate correctly and reaches "finished" state. The diagram below shows the state 72*cc02d7e2SAndroid Build Coastguard Worker * transitions. Any event not appearing on the diagram means the event is not permitted for that 73*cc02d7e2SAndroid Build Coastguard Worker * particular state. 74*cc02d7e2SAndroid Build Coastguard Worker * 75*cc02d7e2SAndroid Build Coastguard Worker * \verbatim 76*cc02d7e2SAndroid Build Coastguard Worker writeData 77*cc02d7e2SAndroid Build Coastguard Worker receiveNextMessages 78*cc02d7e2SAndroid Build Coastguard Worker didReceiveInitialMetadata 79*cc02d7e2SAndroid Build Coastguard Worker didReceiveData 80*cc02d7e2SAndroid Build Coastguard Worker didWriteData receiveNextmessages 81*cc02d7e2SAndroid Build Coastguard Worker writeData ----- ----- ---- didReceiveInitialMetadata 82*cc02d7e2SAndroid Build Coastguard Worker receiveNextMessages | | | | | | didReceiveData 83*cc02d7e2SAndroid Build Coastguard Worker | V | V | V didWriteData 84*cc02d7e2SAndroid Build Coastguard Worker ------------- start --------- finish ------------ 85*cc02d7e2SAndroid Build Coastguard Worker | initialized | -----> | started | --------> | half-close | 86*cc02d7e2SAndroid Build Coastguard Worker ------------- --------- ------------ 87*cc02d7e2SAndroid Build Coastguard Worker | | | 88*cc02d7e2SAndroid Build Coastguard Worker | | didClose | didClose 89*cc02d7e2SAndroid Build Coastguard Worker |cancel | cancel | cancel 90*cc02d7e2SAndroid Build Coastguard Worker | V | 91*cc02d7e2SAndroid Build Coastguard Worker | ---------- | 92*cc02d7e2SAndroid Build Coastguard Worker --------------> | finished | <-------------- 93*cc02d7e2SAndroid Build Coastguard Worker ---------- 94*cc02d7e2SAndroid Build Coastguard Worker | ^ writeData 95*cc02d7e2SAndroid Build Coastguard Worker | | finish 96*cc02d7e2SAndroid Build Coastguard Worker ------ cancel 97*cc02d7e2SAndroid Build Coastguard Worker receiveNextMessages 98*cc02d7e2SAndroid Build Coastguard Worker \endverbatim 99*cc02d7e2SAndroid Build Coastguard Worker * 100*cc02d7e2SAndroid Build Coastguard Worker * An interceptor must forward responses to its previous interceptor in the order of initial 101*cc02d7e2SAndroid Build Coastguard Worker * metadata, message(s), and trailing metadata. Forwarding responses out of this order (e.g. 102*cc02d7e2SAndroid Build Coastguard Worker * forwarding a message before initial metadata) is not allowed. 103*cc02d7e2SAndroid Build Coastguard Worker * 104*cc02d7e2SAndroid Build Coastguard Worker * Events of requests and responses are dispatched to interceptor objects using the interceptor's 105*cc02d7e2SAndroid Build Coastguard Worker * dispatch queue. The dispatch queue should be serial queue to make sure the events are processed 106*cc02d7e2SAndroid Build Coastguard Worker * in order. Interceptor implementations must derive from GRPCInterceptor class. The class makes 107*cc02d7e2SAndroid Build Coastguard Worker * some basic implementation of all methods responding to an event of a call. If an interceptor does 108*cc02d7e2SAndroid Build Coastguard Worker * not care about a particular event, it can use the basic implementation of the GRPCInterceptor 109*cc02d7e2SAndroid Build Coastguard Worker * class, which simply forward the event to the next or previous interceptor in the chain. 110*cc02d7e2SAndroid Build Coastguard Worker * 111*cc02d7e2SAndroid Build Coastguard Worker * The interceptor object should be unique for each call since the call context is not passed to the 112*cc02d7e2SAndroid Build Coastguard Worker * interceptor object in a call event. However, the interceptors can be implemented to share states 113*cc02d7e2SAndroid Build Coastguard Worker * by receiving state sharing object from the factory upon construction. 114*cc02d7e2SAndroid Build Coastguard Worker */ 115*cc02d7e2SAndroid Build Coastguard Worker 116*cc02d7e2SAndroid Build Coastguard Worker #import "GRPCCall.h" 117*cc02d7e2SAndroid Build Coastguard Worker #import "GRPCDispatchable.h" 118*cc02d7e2SAndroid Build Coastguard Worker 119*cc02d7e2SAndroid Build Coastguard Worker NS_ASSUME_NONNULL_BEGIN 120*cc02d7e2SAndroid Build Coastguard Worker 121*cc02d7e2SAndroid Build Coastguard Worker @class GRPCInterceptorManager; 122*cc02d7e2SAndroid Build Coastguard Worker @class GRPCInterceptor; 123*cc02d7e2SAndroid Build Coastguard Worker @class GRPCRequestOptions; 124*cc02d7e2SAndroid Build Coastguard Worker @class GRPCCallOptions; 125*cc02d7e2SAndroid Build Coastguard Worker @protocol GRPCResponseHandler; 126*cc02d7e2SAndroid Build Coastguard Worker 127*cc02d7e2SAndroid Build Coastguard Worker /** 128*cc02d7e2SAndroid Build Coastguard Worker * The GRPCInterceptorInterface defines the request events that can occur to an interceptor. 129*cc02d7e2SAndroid Build Coastguard Worker */ 130*cc02d7e2SAndroid Build Coastguard Worker @protocol GRPCInterceptorInterface <NSObject, GRPCDispatchable> 131*cc02d7e2SAndroid Build Coastguard Worker 132*cc02d7e2SAndroid Build Coastguard Worker /** 133*cc02d7e2SAndroid Build Coastguard Worker * To start the call. This method will only be called once for each instance. 134*cc02d7e2SAndroid Build Coastguard Worker */ 135*cc02d7e2SAndroid Build Coastguard Worker - (void)startWithRequestOptions:(GRPCRequestOptions *)requestOptions 136*cc02d7e2SAndroid Build Coastguard Worker callOptions:(GRPCCallOptions *)callOptions; 137*cc02d7e2SAndroid Build Coastguard Worker 138*cc02d7e2SAndroid Build Coastguard Worker /** 139*cc02d7e2SAndroid Build Coastguard Worker * To write data to the call. 140*cc02d7e2SAndroid Build Coastguard Worker */ 141*cc02d7e2SAndroid Build Coastguard Worker - (void)writeData:(id)data; 142*cc02d7e2SAndroid Build Coastguard Worker 143*cc02d7e2SAndroid Build Coastguard Worker /** 144*cc02d7e2SAndroid Build Coastguard Worker * To finish the stream of requests. 145*cc02d7e2SAndroid Build Coastguard Worker */ 146*cc02d7e2SAndroid Build Coastguard Worker - (void)finish; 147*cc02d7e2SAndroid Build Coastguard Worker 148*cc02d7e2SAndroid Build Coastguard Worker /** 149*cc02d7e2SAndroid Build Coastguard Worker * To cancel the call. 150*cc02d7e2SAndroid Build Coastguard Worker */ 151*cc02d7e2SAndroid Build Coastguard Worker - (void)cancel; 152*cc02d7e2SAndroid Build Coastguard Worker 153*cc02d7e2SAndroid Build Coastguard Worker /** 154*cc02d7e2SAndroid Build Coastguard Worker * To indicate the call that the previous interceptor is ready to receive more messages. 155*cc02d7e2SAndroid Build Coastguard Worker */ 156*cc02d7e2SAndroid Build Coastguard Worker - (void)receiveNextMessages:(NSUInteger)numberOfMessages; 157*cc02d7e2SAndroid Build Coastguard Worker 158*cc02d7e2SAndroid Build Coastguard Worker @end 159*cc02d7e2SAndroid Build Coastguard Worker 160*cc02d7e2SAndroid Build Coastguard Worker /** 161*cc02d7e2SAndroid Build Coastguard Worker * An interceptor factory object is used to create interceptor object for the call at the call 162*cc02d7e2SAndroid Build Coastguard Worker * start time. 163*cc02d7e2SAndroid Build Coastguard Worker */ 164*cc02d7e2SAndroid Build Coastguard Worker @protocol GRPCInterceptorFactory 165*cc02d7e2SAndroid Build Coastguard Worker 166*cc02d7e2SAndroid Build Coastguard Worker /** 167*cc02d7e2SAndroid Build Coastguard Worker * Create an interceptor object. gRPC uses the returned object as the interceptor for the current 168*cc02d7e2SAndroid Build Coastguard Worker * call 169*cc02d7e2SAndroid Build Coastguard Worker */ 170*cc02d7e2SAndroid Build Coastguard Worker - (GRPCInterceptor *)createInterceptorWithManager:(GRPCInterceptorManager *)interceptorManager; 171*cc02d7e2SAndroid Build Coastguard Worker 172*cc02d7e2SAndroid Build Coastguard Worker @end 173*cc02d7e2SAndroid Build Coastguard Worker 174*cc02d7e2SAndroid Build Coastguard Worker /** 175*cc02d7e2SAndroid Build Coastguard Worker * GRPCInterceptorManager is a helper class to forward messages between the interceptors. The 176*cc02d7e2SAndroid Build Coastguard Worker * interceptor manager object retains reference to the next and previous interceptor object in the 177*cc02d7e2SAndroid Build Coastguard Worker * interceptor chain, and forward corresponding events to them. 178*cc02d7e2SAndroid Build Coastguard Worker * 179*cc02d7e2SAndroid Build Coastguard Worker * All methods except the initializer of the class can only be called on the manager's dispatch 180*cc02d7e2SAndroid Build Coastguard Worker * queue. Since the manager's dispatch queue targets corresponding interceptor's dispatch queue, it 181*cc02d7e2SAndroid Build Coastguard Worker * is also safe to call the manager's methods in the corresponding interceptor instance's methods 182*cc02d7e2SAndroid Build Coastguard Worker * that implement GRPCInterceptorInterface. 183*cc02d7e2SAndroid Build Coastguard Worker * 184*cc02d7e2SAndroid Build Coastguard Worker * When an interceptor is shutting down, it must invoke -shutDown method of its corresponding 185*cc02d7e2SAndroid Build Coastguard Worker * manager so that references to other interceptors can be released and proper clean-up is made. 186*cc02d7e2SAndroid Build Coastguard Worker */ 187*cc02d7e2SAndroid Build Coastguard Worker @interface GRPCInterceptorManager : NSObject <GRPCInterceptorInterface, GRPCResponseHandler> 188*cc02d7e2SAndroid Build Coastguard Worker 189*cc02d7e2SAndroid Build Coastguard Worker - (instancetype)init NS_UNAVAILABLE; 190*cc02d7e2SAndroid Build Coastguard Worker 191*cc02d7e2SAndroid Build Coastguard Worker + (instancetype)new NS_UNAVAILABLE; 192*cc02d7e2SAndroid Build Coastguard Worker 193*cc02d7e2SAndroid Build Coastguard Worker - (nullable instancetype)initWithFactories:(nullable NSArray<id<GRPCInterceptorFactory>> *)factories 194*cc02d7e2SAndroid Build Coastguard Worker previousInterceptor:(nullable id<GRPCResponseHandler>)previousInterceptor 195*cc02d7e2SAndroid Build Coastguard Worker transportID:(GRPCTransportID)transportID; 196*cc02d7e2SAndroid Build Coastguard Worker 197*cc02d7e2SAndroid Build Coastguard Worker /** 198*cc02d7e2SAndroid Build Coastguard Worker * Notify the manager that the interceptor has shut down and the manager should release references 199*cc02d7e2SAndroid Build Coastguard Worker * to other interceptors and stop forwarding requests/responses. 200*cc02d7e2SAndroid Build Coastguard Worker */ 201*cc02d7e2SAndroid Build Coastguard Worker - (void)shutDown; 202*cc02d7e2SAndroid Build Coastguard Worker 203*cc02d7e2SAndroid Build Coastguard Worker // Methods to forward GRPCInterceptorInterface calls to the next interceptor 204*cc02d7e2SAndroid Build Coastguard Worker 205*cc02d7e2SAndroid Build Coastguard Worker /** Notify the next interceptor in the chain to start the call and pass arguments */ 206*cc02d7e2SAndroid Build Coastguard Worker - (void)startNextInterceptorWithRequest:(GRPCRequestOptions *)requestOptions 207*cc02d7e2SAndroid Build Coastguard Worker callOptions:(GRPCCallOptions *)callOptions; 208*cc02d7e2SAndroid Build Coastguard Worker 209*cc02d7e2SAndroid Build Coastguard Worker /** Pass a message to be sent to the next interceptor in the chain */ 210*cc02d7e2SAndroid Build Coastguard Worker - (void)writeNextInterceptorWithData:(id)data; 211*cc02d7e2SAndroid Build Coastguard Worker 212*cc02d7e2SAndroid Build Coastguard Worker /** Notify the next interceptor in the chain to finish the call */ 213*cc02d7e2SAndroid Build Coastguard Worker - (void)finishNextInterceptor; 214*cc02d7e2SAndroid Build Coastguard Worker 215*cc02d7e2SAndroid Build Coastguard Worker /** Notify the next interceptor in the chain to cancel the call */ 216*cc02d7e2SAndroid Build Coastguard Worker - (void)cancelNextInterceptor; 217*cc02d7e2SAndroid Build Coastguard Worker 218*cc02d7e2SAndroid Build Coastguard Worker /** Notify the next interceptor in the chain to receive more messages */ 219*cc02d7e2SAndroid Build Coastguard Worker - (void)receiveNextInterceptorMessages:(NSUInteger)numberOfMessages; 220*cc02d7e2SAndroid Build Coastguard Worker 221*cc02d7e2SAndroid Build Coastguard Worker // Methods to forward GRPCResponseHandler callbacks to the previous object 222*cc02d7e2SAndroid Build Coastguard Worker 223*cc02d7e2SAndroid Build Coastguard Worker /** Forward initial metadata to the previous interceptor in the chain */ 224*cc02d7e2SAndroid Build Coastguard Worker - (void)forwardPreviousInterceptorWithInitialMetadata:(nullable NSDictionary *)initialMetadata; 225*cc02d7e2SAndroid Build Coastguard Worker 226*cc02d7e2SAndroid Build Coastguard Worker /** Forward a received message to the previous interceptor in the chain */ 227*cc02d7e2SAndroid Build Coastguard Worker - (void)forwardPreviousInterceptorWithData:(nullable id)data; 228*cc02d7e2SAndroid Build Coastguard Worker 229*cc02d7e2SAndroid Build Coastguard Worker /** Forward call close and trailing metadata to the previous interceptor in the chain */ 230*cc02d7e2SAndroid Build Coastguard Worker - (void)forwardPreviousInterceptorCloseWithTrailingMetadata: 231*cc02d7e2SAndroid Build Coastguard Worker (nullable NSDictionary *)trailingMetadata 232*cc02d7e2SAndroid Build Coastguard Worker error:(nullable NSError *)error; 233*cc02d7e2SAndroid Build Coastguard Worker 234*cc02d7e2SAndroid Build Coastguard Worker /** Forward write completion to the previous interceptor in the chain */ 235*cc02d7e2SAndroid Build Coastguard Worker - (void)forwardPreviousInterceptorDidWriteData; 236*cc02d7e2SAndroid Build Coastguard Worker 237*cc02d7e2SAndroid Build Coastguard Worker @end 238*cc02d7e2SAndroid Build Coastguard Worker 239*cc02d7e2SAndroid Build Coastguard Worker /** 240*cc02d7e2SAndroid Build Coastguard Worker * Base class for a gRPC interceptor. The implementation of the base class provides default behavior 241*cc02d7e2SAndroid Build Coastguard Worker * of an interceptor, which is simply forward a request/callback to the next/previous interceptor in 242*cc02d7e2SAndroid Build Coastguard Worker * the chain. The base class implementation uses the same dispatch queue for both requests and 243*cc02d7e2SAndroid Build Coastguard Worker * callbacks. 244*cc02d7e2SAndroid Build Coastguard Worker * 245*cc02d7e2SAndroid Build Coastguard Worker * An interceptor implementation should inherit from this base class and initialize the base class 246*cc02d7e2SAndroid Build Coastguard Worker * with [super initWithInterceptorManager:dispatchQueue:] for the default implementation to function 247*cc02d7e2SAndroid Build Coastguard Worker * properly. 248*cc02d7e2SAndroid Build Coastguard Worker */ 249*cc02d7e2SAndroid Build Coastguard Worker @interface GRPCInterceptor : NSObject <GRPCInterceptorInterface, GRPCResponseHandler> 250*cc02d7e2SAndroid Build Coastguard Worker 251*cc02d7e2SAndroid Build Coastguard Worker - (instancetype)init NS_UNAVAILABLE; 252*cc02d7e2SAndroid Build Coastguard Worker + (instancetype)new NS_UNAVAILABLE; 253*cc02d7e2SAndroid Build Coastguard Worker 254*cc02d7e2SAndroid Build Coastguard Worker /** 255*cc02d7e2SAndroid Build Coastguard Worker * Initialize the interceptor with the next interceptor in the chain, and provide the dispatch queue 256*cc02d7e2SAndroid Build Coastguard Worker * that this interceptor's methods are dispatched onto. 257*cc02d7e2SAndroid Build Coastguard Worker */ 258*cc02d7e2SAndroid Build Coastguard Worker - (nullable instancetype)initWithInterceptorManager:(GRPCInterceptorManager *)interceptorManager 259*cc02d7e2SAndroid Build Coastguard Worker dispatchQueue:(dispatch_queue_t)dispatchQueue; 260*cc02d7e2SAndroid Build Coastguard Worker 261*cc02d7e2SAndroid Build Coastguard Worker // Default implementation of GRPCInterceptorInterface 262*cc02d7e2SAndroid Build Coastguard Worker 263*cc02d7e2SAndroid Build Coastguard Worker - (void)startWithRequestOptions:(GRPCRequestOptions *)requestOptions 264*cc02d7e2SAndroid Build Coastguard Worker callOptions:(GRPCCallOptions *)callOptions; 265*cc02d7e2SAndroid Build Coastguard Worker - (void)writeData:(id)data; 266*cc02d7e2SAndroid Build Coastguard Worker - (void)finish; 267*cc02d7e2SAndroid Build Coastguard Worker - (void)cancel; 268*cc02d7e2SAndroid Build Coastguard Worker - (void)receiveNextMessages:(NSUInteger)numberOfMessages; 269*cc02d7e2SAndroid Build Coastguard Worker 270*cc02d7e2SAndroid Build Coastguard Worker // Default implementation of GRPCResponeHandler 271*cc02d7e2SAndroid Build Coastguard Worker 272*cc02d7e2SAndroid Build Coastguard Worker - (void)didReceiveInitialMetadata:(nullable NSDictionary *)initialMetadata; 273*cc02d7e2SAndroid Build Coastguard Worker - (void)didReceiveData:(id)data; 274*cc02d7e2SAndroid Build Coastguard Worker - (void)didCloseWithTrailingMetadata:(nullable NSDictionary *)trailingMetadata 275*cc02d7e2SAndroid Build Coastguard Worker error:(nullable NSError *)error; 276*cc02d7e2SAndroid Build Coastguard Worker - (void)didWriteData; 277*cc02d7e2SAndroid Build Coastguard Worker 278*cc02d7e2SAndroid Build Coastguard Worker @end 279*cc02d7e2SAndroid Build Coastguard Worker 280*cc02d7e2SAndroid Build Coastguard Worker NS_ASSUME_NONNULL_END 281