From b4f099f906721e9321a6a5c836177ac5462f8c16 Mon Sep 17 00:00:00 2001
From: Jono Wenger <jono@elixxir.io>
Date: Sun, 25 Sep 2022 16:26:56 -0700
Subject: [PATCH] Wrap calls that start indexedDb with a promise to make them
 async

---
 wasm/channels.go | 64 +++++++++++++++++++++++++-----------------------
 1 file changed, 34 insertions(+), 30 deletions(-)

diff --git a/wasm/channels.go b/wasm/channels.go
index f7f0aa27..9c685776 100644
--- a/wasm/channels.go
+++ b/wasm/channels.go
@@ -92,25 +92,27 @@ func NewChannelsManager(_ js.Value, args []js.Value) interface{} {
 //    retrieved using [UserDiscovery.GetID].
 //  - args[2] - username (string).
 //
-// Returns:
-//  - Javascript representation of the [bindings.ChannelsManager] object.
-//  - Throws a TypeError if initialising indexedDb or created the new channel
-//    manager fails.
+// Returns a promise:
+//  - Resolves to a Javascript representation of the [bindings.ChannelsManager]
+//    object.
+//  - Rejected with an error if loading indexedDb or the manager fails.
 func NewChannelsManagerWithIndexedDb(_ js.Value, args []js.Value) interface{} {
-	em, err := indexedDb.NewWasmEventModel(args[2].String())
-	if err != nil {
-		utils.Throw(utils.TypeError, err)
-		return nil
-	}
+	promiseFn := func(resolve, reject func(args ...interface{}) js.Value) {
+		em, err := indexedDb.NewWasmEventModel(args[2].String())
+		if err != nil {
+			reject(utils.JsTrace(err))
+		}
 
-	cm, err := bindings.NewChannelsManagerGoEventModel(
-		args[0].Int(), args[1].Int(), em)
-	if err != nil {
-		utils.Throw(utils.TypeError, err)
-		return nil
+		cm, err := bindings.NewChannelsManagerGoEventModel(
+			args[0].Int(), args[1].Int(), em)
+		if err != nil {
+			reject(utils.JsTrace(err))
+		} else {
+			resolve(newChannelsManagerJS(cm))
+		}
 	}
 
-	return newChannelsManagerJS(cm)
+	return utils.CreatePromise(promiseFn)
 }
 
 // NewChannelsManagerWithIndexedDbDummyNameService constructs a
@@ -124,25 +126,27 @@ func NewChannelsManagerWithIndexedDb(_ js.Value, args []js.Value) interface{} {
 //    using [Cmix.GetID].
 //  - args[1] - Username (string).
 //
-// Returns:
-//  - Javascript representation of the [bindings.ChannelsManager] object.
-//  - Throws a TypeError if initialising indexedDb or created the new channel
-//    manager fails.
+// Returns a promise:
+//  - Resolves to a Javascript representation of the [bindings.ChannelsManager]
+//    object.
+//  - Rejected with an error if loading indexedDb or the manager fails.
 func NewChannelsManagerWithIndexedDbDummyNameService(_ js.Value, args []js.Value) interface{} {
-	em, err := indexedDb.NewWasmEventModel(args[1].String())
-	if err != nil {
-		utils.Throw(utils.TypeError, err)
-		return nil
-	}
+	promiseFn := func(resolve, reject func(args ...interface{}) js.Value) {
+		em, err := indexedDb.NewWasmEventModel(args[1].String())
+		if err != nil {
+			reject(utils.JsTrace(err))
+		}
 
-	cm, err := bindings.NewChannelsManagerGoEventModelDummyNameService(
-		args[0].Int(), args[1].String(), em)
-	if err != nil {
-		utils.Throw(utils.TypeError, err)
-		return nil
+		cm, err := bindings.NewChannelsManagerGoEventModelDummyNameService(
+			args[0].Int(), args[1].String(), em)
+		if err != nil {
+			reject(utils.JsTrace(err))
+		} else {
+			resolve(newChannelsManagerJS(cm))
+		}
 	}
 
-	return newChannelsManagerJS(cm)
+	return utils.CreatePromise(promiseFn)
 }
 
 // NewChannelsManagerDummyNameService constructs a [ChannelsManager]
-- 
GitLab