Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -34,3 +34,26 @@ public class NodeSyncBailHook1<T, R>(
NodeSyncBailHook1(it, serializer1)
})
}

@Serializable(with = NodeSyncBailHook.Serializer::class)
public class NodeSyncBailHook<R>(
override val node: Node,
) : SyncBailHook<(HookContext) -> BailResult<R>, R>(), NodeHook<R?> {

override fun call(context: HookContext, serializedArgs: Array<Any?>): R? {
require(serializedArgs.isEmpty())
return call(
{ f, _ -> f(context) },
) { Unit as R }
}

public fun tap(name: String, callback: () -> BailResult<R>): String? = super.tap(name) { _ -> callback() }

public inline fun tap(noinline callback: () -> BailResult<R>): String? = tap(callingStackTraceElement.toString(), callback)

public inline fun tap(noinline callback: (HookContext) -> BailResult<R>): String? = tap(callingStackTraceElement.toString(), callback)

internal class Serializer<R> : NodeWrapperSerializer<NodeSyncBailHook<R>>({
NodeSyncBailHook(it)
})
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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<Int>
by NodeSerializableField(NodeSyncBailHook.serializer(Int.serializer()))

public val onFlowBegin: NodeSyncHook1<PlayerFlowMetrics>
by NodeSerializableField(NodeSyncHook1.serializer(PlayerFlowMetrics.serializer()))

Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is this at all flakey

}

@OptIn(ExperimentalContracts::class)
@TestTemplate
fun `should trigger onFlowBegin hook`() {
Expand Down