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