-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathprovider.swift
121 lines (108 loc) · 4.25 KB
/
provider.swift
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import Foundation
import OFREP
import OpenFeature
import Combine
struct Metadata: ProviderMetadata {
var name: String? = "GO Feature Flag provider"
}
public final class GoFeatureFlagProvider: FeatureProvider {
public var hooks: [any OpenFeature.Hook] = []
public var metadata: ProviderMetadata = Metadata()
private let ofrepProvider: OfrepProvider
private let dataCollectorMngr: DataCollectorManager
private let options: GoFeatureFlagProviderOptions
public init(options: GoFeatureFlagProviderOptions) {
var networkService: NetworkingService = URLSession.shared
if let netSer = options.networkService {
networkService = netSer
}
var headers: [String:String] = [:]
if let apiKey = options.apiKey {
headers["Authorization"] = "Bearer \(apiKey)"
}
let ofrepOptions = OfrepProviderOptions(
endpoint: options.endpoint,
pollInterval: options.pollInterval,
headers: headers,
networkService: networkService
)
self.options = options
self.ofrepProvider = OfrepProvider(options: ofrepOptions)
self.dataCollectorMngr = DataCollectorManager(
goffAPI: GoFeatureFlagAPI(networkingService: networkService, options: options),
options: options
)
}
public func initialize(initialContext: OpenFeature.EvaluationContext?) async throws {
self.hooks = dataCollectorMngr.getHooks()
try await self.ofrepProvider.initialize(initialContext: initialContext)
if self.options.dataCollectorInterval > 0 {
self.hooks.append(BooleanHook(dataCollectorMngr: self.dataCollectorMngr))
self.hooks.append(DoubleHook(dataCollectorMngr: self.dataCollectorMngr))
self.hooks.append(IntegerHook(dataCollectorMngr: self.dataCollectorMngr))
self.hooks.append(StringHook(dataCollectorMngr: self.dataCollectorMngr))
self.hooks.append(ObjectHook(dataCollectorMngr: self.dataCollectorMngr))
self.dataCollectorMngr.start()
}
}
public func onContextSet(
oldContext: (any OpenFeature.EvaluationContext)?,
newContext: any OpenFeature.EvaluationContext) async throws {
try await self.ofrepProvider.onContextSet(
oldContext: oldContext,
newContext: newContext)
}
public func getBooleanEvaluation(
key: String,
defaultValue: Bool,
context: (any OpenFeature.EvaluationContext)?)
throws -> OpenFeature.ProviderEvaluation<Bool> {
return try self.ofrepProvider.getBooleanEvaluation(
key: key,
defaultValue: defaultValue,
context: context)
}
public func getStringEvaluation(
key: String,
defaultValue: String,
context: (any OpenFeature.EvaluationContext)?)
throws -> OpenFeature.ProviderEvaluation<String> {
return try self.ofrepProvider.getStringEvaluation(
key: key,
defaultValue: defaultValue,
context: context)
}
public func getIntegerEvaluation(
key: String,
defaultValue: Int64,
context: (any OpenFeature.EvaluationContext)?)
throws -> OpenFeature.ProviderEvaluation<Int64> {
return try self.ofrepProvider.getIntegerEvaluation(
key: key,
defaultValue: defaultValue,
context: context)
}
public func getDoubleEvaluation(
key: String,
defaultValue: Double,
context: (any OpenFeature.EvaluationContext)?)
throws -> OpenFeature.ProviderEvaluation<Double> {
return try self.ofrepProvider.getDoubleEvaluation(
key: key,
defaultValue: defaultValue,
context: context)
}
public func getObjectEvaluation(
key: String,
defaultValue: OpenFeature.Value,
context: (any OpenFeature.EvaluationContext)?)
throws -> OpenFeature.ProviderEvaluation<OpenFeature.Value> {
return try self.ofrepProvider.getObjectEvaluation(
key: key,
defaultValue: defaultValue,
context: context)
}
public func observe() -> AnyPublisher<OpenFeature.ProviderEvent?, Never> {
return self.ofrepProvider.observe()
}
}