|
|
@@ -0,0 +1,147 @@
|
|
|
+/*
|
|
|
+ * Copyright 2024, gRPC Authors All rights reserved.
|
|
|
+ *
|
|
|
+ * 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 GRPCCore
|
|
|
+
|
|
|
+/// A namespace for the HTTP/2 client transport.
|
|
|
+public enum HTTP2ClientTransport {}
|
|
|
+
|
|
|
+extension HTTP2ClientTransport {
|
|
|
+ /// A namespace for HTTP/2 client transport configuration.
|
|
|
+ public enum Config {}
|
|
|
+}
|
|
|
+
|
|
|
+extension HTTP2ClientTransport.Config {
|
|
|
+ public struct Compression: Sendable {
|
|
|
+ /// The default algorithm used for compressing outbound messages.
|
|
|
+ ///
|
|
|
+ /// This can be overridden on a per-call basis via ``CallOptions``.
|
|
|
+ public var algorithm: CompressionAlgorithm
|
|
|
+
|
|
|
+ /// Compression algorithms enabled for inbound messages.
|
|
|
+ ///
|
|
|
+ /// - Note: ``CompressionAlgorithm/none`` is always supported, even if it isn't set here.
|
|
|
+ public var enabledAlgorithms: CompressionAlgorithmSet
|
|
|
+
|
|
|
+ /// Creates a new compression configuration.
|
|
|
+ ///
|
|
|
+ /// - SeeAlso: ``defaults``.
|
|
|
+ public init(algorithm: CompressionAlgorithm, enabledAlgorithms: CompressionAlgorithmSet) {
|
|
|
+ self.algorithm = algorithm
|
|
|
+ self.enabledAlgorithms = enabledAlgorithms
|
|
|
+ }
|
|
|
+
|
|
|
+ /// Default values, compression is disabled.
|
|
|
+ public static var defaults: Self {
|
|
|
+ Self(algorithm: .none, enabledAlgorithms: .none)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @available(macOS 13.0, iOS 16.0, watchOS 9.0, tvOS 16.0, *)
|
|
|
+ public struct Keepalive: Sendable {
|
|
|
+ /// The amount of time to wait after reading data before sending a keepalive ping.
|
|
|
+ ///
|
|
|
+ /// - Note: The transport may choose to increase this value if it is less than 10 seconds.
|
|
|
+ public var time: Duration
|
|
|
+
|
|
|
+ /// The amount of time the server has to respond to a keepalive ping before the connection
|
|
|
+ /// is closed.
|
|
|
+ public var timeout: Duration
|
|
|
+
|
|
|
+ /// Whether the client sends keepalive pings when there are no calls in progress.
|
|
|
+ public var permitWithoutCalls: Bool
|
|
|
+
|
|
|
+ /// Creates a new keepalive configuration.
|
|
|
+ public init(time: Duration, timeout: Duration, permitWithoutCalls: Bool) {
|
|
|
+ self.time = time
|
|
|
+ self.timeout = timeout
|
|
|
+ self.permitWithoutCalls = permitWithoutCalls
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @available(macOS 13.0, iOS 16.0, watchOS 9.0, tvOS 16.0, *)
|
|
|
+ public struct Idle: Sendable {
|
|
|
+ /// The maximum amount of time a connection may be idle before it's closed.
|
|
|
+ public var maxTime: Duration
|
|
|
+
|
|
|
+ /// Creates an idle configuration.
|
|
|
+ public init(maxTime: Duration) {
|
|
|
+ self.maxTime = maxTime
|
|
|
+ }
|
|
|
+
|
|
|
+ /// Default values, a 30 minute max idle time.
|
|
|
+ public static var defaults: Self {
|
|
|
+ Self(maxTime: .seconds(30 * 60))
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @available(macOS 13.0, iOS 16.0, watchOS 9.0, tvOS 16.0, *)
|
|
|
+ public struct Backoff: Sendable {
|
|
|
+ /// The initial duration to wait before reattempting to establish a connection.
|
|
|
+ public var initial: Duration
|
|
|
+
|
|
|
+ /// The maximum duration to wait (before jitter is applied) to wait between connect attempts.
|
|
|
+ public var max: Duration
|
|
|
+
|
|
|
+ /// The scaling factor applied to the backoff duration between connect attempts.
|
|
|
+ public var multiplier: Double
|
|
|
+
|
|
|
+ /// An amount to randomize the backoff by.
|
|
|
+ ///
|
|
|
+ /// If backoff is computed to be 10 seconds and jitter is set to `0.2`, then the amount of
|
|
|
+ /// jitter will be selected randomly from the range `-0.2 ✕ 10` seconds to `0.2 ✕ 10` seconds.
|
|
|
+ /// The resulting backoff will therefore be between 8 seconds and 12 seconds.
|
|
|
+ public var jitter: Double
|
|
|
+
|
|
|
+ /// Creates a new backoff configuration.
|
|
|
+ public init(initial: Duration, max: Duration, multiplier: Double, jitter: Double) {
|
|
|
+ self.initial = initial
|
|
|
+ self.max = max
|
|
|
+ self.multiplier = multiplier
|
|
|
+ self.jitter = jitter
|
|
|
+ }
|
|
|
+
|
|
|
+ /// Default values, initial backoff is one second and maximum back off is two minutes. The
|
|
|
+ /// multiplier is `1.6` and the jitter is set to `0.2`.
|
|
|
+ public static var defaults: Self {
|
|
|
+ Self(initial: .seconds(1), max: .seconds(120), multiplier: 1.6, jitter: 0.2)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public struct HTTP2: Sendable {
|
|
|
+ /// The max frame size, in bytes.
|
|
|
+ ///
|
|
|
+ /// The actual value used is clamped to `(1 << 14) ... (1 << 24) - 1` (the min and max values
|
|
|
+ /// allowed by RFC 9113 § 6.5.2).
|
|
|
+ public var maxFrameSize: Int
|
|
|
+
|
|
|
+ /// The target flow control window size, in bytes.
|
|
|
+ ///
|
|
|
+ /// The value is clamped to `... (1 << 31) - 1`.
|
|
|
+ public var targetWindowSize: Int
|
|
|
+
|
|
|
+ /// Creates a new HTTP/2 configuration.
|
|
|
+ public init(maxFrameSize: Int, targetWindowSize: Int) {
|
|
|
+ self.maxFrameSize = maxFrameSize
|
|
|
+ self.targetWindowSize = targetWindowSize
|
|
|
+ }
|
|
|
+
|
|
|
+ /// Default values, max frame size is 16KiB, and the target window size is 8MiB.
|
|
|
+ public static var defaults: Self {
|
|
|
+ Self(maxFrameSize: 1 << 14, targetWindowSize: 8 * 1024 * 1024)
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|