diff --git a/wasm/collective.go b/wasm/collective.go index 5c2eb771502e3206210cfc0dca78b3743f7b3fc0..36768830654b4b6217b5783e934f7ecea4d7ef84 100644 --- a/wasm/collective.go +++ b/wasm/collective.go @@ -48,6 +48,16 @@ func newRemoteKvJS(api *bindings.RemoteKV) map[string]any { "GetMapElement": js.FuncOf(rkv.GetMapElement), "ListenOnRemoteKey": js.FuncOf(rkv.ListenOnRemoteKey), "ListenOnRemoteMap": js.FuncOf(rkv.ListenOnRemoteMap), + "GetAllRemoteKeyListeners": js.FuncOf( + rkv.GetAllRemoteKeyListeners), + "GetRemoteKeyListeners": js.FuncOf(rkv.GetRemoteKeyListeners), + "DeleteRemoteKeyListener": js.FuncOf( + rkv.DeleteRemoteKeyListener), + "GetAllRemoteMapListeners": js.FuncOf( + rkv.GetAllRemoteMapListeners), + "GetRemoteMapListeners": js.FuncOf(rkv.GetRemoteMapListeners), + "DeleteRemoteMapListener": js.FuncOf( + rkv.DeleteRemoteMapListener), } return rkvMap @@ -403,11 +413,12 @@ func (r *RemoteKV) ListenOnRemoteKey(_ js.Value, args []js.Value) any { } promiseFn := func(resolve, reject func(args ...any) js.Value) { - err := r.api.ListenOnRemoteKey(key, version, cb, localEvents) + id, err := r.api.ListenOnRemoteKey(key, version, cb, + localEvents) if err != nil { reject(exception.NewTrace(err)) } else { - resolve() + resolve(id) } } @@ -439,17 +450,92 @@ func (r *RemoteKV) ListenOnRemoteMap(_ js.Value, args []js.Value) any { } promiseFn := func(resolve, reject func(args ...any) js.Value) { - err := r.api.ListenOnRemoteMap(mapName, version, cb, localEvents) + id, err := r.api.ListenOnRemoteMap(mapName, version, cb, + localEvents) if err != nil { reject(exception.NewTrace(err)) } else { - resolve() + resolve(id) } } return utils.CreatePromise(promiseFn) } +// GetAllRemoteKeyListeners returns a JSON list of { key: [id, id, id, ...] }, +// where key is the key for the listener and the list is an list of integer ids +// of each listener. +func (r *RemoteKV) GetAllRemoteKeyListeners() any { + return r.api.GetAllRemoteKeyListeners() +} + +// GeRemoteKeyListeners returns a JSON list of [id, id, id, ...], +// where the list is an list of integer ids of each listener. +// +// Parameters: +// - args[0] - the key to look at +func (r *RemoteKV) GetRemoteKeyListeners(_ js.Value, args []js.Value) any { + key := args[0].String() + return r.api.GetRemoteKeyListeners(key) +} + +// DeleteRemoteKeyListener deletes a specific listener for a key. +// +// Parameters: +// - args[0] - the key to delete for +// - args[1] - the id of the listener +func (r *RemoteKV) DeleteRemoteKeyListener(_ js.Value, args []js.Value) any { + key := args[0].String() + id := args[1].Int() + + promiseFn := func(resolve, reject func(args ...any) js.Value) { + err := r.api.DeleteRemoteKeyListener(key, id) + if err != nil { + reject(execption.NewTrace(err)) + } else { + resolve() + } + } + return utils.CreatePromiseFn(promisFn) +} + +// GetAllRemoteMapListeners returns a JSON list of { key: [id, id, id, ...] }, +// where key is the key for the listener and the list is an list of integer ids +// of each listener. +func (r *RemoteKV) GetAllRemoteMapListeners() any { + return r.api.GetAllRemoteMapListeners() +} + +// GeRemoteMapListeners returns a JSON list of [id, id, id, ...], +// where the list is an list of integer ids of each listener. +// +// Parameters: +// - args[0] - the key to look at +func (r *RemoteKV) GetRemoteMapListeners(_ js.Value, args []js.Value) any { + key := args[0].String() + return r.api.GetRemoteMapListeners(key) +} + +// DeleteRemoteMapListener deletes a specific listener for a key. +// +// Parameters: +// - args[0] - the mapName to delete for +// - args[1] - the id of the listener +func (r *RemoteKV) DeleteRemoteMapListener(_ js.Value, args []js.Value) any { + mapName := args[0].String() + id := args[1].Int() + + promiseFn := func(resolve, reject func(args ...any) js.Value) { + err := r.api.DeleteRemoteMapListener(mapName, id) + if err != nil { + reject(execption.NewTrace(err)) + } else { + resolve() + } + } + return utils.CreatePromiseFn(promisFn) +} + //////////////////////////////////////////////////////////////////////////////// // RemoteStore // ////////////////////////////////////////////////////////////////////////////////