Skip to content

Commit e726e36

Browse files
authored
Move availability inline (#105)
Motivation: It's hard for packages to incrementally adopt gRPC with platforms in the package manifest as it requires packages to include platforms in their manifest or mint a new major version. Modifications: - Move platform availability onto source code - Check annotations in CI Result: Easier to adopt
1 parent 4c96199 commit e726e36

File tree

108 files changed

+379
-22
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

108 files changed

+379
-22
lines changed

.github/workflows/main.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@ jobs:
1313
with:
1414
linux_5_9_enabled: false
1515
linux_5_10_enabled: false
16-
linux_6_0_arguments_override: "--explicit-target-dependency-import-check error -Xswiftc -warnings-as-errors"
17-
linux_6_1_arguments_override: "--explicit-target-dependency-import-check error -Xswiftc -warnings-as-errors"
18-
linux_nightly_next_arguments_override: "--explicit-target-dependency-import-check error -Xswiftc -warnings-as-errors"
19-
linux_nightly_main_arguments_override: "--explicit-target-dependency-import-check error -Xswiftc -warnings-as-errors"
16+
linux_6_0_arguments_override: "--explicit-target-dependency-import-check error -Xswiftc -warnings-as-errors -Xswiftc -require-explicit-availability"
17+
linux_6_1_arguments_override: "--explicit-target-dependency-import-check error -Xswiftc -warnings-as-errors -Xswiftc -require-explicit-availability"
18+
linux_nightly_next_arguments_override: "--explicit-target-dependency-import-check error -Xswiftc -warnings-as-errors -Xswiftc -require-explicit-availability"
19+
linux_nightly_main_arguments_override: "--explicit-target-dependency-import-check error -Xswiftc -warnings-as-errors -Xswiftc -require-explicit-availability"
2020

2121
construct-integration-tests-matrix:
2222
name: Construct integration matrix

.github/workflows/pull_request.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@ jobs:
2222
with:
2323
linux_5_9_enabled: false
2424
linux_5_10_enabled: false
25-
linux_6_0_arguments_override: "--explicit-target-dependency-import-check error -Xswiftc -warnings-as-errors"
26-
linux_6_1_arguments_override: "--explicit-target-dependency-import-check error -Xswiftc -warnings-as-errors"
27-
linux_nightly_next_arguments_override: "--explicit-target-dependency-import-check error -Xswiftc -warnings-as-errors"
28-
linux_nightly_main_arguments_override: "--explicit-target-dependency-import-check error -Xswiftc -warnings-as-errors"
25+
linux_6_0_arguments_override: "--explicit-target-dependency-import-check error -Xswiftc -warnings-as-errors -Xswiftc -require-explicit-availability"
26+
linux_6_1_arguments_override: "--explicit-target-dependency-import-check error -Xswiftc -warnings-as-errors -Xswiftc -require-explicit-availability"
27+
linux_nightly_next_arguments_override: "--explicit-target-dependency-import-check error -Xswiftc -warnings-as-errors -Xswiftc -require-explicit-availability"
28+
linux_nightly_main_arguments_override: "--explicit-target-dependency-import-check error -Xswiftc -warnings-as-errors -Xswiftc -require-explicit-availability"
2929

3030
construct-integration-tests-matrix:
3131
name: Construct integration matrix

Package.swift

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ let products: [Product] = [
3535
let dependencies: [Package.Dependency] = [
3636
.package(
3737
url: "https://github.com/grpc/grpc-swift.git",
38-
from: "2.2.0"
38+
from: "2.2.1"
3939
),
4040
.package(
4141
url: "https://github.com/apple/swift-nio.git",
@@ -67,12 +67,28 @@ let dependencies: [Package.Dependency] = [
6767
),
6868
]
6969

70-
let defaultSwiftSettings: [SwiftSetting] = [
71-
.swiftLanguageMode(.v6),
72-
.enableUpcomingFeature("ExistentialAny"),
73-
.enableUpcomingFeature("InternalImportsByDefault"),
74-
.enableUpcomingFeature("MemberImportVisibility"),
75-
]
70+
// -------------------------------------------------------------------------------------------------
71+
72+
// This adds some build settings which allow us to map "@available(gRPCSwiftNIOTransport 1.x, *)" to
73+
// the appropriate OS platforms.
74+
let nextMinorVersion = 3
75+
let availabilitySettings: [SwiftSetting] = (0 ... nextMinorVersion).map { minor in
76+
let name = "gRPCSwiftNIOTransport"
77+
let version = "1.\(minor)"
78+
let platforms = "macOS 15.0, iOS 18.0, watchOS 11.0, tvOS 18.0, visionOS 2.0"
79+
let setting = "AvailabilityMacro=\(name) \(version):\(platforms)"
80+
return .enableExperimentalFeature(setting)
81+
}
82+
83+
let defaultSwiftSettings: [SwiftSetting] =
84+
availabilitySettings + [
85+
.swiftLanguageMode(.v6),
86+
.enableUpcomingFeature("ExistentialAny"),
87+
.enableUpcomingFeature("InternalImportsByDefault"),
88+
.enableUpcomingFeature("MemberImportVisibility"),
89+
]
90+
91+
// -------------------------------------------------------------------------------------------------
7692

7793
let targets: [Target] = [
7894
// C-module for z-lib shims
@@ -156,13 +172,6 @@ let targets: [Target] = [
156172

157173
let package = Package(
158174
name: "grpc-swift-nio-transport",
159-
platforms: [
160-
.macOS(.v15),
161-
.iOS(.v18),
162-
.tvOS(.v18),
163-
.watchOS(.v11),
164-
.visionOS(.v2),
165-
],
166175
products: products,
167176
dependencies: dependencies,
168177
targets: targets

Sources/GRPCNIOTransportCore/Client/Connection/Connection.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ private import Synchronization
4343
/// }
4444
/// }
4545
/// ```
46+
@available(gRPCSwiftNIOTransport 1.0, *)
4647
package final class Connection: Sendable {
4748
/// Events which can happen over the lifetime of the connection.
4849
package enum Event: Sendable {
@@ -405,6 +406,7 @@ package final class Connection: Sendable {
405406
}
406407
}
407408

409+
@available(gRPCSwiftNIOTransport 1.0, *)
408410
extension Connection {
409411
package struct Stream {
410412
package typealias Inbound = NIOAsyncChannelInboundStream<RPCResponsePart<GRPCNIOTransportBytes>>
@@ -478,6 +480,7 @@ extension Connection {
478480
}
479481
}
480482

483+
@available(gRPCSwiftNIOTransport 1.0, *)
481484
extension Connection {
482485
private enum State: Sendable {
483486
/// The connection is idle or connecting.

Sources/GRPCNIOTransportCore/Client/Connection/ConnectionBackoff.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
* limitations under the License.
1515
*/
1616

17+
@available(gRPCSwiftNIOTransport 1.0, *)
1718
package struct ConnectionBackoff {
1819
package var initial: Duration
1920
package var max: Duration

Sources/GRPCNIOTransportCore/Client/Connection/ConnectionFactory.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package import NIOCore
1818
package import NIOHTTP2
1919
internal import NIOPosix
2020

21+
@available(gRPCSwiftNIOTransport 1.0, *)
2122
package protocol HTTP2Connector: Sendable {
2223
/// Attempt to establish a connection to the given address.
2324
///
@@ -30,6 +31,7 @@ package protocol HTTP2Connector: Sendable {
3031
) async throws -> HTTP2Connection
3132
}
3233

34+
@available(gRPCSwiftNIOTransport 1.0, *)
3335
package struct HTTP2Connection: Sendable {
3436
/// The underlying TCP connection wrapped up for use with gRPC.
3537
var channel: NIOAsyncChannel<ClientConnectionEvent, Void>

Sources/GRPCNIOTransportCore/Client/Connection/ConnectivityState.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package import GRPCCore
1818

19+
@available(gRPCSwiftNIOTransport 1.0, *)
1920
package enum ConnectivityState: Sendable, Hashable {
2021
/// This channel isn't trying to create a connection because of a lack of new or pending RPCs.
2122
///

Sources/GRPCNIOTransportCore/Client/Connection/GRPCChannel.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ private import DequeModule
1818
package import GRPCCore
1919
private import Synchronization
2020

21+
@available(gRPCSwiftNIOTransport 1.0, *)
2122
package final class GRPCChannel: ClientTransport {
2223
package typealias Bytes = GRPCNIOTransportBytes
2324

@@ -239,6 +240,7 @@ package final class GRPCChannel: ClientTransport {
239240
}
240241
}
241242

243+
@available(gRPCSwiftNIOTransport 1.0, *)
242244
extension GRPCChannel {
243245
package struct Config: Sendable {
244246
/// Configuration for HTTP/2 connections.
@@ -267,6 +269,7 @@ extension GRPCChannel {
267269
}
268270
}
269271

272+
@available(gRPCSwiftNIOTransport 1.0, *)
270273
extension GRPCChannel {
271274
enum MakeStreamResult {
272275
/// A stream was created, use it.
@@ -365,6 +368,7 @@ extension GRPCChannel {
365368
}
366369
}
367370

371+
@available(gRPCSwiftNIOTransport 1.0, *)
368372
extension GRPCChannel {
369373
private func handleClose(in group: inout DiscardingTaskGroup) {
370374
switch self.state.withLock({ $0.close() }) {
@@ -593,6 +597,7 @@ extension GRPCChannel {
593597
}
594598
}
595599

600+
@available(gRPCSwiftNIOTransport 1.0, *)
596601
extension GRPCChannel {
597602
struct StateMachine {
598603
enum State {
@@ -667,6 +672,7 @@ extension GRPCChannel {
667672
}
668673
}
669674

675+
@available(gRPCSwiftNIOTransport 1.0, *)
670676
extension GRPCChannel.StateMachine {
671677
mutating func start() {
672678
precondition(!self.running, "channel must only be started once")

Sources/GRPCNIOTransportCore/Client/Connection/LoadBalancers/LoadBalancer.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@
1414
* limitations under the License.
1515
*/
1616

17+
@available(gRPCSwiftNIOTransport 1.0, *)
1718
package enum LoadBalancer: Sendable {
1819
case roundRobin(RoundRobinLoadBalancer)
1920
case pickFirst(PickFirstLoadBalancer)
2021
}
2122

23+
@available(gRPCSwiftNIOTransport 1.0, *)
2224
extension LoadBalancer {
2325
package init(_ loadBalancer: RoundRobinLoadBalancer) {
2426
self = .roundRobin(loadBalancer)

Sources/GRPCNIOTransportCore/Client/Connection/LoadBalancers/LoadBalancerEvent.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616

1717
/// Events emitted by load-balancers.
18+
@available(gRPCSwiftNIOTransport 1.0, *)
1819
package enum LoadBalancerEvent: Sendable, Hashable {
1920
/// The connectivity state of the subchannel changed.
2021
case connectivityStateChanged(ConnectivityState)

Sources/GRPCNIOTransportCore/Client/Connection/LoadBalancers/PickFirstLoadBalancer.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ private import Synchronization
5656
/// }
5757
/// }
5858
/// ```
59+
@available(gRPCSwiftNIOTransport 1.0, *)
5960
package final class PickFirstLoadBalancer: Sendable {
6061
enum Input: Sendable, Hashable {
6162
/// Update the addresses used by the load balancer to the following endpoints.
@@ -170,6 +171,7 @@ package final class PickFirstLoadBalancer: Sendable {
170171
}
171172
}
172173

174+
@available(gRPCSwiftNIOTransport 1.0, *)
173175
extension PickFirstLoadBalancer {
174176
private func handleUpdateEndpoint(_ endpoint: Endpoint, in group: inout DiscardingTaskGroup) {
175177
if endpoint.addresses.isEmpty { return }
@@ -271,6 +273,7 @@ extension PickFirstLoadBalancer {
271273
}
272274
}
273275

276+
@available(gRPCSwiftNIOTransport 1.0, *)
274277
extension PickFirstLoadBalancer {
275278
enum State: Sendable {
276279
case active(Active)
@@ -283,6 +286,7 @@ extension PickFirstLoadBalancer {
283286
}
284287
}
285288

289+
@available(gRPCSwiftNIOTransport 1.0, *)
286290
extension PickFirstLoadBalancer.State {
287291
struct Active: Sendable {
288292
var endpoint: Endpoint?
@@ -311,6 +315,7 @@ extension PickFirstLoadBalancer.State {
311315
}
312316
}
313317

318+
@available(gRPCSwiftNIOTransport 1.0, *)
314319
extension PickFirstLoadBalancer.State.Active {
315320
mutating func updateEndpoint(
316321
_ endpoint: Endpoint,
@@ -480,6 +485,7 @@ extension PickFirstLoadBalancer.State.Active {
480485
}
481486
}
482487

488+
@available(gRPCSwiftNIOTransport 1.0, *)
483489
extension PickFirstLoadBalancer.State.Closing {
484490
mutating func updateSubchannelConnectivityState(
485491
_ connectivityState: ConnectivityState,
@@ -520,6 +526,7 @@ extension PickFirstLoadBalancer.State.Closing {
520526
}
521527
}
522528

529+
@available(gRPCSwiftNIOTransport 1.0, *)
523530
extension PickFirstLoadBalancer.State {
524531
enum OnUpdateEndpoint {
525532
case connect(Subchannel, close: Subchannel?)

Sources/GRPCNIOTransportCore/Client/Connection/LoadBalancers/RoundRobinLoadBalancer.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ private import NIOConcurrencyHelpers
5858
/// }
5959
/// }
6060
/// ```
61+
@available(gRPCSwiftNIOTransport 1.0, *)
6162
package final class RoundRobinLoadBalancer: Sendable {
6263
enum Input: Sendable, Hashable {
6364
/// Update the addresses used by the load balancer to the following endpoints.
@@ -203,6 +204,7 @@ package final class RoundRobinLoadBalancer: Sendable {
203204
}
204205
}
205206

207+
@available(gRPCSwiftNIOTransport 1.0, *)
206208
extension RoundRobinLoadBalancer {
207209
/// Handles an update in endpoints.
208210
///
@@ -345,6 +347,7 @@ extension RoundRobinLoadBalancer {
345347
}
346348
}
347349

350+
@available(gRPCSwiftNIOTransport 1.0, *)
348351
extension RoundRobinLoadBalancer {
349352
private enum State {
350353
case active(Active)
@@ -738,6 +741,7 @@ extension RoundRobinLoadBalancer {
738741
}
739742
}
740743

744+
@available(gRPCSwiftNIOTransport 1.0, *)
741745
extension ConnectivityState {
742746
static func aggregate(_ states: some Collection<ConnectivityState>) -> ConnectivityState {
743747
// See https://github.com/grpc/grpc/blob/7f664c69b2a636386fbf95c16bc78c559734ce0f/doc/load-balancing.md

Sources/GRPCNIOTransportCore/Client/Connection/LoadBalancers/Subchannel.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ private import Synchronization
4343
/// }
4444
/// }
4545
/// ```
46+
@available(gRPCSwiftNIOTransport 1.0, *)
4647
package final class Subchannel: Sendable {
4748
package enum Event: Sendable, Hashable {
4849
/// The connection received a GOAWAY and will close soon. No new streams
@@ -122,6 +123,7 @@ package final class Subchannel: Sendable {
122123
}
123124
}
124125

126+
@available(gRPCSwiftNIOTransport 1.0, *)
125127
extension Subchannel {
126128
/// A stream of events which can happen to the subchannel.
127129
package var events: AsyncStream<Event> {
@@ -194,6 +196,7 @@ extension Subchannel {
194196
}
195197
}
196198

199+
@available(gRPCSwiftNIOTransport 1.0, *)
197200
extension Subchannel {
198201
private func handleConnectInput(in group: inout DiscardingTaskGroup) {
199202
let connection = self.state.withLock { state in
@@ -379,6 +382,7 @@ extension Subchannel {
379382
}
380383
}
381384

385+
@available(gRPCSwiftNIOTransport 1.0, *)
382386
extension Subchannel {
383387
/// ```
384388
/// ┌───────────────┐

Sources/GRPCNIOTransportCore/Client/Connection/RequestQueue.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
internal import DequeModule
1818

19+
@available(gRPCSwiftNIOTransport 1.0, *)
1920
struct RequestQueue<Element> {
2021
typealias Continuation = CheckedContinuation<Element, any Error>
2122

Sources/GRPCNIOTransportCore/Client/GRPCClientStreamHandler.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ internal import GRPCCore
1818
internal import NIOCore
1919
internal import NIOHTTP2
2020

21+
@available(gRPCSwiftNIOTransport 1.0, *)
2122
final class GRPCClientStreamHandler: ChannelDuplexHandler {
2223
typealias InboundIn = HTTP2Frame.FramePayload
2324
typealias InboundOut = RPCResponsePart<GRPCNIOTransportBytes>
@@ -58,6 +59,7 @@ final class GRPCClientStreamHandler: ChannelDuplexHandler {
5859

5960
// - MARK: ChannelInboundHandler
6061

62+
@available(gRPCSwiftNIOTransport 1.0, *)
6163
extension GRPCClientStreamHandler {
6264
func channelRead(context: ChannelHandlerContext, data: NIOAny) {
6365
self.isReading = true
@@ -178,6 +180,7 @@ extension GRPCClientStreamHandler {
178180

179181
// - MARK: ChannelOutboundHandler
180182

183+
@available(gRPCSwiftNIOTransport 1.0, *)
181184
extension GRPCClientStreamHandler {
182185
func write(context: ChannelHandlerContext, data: NIOAny, promise: EventLoopPromise<Void>?) {
183186
switch self.unwrapOutboundIn(data) {

Sources/GRPCNIOTransportCore/Client/HTTP2ClientTransport.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,16 @@ public import GRPCCore
1818
public import NIOCore
1919

2020
/// A namespace for the HTTP/2 client transport.
21+
@available(gRPCSwiftNIOTransport 1.0, *)
2122
public enum HTTP2ClientTransport {}
2223

24+
@available(gRPCSwiftNIOTransport 1.0, *)
2325
extension HTTP2ClientTransport {
2426
/// A namespace for HTTP/2 client transport configuration.
2527
public enum Config {}
2628
}
2729

30+
@available(gRPCSwiftNIOTransport 1.0, *)
2831
extension HTTP2ClientTransport.Config {
2932
public struct Compression: Sendable, Hashable {
3033
/// The default algorithm used for compressing outbound messages.

0 commit comments

Comments
 (0)