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                                                                //
 ////////////////////////////////////////////////////////////////////////////////