git » sdk » commit 25e6ae7

Skip separate storage of payloads when we have full stanza

author Stephen Paul Weber
2026-07-27 18:25:51 UTC
committer Stephen Paul Weber
2026-07-27 18:25:51 UTC
parent 47fcf6c1625c203be508ca2c7ac7701bb3a797df

Skip separate storage of payloads when we have full stanza

borogove/ChatMessageBuilder.hx +2 -0
borogove/persistence/IDB.js +8 -3

diff --git a/borogove/ChatMessageBuilder.hx b/borogove/ChatMessageBuilder.hx
index b912d44..be9d41d 100644
--- a/borogove/ChatMessageBuilder.hx
+++ b/borogove/ChatMessageBuilder.hx
@@ -312,6 +312,7 @@ class ChatMessageBuilder {
 		@param html rich text body to attach to the message
 	**/
 	public function setBody(html: Null<Html>) {
+		stanza = null;
 		final htmlIdx = payloads.findIndex((p) -> p.attr.get("xmlns") == "http://jabber.org/protocol/xhtml-im" && p.name == "html");
 		if (htmlIdx >= 0) payloads.splice(htmlIdx, 1);
 
@@ -338,6 +339,7 @@ class ChatMessageBuilder {
 		Set subject of this message
 	**/
 	public function setSubject(subject: Null<String>) {
+		stanza = null;
 		final subjectIdx = payloads.findIndex((p) -> p.name == "subject");
 		if (subjectIdx >= 0) payloads.splice(subjectIdx, 1);
 
diff --git a/borogove/persistence/IDB.js b/borogove/persistence/IDB.js
index df90994..47f4169 100644
--- a/borogove/persistence/IDB.js
+++ b/borogove/persistence/IDB.js
@@ -343,9 +343,14 @@ export default async (dbname, media, tokenize, stemmer) => {
 		message.text = value.text;
 		message.lang = value.lang;
 		message.type = value.type || (value.isGroupchat || value.groupchat ? enums.borogove_MessageType.Channel : enums.borogove_MessageType.Chat);
-		message.payloads = (value.payloads || []).map(borogove_Stanza.parse);
-		message.encryption = value.encryption;
 		message.stanza = value.stanza && borogove_Stanza.parse(value.stanza);
+		if (message.stanza) {
+			// Just use children from stanza instead of parsing again
+			message.payloads = message.stanza.allTags();
+		} else {
+			message.payloads = (value.payloads || []).map(borogove_Stanza.parse);
+		}
+		message.encryption = value.encryption;
 		if (!message.localId && !message.serverId) message.localId = "NO_ID"; // bad data
 		return message.build();
 	}
@@ -392,7 +397,7 @@ export default async (dbname, media, tokenize, stemmer) => {
 			timestamp: new Date(message.timestamp),
 			replyToMessage: message.replyToMessage && [account, message.replyToMessage.serverId || "", message.replyToMessage.serverIdBy || "", message.replyToMessage.localId || ""],
 			versions: message.versions.map((m) => serializeMessage(account, m)),
-			payloads: message.payloads.map((p) => p.toString()),
+			payloads: message.stanza ? undefined : message.payloads.map((p) => p.toString()),
 			stanza: message.stanza?.toString(),
 			terms: [...new Set(tokenize((message.text || "").replace(/^>.*/mg, "")).map(stemmer))].sort()
 		}