Skip to content

Commit e018a4d

Browse files
committed
fix: use a sane default settings object in cases where we can't connect.
1 parent d1b7bc4 commit e018a4d

File tree

3 files changed

+54
-56
lines changed

3 files changed

+54
-56
lines changed

core/src/main/java/com/segment/analytics/kotlin/core/Configuration.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ data class Configuration(
3333
var flushAt: Int = 20,
3434
var flushInterval: Int = 30,
3535
var flushPolicies: List<FlushPolicy> = emptyList<FlushPolicy>(),
36-
var defaultSettings: Settings = Settings(),
36+
var defaultSettings: Settings? = null,
3737
var autoAddSegmentDestination: Boolean = true,
3838
var apiHost: String = DEFAULT_API_HOST,
3939
var cdnHost: String = DEFAULT_CDN_HOST,

core/src/main/java/com/segment/analytics/kotlin/core/Settings.kt

Lines changed: 25 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -93,15 +93,7 @@ suspend fun Analytics.checkSettings() {
9393

9494
withContext(analyticsDispatcher) {
9595

96-
val systemState = store.currentState(System::class)
97-
val defaultSettings = systemState?.settings
98-
99-
100-
if (settingsObj == null) {
101-
defaultSettings?.let {
102-
update(defaultSettings)
103-
}
104-
} else {
96+
settingsObj?.let {
10597
log("Dispatching update settings on ${Thread.currentThread().name}")
10698
store.dispatch(System.UpdateSettingsAction(settingsObj), System::class)
10799
update(settingsObj)
@@ -117,22 +109,27 @@ internal fun Analytics.fetchSettings(
117109
writeKey: String,
118110
cdnHost: String
119111
): Settings? = try {
120-
val connection = HTTPClient(writeKey, this.configuration.requestFactory).settings(cdnHost)
121-
val settingsString =
122-
connection.inputStream?.bufferedReader()?.use(BufferedReader::readText) ?: ""
123-
log("Fetched Settings: $settingsString")
124-
LenientJson.decodeFromString(settingsString)
125-
} catch (ex: Exception) {
126-
reportErrorWithMetrics(
127-
this,
128-
AnalyticsError.SettingsFail(AnalyticsError.NetworkUnknown(URL("https://$cdnHost/projects/$writeKey/settings"), ex)),
129-
"Failed to fetch settings",
130-
Telemetry.INVOKE_ERROR_METRIC,
131-
ex.stackTraceToString()
132-
) {
133-
it["error"] = ex.toString()
134-
it["writekey"] = writeKey
135-
it["message"] = "Error retrieving settings"
136-
}
137-
null
138-
}
112+
val connection = HTTPClient(writeKey, this.configuration.requestFactory).settings(cdnHost)
113+
val settingsString =
114+
connection.inputStream?.bufferedReader()?.use(BufferedReader::readText) ?: ""
115+
log("Fetched Settings: $settingsString")
116+
LenientJson.decodeFromString(settingsString)
117+
} catch (ex: Exception) {
118+
reportErrorWithMetrics(
119+
this,
120+
AnalyticsError.SettingsFail(
121+
AnalyticsError.NetworkUnknown(
122+
URL("https://$cdnHost/projects/$writeKey/settings"),
123+
ex
124+
)
125+
),
126+
"Failed to fetch settings",
127+
Telemetry.INVOKE_ERROR_METRIC,
128+
ex.stackTraceToString()
129+
) {
130+
it["error"] = ex.toString()
131+
it["writekey"] = writeKey
132+
it["message"] = "Error retrieving settings"
133+
}
134+
null
135+
}

core/src/main/java/com/segment/analytics/kotlin/core/State.kt

Lines changed: 28 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -25,37 +25,38 @@ data class System(
2525

2626
companion object {
2727
fun defaultState(configuration: Configuration, storage: Storage): System {
28-
val settings = try {
29-
Json.decodeFromString(
30-
Settings.serializer(),
31-
storage.read(Storage.Constants.Settings) ?: ""
32-
)
33-
} catch (ignored: Exception) {
34-
35-
// This could be an empty Settings...
36-
if (configuration.defaultSettings.integrations.contains("Segment.io")) {
37-
configuration.defaultSettings
38-
} else {
39-
Settings(
40-
integrations = buildJsonObject {
28+
val storedSettings = storage.read(Storage.Constants.Settings)
29+
val defaultSettings = configuration.defaultSettings ?: Settings(
30+
integrations = buildJsonObject {
31+
put(
32+
"Segment.io",
33+
buildJsonObject {
4134
put(
42-
"Segment.io",
43-
buildJsonObject {
44-
put(
45-
"apiKey",
46-
configuration.writeKey
47-
)
48-
put("apiHost", Constants.DEFAULT_API_HOST)
49-
})
50-
},
51-
plan = emptyJsonObject,
52-
edgeFunction = emptyJsonObject,
53-
middlewareSettings = emptyJsonObject
35+
"apiKey",
36+
configuration.writeKey
37+
)
38+
put("apiHost", Constants.DEFAULT_API_HOST)
39+
})
40+
},
41+
plan = emptyJsonObject,
42+
edgeFunction = emptyJsonObject,
43+
middlewareSettings = emptyJsonObject
44+
)
45+
46+
// Use stored settings or fallback to default settings
47+
val settings = if (storedSettings == null || storedSettings == "" || storedSettings == "{}") {
48+
defaultSettings
49+
} else {
50+
try {
51+
Json.decodeFromString(
52+
Settings.serializer(),
53+
storedSettings
5454
)
55+
} catch (ignored: Exception) {
56+
defaultSettings
5557
}
56-
57-
5858
}
59+
5960
return System(
6061
configuration = configuration,
6162
settings = settings,

0 commit comments

Comments
 (0)