git » sdk » commit 84ea297

Always serialize when storing

author Stephen Paul Weber
2026-10-01 17:19:22 UTC
committer Stephen Paul Weber
2026-10-01 17:19:22 UTC
parent 7d97e9e8941264c0eb9431de7afd755dcd20231d

Always serialize when storing

We were pulling properties off of an unserialized message, which caused
eg JIDs to be stored as objects instead of strings.  This fixes the
storage but also papers over the mistake on load for existing data.

borogove/persistence/IDB.js +18 -11

diff --git a/borogove/persistence/IDB.js b/borogove/persistence/IDB.js
index 93e3867..b04f6c4 100644
--- a/borogove/persistence/IDB.js
+++ b/borogove/persistence/IDB.js
@@ -472,6 +472,16 @@ export default async (dbname, media, tokenize, stemmer) => {
 		return dateOrNothing.toJSON();
 	}
 
+	function hydrateJid(jid) {
+		if (typeof jid === "string") {
+			return borogove_JID.parse(jid);
+		} else if (jid) {
+			return new borogove_JID(jid.node, jid.domain, jid.resource, true);
+		} else {
+			return undefined;
+		}
+	}
+
 	function hydrateMessageSync(value) {
 		if (!value) return null;
 
@@ -489,14 +499,12 @@ export default async (dbname, media, tokenize, stemmer) => {
 			toISOString(value.timeSent) || toISOString(value.timestamp);
 		message.timeReceived =
 			toISOString(value.timeReceived) || toISOString(value.timestamp);
-		message.from = value.from && borogove_JID.parse(value.from);
-		message.sender = value.sender && borogove_JID.parse(value.sender);
+		message.from = hydrateJid(value.from);
+		message.sender = hydrateJid(value.sender);
 		message.senderId = value.senderId;
-		message.recipients = value.recipients.map((r) => borogove_JID.parse(r));
-		message.to = value.to
-			? borogove_JID.parse(value.to)
-			: message.recipients[0];
-		message.replyTo = value.replyTo.map((r) => borogove_JID.parse(r));
+		message.recipients = value.recipients.map((r) => hydrateJid(r));
+		message.to = value.to ? hydrateJid(value.to) : message.recipients[0];
+		message.replyTo = value.replyTo.map((r) => hydrateJid(r));
 		message.threadId = value.threadId;
 		message.attachments = (value.attachments ?? []).map(
 			(a) =>
@@ -636,16 +644,15 @@ export default async (dbname, media, tokenize, stemmer) => {
 		}
 		versions.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());
 		const head = { ...versions[0] };
-		const outer = getOuter(result.value, message);
+		const outer = getOuter(result.value, serializeMessage(account, message));
 		// Can't change primary key
 		head.serverIdBy = outer.serverIdBy;
 		head.serverId = outer.serverId;
 		head.localId = outer.localId;
 		head.replyId = outer.replyId;
 		// Edited version is not newer
-		head.timestamp = outer.timestamp ?? safeDate(outer.timeReceived);
-		head.timeSent =
-			safeDate(outer.timeSent || head.timestamp) ?? head.timestamp;
+		head.timestamp = outer.timestamp;
+		head.timeSent = outer.timeSent || head.timestamp;
 		head.sortId = outer.sortId;
 		head.versions = versions;
 		head.reactions = outer.reactions; // Preserve these, edit doesn't touch them