diff --git a/indexedDb/channels/handlers.go b/indexedDb/channels/handlers.go index 9c13ed7728fb3a7979e30e95eac2e59f624c418d..0a56d9584b939cb1f82d759a1e30acacd00bc604 100644 --- a/indexedDb/channels/handlers.go +++ b/indexedDb/channels/handlers.go @@ -38,16 +38,16 @@ type manager struct { // RegisterHandlers registers all the reception handlers to manage messages from // the main thread for the channels.EventModel. func (m *manager) RegisterHandlers() { - m.mh.RegisterHandler(worker.NewWASMEventModelTag, m.newWASMEventModelHandler) - m.mh.RegisterHandler(worker.JoinChannelTag, m.joinChannelHandler) - m.mh.RegisterHandler(worker.LeaveChannelTag, m.leaveChannelHandler) - m.mh.RegisterHandler(worker.ReceiveMessageTag, m.receiveMessageHandler) - m.mh.RegisterHandler(worker.ReceiveReplyTag, m.receiveReplyHandler) - m.mh.RegisterHandler(worker.ReceiveReactionTag, m.receiveReactionHandler) - m.mh.RegisterHandler(worker.UpdateFromUUIDTag, m.updateFromUUIDHandler) - m.mh.RegisterHandler(worker.UpdateFromMessageIDTag, m.updateFromMessageIDHandler) - m.mh.RegisterHandler(worker.GetMessageTag, m.getMessageHandler) - m.mh.RegisterHandler(worker.DeleteMessageTag, m.deleteMessageHandler) + m.mh.RegisterCallback(mChannels.NewWASMEventModelTag, m.newWASMEventModelHandler) + m.mh.RegisterCallback(mChannels.JoinChannelTag, m.joinChannelHandler) + m.mh.RegisterCallback(mChannels.LeaveChannelTag, m.leaveChannelHandler) + m.mh.RegisterCallback(mChannels.ReceiveMessageTag, m.receiveMessageHandler) + m.mh.RegisterCallback(mChannels.ReceiveReplyTag, m.receiveReplyHandler) + m.mh.RegisterCallback(mChannels.ReceiveReactionTag, m.receiveReactionHandler) + m.mh.RegisterCallback(mChannels.UpdateFromUUIDTag, m.updateFromUUIDHandler) + m.mh.RegisterCallback(mChannels.UpdateFromMessageIDTag, m.updateFromMessageIDHandler) + m.mh.RegisterCallback(mChannels.GetMessageTag, m.getMessageHandler) + m.mh.RegisterCallback(mChannels.DeleteMessageTag, m.deleteMessageHandler) } // newWASMEventModelHandler is the handler for NewWASMEventModel. Returns an @@ -97,7 +97,7 @@ func (m *manager) messageReceivedCallback( } // Send it to the main thread - m.mh.SendMessage(worker.MessageReceivedCallbackTag, data) + m.mh.SendMessage(mChannels.MessageReceivedCallbackTag, data) } // storeDatabaseName sends the database name to the main thread and waits for @@ -107,14 +107,14 @@ func (m *manager) messageReceivedCallback( func (m *manager) storeDatabaseName(databaseName string) error { // Register response handler with channel that will wait for the response responseChan := make(chan []byte) - m.mh.RegisterCallback(worker.StoreDatabaseNameTag, + m.mh.RegisterCallback(mChannels.StoreDatabaseNameTag, func(data []byte) ([]byte, error) { responseChan <- data return nil, nil }) // Send encryption status to main thread - m.mh.SendMessage(worker.StoreDatabaseNameTag, []byte(databaseName)) + m.mh.SendMessage(mChannels.StoreDatabaseNameTag, []byte(databaseName)) // Wait for response select { @@ -151,14 +151,14 @@ func (m *manager) storeEncryptionStatus( // Register response handler with channel that will wait for the response responseChan := make(chan []byte) - m.mh.RegisterCallback(worker.EncryptionStatusTag, + m.mh.RegisterCallback(mChannels.EncryptionStatusTag, func(data []byte) ([]byte, error) { responseChan <- data return nil, nil }) // Send encryption status to main thread - m.mh.SendMessage(worker.EncryptionStatusTag, data) + m.mh.SendMessage(mChannels.EncryptionStatusTag, data) // Wait for response var response mChannels.EncryptionStatusReply diff --git a/indexedDb/dm/handlers.go b/indexedDb/dm/handlers.go index 4e2607ee46644f34f26548a51a48476fc98d1058..cebe3594f0089fa70392639be2138875443e321e 100644 --- a/indexedDb/dm/handlers.go +++ b/indexedDb/dm/handlers.go @@ -36,12 +36,12 @@ type manager struct { // RegisterHandlers registers all the reception handlers to manage messages from // the main thread for the channels.EventModel. func (m *manager) RegisterHandlers() { - m.mh.RegisterHandler(worker.NewWASMEventModelTag, m.newWASMEventModelHandler) - m.mh.RegisterHandler(worker.ReceiveTag, m.receiveHandler) - m.mh.RegisterHandler(worker.ReceiveTextTag, m.receiveTextHandler) - m.mh.RegisterHandler(worker.ReceiveReplyTag, m.receiveReplyHandler) - m.mh.RegisterHandler(worker.ReceiveReactionTag, m.receiveReactionHandler) - m.mh.RegisterHandler(worker.UpdateSentStatusTag, m.updateSentStatusHandler) + m.mh.RegisterCallback(mDm.NewWASMEventModelTag, m.newWASMEventModelHandler) + m.mh.RegisterCallback(mDm.ReceiveTag, m.receiveHandler) + m.mh.RegisterCallback(mDm.ReceiveTextTag, m.receiveTextHandler) + m.mh.RegisterCallback(mDm.ReceiveReplyTag, m.receiveReplyHandler) + m.mh.RegisterCallback(mDm.ReceiveReactionTag, m.receiveReactionHandler) + m.mh.RegisterCallback(mDm.UpdateSentStatusTag, m.updateSentStatusHandler) } // newWASMEventModelHandler is the handler for NewWASMEventModel. Returns an @@ -91,7 +91,7 @@ func (m *manager) messageReceivedCallback( } // Send it to the main thread - m.mh.SendMessage(worker.MessageReceivedCallbackTag, data) + m.mh.SendMessage(mDm.MessageReceivedCallbackTag, data) } // storeDatabaseName sends the database name to the main thread and waits for @@ -101,14 +101,14 @@ func (m *manager) messageReceivedCallback( func (m *manager) storeDatabaseName(databaseName string) error { // Register response handler with channel that will wait for the response responseChan := make(chan []byte) - m.mh.RegisterCallback(worker.StoreDatabaseNameTag, + m.mh.RegisterCallback(mDm.StoreDatabaseNameTag, func(data []byte) ([]byte, error) { responseChan <- data return nil, nil }) // Send encryption status to main thread - m.mh.SendMessage(worker.StoreDatabaseNameTag, []byte(databaseName)) + m.mh.SendMessage(mDm.StoreDatabaseNameTag, []byte(databaseName)) // Wait for response select { @@ -145,14 +145,14 @@ func (m *manager) storeEncryptionStatus( // Register response handler with channel that will wait for the response responseChan := make(chan []byte) - m.mh.RegisterCallback(worker.EncryptionStatusTag, + m.mh.RegisterCallback(mDm.EncryptionStatusTag, func(data []byte) ([]byte, error) { responseChan <- data return nil, nil }) // Send encryption status to main thread - m.mh.SendMessage(worker.EncryptionStatusTag, data) + m.mh.SendMessage(mDm.EncryptionStatusTag, data) // Wait for response var response mChannels.EncryptionStatusReply diff --git a/indexedDbWorker/channels/implementation.go b/indexedDbWorker/channels/implementation.go index 6e62eb6204c39a3c882720b0651b560a4fd59f23..b1a4cf094880ef2bba9c88cc9ab0fc4f22bf9327 100644 --- a/indexedDbWorker/channels/implementation.go +++ b/indexedDbWorker/channels/implementation.go @@ -40,12 +40,12 @@ func (w *wasmModel) JoinChannel(channel *cryptoBroadcast.Channel) { return } - w.wm.SendMessage(worker.JoinChannelTag, data, nil) + w.wm.SendMessage(JoinChannelTag, data, nil) } // LeaveChannel is called whenever a channel is left locally. func (w *wasmModel) LeaveChannel(channelID *id.ID) { - w.wm.SendMessage(worker.LeaveChannelTag, channelID.Marshal(), nil) + w.wm.SendMessage(LeaveChannelTag, channelID.Marshal(), nil) } // ReceiveMessage is called whenever a message is received on a given channel. @@ -81,7 +81,7 @@ func (w *wasmModel) ReceiveMessage(channelID *id.ID, messageID message.ID, } uuidChan := make(chan uint64) - w.wm.SendMessage(worker.ReceiveMessageTag, data, func(data []byte) { + w.wm.SendMessage(ReceiveMessageTag, data, func(data []byte) { var uuid uint64 err = json.Unmarshal(data, &uuid) if err != nil { @@ -149,7 +149,7 @@ func (w *wasmModel) ReceiveReply(channelID *id.ID, messageID, } uuidChan := make(chan uint64) - w.wm.SendMessage(worker.ReceiveReplyTag, data, func(data []byte) { + w.wm.SendMessage(ReceiveReplyTag, data, func(data []byte) { var uuid uint64 err = json.Unmarshal(data, &uuid) if err != nil { @@ -211,7 +211,7 @@ func (w *wasmModel) ReceiveReaction(channelID *id.ID, messageID, } uuidChan := make(chan uint64) - w.wm.SendMessage(worker.ReceiveReactionTag, data, func(data []byte) { + w.wm.SendMessage(ReceiveReactionTag, data, func(data []byte) { var uuid uint64 err = json.Unmarshal(data, &uuid) if err != nil { @@ -298,7 +298,7 @@ func (w *wasmModel) UpdateFromUUID(uuid uint64, messageID *message.ID, return } - w.wm.SendMessage(worker.UpdateFromUUIDTag, data, nil) + w.wm.SendMessage(UpdateFromUUIDTag, data, nil) } // UpdateFromMessageID is called whenever a message with the message ID is @@ -344,7 +344,7 @@ func (w *wasmModel) UpdateFromMessageID(messageID message.ID, } uuidChan := make(chan uint64) - w.wm.SendMessage(worker.UpdateFromMessageIDTag, data, + w.wm.SendMessage(UpdateFromMessageIDTag, data, func(data []byte) { var uuid uint64 err = json.Unmarshal(data, &uuid) @@ -378,7 +378,7 @@ type GetMessageMessage struct { func (w *wasmModel) GetMessage( messageID message.ID) (channels.ModelMessage, error) { msgChan := make(chan GetMessageMessage) - w.wm.SendMessage(worker.GetMessageTag, messageID.Marshal(), + w.wm.SendMessage(GetMessageTag, messageID.Marshal(), func(data []byte) { var msg GetMessageMessage err := json.Unmarshal(data, &msg) @@ -405,7 +405,7 @@ func (w *wasmModel) GetMessage( // DeleteMessage removes a message with the given messageID from storage. func (w *wasmModel) DeleteMessage(messageID message.ID) error { errChan := make(chan error) - w.wm.SendMessage(worker.DeleteMessageTag, messageID.Marshal(), + w.wm.SendMessage(DeleteMessageTag, messageID.Marshal(), func(data []byte) { if data != nil { errChan <- errors.New(string(data)) diff --git a/indexedDbWorker/channels/init.go b/indexedDbWorker/channels/init.go index 653ba64447a6e97dda56ba5c5949acd5bd5e585b..1f8cc8505b556d148ada745c5d45b61babed0660 100644 --- a/indexedDbWorker/channels/init.go +++ b/indexedDbWorker/channels/init.go @@ -56,23 +56,20 @@ func NewWASMEventModel(path string, encryption cryptoChannel.Cipher, cb MessageReceivedCallback) (channels.EventModel, error) { // TODO: bring in URL and name from caller - wm, err := worker.NewManager( - WorkerJavascriptFileURL, "channelsIndexedDb") + wm, err := worker.NewManager(WorkerJavascriptFileURL, "channelsIndexedDb") if err != nil { return nil, err } // Register handler to manage messages for the MessageReceivedCallback wm.RegisterCallback( - worker.MessageReceivedCallbackTag, messageReceivedCallbackHandler(cb)) + MessageReceivedCallbackTag, messageReceivedCallbackHandler(cb)) // Register handler to manage checking encryption status from local storage - wm.RegisterCallback( - worker.EncryptionStatusTag, checkDbEncryptionStatusHandler(wm)) + wm.RegisterCallback(EncryptionStatusTag, checkDbEncryptionStatusHandler(wm)) // Register handler to manage the storage of the database name - wm.RegisterCallback( - worker.StoreDatabaseNameTag, storeDatabaseNameHandler(wm)) + wm.RegisterCallback(StoreDatabaseNameTag, storeDatabaseNameHandler(wm)) encryptionJSON, err := json.Marshal(encryption) if err != nil { @@ -90,7 +87,7 @@ func NewWASMEventModel(path string, encryption cryptoChannel.Cipher, } errChan := make(chan string) - wm.SendMessage(worker.NewWASMEventModelTag, payload, + wm.SendMessage(NewWASMEventModelTag, payload, func(data []byte) { errChan <- string(data) }) select { @@ -175,7 +172,7 @@ func checkDbEncryptionStatusHandler( return } - wh.SendMessage(worker.EncryptionStatusTag, statusData, nil) + wh.SendMessage(EncryptionStatusTag, statusData, nil) } } @@ -191,6 +188,6 @@ func storeDatabaseNameHandler( returnData = []byte(err.Error()) } - wh.SendMessage(worker.StoreDatabaseNameTag, returnData, nil) + wh.SendMessage(StoreDatabaseNameTag, returnData, nil) } } diff --git a/indexedDbWorker/channels/tags.go b/indexedDbWorker/channels/tags.go new file mode 100644 index 0000000000000000000000000000000000000000..5e3886a04b981aacfcde9007d2ab1ca98404d80d --- /dev/null +++ b/indexedDbWorker/channels/tags.go @@ -0,0 +1,30 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2022 xx foundation // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file. // +//////////////////////////////////////////////////////////////////////////////// + +package channels + +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" + EncryptionStatusTag worker.Tag = "EncryptionStatus" + StoreDatabaseNameTag worker.Tag = "StoreDatabaseName" + + JoinChannelTag worker.Tag = "JoinChannel" + LeaveChannelTag worker.Tag = "LeaveChannel" + ReceiveMessageTag worker.Tag = "ReceiveMessage" + ReceiveReplyTag worker.Tag = "ReceiveReply" + ReceiveReactionTag worker.Tag = "ReceiveReaction" + UpdateFromUUIDTag worker.Tag = "UpdateFromUUID" + UpdateFromMessageIDTag worker.Tag = "UpdateFromMessageID" + GetMessageTag worker.Tag = "GetMessage" + DeleteMessageTag worker.Tag = "DeleteMessage" +) \ No newline at end of file diff --git a/indexedDbWorker/dm/implementation.go b/indexedDbWorker/dm/implementation.go index ed89a476ae03e8c4b3bac49b5667db5d0f53209d..2b37cef9c459769ba1ab08a8529781cf87e46740 100644 --- a/indexedDbWorker/dm/implementation.go +++ b/indexedDbWorker/dm/implementation.go @@ -67,7 +67,7 @@ func (w *wasmModel) Receive(messageID message.ID, nickname string, text []byte, } uuidChan := make(chan uint64) - w.wh.SendMessage(worker.ReceiveTag, data, func(data []byte) { + w.wh.SendMessage(ReceiveTag, data, func(data []byte) { var uuid uint64 err = json.Unmarshal(data, &uuid) if err != nil { @@ -112,7 +112,7 @@ func (w *wasmModel) ReceiveText(messageID message.ID, nickname, text string, } uuidChan := make(chan uint64) - w.wh.SendMessage(worker.ReceiveTextTag, data, func(data []byte) { + w.wh.SendMessage(ReceiveTextTag, data, func(data []byte) { var uuid uint64 err = json.Unmarshal(data, &uuid) if err != nil { @@ -158,7 +158,7 @@ func (w *wasmModel) ReceiveReply(messageID, reactionTo message.ID, nickname, } uuidChan := make(chan uint64) - w.wh.SendMessage(worker.ReceiveReplyTag, data, func(data []byte) { + w.wh.SendMessage(ReceiveReplyTag, data, func(data []byte) { var uuid uint64 err = json.Unmarshal(data, &uuid) if err != nil { @@ -204,7 +204,7 @@ func (w *wasmModel) ReceiveReaction(messageID, reactionTo message.ID, nickname, } uuidChan := make(chan uint64) - w.wh.SendMessage(worker.ReceiveReactionTag, data, func(data []byte) { + w.wh.SendMessage(ReceiveReactionTag, data, func(data []byte) { var uuid uint64 err = json.Unmarshal(data, &uuid) if err != nil { @@ -242,5 +242,5 @@ func (w *wasmModel) UpdateSentStatus(uuid uint64, messageID message.ID, "Could not JSON marshal payload for TransferMessage: %+v", err) } - w.wh.SendMessage(worker.UpdateSentStatusTag, data, nil) + w.wh.SendMessage(UpdateSentStatusTag, data, nil) } diff --git a/indexedDbWorker/dm/init.go b/indexedDbWorker/dm/init.go index 4290a5800f80067564b028c0a36b2a664d8febd1..0ec1d8fc680817a18f63c2fa20ea752a98fa663a 100644 --- a/indexedDbWorker/dm/init.go +++ b/indexedDbWorker/dm/init.go @@ -46,23 +46,20 @@ func NewWASMEventModel(path string, encryption cryptoChannel.Cipher, cb MessageReceivedCallback) (dm.EventModel, error) { // TODO: bring in URL and name from caller - wh, err := worker.NewManager( - WorkerJavascriptFileURL, "dmIndexedDb") + wh, err := worker.NewManager(WorkerJavascriptFileURL, "dmIndexedDb") if err != nil { return nil, err } // Register handler to manage messages for the MessageReceivedCallback wh.RegisterCallback( - worker.MessageReceivedCallbackTag, messageReceivedCallbackHandler(cb)) + MessageReceivedCallbackTag, messageReceivedCallbackHandler(cb)) // Register handler to manage checking encryption status from local storage - wh.RegisterCallback( - worker.EncryptionStatusTag, checkDbEncryptionStatusHandler(wh)) + wh.RegisterCallback(EncryptionStatusTag, checkDbEncryptionStatusHandler(wh)) // Register handler to manage the storage of the database name - wh.RegisterCallback( - worker.StoreDatabaseNameTag, storeDatabaseNameHandler(wh)) + wh.RegisterCallback(StoreDatabaseNameTag, storeDatabaseNameHandler(wh)) encryptionJSON, err := json.Marshal(encryption) if err != nil { @@ -80,7 +77,7 @@ func NewWASMEventModel(path string, encryption cryptoChannel.Cipher, } errChan := make(chan string) - wh.SendMessage(worker.NewWASMEventModelTag, payload, + wh.SendMessage(NewWASMEventModelTag, payload, func(data []byte) { errChan <- string(data) }) select { @@ -164,7 +161,7 @@ func checkDbEncryptionStatusHandler(wh *worker.Manager) func(data []byte) { return } - wh.SendMessage(worker.EncryptionStatusTag, statusData, nil) + wh.SendMessage(EncryptionStatusTag, statusData, nil) } } @@ -179,6 +176,6 @@ func storeDatabaseNameHandler(wh *worker.Manager) func(data []byte) { returnData = []byte(err.Error()) } - wh.SendMessage(worker.StoreDatabaseNameTag, returnData, nil) + wh.SendMessage(StoreDatabaseNameTag, returnData, nil) } } diff --git a/indexedDbWorker/dm/tags.go b/indexedDbWorker/dm/tags.go new file mode 100644 index 0000000000000000000000000000000000000000..ae38027722769672ff4055bf76665f954f199105 --- /dev/null +++ b/indexedDbWorker/dm/tags.go @@ -0,0 +1,25 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2022 xx foundation // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file. // +//////////////////////////////////////////////////////////////////////////////// + +package channelEventModel + +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" + EncryptionStatusTag worker.Tag = "EncryptionStatus" + StoreDatabaseNameTag worker.Tag = "StoreDatabaseName" + + ReceiveReplyTag worker.Tag = "ReceiveReply" + ReceiveReactionTag worker.Tag = "ReceiveReaction" + ReceiveTag worker.Tag = "Receive" + ReceiveTextTag worker.Tag = "ReceiveText" + UpdateSentStatusTag worker.Tag = "UpdateSentStatusTag" +) diff --git a/worker/README.md b/worker/README.md index 978d296ccebbabbc81a4e2f0e8f00b853e051630..6cce13b5735829dd7e56972b2c63fc7323aee87e 100644 --- a/worker/README.md +++ b/worker/README.md @@ -1,6 +1,7 @@ # Web Worker API -This package allows you to create a [Javascript Web Worker](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API) +This package allows you to create +a [Javascript Web Worker](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API) from WASM and facilitates communication between the web worker and the main thread using a messaging system. @@ -27,7 +28,6 @@ func main() { } ``` - Example WASM start file: ```javascript diff --git a/worker/manager.go b/worker/manager.go index bd648c57d32fb7da95a4f8c68074282ba2c8b3ce..53229c59bce67de60a5bf935af124e09e18a509a 100644 --- a/worker/manager.go +++ b/worker/manager.go @@ -20,15 +20,14 @@ import ( ) // TODO: -// 1. fix tag system -// 2. restructure packages -// 3. Get path to JS file from bindings -// 4. Add tests for manager.go and thread.go +// 1. restructure packages +// 2. Get path to JS file from bindings +// 3. Add tests for manager.go and thread.go -// InitID is the ID for the first item in the callback list. If the list only +// initID is the ID for the first item in the callback list. If the list only // contains one callback, then this is the ID of that callback. If the list has // autogenerated unique IDs, this is the initial ID to start at. -const InitID = uint64(0) +const initID = uint64(0) // Response timeouts. const ( @@ -54,7 +53,7 @@ type Manager struct { // received from the worker. Each callback is keyed on a tag specifying how // the received message should be handled. If the message is a reply to a // message sent to the worker, then the callback is also keyed on a unique - // ID. If the message is not a reply, then it appears on InitID. + // ID. If the message is not a reply, then it appears on initID. callbacks map[Tag]map[uint64]ReceptionCallback // responseIDs is a list of the newest ID to assign to each callback when @@ -88,7 +87,7 @@ func NewManager(aURL, name string) (*Manager, error) { // Register a callback that will receive initial message from worker // indicating that it is ready ready := make(chan struct{}) - m.RegisterCallback(ReadyTag, func([]byte) { ready <- struct{}{} }) + m.RegisterCallback(readyTag, func([]byte) { ready <- struct{}{} }) // Wait for the ready signal from the worker select { @@ -115,7 +114,7 @@ func (m *Manager) SendMessage( jww.DEBUG.Printf("[WW] [%s] Main sending message for %q and ID %d with "+ "data: %s", m.name, tag, id, data) - msg := Message{ + msg := message{ Tag: tag, ID: id, Data: data, @@ -132,7 +131,7 @@ func (m *Manager) SendMessage( // receiveMessage is registered with the Javascript event listener and is called // every time a new message from the worker is received. func (m *Manager) receiveMessage(data []byte) error { - var msg Message + var msg message err := json.Unmarshal(data, &msg) if err != nil { return err @@ -184,7 +183,7 @@ func (m *Manager) RegisterCallback(tag Tag, receptionCB ReceptionCallback) { m.mux.Lock() defer m.mux.Unlock() - id := InitID + id := initID jww.DEBUG.Printf("[WW] [%s] Main registering callback for tag %q and ID "+ "%d (autoID: %t)", m.name, tag, id) @@ -217,7 +216,7 @@ func (m *Manager) registerReplyCallback( // thread-safe. func (m *Manager) getNextID(tag Tag) uint64 { if _, exists := m.responseIDs[tag]; !exists { - m.responseIDs[tag] = InitID + m.responseIDs[tag] = initID } id := m.responseIDs[tag] diff --git a/worker/manager_test.go b/worker/manager_test.go index 6d9d85302d549886a359112c4c616b2ea23c038e..3c7c1a357af95723d00cbc9b9a8011b39d52742c 100644 --- a/worker/manager_test.go +++ b/worker/manager_test.go @@ -35,17 +35,11 @@ func TestManager_getNextID(t *testing.T) { responseIDs: make(map[Tag]uint64), } - for _, tag := range []Tag{ - ReadyTag, NewWASMEventModelTag, EncryptionStatusTag, - StoreDatabaseNameTag, JoinChannelTag, LeaveChannelTag, - ReceiveMessageTag, ReceiveReplyTag, ReceiveReactionTag, - UpdateFromUUIDTag, UpdateFromMessageIDTag, GetMessageTag, - DeleteMessageTag, ReceiveTag, ReceiveTextTag, UpdateSentStatusTag, - } { + for _, tag := range []Tag{readyTag, "test", "A", "B", "C"} { id := m.getNextID(tag) - if id != InitID { - t.Errorf("ID for new tag %q is not InitID."+ - "\nexpected: %d\nreceived: %d", tag, InitID, id) + if id != initID { + t.Errorf("ID for new tag %q is not initID."+ + "\nexpected: %d\nreceived: %d", tag, initID, id) } for j := uint64(1); j < 100; j++ { diff --git a/worker/message.go b/worker/message.go index a4adfccaac96fd29c8bdf2b59e0f3edbffa50fdf..aaf819f66c043565aa90f3c214792bae28beebff 100644 --- a/worker/message.go +++ b/worker/message.go @@ -7,9 +7,9 @@ package worker -// Message is the outer message that contains the contents of each message sent +// message is the outer message that contains the contents of each message sent // to the worker. It is transmitted as JSON. -type Message struct { +type message struct { Tag Tag `json:"tag"` ID uint64 `json:"id"` DeleteCB bool `json:"deleteCB"` diff --git a/worker/tag.go b/worker/tag.go index 0763da0cc8ccc1e98ea0b29e4c4a815a4bafab08..fa458c291802c47d0ffb1970ef75202b936561a4 100644 --- a/worker/tag.go +++ b/worker/tag.go @@ -12,30 +12,7 @@ package worker // Tag describes how a message sent to or from the worker should be handled. type Tag string -// FIXME: This system of tagging does not work so well when using the -// Manager for more than one database. This should bed fixed. - -// List of tags that can be used when sending a message or registering a handler -// to receive a message. +// Generic tags used by all workers. const ( - ReadyTag Tag = "Ready" - - NewWASMEventModelTag Tag = "NewWASMEventModel" - MessageReceivedCallbackTag Tag = "MessageReceivedCallback" - EncryptionStatusTag Tag = "EncryptionStatus" - StoreDatabaseNameTag Tag = "StoreDatabaseName" - - JoinChannelTag Tag = "JoinChannel" - LeaveChannelTag Tag = "LeaveChannel" - ReceiveMessageTag Tag = "ReceiveMessage" - ReceiveReplyTag Tag = "ReceiveReply" - ReceiveReactionTag Tag = "ReceiveReaction" - UpdateFromUUIDTag Tag = "UpdateFromUUID" - UpdateFromMessageIDTag Tag = "UpdateFromMessageID" - GetMessageTag Tag = "GetMessage" - DeleteMessageTag Tag = "DeleteMessage" - - ReceiveTag Tag = "Receive" - ReceiveTextTag Tag = "ReceiveText" - UpdateSentStatusTag Tag = "UpdateSentStatusTag" + readyTag Tag = "Ready" ) diff --git a/worker/thread.go b/worker/thread.go index 00969db8b835b0ba2d0aa06e1fdcc87eddc90ecf..c7d7aa974e0d69b10983bfea3e920c09fa8c2f6b 100644 --- a/worker/thread.go +++ b/worker/thread.go @@ -55,14 +55,14 @@ func NewThreadManager(name string) *ThreadManager { // ready. Once the main thread receives this, it will initiate communication. // Therefore, this should only be run once all listeners are ready. func (tm *ThreadManager) SignalReady() { - tm.SendMessage(ReadyTag, nil) + tm.SendMessage(readyTag, nil) } // SendMessage sends a message to the main thread for the given tag. func (tm *ThreadManager) SendMessage(tag Tag, data []byte) { - msg := Message{ + msg := message{ Tag: tag, - ID: InitID, + ID: initID, DeleteCB: false, Data: data, } @@ -81,7 +81,7 @@ func (tm *ThreadManager) SendMessage(tag Tag, data []byte) { // sendResponse sends a reply to the main thread with the given tag and ID. func (tm *ThreadManager) sendResponse( tag Tag, id uint64, data []byte) { - msg := Message{ + msg := message{ Tag: tag, ID: id, DeleteCB: true, @@ -103,7 +103,7 @@ func (tm *ThreadManager) sendResponse( // everytime a message from the main thread is received. If the registered // callback returns a response, it is sent to the main thread. func (tm *ThreadManager) receiveMessage(data []byte) error { - var msg Message + var msg message err := json.Unmarshal(data, &msg) if err != nil { return err