Skip to content
Snippets Groups Projects
Commit 32f2d7ae authored by Jono Wenger's avatar Jono Wenger
Browse files

Fix handler returns on error

parent 3da19905
No related branches found
No related tags found
2 merge requests!67fix for latest client release,!52XX-4382 / Move indexedDb databases to web workers
......@@ -27,6 +27,8 @@ import (
"time"
)
var zeroUUID = []byte{0, 0, 0, 0, 0, 0, 0, 0}
// manager handles the event model and the message handler, which is used to
// send information between the event model and the main thread.
type manager struct {
......@@ -49,13 +51,13 @@ func (m *manager) RegisterHandlers() {
m.mh.RegisterHandler(worker.DeleteMessageTag, m.deleteMessageHandler)
}
// newWASMEventModelHandler is the handler for NewWASMEventModel. Returns nil on
// success or an error message on failure.
// newWASMEventModelHandler is the handler for NewWASMEventModel. Returns an
// empty slice on success or an error message on failure.
func (m *manager) newWASMEventModelHandler(data []byte) ([]byte, error) {
var msg mChannels.NewWASMEventModelMessage
err := json.Unmarshal(data, &msg)
if err != nil {
return nil, errors.Errorf(
return []byte{}, errors.Errorf(
"failed to JSON unmarshal %T from main thread: %+v", msg, err)
}
......@@ -64,7 +66,7 @@ func (m *manager) newWASMEventModelHandler(data []byte) ([]byte, error) {
encryption, err := cryptoChannel.NewCipherFromJSON(
[]byte(msg.EncryptionJSON), rng.GetStream())
if err != nil {
return nil, errors.Errorf(
return []byte{}, errors.Errorf(
"failed to JSON unmarshal Cipher from main thread: %+v", err)
}
......@@ -73,7 +75,7 @@ func (m *manager) newWASMEventModelHandler(data []byte) ([]byte, error) {
if err != nil {
return []byte(err.Error()), nil
}
return nil, nil
return []byte{}, nil
}
// messageReceivedCallback sends calls to the MessageReceivedCallback in the
......@@ -178,13 +180,13 @@ func (m *manager) leaveChannelHandler(data []byte) ([]byte, error) {
return nil, nil
}
// receiveMessageHandler is the handler for wasmModel.ReceiveMessage. Returns
// nil on error or the JSON marshalled UUID (uint64) on success.
// receiveMessageHandler is the handler for wasmModel.ReceiveMessage. Returns a
// UUID of 0 on error or the JSON marshalled UUID (uint64) on success.
func (m *manager) receiveMessageHandler(data []byte) ([]byte, error) {
var msg channels.ModelMessage
err := json.Unmarshal(data, &msg)
if err != nil {
return nil, errors.Errorf(
return zeroUUID, errors.Errorf(
"failed to JSON unmarshal %T from main thread: %+v", msg, err)
}
......@@ -195,18 +197,18 @@ func (m *manager) receiveMessageHandler(data []byte) ([]byte, error) {
uuidData, err := json.Marshal(uuid)
if err != nil {
return nil, errors.Errorf("failed to JSON marshal UUID : %+v", err)
return zeroUUID, errors.Errorf("failed to JSON marshal UUID : %+v", err)
}
return uuidData, nil
}
// receiveReplyHandler is the handler for wasmModel.ReceiveReply. Returns
// nil on error or the JSON marshalled UUID (uint64) on success.
// receiveReplyHandler is the handler for wasmModel.ReceiveReply. Returns a UUID
// of 0 on error or the JSON marshalled UUID (uint64) on success.
func (m *manager) receiveReplyHandler(data []byte) ([]byte, error) {
var msg mChannels.ReceiveReplyMessage
err := json.Unmarshal(data, &msg)
if err != nil {
return nil, errors.Errorf(
return zeroUUID, errors.Errorf(
"failed to JSON unmarshal %T from main thread: %+v", msg, err)
}
......@@ -217,18 +219,18 @@ func (m *manager) receiveReplyHandler(data []byte) ([]byte, error) {
uuidData, err := json.Marshal(uuid)
if err != nil {
return nil, errors.Errorf("failed to JSON marshal UUID : %+v", err)
return zeroUUID, errors.Errorf("failed to JSON marshal UUID : %+v", err)
}
return uuidData, nil
}
// receiveReactionHandler is the handler for wasmModel.ReceiveReaction. Returns
// nil on error or the JSON marshalled UUID (uint64) on success.
// a UUID of 0 on error or the JSON marshalled UUID (uint64) on success.
func (m *manager) receiveReactionHandler(data []byte) ([]byte, error) {
var msg mChannels.ReceiveReplyMessage
err := json.Unmarshal(data, &msg)
if err != nil {
return nil, errors.Errorf(
return zeroUUID, errors.Errorf(
"failed to JSON unmarshal %T from main thread: %+v", msg, err)
}
......@@ -239,7 +241,7 @@ func (m *manager) receiveReactionHandler(data []byte) ([]byte, error) {
uuidData, err := json.Marshal(uuid)
if err != nil {
return nil, errors.Errorf("failed to JSON marshal UUID : %+v", err)
return zeroUUID, errors.Errorf("failed to JSON marshal UUID : %+v", err)
}
return uuidData, nil
}
......
......@@ -61,8 +61,7 @@ func newWASMModel(databaseName string, encryption cryptoChannel.Cipher,
openRequest, err := idb.Global().Open(ctx, databaseName, currentVersion,
func(db *idb.Database, oldVersion, newVersion uint) error {
if oldVersion == newVersion {
jww.INFO.Printf("IndexDb version is current: v%d",
newVersion)
jww.INFO.Printf("IndexDb version is current: v%d", newVersion)
return nil
}
......@@ -208,7 +207,7 @@ func RegisterDatabaseNameStore(m *manager) {
return errors.New(string(response))
}
case <-time.After(indexedDbWorker.ResponseTimeout):
return errors.Errorf("timed out after %s waiting for "+
return errors.Errorf("[WW] Timed out after %s waiting for "+
"response about storing the database name in local "+
"storage in the main thread", indexedDbWorker.ResponseTimeout)
}
......
......@@ -11,15 +11,19 @@ package main
import (
"fmt"
jww "github.com/spf13/jwalterweatherman"
"gitlab.com/elixxir/xxdk-wasm/indexedDb"
)
func main() {
fmt.Println("Starting xxDK WebAssembly Channels Database Worker.")
fmt.Println("[WW] Starting xxDK WebAssembly Channels Database Worker.")
jww.SetStdoutThreshold(jww.LevelDebug)
jww.INFO.Print("[WW] Starting xxDK WebAssembly Channels Database Worker.")
m := &manager{mh: indexedDb.NewMessageHandler("ChannelsIndexedDbWorker")}
RegisterDatabaseNameStore(m)
m.RegisterHandlers()
m.mh.SignalReady()
<-make(chan bool)
fmt.Println("[WW] Closing xxDK WebAssembly Channels Database Worker.")
}
......@@ -25,6 +25,8 @@ import (
"time"
)
var zeroUUID = []byte{0, 0, 0, 0, 0, 0, 0, 0}
// manager handles the event model and the message handler, which is used to
// send information between the event model and the main thread.
type manager struct {
......@@ -43,13 +45,13 @@ func (m *manager) RegisterHandlers() {
m.mh.RegisterHandler(worker.UpdateSentStatusTag, m.updateSentStatusHandler)
}
// newWASMEventModelHandler is the handler for NewWASMEventModel. Returns nil on
// success or an error message on failure.
// newWASMEventModelHandler is the handler for NewWASMEventModel. Returns an
// empty slice on success or an error message on failure.
func (m *manager) newWASMEventModelHandler(data []byte) ([]byte, error) {
var msg mChannels.NewWASMEventModelMessage
err := json.Unmarshal(data, &msg)
if err != nil {
return nil, errors.Errorf(
return []byte{}, errors.Errorf(
"failed to JSON unmarshal %T from main thread: %+v", msg, err)
}
......@@ -58,8 +60,8 @@ func (m *manager) newWASMEventModelHandler(data []byte) ([]byte, error) {
encryption, err := cryptoChannel.NewCipherFromJSON(
[]byte(msg.EncryptionJSON), rng.GetStream())
if err != nil {
return nil, errors.Errorf("failed to JSON unmarshal channel cipher "+
"from main thread: %+v", err)
return []byte{}, errors.Errorf("failed to JSON unmarshal channel "+
"cipher from main thread: %+v", err)
}
m.model, err = NewWASMEventModel(msg.Path, encryption,
......@@ -67,7 +69,7 @@ func (m *manager) newWASMEventModelHandler(data []byte) ([]byte, error) {
if err != nil {
return []byte(err.Error()), nil
}
return nil, nil
return []byte{}, nil
}
// messageReceivedCallback sends calls to the MessageReceivedCallback in the
......@@ -145,13 +147,13 @@ func (m *manager) storeEncryptionStatus(
return response.EncryptionStatus, nil
}
// receiveHandler is the handler for wasmModel.Receive. Returns nil on error or
// the JSON marshalled UUID (uint64) on success.
// receiveHandler is the handler for wasmModel.Receive. Returns a UUID of 0 on
// error or the JSON marshalled UUID (uint64) on success.
func (m *manager) receiveHandler(data []byte) ([]byte, error) {
var msg mDm.TransferMessage
err := json.Unmarshal(data, &msg)
if err != nil {
return nil, errors.Errorf(
return zeroUUID, errors.Errorf(
"failed to JSON unmarshal %T from main thread: %+v", msg, err)
}
......@@ -161,18 +163,18 @@ func (m *manager) receiveHandler(data []byte) ([]byte, error) {
uuidData, err := json.Marshal(uuid)
if err != nil {
return nil, errors.Errorf("failed to JSON marshal UUID : %+v", err)
return zeroUUID, errors.Errorf("failed to JSON marshal UUID : %+v", err)
}
return uuidData, nil
}
// receiveTextHandler is the handler for wasmModel.ReceiveText. Returns nil on
// error or the JSON marshalled UUID (uint64) on success.
// receiveTextHandler is the handler for wasmModel.ReceiveText. Returns a UUID
// of 0 on error or the JSON marshalled UUID (uint64) on success.
func (m *manager) receiveTextHandler(data []byte) ([]byte, error) {
var msg mDm.TransferMessage
err := json.Unmarshal(data, &msg)
if err != nil {
return nil, errors.Errorf(
return []byte{}, errors.Errorf(
"failed to JSON unmarshal %T from main thread: %+v", msg, err)
}
......@@ -182,19 +184,19 @@ func (m *manager) receiveTextHandler(data []byte) ([]byte, error) {
uuidData, err := json.Marshal(uuid)
if err != nil {
return nil, errors.Errorf("failed to JSON marshal UUID : %+v", err)
return []byte{}, errors.Errorf("failed to JSON marshal UUID : %+v", err)
}
return uuidData, nil
}
// receiveReplyHandler is the handler for wasmModel.ReceiveReply. Returns nil on
// error or the JSON marshalled UUID (uint64) on success.
// receiveReplyHandler is the handler for wasmModel.ReceiveReply. Returns a UUID
// of 0 on error or the JSON marshalled UUID (uint64) on success.
func (m *manager) receiveReplyHandler(data []byte) ([]byte, error) {
var msg mDm.TransferMessage
err := json.Unmarshal(data, &msg)
if err != nil {
return nil, errors.Errorf(
return zeroUUID, errors.Errorf(
"failed to JSON unmarshal %T from main thread: %+v", msg, err)
}
......@@ -204,19 +206,19 @@ func (m *manager) receiveReplyHandler(data []byte) ([]byte, error) {
uuidData, err := json.Marshal(uuid)
if err != nil {
return nil, errors.Errorf("failed to JSON marshal UUID : %+v", err)
return zeroUUID, errors.Errorf("failed to JSON marshal UUID : %+v", err)
}
return uuidData, nil
}
// receiveReactionHandler is the handler for wasmModel.ReceiveReaction. Returns
// nil on error or the JSON marshalled UUID (uint64) on success.
// a UUID of 0 on error or the JSON marshalled UUID (uint64) on success.
func (m *manager) receiveReactionHandler(data []byte) ([]byte, error) {
var msg mDm.TransferMessage
err := json.Unmarshal(data, &msg)
if err != nil {
return nil, errors.Errorf(
return zeroUUID, errors.Errorf(
"failed to JSON unmarshal %T from main thread: %+v", msg, err)
}
......@@ -226,7 +228,7 @@ func (m *manager) receiveReactionHandler(data []byte) ([]byte, error) {
uuidData, err := json.Marshal(uuid)
if err != nil {
return nil, errors.Errorf("failed to JSON marshal UUID : %+v", err)
return zeroUUID, errors.Errorf("failed to JSON marshal UUID : %+v", err)
}
return uuidData, nil
......
......@@ -11,15 +11,19 @@ package main
import (
"fmt"
jww "github.com/spf13/jwalterweatherman"
"gitlab.com/elixxir/xxdk-wasm/indexedDb"
)
func main() {
fmt.Println("Starting xxDK WebAssembly DM Database Worker.")
fmt.Println("[WW] Starting xxDK WebAssembly DM Database Worker.")
jww.SetStdoutThreshold(jww.LevelDebug)
jww.INFO.Print("[WW] Starting xxDK WebAssembly DM Database Worker.")
m := &manager{mh: indexedDb.NewMessageHandler("DmIndexedDbWorker")}
m.RegisterHandlers()
RegisterDatabaseNameStore(m)
m.mh.SignalReady()
<-make(chan bool)
fmt.Println("[WW] Closing xxDK WebAssembly Channels Database Worker.")
}
......@@ -13,7 +13,7 @@ import (
"encoding/json"
"github.com/pkg/errors"
jww "github.com/spf13/jwalterweatherman"
"gitlab.com/elixxir/xxdk-wasm/indexedDbWorker"
worker "gitlab.com/elixxir/xxdk-wasm/indexedDbWorker"
"gitlab.com/elixxir/xxdk-wasm/utils"
"sync"
"syscall/js"
......@@ -30,7 +30,7 @@ type MessageHandler struct {
// handlers is a list of functions to handle messages that come from the
// main thread keyed on the handler tag.
handlers map[indexedDbWorker.Tag]HandlerFn
handlers map[worker.Tag]HandlerFn
// name describes the worker. It is used for debugging and logging purposes.
name string
......@@ -42,7 +42,7 @@ type MessageHandler struct {
func NewMessageHandler(name string) *MessageHandler {
mh := &MessageHandler{
messages: make(chan js.Value, 100),
handlers: make(map[indexedDbWorker.Tag]HandlerFn),
handlers: make(map[worker.Tag]HandlerFn),
name: name,
}
......@@ -55,13 +55,13 @@ func NewMessageHandler(name string) *MessageHandler {
// ready. Once the main thread receives this, it will initiate communication.
// Therefore, this should only be run once all listeners are ready.
func (mh *MessageHandler) SignalReady() {
mh.SendResponse(indexedDbWorker.ReadyTag, indexedDbWorker.InitID, nil)
mh.SendResponse(worker.ReadyTag, worker.InitID, nil)
}
// SendResponse sends a reply to the main thread with the given tag and ID,
func (mh *MessageHandler) SendResponse(
tag indexedDbWorker.Tag, id uint64, data []byte) {
msg := indexedDbWorker.WorkerMessage{
tag worker.Tag, id uint64, data []byte) {
msg := worker.WorkerMessage{
Tag: tag,
ID: id,
Data: data,
......@@ -82,7 +82,7 @@ func (mh *MessageHandler) SendResponse(
// everytime a message from the main thread is received. If the registered
// handler returns a response, it is sent to the main thread.
func (mh *MessageHandler) receiveMessage(data []byte) error {
var msg indexedDbWorker.WorkerMessage
var msg worker.WorkerMessage
err := json.Unmarshal(data, &msg)
if err != nil {
return err
......@@ -101,7 +101,7 @@ func (mh *MessageHandler) receiveMessage(data []byte) error {
go func() {
response, err2 := handler(msg.Data)
if err2 != nil {
jww.FATAL.Panicf("[WW] [%s] Handler for for %q and ID %d returned "+
jww.ERROR.Printf("[WW] [%s] Handler for for %q and ID %d returned "+
"an error: %+v", mh.name, msg.Tag, msg.ID, err)
}
if response != nil {
......@@ -116,7 +116,7 @@ func (mh *MessageHandler) receiveMessage(data []byte) error {
// previous registered handler with the same tag. This function is thread safe.
//
// If the handler returns anything but nil, it will be returned as a response.
func (mh *MessageHandler) RegisterHandler(tag indexedDbWorker.Tag, handler HandlerFn) {
func (mh *MessageHandler) RegisterHandler(tag worker.Tag, handler HandlerFn) {
jww.DEBUG.Printf(
"[WW] [%s] Worker registering handler for tag %q", mh.name, tag)
mh.mux.Lock()
......
......@@ -99,8 +99,9 @@ func NewWorkerHandler(aURL, name string) (*WorkerHandler, error) {
select {
case <-ready:
case <-time.After(workerInitialConnectionTimeout):
return nil, errors.Errorf("timed out after %s waiting for initial "+
"message from worker", workerInitialConnectionTimeout)
return nil, errors.Errorf("[WW] [%s] timed out after %s waiting for "+
"initial message from worker",
wh.name, workerInitialConnectionTimeout)
}
return wh, nil
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment