From 4222c49556cd572cd1621b5b5895ee1937350f17 Mon Sep 17 00:00:00 2001
From: Alan Shaw <alan.shaw@protocol.ai>
Date: Tue, 7 Jan 2020 15:27:32 +0000
Subject: [PATCH] fix: stop discoveries (#530)

* fix: stop discoveries

* test: add discovery stop test

* chore: fix lint

Co-authored-by: Jacob Heun <jacobheun@gmail.com>
---
 src/index.js                      |  7 +++++++
 test/peer-discovery/index.spec.js | 26 ++++++++++++++++++++++++++
 2 files changed, 33 insertions(+)

diff --git a/src/index.js b/src/index.js
index 7e635aa7..8c43dd74 100644
--- a/src/index.js
+++ b/src/index.js
@@ -218,7 +218,14 @@ class Libp2p extends EventEmitter {
     log('libp2p is stopping')
 
     try {
+      for (const service of this._discovery.values()) {
+        service.removeListener('peer', this._onDiscoveryPeer)
+      }
+
+      await Promise.all(Array.from(this._discovery.values(), s => s.stop()))
+
       this.connectionManager.stop()
+
       await Promise.all([
         this.pubsub && this.pubsub.stop(),
         this._dht && this._dht.stop(),
diff --git a/test/peer-discovery/index.spec.js b/test/peer-discovery/index.spec.js
index 66e08d37..31fc38cd 100644
--- a/test/peer-discovery/index.spec.js
+++ b/test/peer-discovery/index.spec.js
@@ -65,6 +65,32 @@ describe('peer discovery', () => {
 
       expect(discoverySpy.called).to.eql(false)
     })
+
+    it('should stop discovery on libp2p start/stop', async () => {
+      const mockDiscovery = {
+        tag: 'mock',
+        start: () => {},
+        stop: () => {},
+        on: () => {},
+        removeListener: () => {}
+      }
+      const startSpy = sinon.spy(mockDiscovery, 'start')
+      const stopSpy = sinon.spy(mockDiscovery, 'stop')
+
+      libp2p = new Libp2p(mergeOptions(baseOptions, {
+        peerInfo,
+        modules: {
+          peerDiscovery: [mockDiscovery]
+        }
+      }))
+
+      await libp2p.start()
+      expect(startSpy).to.have.property('callCount', 1)
+      expect(stopSpy).to.have.property('callCount', 0)
+      await libp2p.stop()
+      expect(startSpy).to.have.property('callCount', 1)
+      expect(stopSpy).to.have.property('callCount', 1)
+    })
   })
 
   describe('discovery modules from transports', () => {