From 3e81db5c1e6e4a02da473ec71fe413191a94d997 Mon Sep 17 00:00:00 2001 From: mmehta3 Date: Tue, 27 May 2025 13:17:47 -0400 Subject: [PATCH 1/3] Expose resolveRequestTime hook in MetricsPlugin --- .../core/bridge/hooks/NodeSyncBailHook1.kt | 23 +++++++++++++++++++ .../playerui/plugins/metrics/MetricsPlugin.kt | 4 ++++ .../plugins/metrics/MetricsPluginTest.kt | 16 +++++++++++++ 3 files changed, 43 insertions(+) diff --git a/jvm/core/src/main/kotlin/com/intuit/playerui/core/bridge/hooks/NodeSyncBailHook1.kt b/jvm/core/src/main/kotlin/com/intuit/playerui/core/bridge/hooks/NodeSyncBailHook1.kt index f5b73a063..ae7fe72bd 100644 --- a/jvm/core/src/main/kotlin/com/intuit/playerui/core/bridge/hooks/NodeSyncBailHook1.kt +++ b/jvm/core/src/main/kotlin/com/intuit/playerui/core/bridge/hooks/NodeSyncBailHook1.kt @@ -34,3 +34,26 @@ public class NodeSyncBailHook1( NodeSyncBailHook1(it, serializer1) }) } + +@Serializable(with = NodeSyncBailHook.Serializer::class) +public class NodeSyncBailHook( + override val node: Node, +) : SyncBailHook<(HookContext) -> BailResult, R>(), NodeHook { + + override fun call(context: HookContext, serializedArgs: Array): R? { + require(serializedArgs.isEmpty()) + return call( + { f, _ -> f(context) }, + ) { Unit as R } + } + + public fun tap(name: String, callback: () -> BailResult): String? = super.tap(name) { _ -> callback() } + + public inline fun tap(noinline callback: () -> BailResult): String? = tap(callingStackTraceElement.toString(), callback) + + public inline fun tap(noinline callback: (HookContext) -> BailResult): String? = tap(callingStackTraceElement.toString(), callback) + + internal class Serializer : NodeWrapperSerializer>({ + NodeSyncBailHook(it) + }) +} \ No newline at end of file diff --git a/plugins/metrics/jvm/src/main/kotlin/com/intuit/playerui/plugins/metrics/MetricsPlugin.kt b/plugins/metrics/jvm/src/main/kotlin/com/intuit/playerui/plugins/metrics/MetricsPlugin.kt index 4438b44a8..040c4f7a0 100644 --- a/plugins/metrics/jvm/src/main/kotlin/com/intuit/playerui/plugins/metrics/MetricsPlugin.kt +++ b/plugins/metrics/jvm/src/main/kotlin/com/intuit/playerui/plugins/metrics/MetricsPlugin.kt @@ -3,6 +3,7 @@ package com.intuit.playerui.plugins.metrics import com.intuit.playerui.core.bridge.Node import com.intuit.playerui.core.bridge.NodeWrapper import com.intuit.playerui.core.bridge.getInvokable +import com.intuit.playerui.core.bridge.hooks.NodeSyncBailHook import com.intuit.playerui.core.bridge.hooks.NodeSyncHook1 import com.intuit.playerui.core.bridge.hooks.NodeSyncHook3 import com.intuit.playerui.core.bridge.runtime.Runtime @@ -48,6 +49,9 @@ public class MetricsPlugin( @Serializable(Hooks.Serializer::class) public class Hooks internal constructor(override val node: Node) : NodeWrapper { + public val resolveRequestTime: NodeSyncBailHook + by NodeSerializableField(NodeSyncBailHook.serializer(Int.serializer())) + public val onFlowBegin: NodeSyncHook1 by NodeSerializableField(NodeSyncHook1.serializer(PlayerFlowMetrics.serializer())) diff --git a/plugins/metrics/jvm/src/test/kotlin/com/intuit/playerui/plugins/metrics/MetricsPluginTest.kt b/plugins/metrics/jvm/src/test/kotlin/com/intuit/playerui/plugins/metrics/MetricsPluginTest.kt index 1f3295945..0f654ea57 100644 --- a/plugins/metrics/jvm/src/test/kotlin/com/intuit/playerui/plugins/metrics/MetricsPluginTest.kt +++ b/plugins/metrics/jvm/src/test/kotlin/com/intuit/playerui/plugins/metrics/MetricsPluginTest.kt @@ -1,5 +1,6 @@ package com.intuit.playerui.plugins.metrics +import com.intuit.hooks.BailResult import com.intuit.playerui.core.player.state.inProgressState import com.intuit.playerui.core.plugins.Plugin import com.intuit.playerui.utils.test.PlayerTest @@ -50,6 +51,21 @@ internal class MetricsPluginTest : PlayerTest() { verify { renderEndHandler wasNot Called } } + @OptIn(ExperimentalContracts::class) + @TestTemplate + fun `should trigger resolveRequestTime hook`() { + val expectedRequestTime = 1 + var actualRequestTime = 0 + + plugin?.hooks?.resolveRequestTime?.tap { -> + actualRequestTime = expectedRequestTime + BailResult.Bail(actualRequestTime) + } + + player.start(simpleFlowString) + assertEquals(expectedRequestTime, actualRequestTime) + } + @OptIn(ExperimentalContracts::class) @TestTemplate fun `should trigger onFlowBegin hook`() { From e9efe064ab69fa853c2a19fcdd89078850560eb9 Mon Sep 17 00:00:00 2001 From: mmehta3 Date: Wed, 28 May 2025 15:53:56 -0400 Subject: [PATCH 2/3] Lint fix. --- .../kotlin/com/intuit/playerui/plugins/metrics/MetricsPlugin.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/metrics/jvm/src/main/kotlin/com/intuit/playerui/plugins/metrics/MetricsPlugin.kt b/plugins/metrics/jvm/src/main/kotlin/com/intuit/playerui/plugins/metrics/MetricsPlugin.kt index 040c4f7a0..728395377 100644 --- a/plugins/metrics/jvm/src/main/kotlin/com/intuit/playerui/plugins/metrics/MetricsPlugin.kt +++ b/plugins/metrics/jvm/src/main/kotlin/com/intuit/playerui/plugins/metrics/MetricsPlugin.kt @@ -51,7 +51,7 @@ public class MetricsPlugin( public class Hooks internal constructor(override val node: Node) : NodeWrapper { public val resolveRequestTime: NodeSyncBailHook by NodeSerializableField(NodeSyncBailHook.serializer(Int.serializer())) - + public val onFlowBegin: NodeSyncHook1 by NodeSerializableField(NodeSyncHook1.serializer(PlayerFlowMetrics.serializer())) From 38a53415899cfe0d2baa5bd07c8c248158e420ab Mon Sep 17 00:00:00 2001 From: Mrigank Mehta Date: Wed, 28 May 2025 16:07:35 -0400 Subject: [PATCH 3/3] More lint fix --- .../com/intuit/playerui/core/bridge/hooks/NodeSyncBailHook1.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jvm/core/src/main/kotlin/com/intuit/playerui/core/bridge/hooks/NodeSyncBailHook1.kt b/jvm/core/src/main/kotlin/com/intuit/playerui/core/bridge/hooks/NodeSyncBailHook1.kt index ae7fe72bd..8ece04182 100644 --- a/jvm/core/src/main/kotlin/com/intuit/playerui/core/bridge/hooks/NodeSyncBailHook1.kt +++ b/jvm/core/src/main/kotlin/com/intuit/playerui/core/bridge/hooks/NodeSyncBailHook1.kt @@ -56,4 +56,4 @@ public class NodeSyncBailHook( internal class Serializer : NodeWrapperSerializer>({ NodeSyncBailHook(it) }) -} \ No newline at end of file +}