fcaster/fcast/discovery.go
2025-05-29 22:52:44 +02:00

57 lines
903 B
Go

package fcast
import (
"github.com/hashicorp/mdns"
"log"
)
type DiscoveredHost struct {
Name string
IPv4 string
IPv6 string
}
func Discover() ([]DiscoveredHost, error) {
entriesCh := make(chan *mdns.ServiceEntry)
var discoveredHosts []DiscoveredHost
go func() {
for entry := range entriesCh {
if !validateEntry(entry) {
continue
}
discoveredHosts = append(discoveredHosts, DiscoveredHost{
Name: entry.Name,
IPv4: entry.AddrV4.String(),
IPv6: entry.AddrV6.String(),
})
}
}()
done := make(chan struct{})
go func() {
err := mdns.Lookup("_fcast._tcp", entriesCh)
if err != nil {
log.Println("[ERROR] mdns: lookup error:", err)
}
close(entriesCh)
close(done)
}()
select {
case <-done:
return discoveredHosts, nil
}
}
func validateEntry(entry *mdns.ServiceEntry) bool {
if entry.Port != DefaultPort {
return false
}
return true
}