@@ -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,33 @@ 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 the engine has NOT been recreated and the cache/rules have not been invalidated then we can exit early.
79+ if (! engineRecreated && ! cacheInvalidated) return
6080
61- val setOfActiveDestinations = mutableSetOf<String >()
62- settings.middlewareSettings[" routingRules" ]?.safeJsonArray?.let { rules ->
81+ metricsPlugin.setOfActiveDestinations.clear()
82+ removeExistingFilters()
83+ cachedRules?.safeJsonArray?.let { rules ->
6384 for (it in rules) {
6485 val rule = it.jsonObject
6586 val destination: String =
6687 rule[" destinationName" ]?.jsonPrimitive?.contentOrNull ? : " "
6788 if (destination.isNotBlank()) {
6889 val added = createFilter(destination, rule)
6990 if (added) {
70- setOfActiveDestinations.add(destination)
91+ metricsPlugin. setOfActiveDestinations.add(destination)
7192 }
7293 }
7394 }
7495 }
75-
76- analytics.add(MetricsPlugin (setOfActiveDestinations))
7796 }
7897
7998 private fun removeExistingFilters () {
0 commit comments