Skip to content

Commit e0f581a

Browse files
committed
fix(android): scale invoke result ack timeout to invoke budget
1 parent ab144e6 commit e0f581a

File tree

2 files changed

+43
-4
lines changed

2 files changed

+43
-4
lines changed

apps/android/app/src/main/java/ai/openclaw/android/gateway/GatewaySession.kt

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -501,11 +501,16 @@ class GatewaySession(
501501
} catch (err: Throwable) {
502502
invokeErrorFromThrowable(err)
503503
}
504-
sendInvokeResult(id, nodeId, result)
504+
sendInvokeResult(id, nodeId, result, timeoutMs)
505505
}
506506
}
507507

508-
private suspend fun sendInvokeResult(id: String, nodeId: String, result: InvokeResult) {
508+
private suspend fun sendInvokeResult(
509+
id: String,
510+
nodeId: String,
511+
result: InvokeResult,
512+
invokeTimeoutMs: Long?,
513+
) {
509514
val parsedPayload = result.payloadJson?.let { parseJsonOrNull(it) }
510515
val params =
511516
buildJsonObject {
@@ -527,10 +532,14 @@ class GatewaySession(
527532
)
528533
}
529534
}
535+
val ackTimeoutMs = resolveInvokeResultAckTimeoutMs(invokeTimeoutMs)
530536
try {
531-
request("node.invoke.result", params, timeoutMs = 15_000)
537+
request("node.invoke.result", params, timeoutMs = ackTimeoutMs)
532538
} catch (err: Throwable) {
533-
Log.w(loggerTag, "node.invoke.result failed: ${err.message ?: err::class.java.simpleName}")
539+
Log.w(
540+
loggerTag,
541+
"node.invoke.result failed (ackTimeoutMs=$ackTimeoutMs): ${err.message ?: err::class.java.simpleName}",
542+
)
534543
}
535544
}
536545

@@ -687,3 +696,8 @@ private fun parseJsonOrNull(payload: String): JsonElement? {
687696
null
688697
}
689698
}
699+
700+
internal fun resolveInvokeResultAckTimeoutMs(invokeTimeoutMs: Long?): Long {
701+
val normalized = invokeTimeoutMs?.takeIf { it > 0L } ?: 15_000L
702+
return normalized.coerceIn(15_000L, 120_000L)
703+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package ai.openclaw.android.gateway
2+
3+
import org.junit.Assert.assertEquals
4+
import org.junit.Test
5+
6+
class GatewaySessionInvokeTimeoutTest {
7+
@Test
8+
fun resolveInvokeResultAckTimeoutMs_usesFloorWhenMissingOrTooSmall() {
9+
assertEquals(15_000L, resolveInvokeResultAckTimeoutMs(null))
10+
assertEquals(15_000L, resolveInvokeResultAckTimeoutMs(0L))
11+
assertEquals(15_000L, resolveInvokeResultAckTimeoutMs(5_000L))
12+
}
13+
14+
@Test
15+
fun resolveInvokeResultAckTimeoutMs_usesInvokeBudgetWithinBounds() {
16+
assertEquals(30_000L, resolveInvokeResultAckTimeoutMs(30_000L))
17+
assertEquals(90_000L, resolveInvokeResultAckTimeoutMs(90_000L))
18+
}
19+
20+
@Test
21+
fun resolveInvokeResultAckTimeoutMs_capsAtUpperBound() {
22+
assertEquals(120_000L, resolveInvokeResultAckTimeoutMs(121_000L))
23+
assertEquals(120_000L, resolveInvokeResultAckTimeoutMs(Long.MAX_VALUE))
24+
}
25+
}

0 commit comments

Comments
 (0)