Skip to content

Commit b7b8435

Browse files
[FSSDK-12105] chore: inject cmab config to client (#610)
* chore: Update CMAB configuration classes and client implementation * fix(Sources/CMAB): Fix default prediction endpoint assignment and trailing slash sanitization in CmabClient and CmabConfig files * refactor: improve URL formatting and validation logic in CmabClient and CmabConfig * fix: refactor getUrl method to use URL appendingPathComponent * fix: add missing cmabConfig parameter to init method * cmab endpoint templating added
1 parent 5c10e8f commit b7b8435

File tree

10 files changed

+206
-50
lines changed

10 files changed

+206
-50
lines changed

OptimizelySwiftSDK.xcodeproj/project.pbxproj

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2012,6 +2012,23 @@
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 */; };
2031+
98261A472EDDC35900F7230A /* OptimizelyClientTests_Cmab_Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98261A462EDDC35900F7230A /* OptimizelyClientTests_Cmab_Config.swift */; };
20152032
982C071F2D8C82AE0068B1FF /* HoldoutTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 982C071E2D8C82AE0068B1FF /* HoldoutTests.swift */; };
20162033
982C07202D8C82AE0068B1FF /* HoldoutTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 982C071E2D8C82AE0068B1FF /* HoldoutTests.swift */; };
20172034
9841590F2E13013E0042C01E /* OptimizelyUserContextTests_Decide_Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9841590E2E13013E0042C01E /* OptimizelyUserContextTests_Decide_Async.swift */; };
@@ -2574,6 +2591,8 @@
25742591
980CC9072D833F2800E07D24 /* ExperimentCore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExperimentCore.swift; sourceTree = "<group>"; };
25752592
98137C542A41E86F004896EB /* OptimizelyClientTests_Init_Async_Await.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptimizelyClientTests_Init_Async_Await.swift; sourceTree = "<group>"; };
25762593
98137C562A42BA0F004896EB /* OptimizelyUserContextTests_ODP_Aync_Await.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptimizelyUserContextTests_ODP_Aync_Await.swift; sourceTree = "<group>"; };
2594+
98261A172ED89A8500F7230A /* CmabConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CmabConfig.swift; sourceTree = "<group>"; };
2595+
98261A462EDDC35900F7230A /* OptimizelyClientTests_Cmab_Config.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptimizelyClientTests_Cmab_Config.swift; sourceTree = "<group>"; };
25772596
982C071E2D8C82AE0068B1FF /* HoldoutTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HoldoutTests.swift; sourceTree = "<group>"; };
25782597
9841590E2E13013E0042C01E /* OptimizelyUserContextTests_Decide_Async.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptimizelyUserContextTests_Decide_Async.swift; sourceTree = "<group>"; };
25792598
984159112E141B640042C01E /* OptimizelyUserContextTests_Decide_CMAB.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptimizelyUserContextTests_Decide_CMAB.swift; sourceTree = "<group>"; };
@@ -3227,6 +3246,7 @@
32273246
6E7519BE22C5211100B2B157 /* OptimizelyClientTests_Invalid.swift */,
32283247
6E593FB425BB9C5500EC72BC /* OptimizelyClientTests_Decide.swift */,
32293248
84518B1E287665020023F104 /* OptimizelyClientTests_ODP.swift */,
3249+
98261A462EDDC35900F7230A /* OptimizelyClientTests_Cmab_Config.swift */,
32303250
6E7519BA22C5211100B2B157 /* OptimizelyClientTests_Evaluation.swift */,
32313251
6E7519BB22C5211100B2B157 /* OptimizelyClientTests_DatafileHandler.swift */,
32323252
6E7519C022C5211100B2B157 /* OptimizelyClientTests_Variables.swift */,
@@ -3304,6 +3324,7 @@
33043324
children = (
33053325
98F28A402E02DD6D00A86546 /* CmabClient.swift */,
33063326
98F28A552E0451CC00A86546 /* CmabService.swift */,
3327+
98261A172ED89A8500F7230A /* CmabConfig.swift */,
33073328
);
33083329
path = CMAB;
33093330
sourceTree = "<group>";
@@ -4332,6 +4353,7 @@
43324353
848617CF2863DC2700B7F41B /* OdpSegmentManager.swift in Sources */,
43334354
6E14CD952423F9A700010234 /* Group.swift in Sources */,
43344355
984FE5142CC8AA88004F6F41 /* UserProfileTracker.swift in Sources */,
4356+
98261A272ED89A8500F7230A /* CmabConfig.swift in Sources */,
43354357
84E2E96828540B5E001114AB /* OptimizelySdkSettings.swift in Sources */,
43364358
6E14CD9A2423F9C300010234 /* DataStoreQueueStack.swift in Sources */,
43374359
6E14CD732423F96F00010234 /* OptimizelyResult.swift in Sources */,
@@ -4462,6 +4484,7 @@
44624484
6E424D0226324B620081004A /* Audience.swift in Sources */,
44634485
989428B62DBFA431008BA1C8 /* MockBucketer.swift in Sources */,
44644486
6E424D0326324B620081004A /* AttributeValue.swift in Sources */,
4487+
98261A1F2ED89A8500F7230A /* CmabConfig.swift in Sources */,
44654488
84E2E9482852A378001114AB /* VuidManager.swift in Sources */,
44664489
6E424D0426324B620081004A /* ConditionLeaf.swift in Sources */,
44674490
980CC90E2D833F2800E07D24 /* ExperimentCore.swift in Sources */,
@@ -4578,6 +4601,7 @@
45784601
6E75190122C520D500B2B157 /* Attribute.swift in Sources */,
45794602
848617DB2863E21200B7F41B /* OdpSegmentApiManager.swift in Sources */,
45804603
6E7516B322C520D400B2B157 /* DefaultUserProfileService.swift in Sources */,
4604+
98261A182ED89A8500F7230A /* CmabConfig.swift in Sources */,
45814605
84E2E9432852A378001114AB /* VuidManager.swift in Sources */,
45824606
6E75183522C520D400B2B157 /* EventForDispatch.swift in Sources */,
45834607
6E7517D522C520D400B2B157 /* DefaultNotificationCenter.swift in Sources */,
@@ -4659,6 +4683,7 @@
46594683
848617D42863DC2700B7F41B /* OdpSegmentManager.swift in Sources */,
46604684
6E75184822C520D400B2B157 /* Event.swift in Sources */,
46614685
984FE5172CC8AA88004F6F41 /* UserProfileTracker.swift in Sources */,
4686+
98261A262ED89A8500F7230A /* CmabConfig.swift in Sources */,
46624687
84E2E96D28540B5E001114AB /* OptimizelySdkSettings.swift in Sources */,
46634688
6E75170E22C520D400B2B157 /* OptimizelyClient.swift in Sources */,
46644689
6E75177A22C520D400B2B157 /* SDKVersion.swift in Sources */,
@@ -4799,6 +4824,7 @@
47994824
6E75180822C520D400B2B157 /* DataStoreFile.swift in Sources */,
48004825
6E7518EC22C520D400B2B157 /* ConditionHolder.swift in Sources */,
48014826
6E7516AA22C520D400B2B157 /* DefaultLogger.swift in Sources */,
4827+
98261A472EDDC35900F7230A /* OptimizelyClientTests_Cmab_Config.swift in Sources */,
48024828
84E2E97A2855875E001114AB /* OdpEventManager.swift in Sources */,
48034829
6E75186822C520D400B2B157 /* Rollout.swift in Sources */,
48044830
6E9B11E122C548A200C22D81 /* OptimizelyClientTests_ObjcOthers.m in Sources */,
@@ -4809,6 +4835,7 @@
48094835
6E75172222C520D400B2B157 /* OptimizelyResult.swift in Sources */,
48104836
6E7517E422C520D400B2B157 /* DefaultDecisionService.swift in Sources */,
48114837
6E9B11D722C548A200C22D81 /* OptimizelyErrorTests.swift in Sources */,
4838+
98261A1A2ED89A8500F7230A /* CmabConfig.swift in Sources */,
48124839
C78CAF8624485029009FE876 /* OptimizelyClientTests_OptimizelyJSON_Objc.m in Sources */,
48134840
6E75194C22C520D500B2B157 /* OPTDatafileHandler.swift in Sources */,
48144841
6E652308278E688B00954EA1 /* LruCache.swift in Sources */,
@@ -4975,6 +5002,7 @@
49755002
6E75178522C520D400B2B157 /* ArrayEventForDispatch+Extension.swift in Sources */,
49765003
6E75171922C520D400B2B157 /* OptimizelyClient+ObjC.swift in Sources */,
49775004
6E75192B22C520D500B2B157 /* DataStoreQueueStack.swift in Sources */,
5005+
98261A232ED89A8500F7230A /* CmabConfig.swift in Sources */,
49785006
6E7517A922C520D400B2B157 /* Array+Extension.swift in Sources */,
49795007
6E75186B22C520D400B2B157 /* Rollout.swift in Sources */,
49805008
6E75183B22C520D400B2B157 /* EventForDispatch.swift in Sources */,
@@ -4998,6 +5026,7 @@
49985026
84861808286CF33700B7F41B /* OdpEvent.swift in Sources */,
49995027
6E9B117422C5487100C22D81 /* DecisionServiceTests_Others.swift in Sources */,
50005028
6E9B116E22C5487100C22D81 /* LoggerTests.swift in Sources */,
5029+
98261A1D2ED89A8500F7230A /* CmabConfig.swift in Sources */,
50015030
84F6BADE27FD011B004BE62A /* OptimizelyUserContextTests_ODP_Decide.swift in Sources */,
50025031
98F28A5C2E0451CC00A86546 /* CmabService.swift in Sources */,
50035032
6E75180D22C520D400B2B157 /* DataStoreFile.swift in Sources */,
@@ -5158,6 +5187,7 @@
51585187
6EF8DE1824BD1BB2008B9488 /* OptimizelyDecision.swift in Sources */,
51595188
6E7518C222C520D400B2B157 /* Variable.swift in Sources */,
51605189
6E75192E22C520D500B2B157 /* DataStoreQueueStack.swift in Sources */,
5190+
98261A1C2ED89A8500F7230A /* CmabConfig.swift in Sources */,
51615191
6E75172822C520D400B2B157 /* OptimizelyResult.swift in Sources */,
51625192
6E75170422C520D400B2B157 /* OptimizelyLogLevel.swift in Sources */,
51635193
6E75187A22C520D400B2B157 /* Variation.swift in Sources */,
@@ -5293,6 +5323,7 @@
52935323
6E9B115A22C5486E00C22D81 /* DecisionServiceTests_Others.swift in Sources */,
52945324
6E9B115422C5486E00C22D81 /* LoggerTests.swift in Sources */,
52955325
6E7518DF22C520D400B2B157 /* ConditionLeaf.swift in Sources */,
5326+
98261A1B2ED89A8500F7230A /* CmabConfig.swift in Sources */,
52965327
6E75172D22C520D400B2B157 /* Constants.swift in Sources */,
52975328
98F28A5A2E0451CC00A86546 /* CmabService.swift in Sources */,
52985329
6E75172122C520D400B2B157 /* OptimizelyResult.swift in Sources */,
@@ -5549,6 +5580,7 @@
55495580
6E9B11AE22C5489300C22D81 /* OTUtils.swift in Sources */,
55505581
98AC97F32DAE9685001405DD /* HoldoutConfigTests.swift in Sources */,
55515582
6E9B117A22C5488100C22D81 /* AttributeValueTests.swift in Sources */,
5583+
98261A192ED89A8500F7230A /* CmabConfig.swift in Sources */,
55525584
6E994B3B25A3E6EA00999262 /* DecisionResponse.swift in Sources */,
55535585
84E2E97B2855875E001114AB /* OdpEventManager.swift in Sources */,
55545586
6E75175322C520D400B2B157 /* LogMessage.swift in Sources */,
@@ -5614,6 +5646,7 @@
56145646
84B4D75A27E2A7550078CDA4 /* OptimizelySegmentOption.swift in Sources */,
56155647
6E7517DA22C520D400B2B157 /* DefaultNotificationCenter.swift in Sources */,
56165648
6E7517E622C520D400B2B157 /* DefaultDecisionService.swift in Sources */,
5649+
98261A242ED89A8500F7230A /* CmabConfig.swift in Sources */,
56175650
984FE51F2CC8AA88004F6F41 /* UserProfileTracker.swift in Sources */,
56185651
98F28A5B2E0451CC00A86546 /* CmabService.swift in Sources */,
56195652
6E75171822C520D400B2B157 /* OptimizelyClient+ObjC.swift in Sources */,
@@ -5723,6 +5756,7 @@
57235756
84B4D75F27E2A7550078CDA4 /* OptimizelySegmentOption.swift in Sources */,
57245757
6E7517DF22C520D400B2B157 /* DefaultNotificationCenter.swift in Sources */,
57255758
6E7517EB22C520D400B2B157 /* DefaultDecisionService.swift in Sources */,
5759+
98261A212ED89A8500F7230A /* CmabConfig.swift in Sources */,
57265760
984FE51D2CC8AA88004F6F41 /* UserProfileTracker.swift in Sources */,
57275761
98F28A562E0451CC00A86546 /* CmabService.swift in Sources */,
57285762
6E75171D22C520D400B2B157 /* OptimizelyClient+ObjC.swift in Sources */,
@@ -5833,6 +5867,7 @@
58335867
6E75195422C520D500B2B157 /* OPTBucketer.swift in Sources */,
58345868
848617DA2863E21200B7F41B /* OdpSegmentApiManager.swift in Sources */,
58355869
6E75171E22C520D400B2B157 /* OptimizelyResult.swift in Sources */,
5870+
98261A252ED89A8500F7230A /* CmabConfig.swift in Sources */,
58365871
84E2E9422852A378001114AB /* VuidManager.swift in Sources */,
58375872
6E75172A22C520D400B2B157 /* Constants.swift in Sources */,
58385873
6E7516A622C520D400B2B157 /* DefaultLogger.swift in Sources */,
@@ -5914,6 +5949,7 @@
59145949
848617CC2863DC2700B7F41B /* OdpSegmentManager.swift in Sources */,
59155950
6E75184222C520D400B2B157 /* Event.swift in Sources */,
59165951
984FE5122CC8AA88004F6F41 /* UserProfileTracker.swift in Sources */,
5952+
98261A1E2ED89A8500F7230A /* CmabConfig.swift in Sources */,
59175953
84E2E96528540B5E001114AB /* OptimizelySdkSettings.swift in Sources */,
59185954
6E75170822C520D400B2B157 /* OptimizelyClient.swift in Sources */,
59195955
6E75177422C520D400B2B157 /* SDKVersion.swift in Sources */,
@@ -6028,6 +6064,7 @@
60286064
6E4544AD270E67C800F2CEBC /* NetworkReachability.swift in Sources */,
60296065
75C71A0D25E454460084187E /* OptimizelyUserContext+ObjC.swift in Sources */,
60306066
75C71A0E25E454460084187E /* DefaultLogger.swift in Sources */,
6067+
98261A202ED89A8500F7230A /* CmabConfig.swift in Sources */,
60316068
75C71A0F25E454460084187E /* DefaultUserProfileService.swift in Sources */,
60326069
75C71A1025E454460084187E /* DefaultEventDispatcher.swift in Sources */,
60336070
75C71A1125E454460084187E /* OPTLogger.swift in Sources */,
@@ -6144,6 +6181,7 @@
61446181
BD6485502491474500F30986 /* OPTBucketer.swift in Sources */,
61456182
848617DC2863E21200B7F41B /* OdpSegmentApiManager.swift in Sources */,
61466183
BD6485512491474500F30986 /* OptimizelyResult.swift in Sources */,
6184+
98261A222ED89A8500F7230A /* CmabConfig.swift in Sources */,
61476185
84E2E9442852A378001114AB /* VuidManager.swift in Sources */,
61486186
BD6485522491474500F30986 /* Constants.swift in Sources */,
61496187
BD6485532491474500F30986 /* DefaultLogger.swift in Sources */,

Sources/CMAB/CmabClient.swift

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,14 +54,17 @@ class DefaultCmabClient: CmabClient {
5454
let maxWaitTime: TimeInterval
5555
let cmabQueue = DispatchQueue(label: "com.optimizley.cmab")
5656
let logger = OPTLoggerFactory.getLogger()
57+
let predictionEndpoint: String
5758

5859
init(session: URLSession = .shared,
5960
retryConfig: CmabRetryConfig = CmabRetryConfig(),
60-
maxWaitTime: TimeInterval = 10.0
61+
maxWaitTime: TimeInterval = 10.0,
62+
predictionEndpoint: String? = nil
6163
) {
6264
self.session = session
6365
self.retryConfig = retryConfig
6466
self.maxWaitTime = maxWaitTime
67+
self.predictionEndpoint = predictionEndpoint ?? CMAB_PREDICTION_END_POINT
6568
}
6669

6770
func fetchDecision(
@@ -71,9 +74,8 @@ class DefaultCmabClient: CmabClient {
7174
cmabUUID: String,
7275
completion: @escaping (Result<String, Error>) -> Void
7376
) {
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")))
77+
guard let url = getUrl(ruleId: ruleId) else {
78+
completion(.failure(CmabClientError.fetchFailed("Invalid CMAB prediction endpoint")))
7779
return
7880
}
7981
let attrType = "custom_attribute"
@@ -98,6 +100,15 @@ class DefaultCmabClient: CmabClient {
98100
)
99101
}
100102

103+
func getUrl(ruleId: String) -> URL? {
104+
let urlString = String(format: predictionEndpoint, ruleId)
105+
guard let url = URL(string: urlString) else {
106+
self.logger.e("Invalid CMAB endpoint")
107+
return nil
108+
}
109+
return url
110+
}
111+
101112
private func doFetchWithRetry(
102113
url: URL,
103114
requestBody: [String: Any],

Sources/CMAB/CmabConfig.swift

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
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+
let DEFAULT_CMAB_CACHE_TIMEOUT = 30 * 60 // 30 minutes
20+
let DEFAULT_CMAB_CACHE_SIZE = 100
21+
let CMAB_PREDICTION_END_POINT = "https://prediction.cmab.optimizely.com/predict/%@"
22+
23+
/// Configuration for CMAB (Contextual Multi-Armed Bandit) service
24+
public struct CmabConfig {
25+
/// The maximum size of CMAB decision cache
26+
let cacheSize: Int
27+
/// The timeout in seconds of CMAB cache
28+
let cacheTimeoutInSecs: Int
29+
/// The CMAB prediction endpoint
30+
var predictionEndpoint: String?
31+
32+
/// - cmabCacheSize: The maximum size of cmab cache (optional. default = 100).
33+
/// - cmabCacheTimeoutInSecs: The timeout in seconds of amb cache (optional. default = 30 * 60).
34+
/// - predictionEndpoint: Set the CMAB prediction endpoint. default will be used if nil is set.
35+
public init(
36+
cacheSize: Int = 100,
37+
cacheTimeoutInSecs: Int = 30 * 60,
38+
predictionEndpoint: String? = nil
39+
) {
40+
self.cacheSize = cacheSize
41+
self.cacheTimeoutInSecs = cacheTimeoutInSecs
42+
// Sanitize and validate endpoint
43+
if let sanitized = predictionEndpoint?.trimmingCharacters(in: .whitespaces), !sanitized.isEmpty {
44+
self.predictionEndpoint = sanitized
45+
} else {
46+
self.predictionEndpoint = CMAB_PREDICTION_END_POINT
47+
}
48+
}
49+
}

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)