@@ -11,6 +11,7 @@ import com.segment.analytics.kotlin.core.utilities.toBaseEvent
1111import com.segment.analytics.substrata.kotlin.JSObject
1212import com.segment.analytics.substrata.kotlin.JSScope
1313import com.segment.analytics.substrata.kotlin.JsonElementConverter
14+ import kotlinx.serialization.json.JsonElement
1415import kotlinx.serialization.json.JsonObject
1516import kotlinx.serialization.json.contentOrNull
1617import kotlinx.serialization.json.encodeToJsonElement
@@ -39,13 +40,24 @@ class DestinationFilters : Plugin {
3940 override val type: Plugin .Type = Plugin .Type .Utility
4041 var engine: JSScope ? = null
4142
43+ private var cachedRules: JsonElement ? = null
44+ private val metricsPlugin = MetricsPlugin ()
45+
4246 // Call this function when app is destroyed, to prevent memory leaks
4347 fun release () {
4448 engine?.release()
4549 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)
4657 }
4758
4859 override fun update (settings : Settings , type : Plugin .UpdateType ) {
60+ var engineRecreated = false
4961 if (engine == null ) {
5062 engine = JSScope {
5163 it.printStackTrace()
@@ -54,26 +66,34 @@ class DestinationFilters : Plugin {
5466 evaluate(tsubScript)
5567 evaluate(tsubEvaluate)
5668 }
69+ engineRecreated = true
5770 }
5871
59- removeExistingFilters()
72+ var cacheInvalidated = false
73+ if (cachedRules != settings.middlewareSettings[" routingRules" ]) {
74+ cachedRules = settings.middlewareSettings[" routingRules" ]
75+ cacheInvalidated = true
76+ }
77+
78+ // if engine recreated or rules are different we need to remove and recreated filters
79+ // otherwise, we can skip
80+ if (! engineRecreated && ! cacheInvalidated) return
6081
61- val setOfActiveDestinations = mutableSetOf<String >()
62- settings.middlewareSettings[" routingRules" ]?.safeJsonArray?.let { rules ->
82+ metricsPlugin.setOfActiveDestinations.clear()
83+ removeExistingFilters()
84+ cachedRules?.safeJsonArray?.let { rules ->
6385 for (it in rules) {
6486 val rule = it.jsonObject
6587 val destination: String =
6688 rule[" destinationName" ]?.jsonPrimitive?.contentOrNull ? : " "
6789 if (destination.isNotBlank()) {
6890 val added = createFilter(destination, rule)
6991 if (added) {
70- setOfActiveDestinations.add(destination)
92+ metricsPlugin. setOfActiveDestinations.add(destination)
7193 }
7294 }
7395 }
7496 }
75-
76- analytics.add(MetricsPlugin (setOfActiveDestinations))
7797 }
7898
7999 private fun removeExistingFilters () {
0 commit comments