diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 515d141..f871bde 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,23 +12,10 @@ jobs: matrix: image: # 5.2 Stable - - swift:5.2-xenial - - swift:5.2-bionic - - swift:5.2-focal - - swift:5.2-centos8 - - swift:5.2-amazonlinux2 - # 5.2 Unstable - - swiftlang/swift:nightly-5.2-xenial - - swiftlang/swift:nightly-5.2-bionic - # 5.3 Unstable - - swiftlang/swift:nightly-5.3-xenial - - swiftlang/swift:nightly-5.3-bionic - # Master Unstable - - swiftlang/swift:nightly-master-xenial - - swiftlang/swift:nightly-master-bionic - - swiftlang/swift:nightly-master-focal - - swiftlang/swift:nightly-master-centos8 - - swiftlang/swift:nightly-master-amazonlinux2 + - swift:5.2 + - swift:5.3 + - swift:5.4 + - swift:5.5 container: ${{ matrix.image }} steps: - uses: actions/checkout@v2 diff --git a/Package.swift b/Package.swift index 57024eb..0cb96c7 100644 --- a/Package.swift +++ b/Package.swift @@ -12,11 +12,13 @@ let package = Package( dependencies: [ .package(name: "apnswift", url: "https://github.com/kylebrowning/APNSwift.git", from: "3.0.0"), .package(name: "vapor", url: "https://github.com/vapor/vapor.git", from: "4.0.0"), + .package(url: "https://github.com/apple/swift-nio.git", from: "2.33.0"), ], targets: [ .target(name: "APNS", dependencies: [ .product(name: "APNSwift", package: "apnswift"), .product(name: "Vapor", package: "vapor"), + .product(name: "NIOCore", package: "swift-nio") ]), .testTarget(name: "APNSTests", dependencies: [ .target(name: "APNS"), diff --git a/Sources/APNS/APNS+Concurrency.swift b/Sources/APNS/APNS+Concurrency.swift new file mode 100644 index 0000000..62d2e07 --- /dev/null +++ b/Sources/APNS/APNS+Concurrency.swift @@ -0,0 +1,95 @@ +#if compiler(>=5.5) && canImport(_Concurrency) +import NIOCore +import Vapor + +@available(macOS 12, iOS 15, watchOS 8, tvOS 15, *) +extension Application.APNS { + public func batchSend( + rawBytes payload: ByteBuffer, + pushType: APNSwiftConnection.PushType, + to deviceToken: String..., + expiration: Date?, + priority: Int?, + collapseIdentifier: String?, + topic: String?, + logger: Logger?, + apnsID: UUID? = nil) + async throws { + try await batchSend( + rawBytes: payload, + pushType: pushType, + to: deviceToken, + expiration: expiration, + priority: priority, + collapseIdentifier: collapseIdentifier, + topic: topic, + logger: logger, + apnsID: apnsID) + } + + public func batchSend( + rawBytes payload: ByteBuffer, + pushType: APNSwiftConnection.PushType, + to deviceToken: [String], + expiration: Date?, + priority: Int?, + collapseIdentifier: String?, + topic: String?, + logger: Logger?, + apnsID: UUID? = nil) + async throws { + try await batchSend( + rawBytes: payload, + pushType: pushType, + to: deviceToken, + expiration: expiration, + priority: priority, + collapseIdentifier: collapseIdentifier, + topic: topic, + logger: logger, + apnsID: apnsID).get() + } + + public func send( + rawBytes payload: ByteBuffer, + pushType: APNSwiftConnection.PushType, + to deviceToken: String, + expiration: Date?, + priority: Int?, + collapseIdentifier: String?, + topic: String?, + logger: Logger?, + apnsID: UUID? = nil + ) async throws { + try await self.send(rawBytes: payload, pushType: pushType, to: deviceToken, expiration: expiration, priority: priority, collapseIdentifier: collapseIdentifier, topic: topic, logger: logger, apnsID: apnsID).get() + } +} + +@available(macOS 12, iOS 15, watchOS 8, tvOS 15, *) +extension Request.APNS { + public func send( + rawBytes payload: ByteBuffer, + pushType: APNSwiftConnection.PushType, + to deviceToken: String, + expiration: Date?, + priority: Int?, + collapseIdentifier: String?, + topic: String?, + logger: Logger?, + apnsID: UUID? = nil + ) async throws { + try await send(rawBytes: payload, pushType: pushType, to: deviceToken, expiration: expiration, priority: priority, collapseIdentifier: collapseIdentifier, topic: topic, logger: logger, apnsID: apnsID).get() + } +} + +@available(macOS 12, iOS 15, watchOS 8, tvOS 15, *) +extension APNSConnectionSource { + public func makeConnection( + logger: Logger, + on eventLoop: EventLoop + ) async throws -> APNSwiftConnection { + try await APNSwiftConnection.connect(configuration: self.configuration, on: eventLoop).get() + } +} + +#endif diff --git a/Sources/APNS/APNSConnectionSource.swift b/Sources/APNS/APNSConnectionSource.swift index 2c19520..bc3472e 100644 --- a/Sources/APNS/APNSConnectionSource.swift +++ b/Sources/APNS/APNSConnectionSource.swift @@ -2,7 +2,7 @@ import AsyncKit import Logging public final class APNSConnectionSource: ConnectionPoolSource { - private let configuration: APNSwiftConfiguration + internal let configuration: APNSwiftConfiguration public init(configuration: APNSwiftConfiguration) { self.configuration = configuration