@@ -57,6 +57,17 @@ public class Web3HttpProvider: Web3Provider {
57
57
attachedKeystoreManager = manager
58
58
}
59
59
60
+ fileprivate static func dataFrom( session: URLSession , request urlRequest: URLRequest ) async throws -> Data {
61
+ if #available( macOS 12 . 0 , iOS 15 . 0 , watchOS 8 . 0 , tvOS 15 . 0 , * ) {
62
+ let ( data, _) = try await session. data ( for: urlRequest)
63
+ return data
64
+ } else {
65
+ let ( data, _) = try await session. data ( forRequest: urlRequest)
66
+ // Fallback on earlier versions
67
+ return data
68
+ }
69
+ }
70
+
60
71
static func post< T: Decodable , U: Encodable > ( _ request: U , providerURL: URL , session: URLSession ) async throws -> T {
61
72
62
73
let requestData = try JSONEncoder ( ) . encode ( request)
@@ -66,7 +77,7 @@ public class Web3HttpProvider: Web3Provider {
66
77
urlRequest. setValue ( " application/json " , forHTTPHeaderField: " Accept " )
67
78
urlRequest. httpBody = requestData
68
79
69
- let ( data, _ ) = try await session . data ( for : urlRequest)
80
+ let data = try await dataFrom ( session : session , request : urlRequest)
70
81
71
82
let parsedResponse = try JSONDecoder ( ) . decode ( T . self, from: data)
72
83
@@ -89,3 +100,38 @@ public class Web3HttpProvider: Web3Provider {
89
100
return try await Web3HttpProvider . post ( requests, providerURL: self . url, session: self . session)
90
101
}
91
102
}
103
+
104
+ @available ( iOS, deprecated: 15.0 , message: " Use the built-in API instead " )
105
+ extension URLSession {
106
+ func data( fromUrl url: URL ) async throws -> ( Data , URLResponse ) {
107
+ try await withCheckedThrowingContinuation { continuation in
108
+ let task = self . dataTask ( with: url) { data, response, error in
109
+ guard let data = data, let response = response else {
110
+ let error = error ?? URLError ( . badServerResponse)
111
+ return continuation. resume ( throwing: error)
112
+ }
113
+
114
+ continuation. resume ( returning: ( data, response) )
115
+ }
116
+
117
+ task. resume ( )
118
+ }
119
+ }
120
+
121
+ func data( forRequest request: URLRequest ) async throws -> ( Data , URLResponse ) {
122
+ var dataTask : URLSessionDataTask ?
123
+
124
+ return try await withCheckedThrowingContinuation { continuation in
125
+ dataTask = self . dataTask ( with: request) { data, response, error in
126
+ guard let data = data, let response = response else {
127
+ let error = error ?? URLError ( . badServerResponse)
128
+ return continuation. resume ( throwing: error)
129
+ }
130
+
131
+ continuation. resume ( returning: ( data, response) )
132
+ }
133
+
134
+ dataTask? . resume ( )
135
+ }
136
+ }
137
+ }
0 commit comments