@@ -18,7 +18,7 @@ public protocol GraphQLAPIAdapterProtocol: AnyObject {
1818 queue: DispatchQueue ,
1919 resultHandler: @escaping ( Result < Query . Data , GraphQLAPIAdapterError > ) -> Void
2020 ) -> Cancellable
21-
21+
2222 /// Performs a mutation by sending it to the server.
2323 ///
2424 /// - Parameters:
@@ -38,14 +38,42 @@ public protocol GraphQLAPIAdapterProtocol: AnyObject {
3838public final class GraphQLAPIAdapter : GraphQLAPIAdapterProtocol {
3939 private let apollo : ApolloClientProtocol
4040
41+ public init < each Observer : GraphQLNetworkObserver > (
42+ url: URL ,
43+ urlSessionConfiguration: URLSessionConfiguration = . default,
44+ defaultHeaders: [ String : String ] = [ : ] ,
45+ networkObservers: repeat each Observer
46+ ) {
47+ var observers : [ any GraphQLNetworkObserver ] = [ ]
48+ repeat observers. append ( each networkObservers)
49+
50+ let provider = NetworkInterceptorProvider (
51+ client: URLSessionClient ( sessionConfiguration: urlSessionConfiguration) ,
52+ defaultHeaders: defaultHeaders,
53+ networkObservers: observers
54+ )
55+
56+ let networkTransport = RequestChainNetworkTransport (
57+ interceptorProvider: provider,
58+ endpointURL: url
59+ )
60+
61+ self . apollo = ApolloClient (
62+ networkTransport: networkTransport,
63+ store: ApolloStore ( )
64+ )
65+ }
66+
4167 public init (
4268 url: URL ,
4369 urlSessionConfiguration: URLSessionConfiguration = . default,
44- defaultHeaders: [ String : String ] = [ : ]
70+ defaultHeaders: [ String : String ] = [ : ] ,
71+ networkObservers: [ any GraphQLNetworkObserver ]
4572 ) {
4673 let provider = NetworkInterceptorProvider (
4774 client: URLSessionClient ( sessionConfiguration: urlSessionConfiguration) ,
48- defaultHeaders: defaultHeaders
75+ defaultHeaders: defaultHeaders,
76+ networkObservers: networkObservers
4977 )
5078
5179 let networkTransport = RequestChainNetworkTransport (
@@ -64,7 +92,7 @@ public final class GraphQLAPIAdapter: GraphQLAPIAdapterProtocol {
6492 context: RequestHeaders ? ,
6593 queue: DispatchQueue ,
6694 resultHandler: @escaping ( Result < Query . Data , GraphQLAPIAdapterError > ) -> Void
67- ) -> Cancellable where Query : GraphQLQuery {
95+ ) -> Cancellable where Query: GraphQLQuery {
6896 apollo. fetch (
6997 query: query,
7098 cachePolicy: . fetchIgnoringCacheCompletely,
@@ -92,7 +120,7 @@ public final class GraphQLAPIAdapter: GraphQLAPIAdapterProtocol {
92120 context: RequestHeaders ? ,
93121 queue: DispatchQueue ,
94122 resultHandler: @escaping ( Result < Mutation . Data , GraphQLAPIAdapterError > ) -> Void
95- ) -> Cancellable where Mutation : GraphQLMutation {
123+ ) -> Cancellable where Mutation: GraphQLMutation {
96124 apollo. perform (
97125 mutation: mutation,
98126 publishResultToStore: false ,
@@ -114,50 +142,3 @@ public final class GraphQLAPIAdapter: GraphQLAPIAdapterProtocol {
114142 }
115143 }
116144}
117-
118- private struct NetworkInterceptorProvider : InterceptorProvider {
119- private let client : URLSessionClient
120- private let defaultHeaders : [ String : String ]
121-
122- init ( client: URLSessionClient , defaultHeaders: [ String : String ] ) {
123- self . client = client
124- self . defaultHeaders = defaultHeaders
125- }
126-
127- func interceptors< Operation: GraphQLOperation > ( for operation: Operation ) -> [ ApolloInterceptor ] {
128- [
129- RequestHeaderInterceptor ( defaultHeaders: defaultHeaders) ,
130- MaxRetryInterceptor ( ) ,
131- NetworkFetchInterceptor ( client: self . client) ,
132- ResponseCodeInterceptor ( ) ,
133- MultipartResponseParsingInterceptor ( ) ,
134- JSONResponseParsingInterceptor ( )
135- ]
136- }
137- }
138-
139- private struct RequestHeaderInterceptor : ApolloInterceptor {
140- var id : String = UUID ( ) . uuidString
141-
142- private let defaultHeaders : [ String : String ]
143-
144- init ( defaultHeaders: [ String : String ] ) {
145- self . defaultHeaders = defaultHeaders
146- }
147-
148- func interceptAsync< Operation: GraphQLOperation > (
149- chain: RequestChain ,
150- request: HTTPRequest < Operation > ,
151- response: HTTPResponse < Operation > ? ,
152- completion: @escaping ( Result < GraphQLResult < Operation . Data > , Error > ) -> Void
153- ) {
154- defaultHeaders. forEach { request. addHeader ( name: $0. key, value: $0. value) }
155- if let additionalHeaders = request. context as? RequestHeaders {
156- additionalHeaders. additionalHeaders. forEach { request. addHeader ( name: $0. key, value: $0. value) }
157- }
158-
159- chain. proceedAsync ( request: request, response: response, interceptor: self , completion: completion)
160- }
161- }
162-
163-
0 commit comments