diff --git a/api/client.go b/api/client.go index 6cb4786535df667e5232635a566e7e245f71a109..f9ae0cc51d1d7cbbf12c0134435088f5b9fbf240 100644 --- a/api/client.go +++ b/api/client.go @@ -63,6 +63,9 @@ type Client struct { followerServices *services clientErrorChannel chan interfaces.ClientError + + // Event reporting in event.go + events eventManager } // NewClient creates client storage, generates keys, connects, and registers @@ -184,6 +187,7 @@ func OpenClient(storageDir string, password []byte, parameters params.Network) ( followerServices: newServices(), parameters: parameters, clientErrorChannel: make(chan interfaces.ClientError, 1000), + events: newEventManager(), } return c, nil @@ -370,8 +374,13 @@ func (c *Client) registerFollower() error { } } + err := c.followerServices.add(c.events.eventService) + if err != nil { + return errors.WithMessage(err, "Couldn't start event reporting") + } + //register the core follower service - err := c.followerServices.add(func() (stoppable.Stoppable, error) { return c.network.Follow(cer) }) + err = c.followerServices.add(func() (stoppable.Stoppable, error) { return c.network.Follow(cer) }) if err != nil { return errors.WithMessage(err, "Failed to start following "+ "the network") diff --git a/api/event.go b/api/event.go index 4e5c59d91d3ef39189b148cf0172402d88b53c38..df9e93da36815d319bcdbeb1ed3945e7f4270e89 100644 --- a/api/event.go +++ b/api/event.go @@ -8,11 +8,11 @@ package api import ( + "fmt" + "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/stoppable" "sync" - "github.com/pkg/errors" - "fmt" ) // EventCallbackFunction defines the callback functions for client event reports @@ -20,20 +20,22 @@ type EventCallbackFunction func(priority int, category, evtType, details string) // ReportableEvent is used to surface events to client users. type reportableEvent struct { - Priority int - Category string + Priority int + Category string EventType string - Details string + Details string } + // Holds state for the event reporting system type eventManager struct { - eventCh chan reportableEvent + eventCh chan reportableEvent eventCbs []EventCallbackFunction eventLck sync.Mutex } + func newEventManager() eventManager { - return eventManager { - eventCh: make(chan reportableEvent, 1000), + return eventManager{ + eventCh: make(chan reportableEvent, 1000), eventCbs: make([]EventCallbackFunction, 0), } } @@ -43,10 +45,10 @@ func newEventManager() eventManager { func (e eventManager) ReportEvent(priority int, category, evtType, details string) { re := reportableEvent{ - Priority: priority, - Category: category, + Priority: priority, + Category: category, EventType: evtType, - Details: details, + Details: details, } select { case e.eventCh <- re: @@ -114,12 +116,14 @@ func (e eventManager) reportEventsHandler(stop *stoppable.Single) { func (c *Client) ReportEvent(priority int, category, evtType, details string) { c.events.ReportEvent(priority, category, evtType, details) } + // RegisterEventCallback records the given function to receive // ReportableEvent objects. It returns the internal index // of the callback so that it can be deleted later. func (c *Client) RegisterEventCallback(myFunc EventCallbackFunction) int { return c.events.RegisterEventCallback(myFunc) } + // UnregisterEventCallback deletes the callback identified by the // index. It returns an error if it fails. func (c *Client) UnregisterEventCallback(index int) error {