From 382111583d132a2999ea369b18ae315998441e39 Mon Sep 17 00:00:00 2001 From: Gisle Aune Date: Fri, 19 Aug 2022 23:14:06 +0200 Subject: [PATCH] add privileged service subscription, which grants first look at all events but no bus access in handling. --- bus.go | 25 ++++++++++++++++++++++--- cmd/bustest/main.go | 18 ++---------------- 2 files changed, 24 insertions(+), 19 deletions(-) diff --git a/bus.go b/bus.go index 7d05dcf..17c1d78 100644 --- a/bus.go +++ b/bus.go @@ -24,9 +24,10 @@ type Command interface { } type EventBus struct { - mu sync.Mutex - listeners []*serviceListener - signal chan struct{} + mu sync.Mutex + listeners []*serviceListener + privilegedList []ActiveService + signal chan struct{} } // JoinCallback joins the event bus for a moment. @@ -51,6 +52,15 @@ func (b *EventBus) Join(service Service) { b.mu.Unlock() } +// JoinPrivileged will add the services to a list that gets first look at +// all events, but they are not allowed to issue any commands. This is for +// things that cannot have eventual consistency. +func (b *EventBus) JoinPrivileged(service ActiveService) { + b.mu.Lock() + b.privilegedList = append(b.privilegedList, service) + b.mu.Unlock() +} + func (b *EventBus) RunCommand(command Command) { fmt.Println("[COMMAND]", command.CommandDescription()) b.send(serviceMessage{command: command}) @@ -65,6 +75,15 @@ func (b *EventBus) send(message serviceMessage) { b.mu.Lock() defer b.mu.Unlock() + for _, service := range b.privilegedList { + if message.command != nil { + service.HandleCommand(nil, message.command) + } + if message.event != nil { + service.HandleEvent(nil, message.event) + } + } + deleteList := make([]int, 0, 0) for i, listener := range b.listeners { if !listener.service.Active() { diff --git a/cmd/bustest/main.go b/cmd/bustest/main.go index b841eac..1d235b7 100644 --- a/cmd/bustest/main.go +++ b/cmd/bustest/main.go @@ -20,12 +20,10 @@ func main() { resolver := services.NewResolver() sceneMap := services.NewSceneMap(resolver) - bus.Join(resolver) - bus.Join(sceneMap) + bus.JoinPrivileged(resolver) + bus.JoinPrivileged(sceneMap) bus.Join(services.NewEffectEnforcer(resolver, sceneMap)) - time.Sleep(time.Millisecond) - bus.RunEvent(events.Connected{Prefix: "nanoleaf:10.80.1.11"}) numbers := []int{5, 2, 3, 1, 4} @@ -39,22 +37,16 @@ func main() { }) } - time.Sleep(time.Millisecond) - bus.RunCommand(commands.ReplaceScene{ Match: "lucifer:name:Hex*", SceneID: 7, }) - time.Sleep(time.Millisecond) - bus.RunCommand(commands.AddAlias{ Match: "nanoleaf:10.80.1.{11,7,16,5}:*", Alias: "lucifer:tag:Magic Lamps", }) - time.Sleep(time.Millisecond) - for i, id := range []string{"40e5", "dead", "beef", "cafe", "1337"} { bus.RunEvent(events.HardwareState{ ID: "nanoleaf:10.80.1.11:" + id, @@ -65,8 +57,6 @@ func main() { }) } - time.Sleep(time.Millisecond) - bus.RunEvent(events.ExternalEvent{ Kind: "weather", Values: map[string]string{ @@ -76,8 +66,6 @@ func main() { }, }) - time.Sleep(time.Millisecond) - c1 := gentools.Ptr(color.MustParse("rgb:#ff0000")) c2 := gentools.Ptr(color.MustParse("rgb:#00ff00")) bus.RunCommand(commands.Assign{ @@ -100,8 +88,6 @@ func main() { }, }) - time.Sleep(time.Millisecond * 100) - log.Println("Search \"**:Hexagon {1,5,6}\"") for _, dev := range resolver.Resolve("lucifer:name:Hexagon {1,5,6}") { log.Println("- ID:", dev.ID)