git » sdk » commit 61fa462

Fix backwards logic for chat states

author Stephen Paul Weber
2026-07-13 16:25:14 UTC
committer Stephen Paul Weber
2026-07-13 16:25:14 UTC
parent 8a169185f03bfb9250ff4f45a6fca317c2c31f5f

Fix backwards logic for chat states

Emit when chat != null not when chat == null

borogove/Client.hx +5 -7
test/TestClient.hx +38 -0

diff --git a/borogove/Client.hx b/borogove/Client.hx
index 6275091..aed6f39 100644
--- a/borogove/Client.hx
+++ b/borogove/Client.hx
@@ -637,14 +637,12 @@ class Client extends EventEmitter {
 			case "paused": UserState.Paused;
 			default: null;
 		};
-		if (userState != null) {
-			if (chat == null) {
-				chat.getMemberDetails([message.senderId]).then(members -> {
-					if (members.length > 0 && members[0].isSelf) return;
+		if (userState != null && chat != null) {
+			chat.getMemberDetails([message.senderId]).then(members -> {
+				if (members.length > 0 && members[0].isSelf) return;
 
-					this.trigger("chat-state/update", { message: message, userState: userState });
-				});
-			}
+				this.trigger("chat-state/update", { message: message, userState: userState });
+			});
 		}
 
 		final memberUpdates = MemberUpdate.extractUpdates(accountId(), chat, stanza);
diff --git a/test/TestClient.hx b/test/TestClient.hx
index 9461ca3..66a9202 100644
--- a/test/TestClient.hx
+++ b/test/TestClient.hx
@@ -366,6 +366,44 @@ class TestClient extends utest.Test {
 		client.stream.onStanza(new Stanza("message", { xmlns: "jabber:client", from: "test2@example.com", id: "localid"}).textTag("body", "hi"));
 	}
 
+	public function testUnknownGroupchatChatStateDoesNotCrash() {
+		final persistence = new Dummy();
+		final client = new Client("test@example.com", persistence);
+		var gotChatState = false;
+
+		client.on("chat-state/update", (_) -> {
+			gotChatState = true;
+			return EventHandled;
+		});
+
+		client.stream.onStanza(
+			new Stanza("message", { xmlns: "jabber:client", from: "room@example.com/alice", type: "groupchat" })
+				.tag("composing", { xmlns: "http://jabber.org/protocol/chatstates" })
+		);
+
+		Assert.isFalse(gotChatState);
+		Assert.isNull(client.getChat("room@example.com"));
+	}
+
+	public function testKnownChatChatStateEmits(async: Async) {
+		final persistence = new Dummy();
+		final client = new Client("test@example.com", persistence);
+		client.getDirectChat("friend@example.com");
+
+		client.addUserStateListener((senderId, chatId, threadId, userState) -> {
+			Assert.equals("friend@example.com", senderId);
+			Assert.equals("friend@example.com", chatId);
+			Assert.isNull(threadId);
+			Assert.equals(UserState.Composing, userState);
+			async.done();
+		});
+
+		client.stream.onStanza(
+			new Stanza("message", { xmlns: "jabber:client", from: "friend@example.com" })
+				.tag("composing", { xmlns: "http://jabber.org/protocol/chatstates" })
+		);
+	}
+
 	public function testEmptyAccountId() {
 		final persistence = new Dummy();
 		Assert.raises(() -> new Client("", persistence), String);