| 
					
				 | 
			
			
				@@ -48,11 +48,112 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #import <Foundation/Foundation.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #import <RxLibrary/GRXWriter.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#pragma mark gRPC errors 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// Domain of NSError objects produced by gRPC. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+extern NSString *const kGRPCErrorDomain; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// gRPC error codes. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// Note that a few of these are never produced by the gRPC libraries, but are of general utility for 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// server applications to produce. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+typedef NS_ENUM(NSUInteger, GRPCErrorCode) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // The operation was cancelled (typically by the caller). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GRPCErrorCodeCancelled = 1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // Unknown error. Errors raised by APIs that do not return enough error information may be 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // converted to this error. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GRPCErrorCodeUnknown = 2, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // The client specified an invalid argument. Note that this differs from FAILED_PRECONDITION. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // INVALID_ARGUMENT indicates arguments that are problematic regardless of the state of the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // server (e.g., a malformed file name). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GRPCErrorCodeInvalidArgument = 3, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // Deadline expired before operation could complete. For operations that change the state of the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // server, this error may be returned even if the operation has completed successfully. For 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // example, a successful response from the server could have been delayed long enough for the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // deadline to expire. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GRPCErrorCodeDeadlineExceeded = 4, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // Some requested entity (e.g., file or directory) was not found. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GRPCErrorCodeNotFound = 5, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // Some entity that we attempted to create (e.g., file or directory) already exists. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GRPCErrorCodeAlreadyExists = 6, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // The caller does not have permission to execute the specified operation. PERMISSION_DENIED isn't 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // used for rejections caused by exhausting some resource (RESOURCE_EXHAUSTED is used instead for 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // those errors). PERMISSION_DENIED doesn't indicate a failure to identify the caller 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // (UNAUTHENTICATED is used instead for those errors). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GRPCErrorCodePermissionDenied = 7, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // The request does not have valid authentication credentials for the operation (e.g. the caller's 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // identity can't be verified). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GRPCErrorCodeUnauthenticated = 16, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // Some resource has been exhausted, perhaps a per-user quota. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GRPCErrorCodeResourceExhausted = 8, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // The RPC was rejected because the server is not in a state required for the procedure's 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // execution. For example, a directory to be deleted may be non-empty, etc. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // The client should not retry until the server state has been explicitly fixed (e.g. by 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // performing another RPC). The details depend on the service being called, and should be found in 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // the NSError's userInfo. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GRPCErrorCodeFailedPrecondition = 9, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // The RPC was aborted, typically due to a concurrency issue like sequencer check failures, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // transaction aborts, etc. The client should retry at a higher-level (e.g., restarting a read- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // modify-write sequence). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GRPCErrorCodeAborted = 10, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // The RPC was attempted past the valid range. E.g., enumerating past the end of a list. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // Unlike INVALID_ARGUMENT, this error indicates a problem that may be fixed if the system state 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // changes. For example, an RPC to get elements of a list will generate INVALID_ARGUMENT if asked 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // to return the element at a negative index, but it will generate OUT_OF_RANGE if asked to return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // the element at an index past the current size of the list. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GRPCErrorCodeOutOfRange = 11, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // The procedure is not implemented or not supported/enabled in this server. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GRPCErrorCodeUnimplemented = 12, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // Internal error. Means some invariant expected by the server application or the gRPC library has 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // been broken. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GRPCErrorCodeInternal = 13, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // The server is currently unavailable. This is most likely a transient condition and may be 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // corrected by retrying with a backoff. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GRPCErrorCodeUnavailable = 14, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // Unrecoverable data loss or corruption. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GRPCErrorCodeDataLoss = 15, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // Keys used in |NSError|'s |userInfo| dictionary to store the response headers and trailers sent by 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // the server. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 extern id const kGRPCHeadersKey; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 extern id const kGRPCTrailersKey; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#pragma mark GRPCCall 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// The container of the request headers of an RPC conforms to this protocol, which is a subset of 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// NSMutableDictionary's interface. It will become a NSMutableDictionary later on. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// The keys of this container are the header names, which per the HTTP standard are case- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// insensitive. They are stored in lowercase (which is how HTTP/2 mandates them on the wire), and 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// can only consist of ASCII characters. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// A header value is a NSString object (with only ASCII characters), unless the header name has the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// suffix "-bin", in which case the value has to be a NSData object. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@protocol GRPCRequestHeaders <NSObject> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@property(nonatomic, readonly) NSUInteger count; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+- (id)objectForKeyedSubscript:(NSString *)key; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+- (void)setObject:(id)obj forKeyedSubscript:(NSString *)key; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+- (void)removeAllObjects; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+- (void)removeObjectForKey:(NSString *)key; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@end 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // Represents a single gRPC remote call. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @interface GRPCCall : GRXWriter 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -68,10 +169,8 @@ extern id const kGRPCTrailersKey; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // After the call is started, trying to modify this property is an error. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// For convenience, the property is initialized to an empty NSMutableDictionary, and the setter 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// accepts (and copies) both mutable and immutable dictionaries. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-- (NSMutableDictionary *)requestHeaders; // nonatomic 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-- (void)setRequestHeaders:(NSDictionary *)requestHeaders; // nonatomic, copy 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// The property is initialized to an empty NSMutableDictionary. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@property(atomic, readonly) id<GRPCRequestHeaders> requestHeaders; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // This dictionary is populated with the HTTP headers received from the server. This happens before 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // any response message is received from the server. It has the same structure as the request 
			 |