From 1c0a54f232ba6462706d96f2de3755a8a56b22d5 Mon Sep 17 00:00:00 2001
From: "Richard T. Carback III" <rick.carback@gmail.com>
Date: Tue, 28 Feb 2023 16:49:10 +0000
Subject: [PATCH] Move the codeset from conversation to each message, since
 they change over time and can be different between users

---
 indexedDb/impl/dm/implementation.go | 31 +++++++++++++++--------------
 indexedDb/impl/dm/model.go          | 10 +++++-----
 2 files changed, 21 insertions(+), 20 deletions(-)

diff --git a/indexedDb/impl/dm/implementation.go b/indexedDb/impl/dm/implementation.go
index ca355ce4..9551f7ba 100644
--- a/indexedDb/impl/dm/implementation.go
+++ b/indexedDb/impl/dm/implementation.go
@@ -41,16 +41,15 @@ type wasmModel struct {
 
 // joinConversation is used for joining new conversations.
 func (w *wasmModel) joinConversation(nickname string,
-	pubKey ed25519.PublicKey, dmToken uint32, codeset uint8) error {
+	pubKey ed25519.PublicKey, dmToken uint32) error {
 	parentErr := errors.New("failed to joinConversation")
 
 	// Build object
 	newConvo := Conversation{
-		Pubkey:         pubKey,
-		Nickname:       nickname,
-		Token:          dmToken,
-		CodesetVersion: codeset,
-		Blocked:        false,
+		Pubkey:   pubKey,
+		Nickname: nickname,
+		Token:    dmToken,
+		Blocked:  false,
 	}
 
 	// Convert to jsObject
@@ -81,7 +80,7 @@ func (w *wasmModel) joinConversation(nickname string,
 // message, then you need to set it manually yourself.
 func buildMessage(messageID, parentID, text []byte, pubKey ed25519.PublicKey,
 	timestamp time.Time, round id.Round, mType dm.MessageType,
-	status dm.Status) *Message {
+	codeset uint8, status dm.Status) *Message {
 	return &Message{
 		MessageID:          messageID,
 		ConversationPubKey: pubKey,
@@ -89,6 +88,7 @@ func buildMessage(messageID, parentID, text []byte, pubKey ed25519.PublicKey,
 		Timestamp:          timestamp,
 		SenderPubKey:       pubKey[:],
 		Status:             uint8(status),
+		CodesetVersion:     codeset,
 		Text:               text,
 		Type:               uint16(mType),
 		Round:              uint64(round),
@@ -105,7 +105,7 @@ func (w *wasmModel) Receive(messageID message.ID, nickname string, text []byte,
 	_, err := impl.Get(w.db, conversationStoreName, utils.CopyBytesToJS(pubKey))
 	if err != nil {
 		if strings.Contains(err.Error(), impl.ErrDoesNotExist) {
-			err = w.joinConversation(nickname, pubKey, dmToken, codeset)
+			err = w.joinConversation(nickname, pubKey, dmToken)
 			if err != nil {
 				jww.ERROR.Printf("[DM indexedDB] %+v", err)
 				return 0
@@ -131,7 +131,7 @@ func (w *wasmModel) Receive(messageID message.ID, nickname string, text []byte,
 	}
 
 	msgToInsert := buildMessage(messageID.Bytes(), nil, text, pubKey, timestamp,
-		round.ID, mType, status)
+		round.ID, mType, codeset, status)
 	uuid, err := w.receiveHelper(msgToInsert, false)
 	if err != nil {
 		jww.ERROR.Printf("[DM indexedDB] Failed to receive Message: %+v", err)
@@ -154,7 +154,7 @@ func (w *wasmModel) ReceiveText(messageID message.ID, nickname, text string,
 	_, err := impl.Get(w.db, conversationStoreName, utils.CopyBytesToJS(pubKey))
 	if err != nil {
 		if strings.Contains(err.Error(), impl.ErrDoesNotExist) {
-			err = w.joinConversation(nickname, pubKey, dmToken, codeset)
+			err = w.joinConversation(nickname, pubKey, dmToken)
 			if err != nil {
 				jww.ERROR.Printf("[DM indexedDB] %+v", err)
 				return 0
@@ -182,7 +182,7 @@ func (w *wasmModel) ReceiveText(messageID message.ID, nickname, text string,
 	}
 
 	msgToInsert := buildMessage(messageID.Bytes(), nil, textBytes,
-		pubKey, timestamp, round.ID, dm.TextType, status)
+		pubKey, timestamp, round.ID, dm.TextType, codeset, status)
 
 	uuid, err := w.receiveHelper(msgToInsert, false)
 	if err != nil {
@@ -206,7 +206,7 @@ func (w *wasmModel) ReceiveReply(messageID, reactionTo message.ID, nickname,
 	_, err := impl.Get(w.db, conversationStoreName, utils.CopyBytesToJS(pubKey))
 	if err != nil {
 		if strings.Contains(err.Error(), impl.ErrDoesNotExist) {
-			err = w.joinConversation(nickname, pubKey, dmToken, codeset)
+			err = w.joinConversation(nickname, pubKey, dmToken)
 			if err != nil {
 				jww.ERROR.Printf("[DM indexedDB] %+v", err)
 				return 0
@@ -233,7 +233,8 @@ func (w *wasmModel) ReceiveReply(messageID, reactionTo message.ID, nickname,
 	}
 
 	msgToInsert := buildMessage(messageID.Bytes(), reactionTo.Marshal(),
-		textBytes, pubKey, timestamp, round.ID, dm.TextType, status)
+		textBytes, pubKey, timestamp, round.ID, dm.TextType, codeset,
+		status)
 
 	uuid, err := w.receiveHelper(msgToInsert, false)
 	if err != nil {
@@ -257,7 +258,7 @@ func (w *wasmModel) ReceiveReaction(messageID, _ message.ID, nickname,
 	_, err := impl.Get(w.db, conversationStoreName, utils.CopyBytesToJS(pubKey))
 	if err != nil {
 		if strings.Contains(err.Error(), impl.ErrDoesNotExist) {
-			err = w.joinConversation(nickname, pubKey, dmToken, codeset)
+			err = w.joinConversation(nickname, pubKey, dmToken)
 			if err != nil {
 				jww.ERROR.Printf("[DM indexedDB] %+v", err)
 				return 0
@@ -283,7 +284,7 @@ func (w *wasmModel) ReceiveReaction(messageID, _ message.ID, nickname,
 	}
 
 	msgToInsert := buildMessage(messageID.Bytes(), nil, textBytes, pubKey,
-		timestamp, round.ID, dm.ReactionType, status)
+		timestamp, round.ID, dm.ReactionType, codeset, status)
 
 	uuid, err := w.receiveHelper(msgToInsert, false)
 	if err != nil {
diff --git a/indexedDb/impl/dm/model.go b/indexedDb/impl/dm/model.go
index 96250e03..b4cfdcb6 100644
--- a/indexedDb/impl/dm/model.go
+++ b/indexedDb/impl/dm/model.go
@@ -46,6 +46,7 @@ type Message struct {
 	ParentMessageID    []byte    `json:"parent_message_id"`    // Index
 	Timestamp          time.Time `json:"timestamp"`            // Index
 	SenderPubKey       []byte    `json:"sender_pub_key"`
+	CodesetVersion     uint8     `json:"codeset_version"`
 	Status             uint8     `json:"status"`
 	Text               []byte    `json:"text"`
 	Type               uint16    `json:"type"`
@@ -56,9 +57,8 @@ type Message struct {
 // message exchange between two recipients.
 // A Conversation has many Message.
 type Conversation struct {
-	Pubkey         []byte `json:"pub_key"` // Matches convoPkeyName
-	Nickname       string `json:"nickname"`
-	Token          uint32 `json:"token"`
-	CodesetVersion uint8  `json:"codeset_version"`
-	Blocked        bool   `json:"blocked"`
+	Pubkey   []byte `json:"pub_key"` // Matches convoPkeyName
+	Nickname string `json:"nickname"`
+	Token    uint32 `json:"token"`
+	Blocked  bool   `json:"blocked"`
 }
-- 
GitLab