diff --git a/lib.go b/lib.go index c4766b1..4f52796 100644 --- a/lib.go +++ b/lib.go @@ -184,7 +184,7 @@ func ReconnectCwtchForeground() { // populate profile list peerList := application.ListPeers() for onion := range peerList { - eventHandler.Push(event.NewEvent(event.NewPeer, map[event.Field]string{event.Identity: onion, event.Created: event.False})) + eventHandler.Push(event.NewEvent(event.NewPeer, map[event.Field]string{event.Identity: onion, event.Created: event.False, "Reload": event.True})) } for onion := range peerList { diff --git a/utils/eventHandler.go b/utils/eventHandler.go index 978fb49..9d1c15c 100644 --- a/utils/eventHandler.go +++ b/utils/eventHandler.go @@ -23,11 +23,10 @@ type EventHandler struct { app app.Application appBusQueue event.Queue profileEvents chan EventProfileEnvelope - profileQueues map[string]event.Queue } func NewEventHandler() *EventHandler { - eh := &EventHandler{app: nil, appBusQueue: event.NewQueue(), profileQueues: make(map[string]event.Queue), profileEvents: make(chan EventProfileEnvelope)} + eh := &EventHandler{app: nil, appBusQueue: event.NewQueue(), profileEvents: make(chan EventProfileEnvelope)} return eh } @@ -79,7 +78,10 @@ func (eh *EventHandler) handleAppBusEvent(e *event.Event) string { onion := e.Data[event.Identity] profile := eh.app.GetPeer(e.Data[event.Identity]) log.Debug("New Peer Event: %v", e) - eh.startHandlingPeer(onion) + + if e.Data["Reload"] != event.True { + eh.startHandlingPeer(onion) + } if e.Data[event.Created] == event.True { name, _ := profile.GetAttribute(attr.GetLocalScope(constants.Name)) @@ -345,18 +347,21 @@ func (eh *EventHandler) startHandlingPeer(onion string) { eventBus.Subscribe(event.ChangePasswordError, q) eventBus.Subscribe(event.NewRetValMessageFromPeer, q) eventBus.Subscribe(event.SetAttribute, q) - eh.profileQueues[onion] = q go eh.forwardProfileMessages(onion, q) } func (eh *EventHandler) forwardProfileMessages(onion string, q event.Queue) { + log.Infof("Launching Forwarding Goroutine for %v", onion) // TODO: graceful shutdown, via an injected event of special QUIT type exiting loop/go routine for { e := q.Next() ev := EventProfileEnvelope{Event: e, Profile: onion} eh.profileEvents <- ev + if ev.Event.EventType == event.Shutdown { + return + } } }