@@ -57,6 +57,17 @@ public class Web3HttpProvider: Web3Provider {
5757 attachedKeystoreManager = manager
5858 }
5959
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+
6071 static func post< T: Decodable , U: Encodable > ( _ request: U , providerURL: URL , session: URLSession ) async throws -> T {
6172
6273 let requestData = try JSONEncoder ( ) . encode ( request)
@@ -66,7 +77,7 @@ public class Web3HttpProvider: Web3Provider {
6677 urlRequest. setValue ( " application/json " , forHTTPHeaderField: " Accept " )
6778 urlRequest. httpBody = requestData
6879
69- let ( data, _ ) = try await session . data ( for : urlRequest)
80+ let data = try await dataFrom ( session : session , request : urlRequest)
7081
7182 let parsedResponse = try JSONDecoder ( ) . decode ( T . self, from: data)
7283
@@ -89,3 +100,38 @@ public class Web3HttpProvider: Web3Provider {
89100 return try await Web3HttpProvider . post ( requests, providerURL: self . url, session: self . session)
90101 }
91102}
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