From 3a8a86b9252c6193d7009d5f4c07283ee20c1f44 Mon Sep 17 00:00:00 2001 From: Jono Wenger <jono@elixxir.io> Date: Sun, 25 Sep 2022 16:30:53 -0700 Subject: [PATCH] Wrap calls that start indexedDb with a promise to make them async --- wasm/channels.go | 75 ++++++++++++++++++++++++++---------------------- 1 file changed, 40 insertions(+), 35 deletions(-) diff --git a/wasm/channels.go b/wasm/channels.go index 61e2012a..f93a95c5 100644 --- a/wasm/channels.go +++ b/wasm/channels.go @@ -229,31 +229,33 @@ func LoadChannelsManager(_ js.Value, args []js.Value) interface{} { // - args[1] - Bytes of a private identity ([channel.PrivateIdentity]) that is // generated by [GenerateChannelIdentity] (Uint8Array). // -// Returns: -// - Javascript representation of the [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 [ChannelsManager] object. +// - Rejected with an error if loading indexedDb or the manager fails. func NewChannelsManagerWithIndexedDb(_ js.Value, args []js.Value) interface{} { privateIdentity := utils.CopyBytesToGo(args[1]) - emBuilder := func(path string) channels.EventModel { - em, err := indexedDb.NewWasmEventModel(path) - if err != nil { - utils.Throw(utils.TypeError, err) - return nil + promiseFn := func(resolve, reject func(args ...interface{}) js.Value) { + emBuilder := func(path string) channels.EventModel { + em, err := indexedDb.NewWasmEventModel(path) + if err != nil { + reject(utils.JsTrace(err)) + return nil + } + + return em } - return em - } - - cm, err := bindings.NewChannelsManagerGoEventModel( - args[0].Int(), privateIdentity, emBuilder) - if err != nil { - utils.Throw(utils.TypeError, err) - return nil + cm, err := bindings.NewChannelsManagerGoEventModel( + args[0].Int(), privateIdentity, emBuilder) + if err != nil { + reject(utils.JsTrace(err)) + } else { + resolve(newChannelsManagerJS(cm)) + } } - return newChannelsManagerJS(cm) + return utils.CreatePromise(promiseFn) } // LoadChannelsManagerWithIndexedDb loads an existing [ChannelsManager] using @@ -270,28 +272,31 @@ func NewChannelsManagerWithIndexedDb(_ js.Value, args []js.Value) interface{} { // - args[1] - The storage tag associated with the previously created channel // manager and retrieved with [ChannelsManager.GetStorageTag] (string). // -// Returns: -// - Javascript representation of the [ChannelsManager] object. -// - Throws a TypeError if loading the manager fails. +// Returns a promise: +// - Resolves to a Javascript representation of the [ChannelsManager] object. +// - Rejected with an error if loading indexedDb or the manager fails. func LoadChannelsManagerWithIndexedDb(_ js.Value, args []js.Value) interface{} { - emBuilder := func(path string) channels.EventModel { - em, err := indexedDb.NewWasmEventModel(path) - if err != nil { - utils.Throw(utils.TypeError, err) - return nil + promiseFn := func(resolve, reject func(args ...interface{}) js.Value) { + emBuilder := func(path string) channels.EventModel { + em, err := indexedDb.NewWasmEventModel(path) + if err != nil { + reject(utils.JsTrace(err)) + return nil + } + + return em } - return em - } - - cm, err := bindings.LoadChannelsManagerGoEventModel( - args[0].Int(), args[1].String(), emBuilder) - if err != nil { - utils.Throw(utils.TypeError, err) - return nil + cm, err := bindings.LoadChannelsManagerGoEventModel( + args[0].Int(), args[1].String(), emBuilder) + if err != nil { + reject(utils.JsTrace(err)) + } else { + resolve(newChannelsManagerJS(cm)) + } } - return newChannelsManagerJS(cm) + return utils.CreatePromise(promiseFn) } // GenerateChannel is used to create a channel a new channel of which you are -- GitLab