diff --git a/protocol/connections/engine.go b/protocol/connections/engine.go index beb04df..0cff804 100644 --- a/protocol/connections/engine.go +++ b/protocol/connections/engine.go @@ -36,6 +36,8 @@ type engine struct { // Required for listen(), inaccessible from identity privateKey ed25519.PrivateKey + + shuttingDown bool } // Engine (ProtocolEngine) encapsulates the logic necessary to make and receive Cwtch connections. @@ -133,10 +135,10 @@ func (e *engine) eventHandler() { func (e *engine) createPeerTemplate() *PeerApp { peerAppTemplate := new(PeerApp) peerAppTemplate.MessageHandler = e.handlePeerMessage - peerAppTemplate.OnAcknowledgement = e.peerAck - peerAppTemplate.OnAuth = e.peerAuthed - peerAppTemplate.OnConnecting = e.peerConnecting - peerAppTemplate.OnClose = e.peerDisconnected + peerAppTemplate.OnAcknowledgement = e.ignoreOnShutdown(e.peerAck) + peerAppTemplate.OnAuth = e.ignoreOnShutdown(e.peerAuthed) + peerAppTemplate.OnConnecting = e.ignoreOnShutdown(e.peerConnecting) + peerAppTemplate.OnClose = e.ignoreOnShutdown(e.peerDisconnected) return peerAppTemplate } @@ -149,6 +151,7 @@ func (e *engine) listenFn() { // Shutdown tears down the eventHandler goroutine func (e *engine) Shutdown() { + e.shuttingDown = true e.service.Shutdown() e.connectionsManager.Shutdown() e.queue.Shutdown() @@ -159,6 +162,10 @@ func (e *engine) peerWithOnion(onion string) { e.service.Connect(onion, e.createPeerTemplate()) } +func (e * engine) ignoreOnShutdown(f func(string)) func(string){ + return func (x string) {if !e.shuttingDown{f(x)} } +} + func (e *engine) peerAuthed(onion string) { e.eventManager.Publish(event.NewEvent(event.PeerStateChange, map[event.Field]string{ event.RemotePeer: string(onion),