Fix Java offline client connection cleanup (#3229)

* fix(runtime): close Java client after final offline result

* test(runtime): exercise EOF through Java client API
This commit is contained in:
zhifu gao
2026-07-15 06:07:36 +08:00
committed by GitHub
parent ddd9a3fada
commit ddecf48db4
3 changed files with 81 additions and 2 deletions
+4 -1
View File
@@ -225,7 +225,10 @@ public class FunasrWsClient extends WebSocketClient {
close();
}
if (iseof && mode.equals("offline") && jsonObject.containsKey("is_final") && jsonObject.get("is_final").equals("false")) {
if (iseof
&& mode.equals("offline")
&& jsonObject.containsKey("is_final")
&& Boolean.TRUE.equals(jsonObject.get("is_final"))) {
close();
}
}
+7 -1
View File
@@ -8,6 +8,7 @@ WEBSOCKET_DIR:= ./
WEBSOCKET_FILES = \
$(WEBSOCKET_DIR)/FunasrWsClient.java \
TEST_FILES = $(WEBSOCKET_DIR)/tests/FunasrWsClientTest.java
LIB_BUILD_DIR = ./lib
@@ -31,7 +32,7 @@ vpath %.java src
rebuild: clean all
.PHONY: clean run downjar
.PHONY: clean run downjar test
downjar:
wget https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar -P ./lib/
@@ -61,6 +62,11 @@ runclient:
buildwebsocket: $(WEBSOCKET_FILES:.java=.class)
test: buildwebsocket
$(JAVAC) -cp $(BUILD_DIR):lib/slf4j-simple-1.7.25.jar:lib/slf4j-api-1.7.25.jar:lib/Java-WebSocket-1.5.3.jar:lib/json-simple-1.1.1.jar:lib/argparse4j-0.9.0.jar -d $(BUILD_DIR) -encoding UTF-8 $(TEST_FILES)
java -ea -cp $(BUILD_DIR):lib/slf4j-simple-1.7.25.jar:lib/slf4j-api-1.7.25.jar:lib/Java-WebSocket-1.5.3.jar:lib/json-simple-1.1.1.jar:lib/argparse4j-0.9.0.jar $(RUNJFLAGS) websocket.FunasrWsClientTest
%.class: %.java
$(JAVAC) -cp $(BUILD_DIR):lib/slf4j-simple-1.7.25.jar:lib/slf4j-api-1.7.25.jar:lib/Java-WebSocket-1.5.3.jar:lib/json-simple-1.1.1.jar:lib/argparse4j-0.9.0.jar -d $(BUILD_DIR) -encoding UTF-8 $<
@@ -0,0 +1,70 @@
package websocket;
import java.net.URI;
public final class FunasrWsClientTest {
private static final class RecordingClient extends FunasrWsClient {
private boolean closeCalled;
RecordingClient() throws Exception {
super(new URI("ws://127.0.0.1:1"));
}
@Override
public void close() {
closeCalled = true;
}
@Override
public void send(String text) {}
}
private static void assertCloseDecision(
boolean expected, boolean eof, String clientMode, String message, String description)
throws Exception {
RecordingClient client = new RecordingClient();
FunasrWsClient.mode = clientMode;
if (eof) {
client.sendEof();
}
client.onMessage(message);
if (client.closeCalled != expected) {
throw new AssertionError(
description + ": expected close=" + expected + ", actual=" + client.closeCalled);
}
}
public static void main(String[] args) throws Exception {
assertCloseDecision(
false,
true,
"offline",
"{\"text\":\"partial\",\"is_final\":false}",
"non-final offline response");
assertCloseDecision(
false,
false,
"offline",
"{\"text\":\"done\",\"is_final\":true}",
"final response before EOF");
assertCloseDecision(
false,
true,
"online",
"{\"text\":\"done\",\"is_final\":true}",
"final online response");
assertCloseDecision(
true,
true,
"offline",
"{\"text\":\"legacy done\"}",
"legacy offline response without is_final");
assertCloseDecision(
true,
true,
"offline",
"{\"mode\":\"2pass-offline\",\"text\":\"done\",\"is_final\":true}",
"final offline response");
}
}