-
Notifications
You must be signed in to change notification settings - Fork 17
Expand file tree
/
Copy pathHttpSplitFetcher.swift
More file actions
56 lines (45 loc) · 2.21 KB
/
HttpSplitFetcher.swift
File metadata and controls
56 lines (45 loc) · 2.21 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
46
47
48
49
50
51
52
53
54
55
56
//
// HttpSplitFetcher.swift
// Split
//
// Created by Javier Avrudsky on 02-Dic-2020
import Foundation
protocol HttpSplitFetcher {
func execute(since: Int64, rbSince: Int64?, till: Int64?, headers: HttpHeaders?) throws -> SplitChange
func executeForTargetingRules(since: Int64, rbSince: Int64?, till: Int64?, headers: HttpHeaders?) throws -> TargetingRulesChange
}
class DefaultHttpSplitFetcher: HttpSplitFetcher {
private let restClient: RestClientSplitChanges
private let syncHelper: SyncHelper
private let resource = Resource.splits
init(restClient: RestClientSplitChanges, syncHelper: SyncHelper) {
self.restClient = restClient
self.syncHelper = syncHelper
}
func execute(since: Int64, rbSince: Int64? = nil, till: Int64?, headers: HttpHeaders? = nil) throws -> SplitChange {
let targetingRulesChange = try executeForTargetingRules(since: since, rbSince: rbSince, till: till, headers: headers)
return targetingRulesChange.featureFlags
}
func executeForTargetingRules(since: Int64, rbSince: Int64?, till: Int64?, headers: HttpHeaders? = nil) throws -> TargetingRulesChange {
Logger.d("Fetching targeting rules definitions")
try syncHelper.checkEndpointReachability(restClient: restClient, resource: resource)
let semaphore = DispatchSemaphore(value: 0)
var requestResult: DataResult<TargetingRulesChange>?
let startTime = Date.nowMillis()
restClient.getSplitChanges(since: since, rbSince: rbSince, till: till, headers: headers) { result in
TimeChecker.logInterval("Time to fetch targeting rules", startTime: startTime)
requestResult = result
semaphore.signal()
}
semaphore.wait()
do {
if let targetingRulesChange: TargetingRulesChange = try requestResult?.unwrap() {
syncHelper.recordTelemetry(resource: resource, startTime: startTime)
return targetingRulesChange
}
} catch {
try syncHelper.throwIfError(syncHelper.handleError(error, resource: resource, startTime: startTime))
}
throw GenericError.unknown(message: "Incorrect targeting rules changes retrieved")
}
}