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