| author | Stephen Paul Weber
<singpolyma@singpolyma.net> 2026-07-13 16:25:14 UTC |
| committer | Stephen Paul Weber
<singpolyma@singpolyma.net> 2026-07-13 16:25:14 UTC |
| parent | 8a169185f03bfb9250ff4f45a6fca317c2c31f5f |
| 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);