From e687051e2a3f1b35dfd400c1555adec588a8de2d Mon Sep 17 00:00:00 2001
From: jbhusson <jonah@elixxir.io>
Date: Wed, 27 Jul 2022 16:18:56 -0400
Subject: [PATCH] Fix listen to return an interface for stopping

---
 bindings/single.go | 27 ++++++++++++++++++++-------
 1 file changed, 20 insertions(+), 7 deletions(-)

diff --git a/bindings/single.go b/bindings/single.go
index e7949fd5f..7e93d4085 100644
--- a/bindings/single.go
+++ b/bindings/single.go
@@ -77,20 +77,20 @@ func TransmitSingleUse(e2eID int, recipient []byte, tag string, payload,
 //
 // Returns:
 //  - StopFunc - a function used to stop the listener
-func Listen(e2eID int, tag string, cb SingleUseCallback) (StopFunc, error) {
+func Listen(e2eID int, tag string, cb SingleUseCallback) (Stopper, error) {
 	e2eCl, err := e2eTrackerSingleton.get(e2eID)
 	if err != nil {
 		return nil, err
 	}
 
-	listener := singleUseListener{scb: cb}
+	suListener := singleUseListener{scb: cb}
 	dhpk, err := e2eCl.api.GetReceptionIdentity().GetDHKeyPrivate()
 	if err != nil {
 		return nil, err
 	}
 	l := single.Listen(tag, e2eCl.api.GetReceptionIdentity().ID, dhpk,
-		e2eCl.api.GetCmix(), e2eCl.api.GetStorage().GetE2EGroup(), listener)
-	return l.Stop, nil
+		e2eCl.api.GetCmix(), e2eCl.api.GetStorage().GetE2EGroup(), suListener)
+	return &stopper{l: l}, nil
 }
 
 // JSON Types
@@ -153,9 +153,10 @@ type SingleUseCallbackReport struct {
 // Function Types                                                             //
 ////////////////////////////////////////////////////////////////////////////////
 
-// StopFunc is the function to stop a listener returned to the bindings layer
-// when one is started.
-type StopFunc func()
+// Stopper is a public interface returned by Listen, allowing users to stop the registered listener.
+type Stopper interface {
+	Stop()
+}
 
 // SingleUseCallback func is passed into Listen and called when messages are
 // received.
@@ -209,6 +210,18 @@ func (sl singleUseListener) Callback(
 	sl.scb.Callback(json.Marshal(scr))
 }
 
+/* Listener stopper */
+
+// stopper is the internal struct backing the Stopper interface, allowing us
+// to pass the listener Stop method to the bindings layer.
+type stopper struct {
+	l single.Listener
+}
+
+func (s *stopper) Stop() {
+	s.l.Stop()
+}
+
 /* Response Struct */
 
 // singleUseResponse is the private struct backing SingleUseResponse, which
-- 
GitLab