@@ -11,6 +11,7 @@ import com.segment.analytics.kotlin.core.utilities.toBaseEvent
11
11
import com.segment.analytics.substrata.kotlin.JSObject
12
12
import com.segment.analytics.substrata.kotlin.JSScope
13
13
import com.segment.analytics.substrata.kotlin.JsonElementConverter
14
+ import kotlinx.serialization.json.JsonElement
14
15
import kotlinx.serialization.json.JsonObject
15
16
import kotlinx.serialization.json.contentOrNull
16
17
import kotlinx.serialization.json.encodeToJsonElement
@@ -39,13 +40,24 @@ class DestinationFilters : Plugin {
39
40
override val type: Plugin .Type = Plugin .Type .Utility
40
41
var engine: JSScope ? = null
41
42
43
+ private var cachedRules: JsonElement ? = null
44
+ private val metricsPlugin = MetricsPlugin ()
45
+
42
46
// Call this function when app is destroyed, to prevent memory leaks
43
47
fun release () {
44
48
engine?.release()
45
49
engine = null
50
+ cachedRules = null
51
+ metricsPlugin.setOfActiveDestinations.clear()
52
+ }
53
+
54
+ override fun setup (analytics : Analytics ) {
55
+ super .setup(analytics)
56
+ analytics.add(metricsPlugin)
46
57
}
47
58
48
59
override fun update (settings : Settings , type : Plugin .UpdateType ) {
60
+ var engineRecreated = false
49
61
if (engine == null ) {
50
62
engine = JSScope {
51
63
it.printStackTrace()
@@ -54,26 +66,33 @@ class DestinationFilters : Plugin {
54
66
evaluate(tsubScript)
55
67
evaluate(tsubEvaluate)
56
68
}
69
+ engineRecreated = true
57
70
}
58
71
59
- removeExistingFilters()
72
+ var cacheInvalidated = false
73
+ if (cachedRules != settings.middlewareSettings[" routingRules" ]) {
74
+ cachedRules = settings.middlewareSettings[" routingRules" ]
75
+ cacheInvalidated = true
76
+ }
77
+
78
+ // If the engine has NOT been recreated and the cache/rules have not been invalidated then we can exit early.
79
+ if (! engineRecreated && ! cacheInvalidated) return
60
80
61
- val setOfActiveDestinations = mutableSetOf<String >()
62
- settings.middlewareSettings[" routingRules" ]?.safeJsonArray?.let { rules ->
81
+ metricsPlugin.setOfActiveDestinations.clear()
82
+ removeExistingFilters()
83
+ cachedRules?.safeJsonArray?.let { rules ->
63
84
for (it in rules) {
64
85
val rule = it.jsonObject
65
86
val destination: String =
66
87
rule[" destinationName" ]?.jsonPrimitive?.contentOrNull ? : " "
67
88
if (destination.isNotBlank()) {
68
89
val added = createFilter(destination, rule)
69
90
if (added) {
70
- setOfActiveDestinations.add(destination)
91
+ metricsPlugin. setOfActiveDestinations.add(destination)
71
92
}
72
93
}
73
94
}
74
95
}
75
-
76
- analytics.add(MetricsPlugin (setOfActiveDestinations))
77
96
}
78
97
79
98
private fun removeExistingFilters () {
0 commit comments