From 15cf8ea042fd8738d87cc0b4d226ca3ed2dee4ad Mon Sep 17 00:00:00 2001 From: Jono Wenger <jono@elixxir.io> Date: Sat, 24 Sep 2022 18:10:13 -0700 Subject: [PATCH] Make new channel creation use the new event model builder --- go.mod | 2 +- go.sum | 4 ++ main.go | 4 +- wasm/channels.go | 115 +++++++++++++++++++++++++++++++---------------- 4 files changed, 85 insertions(+), 40 deletions(-) diff --git a/go.mod b/go.mod index 7ad5bd5a..1ebdbb75 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/hack-pad/go-indexeddb v0.2.0 github.com/pkg/errors v0.9.1 github.com/spf13/jwalterweatherman v1.1.0 - gitlab.com/elixxir/client v1.5.1-0.20220924203712-7d4b1dce86b8 + gitlab.com/elixxir/client v1.5.1-0.20220925005456-24eb354b1d6f gitlab.com/elixxir/crypto v0.0.7-0.20220923233816-0364f1b203c6 gitlab.com/elixxir/primitives v0.0.3-0.20220901220638-1acc75fabdc6 gitlab.com/xx_network/primitives v0.0.4-0.20220809193445-9fc0a5209548 diff --git a/go.sum b/go.sum index a6b844fe..ec84476e 100644 --- a/go.sum +++ b/go.sum @@ -630,6 +630,10 @@ gitlab.com/elixxir/bloomfilter v0.0.0-20211222005329-7d931ceead6f h1:yXGvNBqzZwA gitlab.com/elixxir/bloomfilter v0.0.0-20211222005329-7d931ceead6f/go.mod h1:H6jztdm0k+wEV2QGK/KYA+MY9nj9Zzatux/qIvDDv3k= gitlab.com/elixxir/client v1.5.1-0.20220924203712-7d4b1dce86b8 h1:A1x9EJOWm6YiaAJG5SPHXiwsDvik2XGSjeSylJbDBBk= gitlab.com/elixxir/client v1.5.1-0.20220924203712-7d4b1dce86b8/go.mod h1:z1Bdlja75CF3UrzifMC0LQwjlEdOcJCfXEX5k9AKQTQ= +gitlab.com/elixxir/client v1.5.1-0.20220925004736-f9acd4f64d77 h1:wjyV+vXxAAapD8BzHNoYV8ROoaVyQi//h+TKjGjOIWw= +gitlab.com/elixxir/client v1.5.1-0.20220925004736-f9acd4f64d77/go.mod h1:z1Bdlja75CF3UrzifMC0LQwjlEdOcJCfXEX5k9AKQTQ= +gitlab.com/elixxir/client v1.5.1-0.20220925005456-24eb354b1d6f h1:m0jwFnBatQH/3uIhSwO0le06ky80LLuzqKD+Xd4nwXk= +gitlab.com/elixxir/client v1.5.1-0.20220925005456-24eb354b1d6f/go.mod h1:z1Bdlja75CF3UrzifMC0LQwjlEdOcJCfXEX5k9AKQTQ= gitlab.com/elixxir/comms v0.0.4-0.20220916185715-f1e9a5eda939 h1:+VRx2ULHKs040bBhDAOKNCZnbcXxUk3jD9JoKQzQpLk= gitlab.com/elixxir/comms v0.0.4-0.20220916185715-f1e9a5eda939/go.mod h1:AO6XkMhaHJW8eXlgL5m3UUcJqsSP8F5Wm1GX+wyq/rw= gitlab.com/elixxir/crypto v0.0.0-20200804182833-984246dea2c4/go.mod h1:ucm9SFKJo+K0N2GwRRpaNr+tKXMIOVWzmyUD0SbOu2c= diff --git a/main.go b/main.go index 072ea253..a7042228 100644 --- a/main.go +++ b/main.go @@ -49,9 +49,11 @@ func main() { js.Global().Set("GetPublicChannelIdentityFromPrivate", js.FuncOf(wasm.GetPublicChannelIdentityFromPrivate)) js.Global().Set("NewChannelsManager", js.FuncOf(wasm.NewChannelsManager)) + js.Global().Set("LoadChannelsManager", js.FuncOf(wasm.LoadChannelsManager)) js.Global().Set("NewChannelsManagerWithIndexedDb", js.FuncOf(wasm.NewChannelsManagerWithIndexedDb)) - js.Global().Set("LoadChannelsManager", js.FuncOf(wasm.LoadChannelsManager)) + js.Global().Set("LoadChannelsManagerWithIndexedDb", + js.FuncOf(wasm.LoadChannelsManagerWithIndexedDb)) js.Global().Set("GenerateChannel", js.FuncOf(wasm.GenerateChannel)) js.Global().Set("GetChannelInfo", js.FuncOf(wasm.GetChannelInfo)) js.Global().Set("IsNicknameValid", js.FuncOf(wasm.IsNicknameValid)) diff --git a/wasm/channels.go b/wasm/channels.go index 550ba506..61e2012a 100644 --- a/wasm/channels.go +++ b/wasm/channels.go @@ -10,8 +10,7 @@ package wasm import ( - "encoding/base64" - "gitlab.com/elixxir/crypto/channel" + "gitlab.com/elixxir/client/channels" "syscall/js" "gitlab.com/elixxir/client/bindings" @@ -131,6 +130,24 @@ func GetPublicChannelIdentityFromPrivate(_ js.Value, args []js.Value) interface{ return utils.CopyBytesToJS(identity) } +// eventModelBuilder adheres to the [bindings.EventModelBuilder] interface. +type eventModelBuilder struct { + build func(args ...interface{}) js.Value +} + +// Build initializes and returns the event model. +func (emb *eventModelBuilder) Build(path string) bindings.EventModel { + emJs := emb.build(path) + return &eventModel{ + joinChannel: utils.WrapCB(emJs, "JoinChannel"), + leaveChannel: utils.WrapCB(emJs, "LeaveChannel"), + receiveMessage: utils.WrapCB(emJs, "ReceiveMessage"), + receiveReply: utils.WrapCB(emJs, "ReceiveReply"), + receiveReaction: utils.WrapCB(emJs, "ReceiveReaction"), + updateSentStatus: utils.WrapCB(emJs, "UpdateSentStatus"), + } +} + // NewChannelsManager creates a new [ChannelsManager] from a new private // identity ([channel.PrivateIdentity]). // @@ -144,22 +161,17 @@ func GetPublicChannelIdentityFromPrivate(_ js.Value, args []js.Value) interface{ // using [Cmix.GetID]. // - args[1] - Bytes of a private identity ([channel.PrivateIdentity]) that is // generated by [GenerateChannelIdentity] (Uint8Array). -// - args[2] - Javascript object that matches the [bindings.EventModel] -// interface. +// - args[2] - A function that initialises and returns a Javascript object that +// matches the [bindings.EventModel] interface. The function must match the +// Build function in [bindings.EventModelBuilder]. // // Returns: // - Javascript representation of the [ChannelsManager] object. // - Throws a TypeError if creating the manager fails. func NewChannelsManager(_ js.Value, args []js.Value) interface{} { privateIdentity := utils.CopyBytesToGo(args[1]) - em := &eventModel{ - joinChannel: utils.WrapCB(args[2], "JoinChannel"), - leaveChannel: utils.WrapCB(args[2], "LeaveChannel"), - receiveMessage: utils.WrapCB(args[2], "ReceiveMessage"), - receiveReply: utils.WrapCB(args[2], "ReceiveReply"), - receiveReaction: utils.WrapCB(args[2], "ReceiveReaction"), - updateSentStatus: utils.WrapCB(args[2], "UpdateSentStatus"), - } + + em := &eventModelBuilder{args[2].Invoke} cm, err := bindings.NewChannelsManager(args[0].Int(), privateIdentity, em) if err != nil { @@ -170,13 +182,43 @@ func NewChannelsManager(_ js.Value, args []js.Value) interface{} { return newChannelsManagerJS(cm) } +// LoadChannelsManager loads an existing [ChannelsManager]. +// +// This is for loading a manager for an identity that has already been created. +// The channel manager should have previously been created with +// [NewChannelsManager] and the storage is retrievable with +// [ChannelsManager.GetStorageTag]. +// +// Parameters: +// - args[0] - ID of [Cmix] object in tracker (int). This can be retrieved +// using [Cmix.GetID]. +// - args[1] - The storage tag associated with the previously created channel +// manager and retrieved with [ChannelsManager.GetStorageTag] (string). +// - args[2] - A function that initialises and returns a Javascript object that +// matches the [bindings.EventModel] interface. The function must match the +// Build function in [bindings.EventModelBuilder]. +// +// Returns: +// - Javascript representation of the [ChannelsManager] object. +// - Throws a TypeError if loading the manager fails. +func LoadChannelsManager(_ js.Value, args []js.Value) interface{} { + em := &eventModelBuilder{args[2].Invoke} + cm, err := bindings.LoadChannelsManager(args[0].Int(), args[1].String(), em) + if err != nil { + utils.Throw(utils.TypeError, err) + return nil + } + + return newChannelsManagerJS(cm) +} + // NewChannelsManagerWithIndexedDb creates a new [ChannelsManager] from a new // private identity ([channel.PrivateIdentity]) and using indexedDb as a backend // to manage the event model. // // This is for creating a manager for an identity for the first time. For // generating a new one channel identity, use [GenerateChannelIdentity]. To -// reload this channel manager, use [LoadChannelsManagerGoEventModel], passing +// reload this channel manager, use [LoadChannelsManagerWithIndexedDb], passing // in the storage tag retrieved by [ChannelsManager.GetStorageTag]. // // This function initialises an indexedDb database. @@ -194,22 +236,18 @@ func NewChannelsManager(_ js.Value, args []js.Value) interface{} { func NewChannelsManagerWithIndexedDb(_ js.Value, args []js.Value) interface{} { privateIdentity := utils.CopyBytesToGo(args[1]) - // Get the public key to use as a key for indexedDb - pi, err := channel.UnmarshalPrivateIdentity(privateIdentity) - if err != nil { - utils.Throw(utils.TypeError, err) - return nil - } + emBuilder := func(path string) channels.EventModel { + em, err := indexedDb.NewWasmEventModel(path) + if err != nil { + utils.Throw(utils.TypeError, err) + return nil + } - key := base64.StdEncoding.EncodeToString(pi.Identity.PubKey) - em, err := indexedDb.NewWasmEventModel(key) - if err != nil { - utils.Throw(utils.TypeError, err) - return nil + return em } cm, err := bindings.NewChannelsManagerGoEventModel( - args[0].Int(), privateIdentity, em) + args[0].Int(), privateIdentity, emBuilder) if err != nil { utils.Throw(utils.TypeError, err) return nil @@ -218,11 +256,12 @@ func NewChannelsManagerWithIndexedDb(_ js.Value, args []js.Value) interface{} { return newChannelsManagerJS(cm) } -// LoadChannelsManager loads an existing [ChannelsManager]. +// LoadChannelsManagerWithIndexedDb loads an existing [ChannelsManager] using +// an existing indexedDb database as a backend to manage the event model. // // This is for loading a manager for an identity that has already been created. // The channel manager should have previously been created with -// [NewChannelsManager] and the storage is retrievable with +// [NewChannelsManagerWithIndexedDb] and the storage is retrievable with // [ChannelsManager.GetStorageTag]. // // Parameters: @@ -230,23 +269,23 @@ func NewChannelsManagerWithIndexedDb(_ js.Value, args []js.Value) interface{} { // using [Cmix.GetID]. // - args[1] - The storage tag associated with the previously created channel // manager and retrieved with [ChannelsManager.GetStorageTag] (string). -// - args[2] - Javascript object that matches the [bindings.EventModel] -// interface. // // Returns: // - Javascript representation of the [ChannelsManager] object. // - Throws a TypeError if loading the manager fails. -func LoadChannelsManager(_ js.Value, args []js.Value) interface{} { - em := &eventModel{ - joinChannel: utils.WrapCB(args[2], "JoinChannel"), - leaveChannel: utils.WrapCB(args[2], "LeaveChannel"), - receiveMessage: utils.WrapCB(args[2], "ReceiveMessage"), - receiveReply: utils.WrapCB(args[2], "ReceiveReply"), - receiveReaction: utils.WrapCB(args[2], "ReceiveReaction"), - updateSentStatus: utils.WrapCB(args[2], "UpdateSentStatus"), +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 + } + + return em } - cm, err := bindings.LoadChannelsManager(args[0].Int(), args[1].String(), em) + cm, err := bindings.LoadChannelsManagerGoEventModel( + args[0].Int(), args[1].String(), emBuilder) if err != nil { utils.Throw(utils.TypeError, err) return nil -- GitLab