git » sdk » commit 6a47608

Workarounds for historical bad data

author Stephen Paul Weber
2025-03-18 19:17:19 UTC
committer Stephen Paul Weber
2025-03-18 19:17:19 UTC
parent 6d4674a75503b08b354caff5291702150df0323a

Workarounds for historical bad data

snikket/persistence/IDB.js +8 -1

diff --git a/snikket/persistence/IDB.js b/snikket/persistence/IDB.js
index 4f30c56..6e358a4 100644
--- a/snikket/persistence/IDB.js
+++ b/snikket/persistence/IDB.js
@@ -98,11 +98,11 @@ export default (dbname, media, tokenize, stemmer) => {
 		message.direction = value.direction;
 		message.status = value.status;
 		message.timestamp = value.timestamp && value.timestamp.toISOString();
-		message.to = value.to && snikket.JID.parse(value.to);
 		message.from = value.from && snikket.JID.parse(value.from);
 		message.sender = value.sender && snikket.JID.parse(value.sender);
 		message.senderId = value.senderId;
 		message.recipients = value.recipients.map((r) => snikket.JID.parse(r));
+		message.to = value.to ? snikket.JID.parse(value.to) : message.recipients[0];
 		message.replyTo = value.replyTo.map((r) => snikket.JID.parse(r));
 		message.threadId = value.threadId;
 		message.attachments = value.attachments;
@@ -112,6 +112,7 @@ export default (dbname, media, tokenize, stemmer) => {
 		message.type = value.type || (value.isGroupchat || value.groupchat ? enums.MessageType.Channel : enums.MessageType.Chat);
 		message.payloads = (value.payloads || []).map(snikket.Stanza.parse);
 		message.stanza = value.stanza && snikket.Stanza.parse(value.stanza);
+		if (!message.localId && !message.serverId) message.localId = "NO_ID"; // bad data
 		return message.build();
 	}
 
@@ -367,6 +368,7 @@ export default (dbname, media, tokenize, stemmer) => {
 			if (!message.serverId && !message.localId) throw "Cannot store a message with no id";
 			if (!message.serverId && message.isIncoming()) throw "Cannot store an incoming message with no server id";
 			if (message.serverId && !message.serverIdBy) throw "Cannot store a message with a server id and no by";
+
 			new Promise((resolve) =>
 				// Hydrate reply stubs
 				message.replyToMessage && !message.replyToMessage.serverIdBy ? this.getMessage(account, message.chatId(), message.replyToMessage.serverId, message.replyToMessage.localId, resolve) : resolve(message.replyToMessage)
@@ -425,6 +427,11 @@ export default (dbname, media, tokenize, stemmer) => {
 		},
 
 		updateMessage: function(account, message) {
+			if (!message.chatId()) throw "Cannot store a message with no chatId";
+			if (!message.serverId && !message.localId) throw "Cannot store a message with no id";
+			if (!message.serverId && message.isIncoming()) throw "Cannot store an incoming message with no server id";
+			if (message.serverId && !message.serverIdBy) throw "Cannot store a message with a server id and no by";
+
 			const tx = db.transaction(["messages"], "readwrite");
 			const store = tx.objectStore("messages");
 			store.put(serializeMessage(account, message));