From 90b11c04ee3013aee01b321ca6e600395f69b84b Mon Sep 17 00:00:00 2001
From: Jono Wenger <jono@elixxir.io>
Date: Fri, 30 Jun 2023 10:33:54 -0700
Subject: [PATCH] Move all eventUpdate message handling to callback.go for
 channels

---
 indexedDb/impl/channels/callbacks.go          | 13 ++++++--
 indexedDb/impl/channels/implementation.go     | 21 +++++++------
 .../impl/channels/implementation_test.go      | 31 +++++++------------
 indexedDb/impl/channels/init.go               | 21 +++++--------
 indexedDb/impl/dm/callbacks.go                |  5 +--
 indexedDb/worker/dm/implementation.go         |  2 +-
 6 files changed, 44 insertions(+), 49 deletions(-)

diff --git a/indexedDb/impl/channels/callbacks.go b/indexedDb/impl/channels/callbacks.go
index 845fc6f5..32cdffb6 100644
--- a/indexedDb/impl/channels/callbacks.go
+++ b/indexedDb/impl/channels/callbacks.go
@@ -75,7 +75,7 @@ func (m *manager) newWASMEventModelCB(message []byte, reply func(message []byte)
 		return
 	}
 
-	m.model, err = NewWASMEventModel(msg.DatabaseName, encryption, m)
+	m.model, err = NewWASMEventModel(msg.DatabaseName, encryption, m.eventUpdate)
 	if err != nil {
 		reply([]byte(err.Error()))
 		return
@@ -84,8 +84,15 @@ func (m *manager) newWASMEventModelCB(message []byte, reply func(message []byte)
 	reply(nil)
 }
 
-// EventUpdate implements [bindings.ChannelUICallbacks.EventUpdate].
-func (m *manager) EventUpdate(eventType int64, jsonData []byte) {
+// eventUpdate JSON marshals the interface and sends it to the main thread the
+// with the event type to be sent on the EventUpdate callback.
+func (m *manager) eventUpdate(eventType int64, jsonMarshallable any) {
+	jsonData, err := json.Marshal(jsonMarshallable)
+	if err != nil {
+		jww.FATAL.Panicf("[CH] Failed to JSON marshal %T for EventUpdate "+
+			"callback: %+v", jsonMarshallable, err)
+	}
+
 	// Package parameters for sending
 	msg := wChannels.EventUpdateCallbackMessage{
 		EventType: eventType,
diff --git a/indexedDb/impl/channels/implementation.go b/indexedDb/impl/channels/implementation.go
index 7cb2fbfb..842a7543 100644
--- a/indexedDb/impl/channels/implementation.go
+++ b/indexedDb/impl/channels/implementation.go
@@ -36,9 +36,9 @@ import (
 // NOTE: This model is NOT thread safe - it is the responsibility of the
 // caller to ensure that its methods are called sequentially.
 type wasmModel struct {
-	db          *idb.Database
-	cipher      idbCrypto.Cipher
-	eventUpdate func(eventType int64, jsonMarshallable any)
+	db     *idb.Database
+	cipher idbCrypto.Cipher
+	eu     eventUpdate
 }
 
 // JoinChannel is called whenever a channel is joined locally.
@@ -169,7 +169,7 @@ func (w *wasmModel) ReceiveMessage(channelID *id.ID, messageID message.ID,
 		return 0
 	}
 
-	go w.eventUpdate(bindings.MessageReceived, bindings.MessageReceivedJSON{
+	go w.eu(bindings.MessageReceived, bindings.MessageReceivedJSON{
 		UUID:      int64(uuid),
 		ChannelID: channelID,
 		Update:    false,
@@ -211,7 +211,7 @@ func (w *wasmModel) ReceiveReply(channelID *id.ID, messageID,
 		return 0
 	}
 
-	go w.eventUpdate(bindings.MessageReceived, bindings.MessageReceivedJSON{
+	go w.eu(bindings.MessageReceived, bindings.MessageReceivedJSON{
 		UUID:      int64(uuid),
 		ChannelID: channelID,
 		Update:    false,
@@ -253,7 +253,7 @@ func (w *wasmModel) ReceiveReaction(channelID *id.ID, messageID,
 		return 0
 	}
 
-	go w.eventUpdate(bindings.MessageReceived, bindings.MessageReceivedJSON{
+	go w.eu(bindings.MessageReceived, bindings.MessageReceivedJSON{
 		UUID:      int64(uuid),
 		ChannelID: channelID,
 		Update:    false,
@@ -410,7 +410,7 @@ func (w *wasmModel) updateMessage(currentMsg *Message, messageID *message.ID,
 		return 0, err
 	}
 
-	go w.eventUpdate(bindings.MessageReceived, bindings.MessageReceivedJSON{
+	go w.eu(bindings.MessageReceived, bindings.MessageReceivedJSON{
 		UUID:      int64(uuid),
 		ChannelID: channelID,
 		Update:    true,
@@ -532,8 +532,9 @@ func (w *wasmModel) DeleteMessage(messageID message.ID) error {
 		return err
 	}
 
-	go w.eventUpdate(bindings.MessageDeleted,
-		bindings.MessageDeletedJSON{MessageID: messageID})
+	go w.eu(bindings.MessageDeleted, bindings.MessageDeletedJSON{
+		MessageID: messageID,
+	})
 
 	return nil
 }
@@ -542,7 +543,7 @@ func (w *wasmModel) DeleteMessage(messageID message.ID) error {
 func (w *wasmModel) MuteUser(
 	channelID *id.ID, pubKey ed25519.PublicKey, unmute bool) {
 
-	go w.eventUpdate(bindings.UserMuted, bindings.UserMutedJSON{
+	go w.eu(bindings.UserMuted, bindings.UserMutedJSON{
 		ChannelID: channelID,
 		PubKey:    pubKey,
 		Unmute:    unmute,
diff --git a/indexedDb/impl/channels/implementation_test.go b/indexedDb/impl/channels/implementation_test.go
index b6529317..4f52e0ff 100644
--- a/indexedDb/impl/channels/implementation_test.go
+++ b/indexedDb/impl/channels/implementation_test.go
@@ -42,14 +42,12 @@ func TestMain(m *testing.M) {
 	os.Exit(m.Run())
 }
 
-type dummyCbs struct{}
-
-func (c *dummyCbs) EventUpdate(int64, []byte) {}
+var dummyEU = func(int64, any) {}
 
 // Happy path test for receiving, updating, getting, and deleting a File.
 func TestWasmModel_ReceiveFile(t *testing.T) {
 	testString := "TestWasmModel_ReceiveFile"
-	m, err := newWASMModel(testString, nil, &dummyCbs{})
+	m, err := newWASMModel(testString, nil, dummyEU)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -135,8 +133,7 @@ func TestWasmModel_GetMessage(t *testing.T) {
 			storage.GetLocalStorage().Clear()
 			testMsgId := message.DeriveChannelMessageID(&id.ID{1}, 0, []byte(testString))
 
-			eventModel, err := newWASMModel(testString, c,
-				&dummyCbs{})
+			eventModel, err := newWASMModel(testString, c, dummyEU)
 			if err != nil {
 				t.Fatal(err)
 			}
@@ -166,7 +163,7 @@ func TestWasmModel_DeleteMessage(t *testing.T) {
 	storage.GetLocalStorage().Clear()
 	testString := "TestWasmModel_DeleteMessage"
 	testMsgId := message.DeriveChannelMessageID(&id.ID{1}, 0, []byte(testString))
-	eventModel, err := newWASMModel(testString, nil, &dummyCbs{})
+	eventModel, err := newWASMModel(testString, nil, dummyEU)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -222,8 +219,7 @@ func Test_wasmModel_UpdateSentStatus(t *testing.T) {
 			testString := "Test_wasmModel_UpdateSentStatus" + cs
 			testMsgId := message.DeriveChannelMessageID(
 				&id.ID{1}, 0, []byte(testString))
-			eventModel, err2 := newWASMModel(testString, c,
-				&dummyCbs{})
+			eventModel, err2 := newWASMModel(testString, c, dummyEU)
 			if err2 != nil {
 				t.Fatal(err)
 			}
@@ -294,7 +290,7 @@ func Test_wasmModel_JoinChannel_LeaveChannel(t *testing.T) {
 		}
 		t.Run("Test_wasmModel_JoinChannel_LeaveChannel"+cs, func(t *testing.T) {
 			storage.GetLocalStorage().Clear()
-			eventModel, err2 := newWASMModel("test", c, &dummyCbs{})
+			eventModel, err2 := newWASMModel("test", c, dummyEU)
 			if err2 != nil {
 				t.Fatal(err2)
 			}
@@ -347,8 +343,7 @@ func Test_wasmModel_UUIDTest(t *testing.T) {
 		t.Run("Test_wasmModel_UUIDTest"+cs, func(t *testing.T) {
 			storage.GetLocalStorage().Clear()
 			testString := "testHello" + cs
-			eventModel, err2 := newWASMModel(testString, c,
-				&dummyCbs{})
+			eventModel, err2 := newWASMModel(testString, c, dummyEU)
 			if err2 != nil {
 				t.Fatal(err2)
 			}
@@ -394,8 +389,7 @@ func Test_wasmModel_DuplicateReceives(t *testing.T) {
 		testString := "Test_wasmModel_DuplicateReceives" + cs
 		t.Run(testString, func(t *testing.T) {
 			storage.GetLocalStorage().Clear()
-			eventModel, err := newWASMModel(testString, c,
-				&dummyCbs{})
+			eventModel, err := newWASMModel(testString, c, dummyEU)
 			if err != nil {
 				t.Fatal(err)
 			}
@@ -446,8 +440,7 @@ func Test_wasmModel_deleteMsgByChannel(t *testing.T) {
 			storage.GetLocalStorage().Clear()
 			totalMessages := 10
 			expectedMessages := 5
-			eventModel, err := newWASMModel(testString, c,
-				&dummyCbs{})
+			eventModel, err := newWASMModel(testString, c, dummyEU)
 			if err != nil {
 				t.Fatal(err)
 			}
@@ -517,8 +510,7 @@ func TestWasmModel_receiveHelper_UniqueIndex(t *testing.T) {
 		t.Run("TestWasmModel_receiveHelper_UniqueIndex"+cs, func(t *testing.T) {
 			storage.GetLocalStorage().Clear()
 			testString := fmt.Sprintf("test_receiveHelper_UniqueIndex_%d", i)
-			eventModel, err := newWASMModel(testString, c,
-				&dummyCbs{})
+			eventModel, err := newWASMModel(testString, c, dummyEU)
 			if err != nil {
 				t.Fatal(err)
 			}
@@ -632,8 +624,7 @@ func TestUpsertMessageDuplicates(t *testing.T) {
 		csprng.NewSystemRNG())
 	require.NoError(t, err)
 	testString := "test_duplicateUpsertMessage"
-	eventModel, err := newWASMModel(testString, cipher,
-		&dummyCbs{})
+	eventModel, err := newWASMModel(testString, cipher, dummyEU)
 	require.NoError(t, err)
 
 	uuid, err := eventModel.upsertMessage(msg1)
diff --git a/indexedDb/impl/channels/init.go b/indexedDb/impl/channels/init.go
index e604b666..e53c0326 100644
--- a/indexedDb/impl/channels/init.go
+++ b/indexedDb/impl/channels/init.go
@@ -10,13 +10,11 @@
 package main
 
 import (
-	"encoding/json"
 	"syscall/js"
 
 	"github.com/hack-pad/go-indexeddb/idb"
 	jww "github.com/spf13/jwalterweatherman"
 
-	"gitlab.com/elixxir/client/v4/bindings"
 	"gitlab.com/elixxir/client/v4/channels"
 	idbCrypto "gitlab.com/elixxir/crypto/indexedDb"
 	"gitlab.com/elixxir/xxdk-wasm/indexedDb/impl"
@@ -26,17 +24,21 @@ import (
 // migration purposes.
 const currentVersion uint = 1
 
+// eventUpdate takes an event type and JSON object from
+// bindings/channelsCallbacks.go.
+type eventUpdate func(eventType int64, jsonMarshallable any)
+
 // NewWASMEventModel returns a [channels.EventModel] backed by a wasmModel.
 // The name should be a base64 encoding of the users public key. Returns the
 // EventModel based on IndexedDb and the database name as reported by IndexedDb.
 func NewWASMEventModel(databaseName string, encryption idbCrypto.Cipher,
-	uiCallbacks bindings.ChannelUICallbacks) (channels.EventModel, error) {
-	return newWASMModel(databaseName, encryption, uiCallbacks)
+	eu eventUpdate) (channels.EventModel, error) {
+	return newWASMModel(databaseName, encryption, eu)
 }
 
 // newWASMModel creates the given [idb.Database] and returns a wasmModel.
 func newWASMModel(databaseName string, encryption idbCrypto.Cipher,
-	uiCallbacks bindings.ChannelUICallbacks) (*wasmModel, error) {
+	eu eventUpdate) (*wasmModel, error) {
 	// Attempt to open database object
 	ctx, cancel := impl.NewContext()
 	defer cancel()
@@ -77,14 +79,7 @@ func newWASMModel(databaseName string, encryption idbCrypto.Cipher,
 	wrapper := &wasmModel{
 		db:     db,
 		cipher: encryption,
-		eventUpdate: func(eventType int64, jsonMarshallable any) {
-			data, err := json.Marshal(jsonMarshallable)
-			if err != nil {
-				jww.FATAL.Panicf("Failed to JSON marshal %T for EventUpdate "+
-					"callback: %+v", jsonMarshallable, err)
-			}
-			uiCallbacks.EventUpdate(eventType, data)
-		},
+		eu:     eu,
 	}
 	return wrapper, nil
 }
diff --git a/indexedDb/impl/dm/callbacks.go b/indexedDb/impl/dm/callbacks.go
index a18dba97..46d423f2 100644
--- a/indexedDb/impl/dm/callbacks.go
+++ b/indexedDb/impl/dm/callbacks.go
@@ -77,7 +77,8 @@ func (m *manager) newWASMEventModelCB(message []byte, reply func(message []byte)
 	reply(nil)
 }
 
-// EventUpdate implements [bindings.DmCallbacks.EventUpdate].
+// eventUpdate JSON marshals the interface and sends it to the main thread the
+// with the event type to be sent on the EventUpdate callback.
 func (m *manager) eventUpdate(eventType int64, jsonMarshallable any) {
 	jsonData, err := json.Marshal(jsonMarshallable)
 	if err != nil {
@@ -100,7 +101,7 @@ func (m *manager) eventUpdate(eventType int64, jsonMarshallable any) {
 	err = m.wtm.SendNoResponse(wDm.EventUpdateCallbackTag, data)
 	if err != nil {
 		exception.Throwf(
-			"[CH] Could not send message for EventUpdate callback: %+v", err)
+			"[DM] Could not send message for EventUpdate callback: %+v", err)
 	}
 }
 
diff --git a/indexedDb/worker/dm/implementation.go b/indexedDb/worker/dm/implementation.go
index ed021462..3104eb48 100644
--- a/indexedDb/worker/dm/implementation.go
+++ b/indexedDb/worker/dm/implementation.go
@@ -216,7 +216,7 @@ func (w *wasmModel) UpdateSentStatus(uuid uint64, messageID message.ID,
 	}
 
 	if err = w.wh.SendNoResponse(UpdateSentStatusTag, data); err != nil {
-		jww.FATAL.Panicf("[CH] Failed to send to %q: %+v", UpdateSentStatusTag, err)
+		jww.FATAL.Panicf("[DM] Failed to send to %q: %+v", UpdateSentStatusTag, err)
 	}
 }
 
-- 
GitLab