From 35ecc599b06115d5c5a41d931777cb873114de09 Mon Sep 17 00:00:00 2001
From: "Richard T. Carback III" <rick.carback@gmail.com>
Date: Wed, 14 Jun 2023 17:38:27 +0000
Subject: [PATCH] Implement changes for the multiListener update

---
 wasm/collective.go | 94 ++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 90 insertions(+), 4 deletions(-)

diff --git a/wasm/collective.go b/wasm/collective.go
index 5c2eb771..36768830 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                                                                //
 ////////////////////////////////////////////////////////////////////////////////
-- 
GitLab