Skip to content

Commit 975bf37

Browse files
chore: Update CMAB configuration classes and client implementation
1 parent 5c10e8f commit 975bf37

File tree

8 files changed

+156
-48
lines changed

8 files changed

+156
-48
lines changed

OptimizelySwiftSDK.xcodeproj/project.pbxproj

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2012,6 +2012,22 @@
20122012
980CC9172D833F2800E07D24 /* ExperimentCore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 980CC9072D833F2800E07D24 /* ExperimentCore.swift */; };
20132013
98137C552A41E86F004896EB /* OptimizelyClientTests_Init_Async_Await.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98137C542A41E86F004896EB /* OptimizelyClientTests_Init_Async_Await.swift */; };
20142014
98137C572A42BA0F004896EB /* OptimizelyUserContextTests_ODP_Aync_Await.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98137C562A42BA0F004896EB /* OptimizelyUserContextTests_ODP_Aync_Await.swift */; };
2015+
98261A182ED89A8500F7230A /* CmabConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98261A172ED89A8500F7230A /* CmabConfig.swift */; };
2016+
98261A192ED89A8500F7230A /* CmabConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98261A172ED89A8500F7230A /* CmabConfig.swift */; };
2017+
98261A1A2ED89A8500F7230A /* CmabConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98261A172ED89A8500F7230A /* CmabConfig.swift */; };
2018+
98261A1B2ED89A8500F7230A /* CmabConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98261A172ED89A8500F7230A /* CmabConfig.swift */; };
2019+
98261A1C2ED89A8500F7230A /* CmabConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98261A172ED89A8500F7230A /* CmabConfig.swift */; };
2020+
98261A1D2ED89A8500F7230A /* CmabConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98261A172ED89A8500F7230A /* CmabConfig.swift */; };
2021+
98261A1E2ED89A8500F7230A /* CmabConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98261A172ED89A8500F7230A /* CmabConfig.swift */; };
2022+
98261A1F2ED89A8500F7230A /* CmabConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98261A172ED89A8500F7230A /* CmabConfig.swift */; };
2023+
98261A202ED89A8500F7230A /* CmabConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98261A172ED89A8500F7230A /* CmabConfig.swift */; };
2024+
98261A212ED89A8500F7230A /* CmabConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98261A172ED89A8500F7230A /* CmabConfig.swift */; };
2025+
98261A222ED89A8500F7230A /* CmabConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98261A172ED89A8500F7230A /* CmabConfig.swift */; };
2026+
98261A232ED89A8500F7230A /* CmabConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98261A172ED89A8500F7230A /* CmabConfig.swift */; };
2027+
98261A242ED89A8500F7230A /* CmabConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98261A172ED89A8500F7230A /* CmabConfig.swift */; };
2028+
98261A252ED89A8500F7230A /* CmabConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98261A172ED89A8500F7230A /* CmabConfig.swift */; };
2029+
98261A262ED89A8500F7230A /* CmabConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98261A172ED89A8500F7230A /* CmabConfig.swift */; };
2030+
98261A272ED89A8500F7230A /* CmabConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98261A172ED89A8500F7230A /* CmabConfig.swift */; };
20152031
982C071F2D8C82AE0068B1FF /* HoldoutTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 982C071E2D8C82AE0068B1FF /* HoldoutTests.swift */; };
20162032
982C07202D8C82AE0068B1FF /* HoldoutTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 982C071E2D8C82AE0068B1FF /* HoldoutTests.swift */; };
20172033
9841590F2E13013E0042C01E /* OptimizelyUserContextTests_Decide_Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9841590E2E13013E0042C01E /* OptimizelyUserContextTests_Decide_Async.swift */; };
@@ -2574,6 +2590,7 @@
25742590
980CC9072D833F2800E07D24 /* ExperimentCore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExperimentCore.swift; sourceTree = "<group>"; };
25752591
98137C542A41E86F004896EB /* OptimizelyClientTests_Init_Async_Await.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptimizelyClientTests_Init_Async_Await.swift; sourceTree = "<group>"; };
25762592
98137C562A42BA0F004896EB /* OptimizelyUserContextTests_ODP_Aync_Await.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptimizelyUserContextTests_ODP_Aync_Await.swift; sourceTree = "<group>"; };
2593+
98261A172ED89A8500F7230A /* CmabConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CmabConfig.swift; sourceTree = "<group>"; };
25772594
982C071E2D8C82AE0068B1FF /* HoldoutTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HoldoutTests.swift; sourceTree = "<group>"; };
25782595
9841590E2E13013E0042C01E /* OptimizelyUserContextTests_Decide_Async.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptimizelyUserContextTests_Decide_Async.swift; sourceTree = "<group>"; };
25792596
984159112E141B640042C01E /* OptimizelyUserContextTests_Decide_CMAB.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptimizelyUserContextTests_Decide_CMAB.swift; sourceTree = "<group>"; };
@@ -3304,6 +3321,7 @@
33043321
children = (
33053322
98F28A402E02DD6D00A86546 /* CmabClient.swift */,
33063323
98F28A552E0451CC00A86546 /* CmabService.swift */,
3324+
98261A172ED89A8500F7230A /* CmabConfig.swift */,
33073325
);
33083326
path = CMAB;
33093327
sourceTree = "<group>";
@@ -4332,6 +4350,7 @@
43324350
848617CF2863DC2700B7F41B /* OdpSegmentManager.swift in Sources */,
43334351
6E14CD952423F9A700010234 /* Group.swift in Sources */,
43344352
984FE5142CC8AA88004F6F41 /* UserProfileTracker.swift in Sources */,
4353+
98261A272ED89A8500F7230A /* CmabConfig.swift in Sources */,
43354354
84E2E96828540B5E001114AB /* OptimizelySdkSettings.swift in Sources */,
43364355
6E14CD9A2423F9C300010234 /* DataStoreQueueStack.swift in Sources */,
43374356
6E14CD732423F96F00010234 /* OptimizelyResult.swift in Sources */,
@@ -4462,6 +4481,7 @@
44624481
6E424D0226324B620081004A /* Audience.swift in Sources */,
44634482
989428B62DBFA431008BA1C8 /* MockBucketer.swift in Sources */,
44644483
6E424D0326324B620081004A /* AttributeValue.swift in Sources */,
4484+
98261A1F2ED89A8500F7230A /* CmabConfig.swift in Sources */,
44654485
84E2E9482852A378001114AB /* VuidManager.swift in Sources */,
44664486
6E424D0426324B620081004A /* ConditionLeaf.swift in Sources */,
44674487
980CC90E2D833F2800E07D24 /* ExperimentCore.swift in Sources */,
@@ -4578,6 +4598,7 @@
45784598
6E75190122C520D500B2B157 /* Attribute.swift in Sources */,
45794599
848617DB2863E21200B7F41B /* OdpSegmentApiManager.swift in Sources */,
45804600
6E7516B322C520D400B2B157 /* DefaultUserProfileService.swift in Sources */,
4601+
98261A182ED89A8500F7230A /* CmabConfig.swift in Sources */,
45814602
84E2E9432852A378001114AB /* VuidManager.swift in Sources */,
45824603
6E75183522C520D400B2B157 /* EventForDispatch.swift in Sources */,
45834604
6E7517D522C520D400B2B157 /* DefaultNotificationCenter.swift in Sources */,
@@ -4659,6 +4680,7 @@
46594680
848617D42863DC2700B7F41B /* OdpSegmentManager.swift in Sources */,
46604681
6E75184822C520D400B2B157 /* Event.swift in Sources */,
46614682
984FE5172CC8AA88004F6F41 /* UserProfileTracker.swift in Sources */,
4683+
98261A262ED89A8500F7230A /* CmabConfig.swift in Sources */,
46624684
84E2E96D28540B5E001114AB /* OptimizelySdkSettings.swift in Sources */,
46634685
6E75170E22C520D400B2B157 /* OptimizelyClient.swift in Sources */,
46644686
6E75177A22C520D400B2B157 /* SDKVersion.swift in Sources */,
@@ -4809,6 +4831,7 @@
48094831
6E75172222C520D400B2B157 /* OptimizelyResult.swift in Sources */,
48104832
6E7517E422C520D400B2B157 /* DefaultDecisionService.swift in Sources */,
48114833
6E9B11D722C548A200C22D81 /* OptimizelyErrorTests.swift in Sources */,
4834+
98261A1A2ED89A8500F7230A /* CmabConfig.swift in Sources */,
48124835
C78CAF8624485029009FE876 /* OptimizelyClientTests_OptimizelyJSON_Objc.m in Sources */,
48134836
6E75194C22C520D500B2B157 /* OPTDatafileHandler.swift in Sources */,
48144837
6E652308278E688B00954EA1 /* LruCache.swift in Sources */,
@@ -4975,6 +4998,7 @@
49754998
6E75178522C520D400B2B157 /* ArrayEventForDispatch+Extension.swift in Sources */,
49764999
6E75171922C520D400B2B157 /* OptimizelyClient+ObjC.swift in Sources */,
49775000
6E75192B22C520D500B2B157 /* DataStoreQueueStack.swift in Sources */,
5001+
98261A232ED89A8500F7230A /* CmabConfig.swift in Sources */,
49785002
6E7517A922C520D400B2B157 /* Array+Extension.swift in Sources */,
49795003
6E75186B22C520D400B2B157 /* Rollout.swift in Sources */,
49805004
6E75183B22C520D400B2B157 /* EventForDispatch.swift in Sources */,
@@ -4998,6 +5022,7 @@
49985022
84861808286CF33700B7F41B /* OdpEvent.swift in Sources */,
49995023
6E9B117422C5487100C22D81 /* DecisionServiceTests_Others.swift in Sources */,
50005024
6E9B116E22C5487100C22D81 /* LoggerTests.swift in Sources */,
5025+
98261A1D2ED89A8500F7230A /* CmabConfig.swift in Sources */,
50015026
84F6BADE27FD011B004BE62A /* OptimizelyUserContextTests_ODP_Decide.swift in Sources */,
50025027
98F28A5C2E0451CC00A86546 /* CmabService.swift in Sources */,
50035028
6E75180D22C520D400B2B157 /* DataStoreFile.swift in Sources */,
@@ -5158,6 +5183,7 @@
51585183
6EF8DE1824BD1BB2008B9488 /* OptimizelyDecision.swift in Sources */,
51595184
6E7518C222C520D400B2B157 /* Variable.swift in Sources */,
51605185
6E75192E22C520D500B2B157 /* DataStoreQueueStack.swift in Sources */,
5186+
98261A1C2ED89A8500F7230A /* CmabConfig.swift in Sources */,
51615187
6E75172822C520D400B2B157 /* OptimizelyResult.swift in Sources */,
51625188
6E75170422C520D400B2B157 /* OptimizelyLogLevel.swift in Sources */,
51635189
6E75187A22C520D400B2B157 /* Variation.swift in Sources */,
@@ -5293,6 +5319,7 @@
52935319
6E9B115A22C5486E00C22D81 /* DecisionServiceTests_Others.swift in Sources */,
52945320
6E9B115422C5486E00C22D81 /* LoggerTests.swift in Sources */,
52955321
6E7518DF22C520D400B2B157 /* ConditionLeaf.swift in Sources */,
5322+
98261A1B2ED89A8500F7230A /* CmabConfig.swift in Sources */,
52965323
6E75172D22C520D400B2B157 /* Constants.swift in Sources */,
52975324
98F28A5A2E0451CC00A86546 /* CmabService.swift in Sources */,
52985325
6E75172122C520D400B2B157 /* OptimizelyResult.swift in Sources */,
@@ -5549,6 +5576,7 @@
55495576
6E9B11AE22C5489300C22D81 /* OTUtils.swift in Sources */,
55505577
98AC97F32DAE9685001405DD /* HoldoutConfigTests.swift in Sources */,
55515578
6E9B117A22C5488100C22D81 /* AttributeValueTests.swift in Sources */,
5579+
98261A192ED89A8500F7230A /* CmabConfig.swift in Sources */,
55525580
6E994B3B25A3E6EA00999262 /* DecisionResponse.swift in Sources */,
55535581
84E2E97B2855875E001114AB /* OdpEventManager.swift in Sources */,
55545582
6E75175322C520D400B2B157 /* LogMessage.swift in Sources */,
@@ -5614,6 +5642,7 @@
56145642
84B4D75A27E2A7550078CDA4 /* OptimizelySegmentOption.swift in Sources */,
56155643
6E7517DA22C520D400B2B157 /* DefaultNotificationCenter.swift in Sources */,
56165644
6E7517E622C520D400B2B157 /* DefaultDecisionService.swift in Sources */,
5645+
98261A242ED89A8500F7230A /* CmabConfig.swift in Sources */,
56175646
984FE51F2CC8AA88004F6F41 /* UserProfileTracker.swift in Sources */,
56185647
98F28A5B2E0451CC00A86546 /* CmabService.swift in Sources */,
56195648
6E75171822C520D400B2B157 /* OptimizelyClient+ObjC.swift in Sources */,
@@ -5723,6 +5752,7 @@
57235752
84B4D75F27E2A7550078CDA4 /* OptimizelySegmentOption.swift in Sources */,
57245753
6E7517DF22C520D400B2B157 /* DefaultNotificationCenter.swift in Sources */,
57255754
6E7517EB22C520D400B2B157 /* DefaultDecisionService.swift in Sources */,
5755+
98261A212ED89A8500F7230A /* CmabConfig.swift in Sources */,
57265756
984FE51D2CC8AA88004F6F41 /* UserProfileTracker.swift in Sources */,
57275757
98F28A562E0451CC00A86546 /* CmabService.swift in Sources */,
57285758
6E75171D22C520D400B2B157 /* OptimizelyClient+ObjC.swift in Sources */,
@@ -5833,6 +5863,7 @@
58335863
6E75195422C520D500B2B157 /* OPTBucketer.swift in Sources */,
58345864
848617DA2863E21200B7F41B /* OdpSegmentApiManager.swift in Sources */,
58355865
6E75171E22C520D400B2B157 /* OptimizelyResult.swift in Sources */,
5866+
98261A252ED89A8500F7230A /* CmabConfig.swift in Sources */,
58365867
84E2E9422852A378001114AB /* VuidManager.swift in Sources */,
58375868
6E75172A22C520D400B2B157 /* Constants.swift in Sources */,
58385869
6E7516A622C520D400B2B157 /* DefaultLogger.swift in Sources */,
@@ -5914,6 +5945,7 @@
59145945
848617CC2863DC2700B7F41B /* OdpSegmentManager.swift in Sources */,
59155946
6E75184222C520D400B2B157 /* Event.swift in Sources */,
59165947
984FE5122CC8AA88004F6F41 /* UserProfileTracker.swift in Sources */,
5948+
98261A1E2ED89A8500F7230A /* CmabConfig.swift in Sources */,
59175949
84E2E96528540B5E001114AB /* OptimizelySdkSettings.swift in Sources */,
59185950
6E75170822C520D400B2B157 /* OptimizelyClient.swift in Sources */,
59195951
6E75177422C520D400B2B157 /* SDKVersion.swift in Sources */,
@@ -6028,6 +6060,7 @@
60286060
6E4544AD270E67C800F2CEBC /* NetworkReachability.swift in Sources */,
60296061
75C71A0D25E454460084187E /* OptimizelyUserContext+ObjC.swift in Sources */,
60306062
75C71A0E25E454460084187E /* DefaultLogger.swift in Sources */,
6063+
98261A202ED89A8500F7230A /* CmabConfig.swift in Sources */,
60316064
75C71A0F25E454460084187E /* DefaultUserProfileService.swift in Sources */,
60326065
75C71A1025E454460084187E /* DefaultEventDispatcher.swift in Sources */,
60336066
75C71A1125E454460084187E /* OPTLogger.swift in Sources */,
@@ -6144,6 +6177,7 @@
61446177
BD6485502491474500F30986 /* OPTBucketer.swift in Sources */,
61456178
848617DC2863E21200B7F41B /* OdpSegmentApiManager.swift in Sources */,
61466179
BD6485512491474500F30986 /* OptimizelyResult.swift in Sources */,
6180+
98261A222ED89A8500F7230A /* CmabConfig.swift in Sources */,
61476181
84E2E9442852A378001114AB /* VuidManager.swift in Sources */,
61486182
BD6485522491474500F30986 /* Constants.swift in Sources */,
61496183
BD6485532491474500F30986 /* DefaultLogger.swift in Sources */,

Sources/CMAB/CmabClient.swift

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616

1717
import Foundation
1818

19+
let DEFAULT_CMAB_CACHE_TIMEOUT = 30 * 60 // 30 minutes
20+
let DEFAULT_CMAB_CACHE_SIZE = 100
21+
1922
enum CmabClientError: Error, Equatable {
2023
case fetchFailed(String)
2124
case invalidResponse
@@ -48,20 +51,25 @@ protocol CmabClient {
4851
)
4952
}
5053

54+
let CMAB_END_POINT = "https://prediction.cmab.optimizely.com/predict"
55+
5156
class DefaultCmabClient: CmabClient {
5257
let session: URLSession
5358
let retryConfig: CmabRetryConfig
5459
let maxWaitTime: TimeInterval
5560
let cmabQueue = DispatchQueue(label: "com.optimizley.cmab")
5661
let logger = OPTLoggerFactory.getLogger()
62+
let predictionEndpoint: String
5763

5864
init(session: URLSession = .shared,
5965
retryConfig: CmabRetryConfig = CmabRetryConfig(),
60-
maxWaitTime: TimeInterval = 10.0
66+
maxWaitTime: TimeInterval = 10.0,
67+
predictionEndpoint: String? = nil
6168
) {
6269
self.session = session
6370
self.retryConfig = retryConfig
6471
self.maxWaitTime = maxWaitTime
72+
self.predictionEndpoint = predictionEndpoint ?? CMAB_END_POINT
6573
}
6674

6775
func fetchDecision(
@@ -71,9 +79,8 @@ class DefaultCmabClient: CmabClient {
7179
cmabUUID: String,
7280
completion: @escaping (Result<String, Error>) -> Void
7381
) {
74-
let urlString = "https://prediction.cmab.optimizely.com/predict/\(ruleId)"
75-
guard let url = URL(string: urlString) else {
76-
completion(.failure(CmabClientError.fetchFailed("Invalid URL")))
82+
guard let url = getUrl(ruleId: ruleId) else {
83+
completion(.failure(CmabClientError.fetchFailed("Invalid CMAB prediction endpoint")))
7784
return
7885
}
7986
let attrType = "custom_attribute"
@@ -98,6 +105,15 @@ class DefaultCmabClient: CmabClient {
98105
)
99106
}
100107

108+
func getUrl(ruleId: String) -> URL? {
109+
let urlString = "\(predictionEndpoint)/\(ruleId)"
110+
guard let url = URL(string: urlString) else {
111+
self.logger.e("Invalid CMAB endpoint")
112+
return nil
113+
}
114+
return url
115+
}
116+
101117
private func doFetchWithRetry(
102118
url: URL,
103119
requestBody: [String: Any],

Sources/CMAB/CmabConfig.swift

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
//
2+
// Copyright 2022, Optimizely, Inc. and contributors
3+
//
4+
// Licensed under the Apache License, Version 2.0 (the "License");
5+
// you may not use this file except in compliance with the License.
6+
// You may obtain a copy of the License at
7+
//
8+
// http://www.apache.org/licenses/LICENSE-2.0
9+
//
10+
// Unless required by applicable law or agreed to in writing, software
11+
// distributed under the License is distributed on an "AS IS" BASIS,
12+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
// See the License for the specific language governing permissions and
14+
// limitations under the License.
15+
//
16+
17+
import Foundation
18+
19+
/// Configuration for CMAB (Contextual Multi-Armed Bandit) service
20+
public struct CmabConfig {
21+
/// The maximum size of CMAB decision cache
22+
let cacheSize: Int
23+
/// The timeout in seconds of CMAB cache
24+
let cacheTimeoutInSecs: Int
25+
/// The CMAB prediction endpoint
26+
var predictionEndpoint: String?
27+
28+
/// - cmabCacheSize: The maximum size of cmab cache (optional. default = 100).
29+
/// - cmabCacheTimeoutInSecs: The timeout in seconds of amb cache (optional. default = 30 * 60).
30+
/// - predictionEndpoint: Set the CMAB prediction endpoint. default will be used if nil is set.
31+
public init(
32+
cacheSize: Int = 100,
33+
cacheTimeoutInSecs: Int = 30 * 60,
34+
predictionEndpoint: String? = nil
35+
) {
36+
self.cacheSize = cacheSize
37+
self.cacheTimeoutInSecs = cacheTimeoutInSecs
38+
// Sanitize and validate endpoint
39+
if let endpoint = predictionEndpoint?.trimmingCharacters(in: .whitespaces), !endpoint.isEmpty {
40+
// Remove all trailing slashes
41+
var sanitized = endpoint
42+
while sanitized.hasSuffix("/") {
43+
sanitized = String(sanitized.dropLast())
44+
}
45+
self.predictionEndpoint = sanitized
46+
} else {
47+
self.predictionEndpoint = CMAB_END_POINT
48+
}
49+
}
50+
}

Sources/CMAB/CmabService.swift

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -41,15 +41,12 @@ protocol CmabService {
4141
completion: @escaping CmabDecisionCompletionHandler)
4242
}
4343

44-
let DEFAULT_CMAB_CACHE_TIMEOUT = 30 * 60 // 30 minutes
45-
let DEFAULT_CMAB_CACHE_SIZE = 100
46-
4744
typealias CmabCache = LruCache<String, CmabCacheValue>
4845

4946
class DefaultCmabService: CmabService {
5047
typealias UserAttributes = [String : Any?]
5148

52-
private let cmabClient: CmabClient
49+
let cmabClient: CmabClient
5350
let cmabCache: CmabCache
5451
private let logger = OPTLoggerFactory.getLogger()
5552

@@ -201,11 +198,11 @@ extension DefaultCmabService {
201198
let cache = CmabCache(size: DEFAULT_CMAB_CACHE_SIZE, timeoutInSecs: DEFAULT_CMAB_CACHE_TIMEOUT)
202199
return DefaultCmabService(cmabClient: DefaultCmabClient(), cmabCache: cache)
203200
}
204-
205-
static func createDefault(cacheSize: Int, cacheTimeout: Int) -> DefaultCmabService {
201+
202+
static func createDefault(config: CmabConfig) -> DefaultCmabService {
206203
// if cache timeout is set to 0 or negative, use default timeout
207-
let timeout = cacheTimeout <= 0 ? DEFAULT_CMAB_CACHE_TIMEOUT : cacheTimeout
208-
let cache = CmabCache(size: cacheSize, timeoutInSecs: timeout)
209-
return DefaultCmabService(cmabClient: DefaultCmabClient(), cmabCache: cache)
204+
let timeout = config.cacheTimeoutInSecs <= 0 ? DEFAULT_CMAB_CACHE_TIMEOUT : config.cacheTimeoutInSecs
205+
let cache = CmabCache(size: config.cacheSize, timeoutInSecs: timeout)
206+
return DefaultCmabService(cmabClient: DefaultCmabClient(predictionEndpoint: config.predictionEndpoint), cmabCache: cache)
210207
}
211208
}

0 commit comments

Comments
 (0)