From 79b49116dddea35da37c73b6fc8bab71a4b2f751 Mon Sep 17 00:00:00 2001
From: Jono Wenger <jono@elixxir.io>
Date: Wed, 10 May 2023 00:15:55 +0000
Subject: [PATCH] General fixes

---
 indexedDb/impl/channels/implementation.go | 2 +-
 indexedDb/impl/dm/implementation.go       | 2 +-
 indexedDb/impl/utils.go                   | 8 ++++++++
 utils/utils.go                            | 4 +++-
 worker/manager.go                         | 8 ++++----
 5 files changed, 17 insertions(+), 7 deletions(-)

diff --git a/indexedDb/impl/channels/implementation.go b/indexedDb/impl/channels/implementation.go
index 35bf0032..5f8273a2 100644
--- a/indexedDb/impl/channels/implementation.go
+++ b/indexedDb/impl/channels/implementation.go
@@ -414,7 +414,7 @@ func (w *wasmModel) upsertMessage(msg *Message) (uint64, error) {
 
 	// Store message to database
 	msgIdObj, err := impl.Put(w.db, messageStoreName, messageObj)
-	if err != nil || msgIdObj.Equal(js.Undefined()) {
+	if err != nil {
 		return 0, errors.Errorf("Unable to put Message: %+v\n%s",
 			err, newMessageJson)
 	}
diff --git a/indexedDb/impl/dm/implementation.go b/indexedDb/impl/dm/implementation.go
index 8d13915d..1c8e1805 100644
--- a/indexedDb/impl/dm/implementation.go
+++ b/indexedDb/impl/dm/implementation.go
@@ -317,7 +317,7 @@ func (w *wasmModel) upsertMessage(msg *Message) (uint64, error) {
 
 	// Store message to database
 	msgIdObj, err := impl.Put(w.db, messageStoreName, messageObj)
-	if err != nil || msgIdObj.Equal(js.Undefined()) {
+	if err != nil {
 		return 0, errors.Errorf("Unable to put Message: %+v\n%s",
 			err, newMessageJson)
 	}
diff --git a/indexedDb/impl/utils.go b/indexedDb/impl/utils.go
index 3765cfce..c2756f61 100644
--- a/indexedDb/impl/utils.go
+++ b/indexedDb/impl/utils.go
@@ -76,6 +76,8 @@ func Get(db *idb.Database, objectStoreName string, key js.Value) (js.Value, erro
 	if err != nil {
 		return js.Undefined(), errors.WithMessagef(parentErr,
 			"Unable to get from ObjectStore: %+v", err)
+	} else if err = ctx.Err(); errors.Is(err, context.DeadlineExceeded) {
+		return js.Null(), errors.Wrapf(err, "timed out after %s", dbTimeout)
 	} else if resultObj.IsUndefined() {
 		return js.Undefined(), errors.WithMessagef(parentErr,
 			"Unable to get from ObjectStore: %s", ErrDoesNotExist)
@@ -164,6 +166,8 @@ func GetIndex(db *idb.Database, objectStoreName,
 	if err != nil {
 		return js.Undefined(), errors.WithMessagef(parentErr,
 			"Unable to get from ObjectStore: %+v", err)
+	} else if err = ctx.Err(); errors.Is(err, context.DeadlineExceeded) {
+		return js.Null(), errors.Wrapf(err, "timed out after %s", dbTimeout)
 	} else if resultObj.IsUndefined() {
 		return js.Undefined(), errors.WithMessagef(parentErr,
 			"Unable to get from ObjectStore: %s", ErrDoesNotExist)
@@ -202,6 +206,8 @@ func Put(db *idb.Database, objectStoreName string, value js.Value) (js.Value, er
 	if err != nil {
 		return js.Undefined(), errors.Errorf("Putting value failed: %+v\n%s",
 			err, utils.JsToJson(value))
+	} else if err = ctx.Err(); errors.Is(err, context.DeadlineExceeded) {
+		return js.Null(), errors.Wrapf(err, "timed out after %s", dbTimeout)
 	}
 	jww.DEBUG.Printf("Successfully put value in %s: %s",
 		objectStoreName, utils.JsToJson(value))
@@ -239,6 +245,8 @@ func Delete(db *idb.Database, objectStoreName string, key js.Value) error {
 	if err != nil {
 		return errors.WithMessagef(parentErr,
 			"Unable to Delete from ObjectStore: %+v", err)
+	} else if err = ctx.Err(); errors.Is(err, context.DeadlineExceeded) {
+		return errors.Wrapf(err, "timed out after %s", dbTimeout)
 	}
 	jww.DEBUG.Printf("Successfully deleted value at %s/%s",
 		objectStoreName, utils.JsToJson(key))
diff --git a/utils/utils.go b/utils/utils.go
index cb1e46f3..8f156761 100644
--- a/utils/utils.go
+++ b/utils/utils.go
@@ -61,10 +61,12 @@ type PromiseFn func(resolve, reject func(args ...any) js.Value)
 // Go function to Javascript.
 func CreatePromise(f PromiseFn) any {
 	// Create handler for promise (this will be a Javascript function)
-	handler := js.FuncOf(func(this js.Value, args []js.Value) any {
+	var handler js.Func
+	handler = js.FuncOf(func(this js.Value, args []js.Value) any {
 		// Spawn a new go routine to perform the blocking function
 		go func(resolve, reject js.Value) {
 			f(resolve.Invoke, reject.Invoke)
+			go func() { handler.Release() }()
 		}(args[0], args[1])
 
 		return nil
diff --git a/worker/manager.go b/worker/manager.go
index 1f8328c9..3a5831db 100644
--- a/worker/manager.go
+++ b/worker/manager.go
@@ -325,8 +325,8 @@ func (m *Manager) addEventListeners() {
 	// Doc: https://developer.mozilla.org/en-US/docs/Web/API/Worker/error_event
 	errorEvent := js.FuncOf(func(_ js.Value, args []js.Value) any {
 		event := args[0]
-		jww.ERROR.Printf("[WW] [%s] Main received error event: %s",
-			m.name, utils.JsErrorToJson(event))
+		jww.FATAL.Panicf("[WW] [%s] Main received error event: %+v",
+			m.name, js.Error{Value: event})
 		return nil
 	})
 
@@ -335,8 +335,8 @@ func (m *Manager) addEventListeners() {
 	// Doc: https://developer.mozilla.org/en-US/docs/Web/API/Worker/messageerror_event
 	messageerrorEvent := js.FuncOf(func(_ js.Value, args []js.Value) any {
 		event := args[0]
-		jww.ERROR.Printf("[WW] [%s] Main received message error event: %s",
-			m.name, utils.JsErrorToJson(event))
+		jww.ERROR.Printf("[WW] [%s] Main received message error event: %+v",
+			m.name, js.Error{Value: event})
 		return nil
 	})
 
-- 
GitLab