@@ -9,23 +9,31 @@ public extension SCNetworkReachability {
99
1010 static func promise( ) -> Promise < Void > {
1111 do {
12- var zeroAddress = sockaddr ( )
13- zeroAddress. sa_len = UInt8 ( MemoryLayout< sockaddr> . size)
14- zeroAddress. sa_family = sa_family_t ( AF_INET)
15- guard let ref = SCNetworkReachabilityCreateWithAddress ( nil , & zeroAddress) else {
16- throw PMKError . couldNotInitializeReachability
17- }
18-
19- var flags = SCNetworkReachabilityFlags ( )
20- if SCNetworkReachabilityGetFlags ( ref, & flags) , flags. contains ( . reachable) {
12+ if let promise = try pending ( ) ? . promise {
13+ return promise
14+ } else {
2115 return Promise ( )
2216 }
23-
24- return try Helper ( ref: ref) . pending. promise
2517 } catch {
2618 return Promise ( error: error)
2719 }
2820 }
21+
22+ fileprivate static func pending( ) throws -> ( promise: Promise < Void > , resolver: Resolver < Void > ) ? {
23+ var zeroAddress = sockaddr ( )
24+ zeroAddress. sa_len = UInt8 ( MemoryLayout< sockaddr> . size)
25+ zeroAddress. sa_family = sa_family_t ( AF_INET)
26+ guard let ref = SCNetworkReachabilityCreateWithAddress ( nil , & zeroAddress) else {
27+ throw PMKError . couldNotInitializeReachability
28+ }
29+
30+ var flags = SCNetworkReachabilityFlags ( )
31+ if SCNetworkReachabilityGetFlags ( ref, & flags) , flags. contains ( . reachable) {
32+ return nil
33+ }
34+
35+ return try Helper ( ref: ref) . pending
36+ }
2937}
3038
3139private func callback( reachability: SCNetworkReachability , flags: SCNetworkReachabilityFlags , info: UnsafeMutableRawPointer ? ) {
@@ -40,6 +48,10 @@ private class Helper {
4048
4149 init ( ref: SCNetworkReachability ) throws {
4250 self . ref = ref
51+
52+ // Set 'reject' for cancellation so that the promise will be rejected if cancelled. The 'ensure' block
53+ // below will automatically clean up the callback and dispatch queue when the promise is rejected.
54+ pending. promise. setCancellableTask ( nil , reject: pending. resolver. reject)
4355
4456 var context = SCNetworkReachabilityContext ( version: 0 , info: nil , retain: nil , release: nil , copyDescription: nil )
4557 context. info = UnsafeMutableRawPointer ( Unmanaged < Helper > . passUnretained ( self ) . toOpaque ( ) )
@@ -58,3 +70,12 @@ private class Helper {
5870 }
5971 }
6072}
73+
74+ //////////////////////////////////////////////////////////// Cancellable wrapper
75+
76+ extension SCNetworkReachability {
77+ static func cancellablePromise( ) -> CancellablePromise < Void > {
78+ return cancellable ( promise ( ) )
79+ }
80+ }
81+
0 commit comments