Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • elixxir/xxdk-wasm
1 result
Show changes
Commits on Source (17)
......@@ -9,7 +9,7 @@ require (
github.com/spf13/cobra v1.7.0
github.com/spf13/jwalterweatherman v1.1.0
github.com/stretchr/testify v1.8.2
gitlab.com/elixxir/client/v4 v4.6.4-0.20230526074923-c0fb2a45c312
gitlab.com/elixxir/client/v4 v4.6.4-0.20230531224642-b24cd3f5e4a4
gitlab.com/elixxir/crypto v0.0.7-0.20230522162218-45433d877235
gitlab.com/elixxir/primitives v0.0.3-0.20230214180039-9a25e2d3969c
gitlab.com/elixxir/wasm-utils v0.0.0-20230522231408-a43b2c1481b2
......
......@@ -517,6 +517,32 @@ gitlab.com/elixxir/client/v4 v4.6.4-0.20230525191042-3795029e4315 h1:rOgY9KPwq0w
gitlab.com/elixxir/client/v4 v4.6.4-0.20230525191042-3795029e4315/go.mod h1:1+FU4spF6kwSA84AnFq0i6j4jsAICuvVfp6ACh00K0U=
gitlab.com/elixxir/client/v4 v4.6.4-0.20230526074923-c0fb2a45c312 h1:yUyz1L/rzodZxUU45CeH7mfMfmKAs706+s2j2ZGUSwE=
gitlab.com/elixxir/client/v4 v4.6.4-0.20230526074923-c0fb2a45c312/go.mod h1:fegbuF1/6a+H3QgsoMG8teLnyuKtDxkELMw8pn5WlZ8=
gitlab.com/elixxir/client/v4 v4.6.4-0.20230530165750-f6ea41bc69e4 h1:dgq4fwLdVzsPGdk1E7vLZI1gWk/QB/K7Rntg+DrxAjY=
gitlab.com/elixxir/client/v4 v4.6.4-0.20230530165750-f6ea41bc69e4/go.mod h1:fegbuF1/6a+H3QgsoMG8teLnyuKtDxkELMw8pn5WlZ8=
gitlab.com/elixxir/client/v4 v4.6.4-0.20230530170051-243baab3da48 h1:2HP8w4HOlqjg0FcvSnhMmpwUa1pcU0WbvWMOUNiy/hE=
gitlab.com/elixxir/client/v4 v4.6.4-0.20230530170051-243baab3da48/go.mod h1:fegbuF1/6a+H3QgsoMG8teLnyuKtDxkELMw8pn5WlZ8=
gitlab.com/elixxir/client/v4 v4.6.4-0.20230530182422-d12ab437257f h1:8TJwqKjeD0eZSvWIlPwjgIwfgdzcHhTzGwaiUJCwwuI=
gitlab.com/elixxir/client/v4 v4.6.4-0.20230530182422-d12ab437257f/go.mod h1:fegbuF1/6a+H3QgsoMG8teLnyuKtDxkELMw8pn5WlZ8=
gitlab.com/elixxir/client/v4 v4.6.4-0.20230530201605-ba087da90ba2 h1:sxAgLmG2RLarBuXtcH8g5ZcQbAF9PmS3wrnlwZVFrLA=
gitlab.com/elixxir/client/v4 v4.6.4-0.20230530201605-ba087da90ba2/go.mod h1:fegbuF1/6a+H3QgsoMG8teLnyuKtDxkELMw8pn5WlZ8=
gitlab.com/elixxir/client/v4 v4.6.4-0.20230530211720-a1bc89986df8 h1:XTklpI9leJYgZ4bYZLQUOzzgoxlYUz7xDmcl2Fy7knc=
gitlab.com/elixxir/client/v4 v4.6.4-0.20230530211720-a1bc89986df8/go.mod h1:fegbuF1/6a+H3QgsoMG8teLnyuKtDxkELMw8pn5WlZ8=
gitlab.com/elixxir/client/v4 v4.6.4-0.20230530220505-726d2194d278 h1:etC7c2JeKbykuSHIm8jvb3cpMUdJGlyMsBQbImXlIK8=
gitlab.com/elixxir/client/v4 v4.6.4-0.20230530220505-726d2194d278/go.mod h1:fegbuF1/6a+H3QgsoMG8teLnyuKtDxkELMw8pn5WlZ8=
gitlab.com/elixxir/client/v4 v4.6.4-0.20230530222715-a0c0ea0de57f h1:67k1pJg8w6bGfDLex3/e4rdm8Cb2m43qjrryKjVo/UE=
gitlab.com/elixxir/client/v4 v4.6.4-0.20230530222715-a0c0ea0de57f/go.mod h1:fegbuF1/6a+H3QgsoMG8teLnyuKtDxkELMw8pn5WlZ8=
gitlab.com/elixxir/client/v4 v4.6.4-0.20230531180314-040f2bf4bc9f h1:KJQjb0WfOtrJo1vKGeISwlmdQTwtV3CmCg4nbP6bzlM=
gitlab.com/elixxir/client/v4 v4.6.4-0.20230531180314-040f2bf4bc9f/go.mod h1:fegbuF1/6a+H3QgsoMG8teLnyuKtDxkELMw8pn5WlZ8=
gitlab.com/elixxir/client/v4 v4.6.4-0.20230531193105-0f398d814565 h1:kBbMa8AdCD/0KaLY7jIMk8yWsrRYSMb4zrdGRT4xZ6w=
gitlab.com/elixxir/client/v4 v4.6.4-0.20230531193105-0f398d814565/go.mod h1:fegbuF1/6a+H3QgsoMG8teLnyuKtDxkELMw8pn5WlZ8=
gitlab.com/elixxir/client/v4 v4.6.4-0.20230531195028-ad25aee27c19 h1:OLZTJAqRm1hqGeeHs+aYZ9v3ojgiv+6qykC8+9pFBVM=
gitlab.com/elixxir/client/v4 v4.6.4-0.20230531195028-ad25aee27c19/go.mod h1:fegbuF1/6a+H3QgsoMG8teLnyuKtDxkELMw8pn5WlZ8=
gitlab.com/elixxir/client/v4 v4.6.4-0.20230531195851-a65797612a21 h1:u4H7ITaOwO4aQoSJCo8zpfRpenaqgHuvjqF3GAe8RrE=
gitlab.com/elixxir/client/v4 v4.6.4-0.20230531195851-a65797612a21/go.mod h1:fegbuF1/6a+H3QgsoMG8teLnyuKtDxkELMw8pn5WlZ8=
gitlab.com/elixxir/client/v4 v4.6.4-0.20230531212217-e21b55fbf23c h1:6OTyW9U/ntZ41Xry+8qDkOH4LoxhlyWTwKpAxi2fvZY=
gitlab.com/elixxir/client/v4 v4.6.4-0.20230531212217-e21b55fbf23c/go.mod h1:fegbuF1/6a+H3QgsoMG8teLnyuKtDxkELMw8pn5WlZ8=
gitlab.com/elixxir/client/v4 v4.6.4-0.20230531224642-b24cd3f5e4a4 h1:YacWU7IJUfixfZyckdXEWPwhix7sq+STK+8Vz8DzVO4=
gitlab.com/elixxir/client/v4 v4.6.4-0.20230531224642-b24cd3f5e4a4/go.mod h1:fegbuF1/6a+H3QgsoMG8teLnyuKtDxkELMw8pn5WlZ8=
gitlab.com/elixxir/comms v0.0.4-0.20230519211512-4a998f4b0938 h1:f27+QUFiGWrprKm+fstOg3ABkYLpWcZi3+8Lf5eDnqY=
gitlab.com/elixxir/comms v0.0.4-0.20230519211512-4a998f4b0938/go.mod h1:z+qW0D9VpY5QKTd7wRlb5SK4kBNqLYsa4DXBcUXue9Q=
gitlab.com/elixxir/crypto v0.0.7-0.20230522162218-45433d877235 h1:0BySdXTzRWxzH8k5RiNNMmmn2lpuQWLVcDDA/7ehyqc=
......
......@@ -156,6 +156,8 @@ func setGlobals() {
// wasm/cmix.go
js.Global().Set("NewCmix", js.FuncOf(wasm.NewCmix))
js.Global().Set("NewSynchronizedCmix",
js.FuncOf(wasm.NewSynchronizedCmix))
js.Global().Set("LoadCmix", js.FuncOf(wasm.LoadCmix))
js.Global().Set("LoadSynchronizedCmix",
js.FuncOf(wasm.LoadSynchronizedCmix))
......
......@@ -10,6 +10,8 @@
package wasm
import (
"fmt"
"sync/atomic"
"syscall/js"
"gitlab.com/elixxir/client/v4/bindings"
......@@ -17,6 +19,8 @@ import (
"gitlab.com/elixxir/wasm-utils/utils"
)
var initializing atomic.Bool
// Cmix wraps the [bindings.Cmix] object so its methods can be wrapped to be
// Javascript compatible.
type Cmix struct {
......@@ -110,6 +114,40 @@ func NewCmix(_ js.Value, args []js.Value) any {
return utils.CreatePromise(promiseFn)
}
// NewSynchronizedCmix clones a cMix from remote storage.
//
// Users of this function should delete the storage directory on error.
//
// Parameters:
// - args[0] - NDF JSON ([ndf.NetworkDefinition]) (string).
// - args[1] - Storage directory path (string).
// - args[2] - Password used for storage (Uint8Array).
// - args[3] - Javascript [RemoteStore] implementation.
//
// Returns a promise:
// - Resolves on success.
// - Rejected with an error if creating a new cMix client fails.
func NewSynchronizedCmix(_ js.Value, args []js.Value) any {
initializing.Store(true)
ndfJSON := args[0].String()
storageDir := args[1].String()
password := utils.CopyBytesToGo(args[2])
rs := newRemoteStore(args[3])
promiseFn := func(resolve, reject func(args ...any) js.Value) {
err := bindings.NewSynchronizedCmix(ndfJSON, storageDir,
password, rs)
if err != nil {
reject(exception.NewTrace(err))
} else {
initializing.Store(false)
resolve()
}
}
return utils.CreatePromise(promiseFn)
}
// LoadCmix will load an existing user storage from the storageDir using the
// password. This will fail if the user storage does not exist or the password
// is incorrect.
......@@ -164,6 +202,10 @@ func LoadSynchronizedCmix(_ js.Value, args []js.Value) any {
cmixParamsJSON := utils.CopyBytesToGo(args[3])
promiseFn := func(resolve, reject func(args ...any) js.Value) {
if initializing.Load() {
reject(exception.NewTrace(fmt.Errorf(
"cannot Load when New is running")))
}
net, err := bindings.LoadSynchronizedCmix(storageDir, password,
rs, cmixParamsJSON)
if err != nil {
......
......@@ -385,6 +385,7 @@ func (r *RemoteKV) GetMapElement(_ js.Value, args []js.Value) any {
// - args[0] - the key string
// - args[1] - the version int
// - args[2] - the [KeyChangedByRemoteCallback] javascript callback
// - args[3] - set the localEvents flag to true or false (optional)
//
// Returns a promise with an error if any or the json of the existing
// [versioned.Object], e.g.:
......@@ -396,12 +397,17 @@ func (r *RemoteKV) ListenOnRemoteKey(_ js.Value, args []js.Value) any {
version := int64(args[1].Int())
cb := newKeyChangedByRemoteCallback(args[2])
localEvents := true
if len(args) > 3 && !args[3].IsUndefined() {
localEvents = args[3].Bool()
}
promiseFn := func(resolve, reject func(args ...any) js.Value) {
deleted, err := r.api.ListenOnRemoteKey(key, version, cb)
err := r.api.ListenOnRemoteKey(key, version, cb, localEvents)
if err != nil {
reject(exception.NewTrace(err))
} else {
resolve(utils.CopyBytesToJS(deleted))
resolve()
}
}
......@@ -415,6 +421,7 @@ func (r *RemoteKV) ListenOnRemoteKey(_ js.Value, args []js.Value) any {
// - args[0] - the mapName string
// - args[1] - the version int
// - args[2] - the [MapChangedByRemoteCallback] javascript callback
// - args[3] - set the localEvents flag to true or false (optional)
//
// Returns a promise with an error if any or the json of the existing
// the [map[string]versioned.Object] JSON value, e.g.:
......@@ -426,12 +433,17 @@ func (r *RemoteKV) ListenOnRemoteMap(_ js.Value, args []js.Value) any {
version := int64(args[1].Int())
cb := newMapChangedByRemoteCallback(args[2])
localEvents := true
if len(args) > 3 && !args[3].IsUndefined() {
localEvents = args[3].Bool()
}
promiseFn := func(resolve, reject func(args ...any) js.Value) {
deleted, err := r.api.ListenOnRemoteMap(mapName, version, cb)
err := r.api.ListenOnRemoteMap(mapName, version, cb, localEvents)
if err != nil {
reject(exception.NewTrace(err))
} else {
resolve(utils.CopyBytesToJS(deleted))
resolve()
}
}
......@@ -473,13 +485,11 @@ func newRemoteStore(arg js.Value) *RemoteStore {
// - The file data (Uint8Array).
// - Catches any thrown errors (of type Error) and returns it as an error.
func (rsCB *RemoteStore) Read(path string) ([]byte, error) {
fn := func() js.Value { return rsCB.read(path) }
v, err := exception.RunAndCatch(fn)
if err != nil {
return nil, err
v, awaitErr := utils.Await(rsCB.read(path))
if awaitErr != nil {
return nil, js.Error{Value: awaitErr[0]}
}
return utils.CopyBytesToGo(v), err
return utils.CopyBytesToGo(v[0]), nil
}
// Write implements [bindings.RemoteStore.Write]
......@@ -491,9 +501,11 @@ func (rsCB *RemoteStore) Read(path string) ([]byte, error) {
// Returns:
// - Catches any thrown errors (of type Error) and returns it as an error.
func (rsCB *RemoteStore) Write(path string, data []byte) error {
fn := func() js.Value { return rsCB.write(path, utils.CopyBytesToJS(data)) }
_, err := exception.RunAndCatch(fn)
return err
_, awaitErr := utils.Await(rsCB.write(path, utils.CopyBytesToJS(data)))
if awaitErr != nil {
return js.Error{Value: awaitErr[0]}
}
return nil
}
// GetLastModified implements [bindings.RemoteStore.GetLastModified]
......@@ -536,12 +548,11 @@ func (rsCB *RemoteStore) GetLastWrite() ([]byte, error) {
// - JSON of []string (Uint8Array).
// - Catches any thrown errors (of type Error) and returns it as an error.
func (rsCB *RemoteStore) ReadDir(path string) ([]byte, error) {
fn := func() js.Value { return rsCB.readDir(path) }
v, err := exception.RunAndCatch(fn)
if err != nil {
return nil, err
v, awaitErr := utils.Await(rsCB.readDir(path))
if awaitErr != nil {
return nil, js.Error{Value: awaitErr[0]}
}
return utils.CopyBytesToGo(v), err
return utils.CopyBytesToGo(v[0]), nil
}
////////////////////////////////////////////////////////////////////////////////
......