blob: 451bc5b6915f1d172ce75809abd6c19c54b75faa [file] [log] [blame]
/*
*
* Copyright 2018 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.
*
*/
#import <Foundation/Foundation.h>
#import "GRPCTypes.h"
NS_ASSUME_NONNULL_BEGIN
@protocol GRPCInterceptorFactory;
/**
* Immutable user configurable options for a gRPC call.
* Caller can obtain a mutable copy of type \b GRPCMutableCallOptions by calling [option
* mutableCopy]
*/
@interface GRPCCallOptions : NSObject <NSCopying, NSMutableCopying>
// Call parameters
/**
* The authority for the RPC. If nil, the default authority will be used.
*
* Note: This property does not have effect on Cronet transport and will be ignored.
* Note: This property cannot be used to validate a self-signed server certificate. It control the
* :authority header field of the call and performs an extra check that server's certificate
* matches the :authority header.
*/
@property(nonatomic, copy, readonly, nullable) NSString *serverAuthority;
/**
* The timeout for the RPC call in seconds. If set to 0, the call will not timeout. If set to
* positive, the gRPC call returns with status GRPCErrorCodeDeadlineExceeded if it is not completed
* within \a timeout seconds. A negative value is not allowed.
*/
@property(nonatomic, readonly) NSTimeInterval timeout;
/**
* Enable flow control of a gRPC call. The option is default to NO. If set to YES, writeData: method
* should only be called at most once before a didWriteData callback is issued, and
* receiveNextMessage: must be called each time before gRPC call issues a didReceiveMessage
* callback.
*/
@property(nonatomic, readonly) BOOL flowControlEnabled;
/**
* An array of interceptor factories. When a call starts, interceptors are created
* by these factories and chained together with the same order as the factories in
* this array. This parameter should not be modified by any interceptor and will
* not take effect if done so.
*/
@property(nonatomic, copy, readonly) NSArray<id<GRPCInterceptorFactory>> *interceptorFactories;
// OAuth2 parameters. Users of gRPC may specify one of the following two parameters.
/**
* The OAuth2 access token string. The string is prefixed with "Bearer " then used as value of the
* request's "authorization" header field. This parameter should not be used simultaneously with
* \a authTokenProvider.
*/
@property(nonatomic, copy, readonly, nullable) NSString *oauth2AccessToken;
/**
* The interface to get the OAuth2 access token string. gRPC will attempt to acquire token when
* initiating the call. This parameter should not be used simultaneously with \a oauth2AccessToken.
*/
@property(nonatomic, readonly, nullable) id<GRPCAuthorizationProtocol> authTokenProvider;
/**
* Initial metadata key-value pairs that should be included in the request.
* Dictionary key is of type NSString, value should be either NSString or NSData containing binary
* bytes data.
*/
@property(nonatomic, copy, readonly, nullable) GRPCMetadataDictionary *initialMetadata;
// Channel parameters; take into account of channel signature.
/**
* Custom string that is prefixed to a request's user-agent header field before gRPC's internal
* user-agent string.
*/
@property(nonatomic, copy, readonly, nullable) NSString *userAgentPrefix;
/**
* Custom string that is suffixed to a request's user-agent header field after gRPC's internal
* user-agent string.
*/
@property(nonatomic, copy, readonly, nullable) NSString *userAgentSuffix;
/**
* The size limit for the response received from server. If it is exceeded, an error with status
* code GRPCErrorCodeResourceExhausted is returned.
*/
@property(nonatomic, readonly) NSUInteger responseSizeLimit;
/**
* The compression algorithm to be used by the gRPC call. For more details refer to
* https://github.com/grpc/grpc/blob/master/doc/compression.md
*/
@property(nonatomic, readonly) GRPCCompressionAlgorithm compressionAlgorithm;
/**
* Enable/Disable gRPC call's retry feature. The default is enabled. For details of this feature
* refer to
* https://github.com/grpc/proposal/blob/master/A6-client-retries.md
*/
@property(nonatomic, readonly) BOOL retryEnabled;
/**
* Maximum interval in seconds between two consecutive retries.
* Internal-only property used for GTMSessionFetcher transport retry policy.
*/
@property(nonatomic, readonly) NSTimeInterval maxRetryInterval;
/**
* Minimum interval in seconds between two consecutive retries.
* Internal-only property used for GTMSessionFetcher transport retry policy.
*/
@property(nonatomic, readonly) NSTimeInterval minRetryInterval;
/**
* Multiplier used to increase the interval between retries.
* Internal-only property used for GTMSessionFetcher transport retry policy.
*/
@property(readonly) double retryFactor;
// HTTP/2 keep-alive feature. The parameter \a keepaliveInterval specifies the interval between two
// PING frames. The parameter \a keepaliveTimeout specifies the length of the period for which the
// call should wait for PING ACK. If PING ACK is not received after this period, the call fails.
// Negative values are not allowed.
@property(nonatomic, readonly) NSTimeInterval keepaliveInterval;
@property(nonatomic, readonly) NSTimeInterval keepaliveTimeout;
// Parameters for connection backoff. Negative values are not allowed.
// For details of gRPC's backoff behavior, refer to
// https://github.com/grpc/grpc/blob/master/doc/connection-backoff.md
@property(nonatomic, readonly) NSTimeInterval connectMinTimeout;
@property(nonatomic, readonly) NSTimeInterval connectInitialBackoff;
@property(nonatomic, readonly) NSTimeInterval connectMaxBackoff;
/**
* Specify channel args to be used for this call. For a list of channel args available, see
* grpc/grpc_types.h
*/
@property(nonatomic, copy, readonly, nullable) GRPCMetadataDictionary *additionalChannelArgs;
// Parameters for SSL authentication.
/**
* PEM format root certifications that is trusted. If set to nil, gRPC uses a list of default
* root certificates.
*/
@property(nonatomic, copy, readonly, nullable) NSString *PEMRootCertificates;
/**
* PEM format private key for client authentication, if required by the server.
*/
@property(nonatomic, copy, readonly, nullable) NSString *PEMPrivateKey;
/**
* PEM format certificate chain for client authentication, if required by the server.
*/
@property(nonatomic, copy, readonly, nullable) NSString *PEMCertificateChain;
/**
* Deprecated: this option is deprecated. Please use the property \a transport
* instead.
*
* Select the transport type to be used for this call.
*/
@property(nonatomic, readonly) GRPCTransportType transportType;
/**
* The transport to be used for this call. Users may choose a native transport
* identifier defined in \a GRPCTransport or provided by a non-native transport
* implementation. If the option is left to be NULL, gRPC will use its default
* transport.
*
* This is currently an experimental option.
*/
@property(nonatomic, readonly) GRPCTransportID transport;
/**
* Override the hostname during the TLS hostname validation process.
*/
@property(nonatomic, copy, readonly, nullable) NSString *hostNameOverride;
/**
* A string that specify the domain where channel is being cached. Channels with different domains
* will not get cached to the same connection.
*/
@property(nonatomic, copy, readonly, nullable) NSString *channelPoolDomain;
/**
* Channel id allows control of channel caching within a channelPoolDomain. A call with a unique
* channelID will create a new channel (connection) instead of reusing an existing one. Multiple
* calls in the same channelPoolDomain using identical channelID are allowed to share connection
* if other channel options are also the same.
*/
@property(nonatomic, readonly) NSUInteger channelID;
/**
* Hash for channel options.
*/
@property(nonatomic, readonly) NSUInteger channelOptionsHash;
/**
* Return if the channel options are equal to another object.
*/
- (BOOL)hasChannelOptionsEqualTo:(GRPCCallOptions *)callOptions;
@end
/**
* Mutable user configurable options for a gRPC call.
* Caller can obtain an immutable copy of type \b GRPCCallOptions by calling [option copy]
*/
@interface GRPCMutableCallOptions : GRPCCallOptions <NSCopying, NSMutableCopying>
// Call parameters
/**
* The authority for the RPC. If nil, the default authority will be used.
*
* Note: This property does not have effect on Cronet transport and will be ignored.
* Note: This property cannot be used to validate a self-signed server certificate. It control the
* :authority header field of the call and performs an extra check that server's certificate
* matches the :authority header.
*/
@property(nonatomic, copy, readwrite, nullable) NSString *serverAuthority;
/**
* The timeout for the RPC call in seconds. If set to 0, the call will not timeout. If set to
* positive, the gRPC call returns with status GRPCErrorCodeDeadlineExceeded if it is not completed
* within \a timeout seconds. Negative value is invalid; setting the parameter to negative value
* will reset the parameter to 0.
*/
@property(nonatomic, readwrite) NSTimeInterval timeout;
/**
* Enable flow control of a gRPC call. The option is default to NO. If set to YES, writeData: method
* should only be called at most once before a didWriteData callback is issued, and
* receiveNextMessage: must be called each time before gRPC call can issue a didReceiveMessage
* callback.
*
* If writeData: method is called more than once before issuance of a didWriteData callback, gRPC
* will continue to queue the message and write them to gRPC core in order. However, the user
* assumes their own responsibility of flow control by keeping tracking of the pending writes in
* the call.
*/
@property(nonatomic, readwrite) BOOL flowControlEnabled;
/**
* An array of interceptor factories. When a call starts, interceptors are created
* by these factories and chained together with the same order as the factories in
* this array. This parameter should not be modified by any interceptor and will
* not take effect if done so.
*/
@property(nonatomic, copy, readwrite) NSArray<id<GRPCInterceptorFactory>> *interceptorFactories;
// OAuth2 parameters. Users of gRPC may specify one of the following two parameters.
/**
* The OAuth2 access token string. The string is prefixed with "Bearer " then used as value of the
* request's "authorization" header field. This parameter should not be used simultaneously with
* \a authTokenProvider.
*/
@property(nonatomic, copy, readwrite, nullable) NSString *oauth2AccessToken;
/**
* The interface to get the OAuth2 access token string. gRPC will attempt to acquire token when
* initiating the call. This parameter should not be used simultaneously with \a oauth2AccessToken.
*/
@property(nonatomic, readwrite, nullable) id<GRPCAuthorizationProtocol> authTokenProvider;
/**
* Initial metadata key-value pairs that should be included in the request.
* Dictionary key is of type NSString, value should be either NSString or NSData containing binary
* bytes data.
*/
@property(nonatomic, nonatomic, copy, readwrite, nullable) GRPCMetadataDictionary *initialMetadata;
// Channel parameters; take into account of channel signature.
/**
* Custom string that is prefixed to a request's user-agent header field before gRPC's internal
* user-agent string.
*/
@property(nonatomic, copy, readwrite, nullable) NSString *userAgentPrefix;
/**
* Custom string that is suffixed to a request's user-agent header field after gRPC's internal
* user-agent string.
*/
@property(nonatomic, copy, readwrite, nullable) NSString *userAgentSuffix;
/**
* The size limit for the response received from server. If it is exceeded, an error with status
* code GRPCErrorCodeResourceExhausted is returned.
*/
@property(nonatomic, readwrite) NSUInteger responseSizeLimit;
/**
* The compression algorithm to be used by the gRPC call. For more details refer to
* https://github.com/grpc/grpc/blob/master/doc/compression.md
*/
@property(nonatomic, readwrite) GRPCCompressionAlgorithm compressionAlgorithm;
/**
* Enable/Disable gRPC call's retry feature. The default is enabled. For details of this feature
* refer to
* https://github.com/grpc/proposal/blob/master/A6-client-retries.md
*/
@property(nonatomic, readwrite) BOOL retryEnabled;
/**
* Maximum interval in seconds between two consecutive retries. Pass 0 to use default.
* Internal-only property used for GTMSessionFetcher transport retry policy.
*/
@property(nonatomic, readwrite) NSTimeInterval maxRetryInterval;
/**
* Minimum interval in seconds between two consecutive retries. Pass 0 to use default.
* Internal-only property used for GTMSessionFetcher transport retry policy.
*/
@property(nonatomic, readwrite) NSTimeInterval minRetryInterval;
/**
* Multiplier used to increase the interval between retries. Pass 0 to use default.
* Internal-only property used for GTMSessionFetcher transport retry policy.
*/
@property(nonatomic, readwrite) double retryFactor;
// HTTP/2 keep-alive feature. The parameter \a keepaliveInterval specifies the interval between two
// PING frames. The parameter \a keepaliveTimeout specifies the length of the period for which the
// call should wait for PING ACK. If PING ACK is not received after this period, the call fails.
// Negative values are invalid; setting these parameters to negative value will reset the
// corresponding parameter to 0.
@property(nonatomic, readwrite) NSTimeInterval keepaliveInterval;
@property(nonatomic, readwrite) NSTimeInterval keepaliveTimeout;
// Parameters for connection backoff. Negative value is invalid; setting the parameters to negative
// value will reset corresponding parameter to 0.
// For details of gRPC's backoff behavior, refer to
// https://github.com/grpc/grpc/blob/master/doc/connection-backoff.md
@property(nonatomic, readwrite) NSTimeInterval connectMinTimeout;
@property(nonatomic, readwrite) NSTimeInterval connectInitialBackoff;
@property(nonatomic, readwrite) NSTimeInterval connectMaxBackoff;
/**
* Specify channel args to be used for this call. For a list of channel args available, see
* grpc/grpc_types.h
*/
@property(nonatomic, copy, readwrite, nullable) GRPCMetadataDictionary *additionalChannelArgs;
// Parameters for SSL authentication.
/**
* PEM format root certifications that is trusted. If set to nil, gRPC uses a list of default
* root certificates.
*/
@property(nonatomic, copy, readwrite, nullable) NSString *PEMRootCertificates;
/**
* PEM format private key for client authentication, if required by the server.
*/
@property(nonatomic, copy, readwrite, nullable) NSString *PEMPrivateKey;
/**
* PEM format certificate chain for client authentication, if required by the server.
*/
@property(nonatomic, copy, readwrite, nullable) NSString *PEMCertificateChain;
/**
* Deprecated: this option is deprecated. Please use the property \a transport
* instead.
*
* Select the transport type to be used for this call.
*/
@property(nonatomic, readwrite) GRPCTransportType transportType;
/**
* The transport to be used for this call. Users may choose a native transport
* identifier defined in \a GRPCTransport or provided by a non-native ttransport
* implementation. If the option is left to be NULL, gRPC will use its default
* transport.
*
* An interceptor must not change the value of this option.
*/
@property(nonatomic, readwrite) GRPCTransportID transport;
/**
* Override the hostname during the TLS hostname validation process.
*/
@property(nonatomic, copy, readwrite, nullable) NSString *hostNameOverride;
/**
* A string that specify the domain where channel is being cached. Channels with different domains
* will not get cached to the same channel. For example, a gRPC example app may use the channel pool
* domain 'io.grpc.example' so that its calls do not reuse the channel created by other modules in
* the same process.
*/
@property(nonatomic, copy, readwrite, nullable) NSString *channelPoolDomain;
/**
* Channel id allows a call to force creating a new channel (connection) rather than using a cached
* channel. Calls using distinct channelID's will not get cached to the same channel.
*/
@property(nonatomic, readwrite) NSUInteger channelID;
@end
NS_ASSUME_NONNULL_END