diff --git a/indexedDb/implementation.go b/indexedDb/implementation.go index 7153a5ea8c62aed971d69091eb23e3d8af32b0e4..8a437467b2bc8ea355b1df91eb95f3df1e55eb7b 100644 --- a/indexedDb/implementation.go +++ b/indexedDb/implementation.go @@ -16,6 +16,7 @@ import ( "github.com/hack-pad/go-indexeddb/idb" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" + "gitlab.com/elixxir/xxdk-wasm/utils" "syscall/js" "time" @@ -40,17 +41,6 @@ func newContext() (context.Context, context.CancelFunc) { return context.WithTimeout(context.Background(), dbTimeout) } -// convertJsonToJs is a helper that converts JSON bytes input -// to a [js.Value] of the object subtype. -func convertJsonToJs(inputJson []byte) (js.Value, error) { - jsObj := make(map[string]interface{}) - err := json.Unmarshal(inputJson, &jsObj) - if err != nil { - return js.Value{}, err - } - return js.ValueOf(jsObj), nil -} - // JoinChannel is called whenever a channel is joined locally. func (w *wasmModel) JoinChannel(channel *cryptoBroadcast.Channel) { parentErr := errors.New("failed to JoinChannel") @@ -69,7 +59,7 @@ func (w *wasmModel) JoinChannel(channel *cryptoBroadcast.Channel) { "Unable to marshal Channel: %+v", err)) return } - channelObj, err := convertJsonToJs(newChannelJson) + channelObj, err := utils.JsonToJS(newChannelJson) if err != nil { jww.ERROR.Printf("%+v", errors.WithMessagef(parentErr, "Unable to marshal Channel: %+v", err)) @@ -240,7 +230,7 @@ func (w *wasmModel) receiveHelper(newMessage *Message) error { if err != nil { return errors.Errorf("Unable to marshal Message: %+v", err) } - messageObj, err := convertJsonToJs(newMessageJson) + messageObj, err := utils.JsonToJS(newMessageJson) if err != nil { return errors.Errorf("Unable to marshal Message: %+v", err) } @@ -273,33 +263,43 @@ func (w *wasmModel) receiveHelper(newMessage *Message) error { } // dump is used to output given ObjectStore contents to log for debugging -func (w *wasmModel) dump(objectStoreName string) { +func (w *wasmModel) dump(objectStoreName string) ([]string, error) { + parentErr := errors.Errorf("failed to dump %s", objectStoreName) + txn, err := w.db.Transaction(idb.TransactionReadOnly, objectStoreName) if err != nil { - jww.ERROR.Printf("Failed to create Transaction: %+v", err) + return nil, errors.WithMessagef(parentErr, + "Unable to create Transaction: %+v", err) } store, err := txn.ObjectStore(objectStoreName) if err != nil { - jww.ERROR.Printf("Failed to get ObjectStore: %+v", err) + return nil, errors.WithMessagef(parentErr, + "Unable to get ObjectStore: %+v", err) } cursorRequest, err := store.OpenCursor(idb.CursorNext) if err != nil { - jww.ERROR.Printf("Failed to open Cursor: %+v", err) + return nil, errors.WithMessagef(parentErr, + "Unable to open Cursor: %+v", err) } // Run the query - jww.INFO.Printf("%s values:", objectStoreName) + jww.DEBUG.Printf("%s values:", objectStoreName) + results := make([]string, 0) ctx, cancel := newContext() err = cursorRequest.Iter(ctx, func(cursor *idb.CursorWithValue) error { value, err := cursor.Value() if err != nil { return err } - jww.INFO.Printf("- %v", js.Global().Get("JSON").Call("stringify", value)) + valueStr := utils.JsToJson(value) + results = append(results, valueStr) + jww.DEBUG.Printf("- %v", valueStr) return nil }) cancel() if err != nil { - jww.ERROR.Printf("Failed to dump ObjectStore: %+v", err) + return nil, errors.WithMessagef(parentErr, + "Unable to dump ObjectStore: %+v", err) } + return results, nil } diff --git a/indexedDb/implementation_test.go b/indexedDb/implementation_test.go new file mode 100644 index 0000000000000000000000000000000000000000..3cdcfb2cb341ee39b7c95d0226bbf11173111336 --- /dev/null +++ b/indexedDb/implementation_test.go @@ -0,0 +1,57 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2022 xx foundation // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package indexedDb + +import ( + jww "github.com/spf13/jwalterweatherman" + cryptoBroadcast "gitlab.com/elixxir/crypto/broadcast" + "gitlab.com/xx_network/primitives/id" + "testing" +) + +func TestWasmModel_JoinChannel_LeaveChannel(t *testing.T) { + testDbName := "test" + jww.SetStdoutThreshold(jww.LevelTrace) + + eventModel, err := newWasmModel(testDbName) + if err != nil { + t.Fatalf("%+v", err) + } + + testChannel := &cryptoBroadcast.Channel{ + ReceptionID: id.NewIdFromString("test", id.Generic, t), + Name: "test", + Description: "test", + Salt: nil, + RsaPubKey: nil, + } + testChannel2 := &cryptoBroadcast.Channel{ + ReceptionID: id.NewIdFromString("test2", id.Generic, t), + Name: "test2", + Description: "test2", + Salt: nil, + RsaPubKey: nil, + } + eventModel.JoinChannel(testChannel) + eventModel.JoinChannel(testChannel2) + results, err := eventModel.dump(channelsStoreName) + if err != nil { + t.Fatalf("%+v", err) + } + if len(results) != 2 { + t.Fatalf("Expected 2 channels to exist") + } + eventModel.LeaveChannel(testChannel.ReceptionID) + results, err = eventModel.dump(channelsStoreName) + if err != nil { + t.Fatalf("%+v", err) + } + if len(results) != 1 { + t.Fatalf("Expected 1 channels to exist") + } +} diff --git a/utils/utils.go b/utils/utils.go index 816f4f67c1d795afbab16dc6b6fc4593cd6d5132..c318cb808fabf2ec61b17180de67bf8411802e05 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -62,16 +62,15 @@ func WrapCB(parent js.Value, m string) func(args ...interface{}) js.Value { } } -// JsonToJS converts a marshalled JSON bytes to a Javascript object. -func JsonToJS(src []byte) (js.Value, error) { - var inInterface map[string]interface{} - err := json.Unmarshal(src, &inInterface) +// JsonToJS is a helper that converts JSON bytes input +// to a [js.Value] of the object subtype. +func JsonToJS(inputJson []byte) (js.Value, error) { + jsObj := make(map[string]interface{}) + err := json.Unmarshal(inputJson, &jsObj) if err != nil { - Throw(TypeError, err) - return js.ValueOf(nil), err + return js.Value{}, err } - - return js.ValueOf(inInterface), nil + return js.ValueOf(jsObj), nil } // JsToJson converts the Javascript value to JSON.