From 01dfcf60e5ced6099fde3360ba54f2014cba70eb Mon Sep 17 00:00:00 2001
From: Jake Taylor <jake@elixxir.io>
Date: Fri, 9 Sep 2022 13:57:51 -0500
Subject: [PATCH] add dump prints for debugging purposes

---
 indexedDb/implementation.go | 61 ++++++++++++++++++++++++++++++++-----
 indexedDb/init.go           |  8 +++--
 2 files changed, 59 insertions(+), 10 deletions(-)

diff --git a/indexedDb/implementation.go b/indexedDb/implementation.go
index 5144610d..7153a5ea 100644
--- a/indexedDb/implementation.go
+++ b/indexedDb/implementation.go
@@ -40,6 +40,17 @@ 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")
@@ -58,11 +69,10 @@ func (w *wasmModel) JoinChannel(channel *cryptoBroadcast.Channel) {
 			"Unable to marshal Channel: %+v", err))
 		return
 	}
-	channelObj := make(map[string]interface{})
-	err = json.Unmarshal(newChannelJson, &channelObj)
+	channelObj, err := convertJsonToJs(newChannelJson)
 	if err != nil {
 		jww.ERROR.Printf("%+v", errors.WithMessagef(parentErr,
-			"Unable to unmarshal Channel: %+v", err))
+			"Unable to marshal Channel: %+v", err))
 		return
 	}
 
@@ -81,7 +91,7 @@ func (w *wasmModel) JoinChannel(channel *cryptoBroadcast.Channel) {
 	}
 
 	// Perform the operation
-	_, err = store.Add(js.ValueOf(channelObj))
+	_, err = store.Add(channelObj)
 	if err != nil {
 		jww.ERROR.Printf("%+v", errors.WithMessagef(parentErr,
 			"Unable to Add Channel: %+v", err))
@@ -97,6 +107,8 @@ func (w *wasmModel) JoinChannel(channel *cryptoBroadcast.Channel) {
 			"Adding Channel failed: %+v", err))
 		return
 	}
+	jww.DEBUG.Printf("Successfully added channel: %s",
+		channel.ReceptionID.String())
 }
 
 // LeaveChannel is called whenever a channel is left locally.
@@ -134,6 +146,7 @@ func (w *wasmModel) LeaveChannel(channelID *id.ID) {
 			"Deleting Channel failed: %+v", err))
 		return
 	}
+	jww.DEBUG.Printf("Successfully deleted channel: %s", channelID.String())
 }
 
 // ReceiveMessage is called whenever a message is received on a given channel
@@ -227,10 +240,9 @@ func (w *wasmModel) receiveHelper(newMessage *Message) error {
 	if err != nil {
 		return errors.Errorf("Unable to marshal Message: %+v", err)
 	}
-	messageObj := make(map[string]interface{})
-	err = json.Unmarshal(newMessageJson, &messageObj)
+	messageObj, err := convertJsonToJs(newMessageJson)
 	if err != nil {
-		return errors.Errorf("Unable to unmarshal Message: %+v", err)
+		return errors.Errorf("Unable to marshal Message: %+v", err)
 	}
 
 	// Prepare the Transaction
@@ -244,7 +256,7 @@ func (w *wasmModel) receiveHelper(newMessage *Message) error {
 	}
 
 	// Perform the upsert (put) operation
-	_, err = store.Put(js.ValueOf(messageObj))
+	_, err = store.Put(messageObj)
 	if err != nil {
 		return errors.Errorf("Unable to upsert Message: %+v", err)
 	}
@@ -256,5 +268,38 @@ func (w *wasmModel) receiveHelper(newMessage *Message) error {
 	if err != nil {
 		return errors.Errorf("Upserting Message failed: %+v", err)
 	}
+	jww.DEBUG.Printf("Successfully received message: %s", newMessage.Id)
 	return nil
 }
+
+// dump is used to output given ObjectStore contents to log for debugging
+func (w *wasmModel) dump(objectStoreName string) {
+	txn, err := w.db.Transaction(idb.TransactionReadOnly, objectStoreName)
+	if err != nil {
+		jww.ERROR.Printf("Failed to create Transaction: %+v", err)
+	}
+	store, err := txn.ObjectStore(objectStoreName)
+	if err != nil {
+		jww.ERROR.Printf("Failed to get ObjectStore: %+v", err)
+	}
+	cursorRequest, err := store.OpenCursor(idb.CursorNext)
+	if err != nil {
+		jww.ERROR.Printf("Failed to open Cursor: %+v", err)
+	}
+
+	// Run the query
+	jww.INFO.Printf("%s values:", objectStoreName)
+	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))
+		return nil
+	})
+	cancel()
+	if err != nil {
+		jww.ERROR.Printf("Failed to dump ObjectStore: %+v", err)
+	}
+}
diff --git a/indexedDb/init.go b/indexedDb/init.go
index 452f7795..d6ebb020 100644
--- a/indexedDb/init.go
+++ b/indexedDb/init.go
@@ -11,7 +11,6 @@
 package indexedDb
 
 import (
-	"context"
 	"github.com/hack-pad/go-indexeddb/idb"
 	"github.com/pkg/errors"
 	jww "github.com/spf13/jwalterweatherman"
@@ -29,10 +28,15 @@ const (
 
 // NewWasmEventModel returns a [channels.EventModel] backed by a wasmModel
 func NewWasmEventModel(username string) (channels.EventModel, error) {
-	ctx := context.Background()
 	databaseName := username + databaseSuffix
+	return newWasmModel(databaseName)
+}
 
+// newWasmModel creates the given [idb.Database] and returns a wasmModel
+func newWasmModel(databaseName string) (*wasmModel, error) {
 	// Attempt to open database object
+	ctx, cancel := newContext()
+	defer cancel()
 	openRequest, _ := idb.Global().Open(ctx, databaseName, currentVersion,
 		func(db *idb.Database, oldVersion, newVersion uint) error {
 			if oldVersion == newVersion {
-- 
GitLab