-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathNetworkInterceptorProvider.swift
More file actions
45 lines (41 loc) · 1.84 KB
/
NetworkInterceptorProvider.swift
File metadata and controls
45 lines (41 loc) · 1.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import Apollo
import ApolloAPI
import Foundation
struct NetworkInterceptorProvider: InterceptorProvider {
private let client: URLSessionClient
private let defaultHeaders: [String: String]
private let pairOfObserverInterceptors: [(before: ApolloInterceptor, after: ApolloInterceptor)]
init(
client: URLSessionClient,
defaultHeaders: [String: String],
networkObservers: [any GraphQLNetworkObserver]
) {
self.client = client
self.defaultHeaders = defaultHeaders
// Create interceptor pairs with shared context stores
self.pairOfObserverInterceptors = networkObservers.map { Self.makePair(of: $0) }
}
func interceptors<Operation: GraphQLOperation>(for operation: Operation) -> [ApolloInterceptor] {
// Headers first, then before-observers, then network fetch, then after-observers
[
RequestHeaderInterceptor(defaultHeaders: defaultHeaders)
]
+ pairOfObserverInterceptors.map(\.before) // Before network - captures timing
+ [
MaxRetryInterceptor(),
NetworkFetchInterceptor(client: client)
]
+ pairOfObserverInterceptors.map(\.after) // After network - captures response
+ [
ResponseCodeInterceptor(),
MultipartResponseParsingInterceptor(),
JSONResponseParsingInterceptor()
]
}
private static func makePair<T: GraphQLNetworkObserver>(of observer: T) -> (before: ApolloInterceptor, after: ApolloInterceptor) {
let contextStore = ObserverContextStore<T.Context>()
let beforeInterceptor = ObserverInterceptor(observer: observer, contextStore: contextStore)
let afterInterceptor = ObserverInterceptor(observer: observer, contextStore: contextStore)
return (before: beforeInterceptor, after: afterInterceptor)
}
}