This repository has been archived by the owner on Nov 21, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
resolver.go
82 lines (76 loc) · 1.83 KB
/
resolver.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package graph
import (
"context"
"github.com/AJGherardi/HomeHub/cmd"
"github.com/AJGherardi/HomeHub/generated"
"github.com/AJGherardi/HomeHub/utils"
"github.com/grandcat/zeroconf"
)
type eventObserver struct {
messages chan int
ctx context.Context
}
type stateObserver struct {
groupAddr uint16
devAddr uint16
elemAddr uint16
messages chan string
ctx context.Context
}
// Resolver is the root of the schema
type Resolver struct {
Network *cmd.Network
Mdns *zeroconf.Server
StateObservers []stateObserver
EventObservers []eventObserver
UserPin int
}
// New returns the servers config
func New(
network *cmd.Network,
mdns *zeroconf.Server,
) (generated.Config, *Resolver, func(), func(addr uint16)) {
// Make resolver
resolver := Resolver{
Network: network,
Mdns: mdns,
StateObservers: make([]stateObserver, 0),
EventObservers: make([]eventObserver, 0),
UserPin: 000000,
}
// Make config
c := generated.Config{
Resolvers: &resolver,
}
// Start updater function
return c, &resolver,
func() {
// Update observers
for _, observer := range resolver.StateObservers {
// Check if observer is closed
select {
case <-observer.ctx.Done():
// If so remove observer and continue
utils.Delete(&resolver.StateObservers, i)
continue
default:
}
state, _ := network.ReadState(observer.groupAddr, observer.devAddr, observer.elemAddr)
observer.messages <- utils.EncodeBase64(state)
}
},
func(addr uint16) {
// Update observers
for i, observer := range resolver.EventObservers {
// Check if observer is closed
select {
case <-observer.ctx.Done():
// If so remove observer and continue
utils.Delete(&resolver.StateObservers, i)
continue
default:
}
observer.messages <- int(addr)
}
}
}