diff --git a/go.mod b/go.mod index 269a4feffcc6de5c08ff6b71c0b5a74ed3fd79b1..80e2312b666a0582628ef9baf4278f29daae8fed 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( github.com/spf13/cobra v1.7.0 github.com/spf13/jwalterweatherman v1.1.0 github.com/stretchr/testify v1.8.2 - gitlab.com/elixxir/client/v4 v4.6.4-0.20230629214449-ae8876a2850c + gitlab.com/elixxir/client/v4 v4.6.4-0.20230630173422-ac9c5506b1fb gitlab.com/elixxir/crypto v0.0.7-0.20230614183801-387e0cb8e76f gitlab.com/elixxir/primitives v0.0.3-0.20230613193928-8cf8bdd777ef gitlab.com/elixxir/wasm-utils v0.0.0-20230615222914-185dd3a6fa08 diff --git a/go.sum b/go.sum index 2956bf2f5c2e52e1eec501ffd8150275a169da3f..2859c8d3bc77d40238cb07ef17228490f1c65a91 100644 --- a/go.sum +++ b/go.sum @@ -411,8 +411,8 @@ github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo= github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4= gitlab.com/elixxir/bloomfilter v0.0.0-20230322223210-fa84f6842de8 h1:uAFCyBkXprQoPkcDDfxXtaMyL5x+xSGrAWzR907xROQ= gitlab.com/elixxir/bloomfilter v0.0.0-20230322223210-fa84f6842de8/go.mod h1:1X8gRIAPDisS3W6Vtr/ymiUmZMJUIwDV1o5DEOo/pzw= -gitlab.com/elixxir/client/v4 v4.6.4-0.20230629214449-ae8876a2850c h1:YCltggRu+zrUlru/gtGVIg672/uCNSGLemRpn/ClI5E= -gitlab.com/elixxir/client/v4 v4.6.4-0.20230629214449-ae8876a2850c/go.mod h1:wSeJ9pk+qqUrKHwhd4qZW1CnNlakK75n+1fOjJ7k1Ns= +gitlab.com/elixxir/client/v4 v4.6.4-0.20230630173422-ac9c5506b1fb h1:991u/qqqP2FI3MaH5y7MZE60HsXKXJ4lqCd2dYJcS88= +gitlab.com/elixxir/client/v4 v4.6.4-0.20230630173422-ac9c5506b1fb/go.mod h1:wSeJ9pk+qqUrKHwhd4qZW1CnNlakK75n+1fOjJ7k1Ns= gitlab.com/elixxir/comms v0.0.4-0.20230613220741-7de1d2ca4a1c h1:0TpLn4AdarrqCwUMvnz4Md+9gLyk9wrQ73J3W9U5zJo= gitlab.com/elixxir/comms v0.0.4-0.20230613220741-7de1d2ca4a1c/go.mod h1:z+qW0D9VpY5QKTd7wRlb5SK4kBNqLYsa4DXBcUXue9Q= gitlab.com/elixxir/crypto v0.0.7-0.20230614183801-387e0cb8e76f h1:T0Jvhq5nCELiwkVr07Ti/Ew9ICdexviYeCkFV19kk9A= diff --git a/indexedDb/impl/channels/callbacks.go b/indexedDb/impl/channels/callbacks.go index a2ac5e3d9c927207de354679e397f9255f4d9374..8eeadabeb2a61236bded58a5abb77d9d263d27a3 100644 --- a/indexedDb/impl/channels/callbacks.go +++ b/indexedDb/impl/channels/callbacks.go @@ -75,7 +75,8 @@ 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.eventUpdateCallback) if err != nil { reply([]byte(err.Error())) return @@ -84,10 +85,17 @@ 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) { +// eventUpdateCallback 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) eventUpdateCallback(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{ + msg := wChannels.EventUpdateCallbackMessage{ EventType: eventType, JsonData: jsonData, } diff --git a/indexedDb/impl/channels/implementation.go b/indexedDb/impl/channels/implementation.go index 7cb2fbfb35bde45e278a9209d06df6f0356b6436..8980a4bbd337b0993bd4b9963f6d89cb326b10f6 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 + eventCallback 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.eventCallback(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.eventCallback(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.eventCallback(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.eventCallback(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.eventCallback(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.eventCallback(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 b652931769ab0e1aac4c76f27c08e03135146213..4f52e0ff707de1a611384c41e816613ebd39638a 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 e604b666636e0953a0a9e19947c53550972d1e76..7a55c6d09823124e26360558aa7d3555bdbdb462 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) + eventCallback eventUpdate) (channels.EventModel, error) { + return newWASMModel(databaseName, encryption, eventCallback) } // newWASMModel creates the given [idb.Database] and returns a wasmModel. func newWASMModel(databaseName string, encryption idbCrypto.Cipher, - uiCallbacks bindings.ChannelUICallbacks) (*wasmModel, error) { + eventCallback eventUpdate) (*wasmModel, error) { // Attempt to open database object ctx, cancel := impl.NewContext() defer cancel() @@ -75,16 +77,9 @@ 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) - }, + db: db, + cipher: encryption, + eventCallback: eventCallback, } return wrapper, nil } diff --git a/indexedDb/impl/dm/callbacks.go b/indexedDb/impl/dm/callbacks.go index 72275ef9f9f093f74eda08462daa93508e64e9a2..a081a83dca9adf61a78e48101239edfd6a22c0b1 100644 --- a/indexedDb/impl/dm/callbacks.go +++ b/indexedDb/impl/dm/callbacks.go @@ -10,13 +10,11 @@ package main import ( - "crypto/ed25519" "encoding/json" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/v4/bindings" "gitlab.com/elixxir/client/v4/dm" "gitlab.com/elixxir/crypto/fastRNG" idbCrypto "gitlab.com/elixxir/crypto/indexedDb" @@ -71,7 +69,7 @@ func (m *manager) newWASMEventModelCB(message []byte, reply func(message []byte) } m.model, err = NewWASMEventModel( - msg.DatabaseName, encryption, m.messageReceivedCallback) + msg.DatabaseName, encryption, m.eventUpdateCallback) if err != nil { reply([]byte(err.Error())) return @@ -80,31 +78,31 @@ func (m *manager) newWASMEventModelCB(message []byte, reply func(message []byte) reply(nil) } -// messageReceivedCallback sends calls to the MessageReceivedCallback in the -// main thread. -// -// messageReceivedCallback adhere to the MessageReceivedCallback type. -func (m *manager) messageReceivedCallback(uuid uint64, pubKey ed25519.PublicKey, - messageUpdate, conversationUpdate bool) { +// eventUpdateCallback 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) eventUpdateCallback(eventType int64, jsonMarshallable any) { + jsonData, err := json.Marshal(jsonMarshallable) + if err != nil { + jww.FATAL.Panicf("[DM] Failed to JSON marshal %T for EventUpdate "+ + "callback: %+v", jsonMarshallable, err) + } + // Package parameters for sending - msg := bindings.DmMessageReceivedJSON{ - UUID: uuid, - PubKey: pubKey, - MessageUpdate: messageUpdate, - ConversationUpdate: conversationUpdate, + msg := wDm.EventUpdateCallbackMessage{ + EventType: eventType, + JsonData: jsonData, } data, err := json.Marshal(msg) if err != nil { - jww.ERROR.Printf( - "Could not JSON marshal MessageReceivedCallbackMessage: %+v", err) - return + exception.Throwf("[DM] Could not JSON marshal %T for EventUpdate "+ + "callback: %+v", msg, err) } // Send it to the main thread - err = m.wtm.SendNoResponse(wDm.MessageReceivedCallbackTag, data) + err = m.wtm.SendNoResponse(wDm.EventUpdateCallbackTag, data) if err != nil { - exception.Throwf("[DM] Could not send message for "+ - "MessageReceivedCallback: %+v", err) + exception.Throwf( + "[DM] Could not send message for EventUpdate callback: %+v", err) } } diff --git a/indexedDb/impl/dm/implementation.go b/indexedDb/impl/dm/implementation.go index 09303bcfa7747ef203d262c4da8e36b62c3daabe..e34bedb879c69daafbf0f5df1eb89c788b343b46 100644 --- a/indexedDb/impl/dm/implementation.go +++ b/indexedDb/impl/dm/implementation.go @@ -13,7 +13,6 @@ import ( "bytes" "crypto/ed25519" "encoding/json" - "gitlab.com/xx_network/primitives/netTime" "strings" "syscall/js" "time" @@ -22,6 +21,7 @@ import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" + "gitlab.com/elixxir/client/v4/bindings" "gitlab.com/elixxir/client/v4/cmix/rounds" "gitlab.com/elixxir/client/v4/dm" idbCrypto "gitlab.com/elixxir/crypto/indexedDb" @@ -29,15 +29,16 @@ import ( "gitlab.com/elixxir/wasm-utils/utils" "gitlab.com/elixxir/xxdk-wasm/indexedDb/impl" "gitlab.com/xx_network/primitives/id" + "gitlab.com/xx_network/primitives/netTime" ) // wasmModel implements dm.EventModel interface backed by IndexedDb. // 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 - receivedMessageCB MessageReceivedCallback + db *idb.Database + cipher idbCrypto.Cipher + eventCallback eventUpdate } // upsertConversation is used for joining or updating a Conversation. @@ -203,8 +204,12 @@ func (w *wasmModel) UpdateSentStatus(uuid uint64, messageID message.ID, jww.TRACE.Printf("[DM indexedDB] Calling ReceiveMessageCB(%v, %v, t, f)", uuid, newMessage.ConversationPubKey) - go w.receivedMessageCB(uuid, newMessage.ConversationPubKey, - true, false) + go w.eventCallback(bindings.DmMessageReceived, bindings.DmMessageReceivedJSON{ + UUID: uuid, + PubKey: newMessage.ConversationPubKey, + MessageUpdate: true, + ConversationUpdate: false, + }) } // receiveWrapper is a higher-level wrapper of upsertMessage. @@ -292,7 +297,12 @@ func (w *wasmModel) receiveWrapper(messageID message.ID, parentID *message.ID, n jww.TRACE.Printf("[DM indexedDB] Calling ReceiveMessageCB(%v, %v, f, %t)", uuid, partnerKey, conversationUpdated) - go w.receivedMessageCB(uuid, partnerKey, false, conversationUpdated) + go w.eventCallback(bindings.DmMessageReceived, bindings.DmMessageReceivedJSON{ + UUID: uuid, + PubKey: partnerKey, + MessageUpdate: false, + ConversationUpdate: conversationUpdated, + }) return uuid, nil } @@ -395,6 +405,10 @@ func (w *wasmModel) DeleteMessage(messageID message.ID, senderPubKey ed25519.Pub jww.ERROR.Printf("%s: %+v", parentErr, err) return false } + + go w.eventCallback(bindings.DmMessageReceived, bindings.DmMessageDeletedJSON{ + MessageID: messageID, + }) return true } diff --git a/indexedDb/impl/dm/implementation_test.go b/indexedDb/impl/dm/implementation_test.go index 39ca0036a078382ca232a2a725ff7a5ff412dddf..3ccadb2d8202f2b435a5331a52c7a569cd995ffa 100644 --- a/indexedDb/impl/dm/implementation_test.go +++ b/indexedDb/impl/dm/implementation_test.go @@ -29,7 +29,7 @@ import ( jww "github.com/spf13/jwalterweatherman" ) -func dummyReceivedMessageCB(uint64, ed25519.PublicKey, bool, bool) {} +var dummyEU = func(int64, any) {} func TestMain(m *testing.M) { jww.SetStdoutThreshold(jww.LevelDebug) @@ -38,8 +38,7 @@ func TestMain(m *testing.M) { // Test simple receive of a new message for a new conversation. func TestImpl_Receive(t *testing.T) { - m, err := newWASMModel("TestImpl_Receive", nil, - dummyReceivedMessageCB) + m, err := newWASMModel("TestImpl_Receive", nil, dummyEU) if err != nil { t.Fatal(err.Error()) } @@ -91,8 +90,7 @@ func TestImpl_Receive(t *testing.T) { // Test happy path. Insert some conversations and check they exist. func TestImpl_GetConversations(t *testing.T) { - m, err := newWASMModel("TestImpl_GetConversations", nil, - dummyReceivedMessageCB) + m, err := newWASMModel("TestImpl_GetConversations", nil, dummyEU) if err != nil { t.Fatal(err.Error()) } @@ -127,7 +125,7 @@ func TestImpl_GetConversations(t *testing.T) { // Test happy path toggling between blocked/unblocked in a Conversation. func TestWasmModel_BlockSender(t *testing.T) { - m, err := newWASMModel("TestWasmModel_BlockSender", nil, dummyReceivedMessageCB) + m, err := newWASMModel("TestWasmModel_BlockSender", nil, dummyEU) if err != nil { t.Fatal(err.Error()) } @@ -162,7 +160,7 @@ func TestWasmModel_BlockSender(t *testing.T) { // Test failed and successful deletes func TestWasmModel_DeleteMessage(t *testing.T) { - m, err := newWASMModel("TestWasmModel_DeleteMessage", nil, dummyReceivedMessageCB) + m, err := newWASMModel("TestWasmModel_DeleteMessage", nil, dummyEU) if err != nil { t.Fatal(err.Error()) } diff --git a/indexedDb/impl/dm/init.go b/indexedDb/impl/dm/init.go index aabad5c593eaca751ada0e364893aa6382135f35..0c33f614fc7cf2b9e2bbc041059e2e8b3bf0b90e 100644 --- a/indexedDb/impl/dm/init.go +++ b/indexedDb/impl/dm/init.go @@ -10,7 +10,6 @@ package main import ( - "crypto/ed25519" "syscall/js" "github.com/hack-pad/go-indexeddb/idb" @@ -25,24 +24,20 @@ import ( // migration purposes. const currentVersion uint = 1 -// MessageReceivedCallback is called any time a message is received or updated. -// -// messageUpdate is true if the Message already exists and was edited. -// conversationUpdate is true if the Conversation was created or modified. -type MessageReceivedCallback func( - uuid uint64, pubKey ed25519.PublicKey, messageUpdate, conversationUpdate bool) +// eventUpdate takes an event type and JSON object from bindings/dm.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, - cb MessageReceivedCallback) (dm.EventModel, error) { - return newWASMModel(databaseName, encryption, cb) + eventCallback eventUpdate) (dm.EventModel, error) { + return newWASMModel(databaseName, encryption, eventCallback) } // newWASMModel creates the given [idb.Database] and returns a wasmModel. func newWASMModel(databaseName string, encryption idbCrypto.Cipher, - cb MessageReceivedCallback) (*wasmModel, error) { + eventCallback eventUpdate) (*wasmModel, error) { // Attempt to open database object ctx, cancel := impl.NewContext() defer cancel() @@ -80,7 +75,11 @@ func newWASMModel(databaseName string, encryption idbCrypto.Cipher, return nil, ctx.Err() } - wrapper := &wasmModel{db: db, receivedMessageCB: cb, cipher: encryption} + wrapper := &wasmModel{ + db: db, + cipher: encryption, + eventCallback: eventCallback, + } return wrapper, nil } diff --git a/indexedDb/worker/channels/init.go b/indexedDb/worker/channels/init.go index dc88cbcf8b114c84696a9233c8ebca0e642d8580..7dbc56e6b77499e6c92dfb9903a72e06af77383a 100644 --- a/indexedDb/worker/channels/init.go +++ b/indexedDb/worker/channels/init.go @@ -26,11 +26,6 @@ import ( // databaseSuffix is the suffix to be appended to the name of the database. const databaseSuffix = "_speakeasy" -// eventUpdateCallback is the [bindings.ChannelUICallback] callback function -// it has a type [bindings.NickNameUpdate] to [bindings.MessageDeleted] -// and json data that is the callback information. -type eventUpdateCallback func(eventType int64, jsonData []byte) - // NewWASMEventModelBuilder returns an EventModelBuilder which allows // the channel manager to define the path but the callback is the same // across the board. @@ -53,7 +48,7 @@ type NewWASMEventModelMessage struct { // NewWASMEventModel returns a [channels.EventModel] backed by a wasmModel. // The name should be a base64 encoding of the users public key. func NewWASMEventModel(path, wasmJsPath string, encryption idbCrypto.Cipher, - channelCbs bindings.ChannelUICallbacks) (channels.EventModel, error) { + cbs bindings.ChannelUICallbacks) (channels.EventModel, error) { databaseName := path + databaseSuffix wm, err := worker.NewManager(wasmJsPath, "channelsIndexedDb", true) @@ -62,8 +57,7 @@ func NewWASMEventModel(path, wasmJsPath string, encryption idbCrypto.Cipher, } // Register handler to manage messages for the EventUpdate - wm.RegisterCallback(EventUpdateCallbackTag, - messageReceivedCallbackHandler(channelCbs.EventUpdate)) + wm.RegisterCallback(EventUpdateCallbackTag, eventUpdateCallbackHandler(cbs)) // Create MessageChannel between worker and logger so that the worker logs // are saved @@ -114,25 +108,25 @@ func NewWASMEventModel(path, wasmJsPath string, encryption idbCrypto.Cipher, } // EventUpdateCallbackMessage is JSON marshalled and received from the worker -// for the [EventUpdate] callback. +// for the EventUpdate callback. type EventUpdateCallbackMessage struct { EventType int64 `json:"eventType"` JsonData []byte `json:"jsonData"` } -// messageReceivedCallbackHandler returns a handler to manage messages for the -// MessageReceivedCallback. -func messageReceivedCallbackHandler(cb eventUpdateCallback) worker.ReceiverCallback { +// eventUpdateCallbackHandler returns a handler to manage messages for the +// [bindings.ChannelUICallbacks.EventUpdate] callback. +func eventUpdateCallbackHandler( + cbs bindings.ChannelUICallbacks) worker.ReceiverCallback { return func(message []byte, _ func([]byte)) { var msg EventUpdateCallbackMessage - err := json.Unmarshal(message, &msg) - if err != nil { + if err := json.Unmarshal(message, &msg); err != nil { jww.ERROR.Printf( "Failed to JSON unmarshal %T from worker: %+v", msg, err) return } - cb(msg.EventType, msg.JsonData) + cbs.EventUpdate(msg.EventType, msg.JsonData) } } diff --git a/indexedDb/worker/dm/implementation.go b/indexedDb/worker/dm/implementation.go index ed021462504dd35816c20839ee0cfbd61babef54..3104eb48ae12a78afb0ae654230f1c2ac85584a1 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) } } diff --git a/indexedDb/worker/dm/init.go b/indexedDb/worker/dm/init.go index 7ad5eca9a52a5facb6087a949f89c858a3d1043b..4e084aa29f92f71d296ae85ee39187f38aacc3b8 100644 --- a/indexedDb/worker/dm/init.go +++ b/indexedDb/worker/dm/init.go @@ -53,8 +53,7 @@ func NewWASMEventModel(path, wasmJsPath string, encryption idbCrypto.Cipher, } // Register handler to manage messages for the MessageReceivedCallback - wh.RegisterCallback( - MessageReceivedCallbackTag, messageReceivedCallbackHandler(cbs)) + wh.RegisterCallback(EventUpdateCallbackTag, eventUpdateCallbackHandler(cbs)) // Create MessageChannel between worker and logger so that the worker logs // are saved @@ -104,11 +103,26 @@ func NewWASMEventModel(path, wasmJsPath string, encryption idbCrypto.Cipher, return &wasmModel{wh}, nil } -// messageReceivedCallbackHandler returns a handler to manage messages for the -// MessageReceivedCallback. -func messageReceivedCallbackHandler(cbs bindings.DmCallbacks) worker.ReceiverCallback { +// EventUpdateCallbackMessage is JSON marshalled and received from the worker +// for the EventUpdate callback. +type EventUpdateCallbackMessage struct { + EventType int64 `json:"eventType"` + JsonData []byte `json:"jsonData"` +} + +// eventUpdateCallbackHandler returns a handler to manage messages for the +// [bindings.DmCallbacks.EventUpdate] callback. +func eventUpdateCallbackHandler( + cbs bindings.DmCallbacks) worker.ReceiverCallback { return func(message []byte, _ func([]byte)) { - cbs.EventUpdate(bindings.DmMessageReceived, message) + var msg EventUpdateCallbackMessage + if err := json.Unmarshal(message, &msg); err != nil { + jww.ERROR.Printf( + "Failed to JSON unmarshal %T from worker: %+v", msg, err) + return + } + + cbs.EventUpdate(msg.EventType, msg.JsonData) } } diff --git a/indexedDb/worker/dm/tags.go b/indexedDb/worker/dm/tags.go index 19e18afc537eb7686693e58e83b0e9ec5b3606ed..6679c9be4bd72026a8baf432fb43347dccc7bb53 100644 --- a/indexedDb/worker/dm/tags.go +++ b/indexedDb/worker/dm/tags.go @@ -14,8 +14,8 @@ import "gitlab.com/elixxir/xxdk-wasm/worker" // List of tags that can be used when sending a message or registering a handler // to receive a message. const ( - NewWASMEventModelTag worker.Tag = "NewWASMEventModel" - MessageReceivedCallbackTag worker.Tag = "MessageReceivedCallback" + NewWASMEventModelTag worker.Tag = "NewWASMEventModel" + EventUpdateCallbackTag worker.Tag = "EventUpdateCallback" ReceiveReplyTag worker.Tag = "ReceiveReply" ReceiveReactionTag worker.Tag = "ReceiveReaction"