git » sdk » commit c9f8234

Fix NPE

author Stephen Paul Weber
2026-03-16 15:02:57 UTC
committer Stephen Paul Weber
2026-03-16 15:02:57 UTC
parent 5072b9b1a9084e104b9e3f6081a8e398ca32dfd9

Fix NPE

borogove/Chat.hx +8 -6
borogove/persistence/IDB.js +2 -0

diff --git a/borogove/Chat.hx b/borogove/Chat.hx
index 279e250..f3f7814 100644
--- a/borogove/Chat.hx
+++ b/borogove/Chat.hx
@@ -503,6 +503,8 @@ abstract class Chat {
 		An ID of the last message displayed to the user
 	**/
 	public function readUpTo(): Promise<Null<ChatMessage>> {
+		if (readUpToId == null) return Promise.resolve(null);
+
 		return persistence.getMessage(client.accountId(), chatId, readUpToId, null);
 	}
 
@@ -976,14 +978,14 @@ class DirectChat extends Chat {
 
 	@HaxeCBridge.noemit // on superclass as abstract
 	public function getMessagesBefore(before: Null<ChatMessage>):Promise<Array<ChatMessage>> {
-		if (before.chatId() != chatId) throw "Cannot look before from a different chat";
+		if (before != null && before.chatId() != chatId) throw "Cannot look before from a different chat";
 
 		return persistence.getMessagesBefore(client.accountId(), chatId, before).then((messages) ->
 			if (messages.length > 0) {
 				Promise.resolve(messages);
 			} else {
 				var filter:MAMQueryParams = { with: this.chatId };
-				if (before.serverId != null) filter.page = { before: before.serverId };
+				if (before?.serverId != null) filter.page = { before: before.serverId };
 				var sync  = new MessageSync(this.client, this.stream, filter);
 				fetchFromSync(sync);
 			}
@@ -992,7 +994,7 @@ class DirectChat extends Chat {
 
 	@HaxeCBridge.noemit // on superclass as abstract
 	public function getMessagesAfter(after: Null<ChatMessage>):Promise<Array<ChatMessage>> {
-		if (after.chatId() != chatId) throw "Cannot look after from a different chat";
+		if (after != null && after.chatId() != chatId) throw "Cannot look after from a different chat";
 		if (after != null && lastMessage != null && lastMessage.canReplace(after) && !syncing()) {
 			return Promise.resolve([]);
 		}
@@ -1002,7 +1004,7 @@ class DirectChat extends Chat {
 				Promise.resolve(messages);
 			} else {
 				var filter:MAMQueryParams = { with: this.chatId };
-				if (after.serverId != null) filter.page = { after: after.serverId };
+				if (after?.serverId != null) filter.page = { after: after.serverId };
 				var sync  = new MessageSync(this.client, this.stream, filter);
 				fetchFromSync(sync);
 			}
@@ -1649,7 +1651,7 @@ trace("XYZZY no MUC avatar locally matching so fetch vcard", chatId, avatarSha1H
 
 	@HaxeCBridge.noemit // on superclass as abstract
 	public function getMessagesBefore(before: Null<ChatMessage>):Promise<Array<ChatMessage>> {
-		if (before.chatId() != chatId) throw "Cannot look before from a different chat";
+		if (before != null && before.chatId() != chatId) throw "Cannot look before from a different chat";
 
 		return persistence.getMessagesBefore(client.accountId(), chatId, before).then((messages) ->
 			if (messages.length > 0) {
@@ -1670,7 +1672,7 @@ trace("XYZZY no MUC avatar locally matching so fetch vcard", chatId, avatarSha1H
 
 	@HaxeCBridge.noemit // on superclass as abstract
 	public function getMessagesAfter(after: Null<ChatMessage>):Promise<Array<ChatMessage>> {
-		if (after.chatId() != chatId) throw "Cannot look after from a different chat";
+		if (after != null && after.chatId() != chatId) throw "Cannot look after from a different chat";
 		if (after != null && lastMessage != null && lastMessage.canReplace(after) && !syncing()) {
 			return Promise.resolve([]);
 		}
diff --git a/borogove/persistence/IDB.js b/borogove/persistence/IDB.js
index 6c62f00..5638afd 100644
--- a/borogove/persistence/IDB.js
+++ b/borogove/persistence/IDB.js
@@ -382,6 +382,8 @@ export default async (dbname, media, tokenize, stemmer) => {
 		},
 
 		getMessage: async function(account, chatId, serverId, localId) {
+			if (!serverId && !localId) throw "Can't getMessage by no id";
+
 			const tx = db.transaction(["messages"], "readonly");
 			const store = tx.objectStore("messages");
 			let result;