@@ -10,6 +10,7 @@ import Apexy
1010import Foundation
1111
1212/// API Client.
13+ @available ( macOS 10 . 15 , iOS 13 , watchOS 6 , tvOS 13 , * )
1314open class AlamofireClient : Client , CombineClient {
1415
1516 /// Session network manager.
@@ -93,43 +94,72 @@ open class AlamofireClient: Client, CombineClient {
9394 eventMonitors: eventMonitors)
9495 }
9596
96- /// Send request to specified endpoint.
97- ///
98- /// - Parameters:
99- /// - endpoint: endpoint of remote content.
100- /// - completionHandler: The completion closure to be executed when request is completed.
101- /// - Returns: The progress of fetching the response data from the server for the request.
102- open func request< T> (
103- _ endpoint: T ,
104- completionHandler: @escaping ( APIResult < T . Content > ) -> Void
105- ) -> Progress where T: Endpoint {
106-
97+ func observeResponse(
98+ dataResponse: DataResponse < Data , AFError > ,
99+ error: Error ? ) {
100+ self . responseObserver ? (
101+ dataResponse. request,
102+ dataResponse. response,
103+ dataResponse. data,
104+ error)
105+ }
106+
107+ open func request< T> ( _ endpoint: T ) async throws -> T . Content where T : Endpoint {
108+
107109 let anyRequest = AnyRequest ( create: endpoint. makeRequest)
108110 let request = sessionManager. request ( anyRequest)
109111 . validate { request, response, data in
110112 Result ( catching: { try endpoint. validate ( request, response: response, data: data) } )
111- } . responseData (
112- queue: responseQueue,
113- completionHandler: { ( response: DataResponse < Data , AFError > ) in
114-
115- let result = APIResult < T . Content > ( catching: { ( ) throws -> T . Content in
116- do {
117- let data = try response. result. get ( )
118- return try endpoint. content ( from: response. response, with: data)
119- } catch {
120- throw error. unwrapAlamofireValidationError ( )
121- }
122- } )
123-
124- self . completionQueue. async {
125- self . responseObserver ? ( response. request, response. response, response. data, result. error)
126- completionHandler ( result)
127- }
128- } )
129-
130- let progress = request. downloadProgress
131- progress. cancellationHandler = { [ weak request] in request? . cancel ( ) }
132- return progress
113+ }
114+
115+ let dataResponse = await request. serializingData ( ) . response
116+ let result = APIResult < T . Content > ( catching: { ( ) throws -> T . Content in
117+ do {
118+ let data = try dataResponse. result. get ( )
119+ return try endpoint. content ( from: dataResponse. response, with: data)
120+ } catch {
121+ throw error. unwrapAlamofireValidationError ( )
122+ }
123+ } )
124+
125+ Task . detached { [ weak self, dataResponse, result] in
126+ self ? . observeResponse ( dataResponse: dataResponse, error: result. error)
127+ }
128+
129+ return try result. get ( )
130+ }
131+
132+ open func upload< T> ( _ endpoint: T ) async throws -> T . Content where T : UploadEndpoint {
133+
134+ let urlRequest : URLRequest
135+ let body : UploadEndpointBody
136+ ( urlRequest, body) = try endpoint. makeRequest ( )
137+
138+ let request : UploadRequest
139+ switch body {
140+ case . data( let data) :
141+ request = sessionManager. upload ( data, with: urlRequest)
142+ case . file( let url) :
143+ request = sessionManager. upload ( url, with: urlRequest)
144+ case . stream( let stream) :
145+ request = sessionManager. upload ( stream, with: urlRequest)
146+ }
147+
148+ let dataResponse = await request. serializingData ( ) . response
149+ let result = APIResult < T . Content > ( catching: { ( ) throws -> T . Content in
150+ do {
151+ let data = try dataResponse. result. get ( )
152+ return try endpoint. content ( from: dataResponse. response, with: data)
153+ } catch {
154+ throw error. unwrapAlamofireValidationError ( )
155+ }
156+ } )
157+
158+ Task . detached { [ weak self, dataResponse, result] in
159+ self ? . observeResponse ( dataResponse: dataResponse, error: result. error)
160+ }
161+
162+ return try result. get ( )
133163 }
134164
135165}
0 commit comments