Files
work_cation/service/zeroconf.go
T
2024-10-14 17:40:11 +08:00

78 lines
1.7 KiB
Go

package service
import (
"context"
"fmt"
"github.com/grandcat/zeroconf"
"slices"
"work_cation/cfg"
"work_cation/models"
)
type zeroconfService struct {
server *zeroconf.Server
onlines []models.Online
}
var Zeroconf = &zeroconfService{}
// Register 注册被发现服务
func (s *zeroconfService) Register(user *models.Users) error {
if s.server != nil {
return nil // already registered
}
server, err := zeroconf.Register(cfg.T.ZeroconfKey, "_http._tcp",
"local.", cfg.T.ZeroconfPort, models.UserTOnlineList(user), nil)
if err != nil {
return err
}
s.server = server
return nil
}
func (s *zeroconfService) Close() {
if s.server != nil {
s.server.Shutdown()
s.server = nil
}
}
// FindService 查找被发现服务
func (s *zeroconfService) FindService() ([]models.Online, error) {
return s.onlines, nil
}
func (s *zeroconfService) GetOnline(id string) *models.Online {
for _, online := range s.onlines {
if online.ID == id {
return &online
}
}
return nil
}
func (s *zeroconfService) StartFindService() error {
resolver, err := zeroconf.NewResolver(nil)
if err != nil {
return err
}
allEntries := make(chan *zeroconf.ServiceEntry)
go func(results <-chan *zeroconf.ServiceEntry) {
for entry := range results {
fmt.Println(entry.AddrIPv4, entry.ServiceInstanceName())
if entry.ServiceInstanceName() == fmt.Sprintf("%s._http._tcp.local.", cfg.T.ZeroconfKey) {
online, err := models.NewOnline(entry)
if err != nil {
continue
}
delOnlines := slices.DeleteFunc(s.onlines, func(item models.Online) bool {
return item.ID == online.ID
})
s.onlines = append(delOnlines, *online)
}
}
}(allEntries)
err = resolver.Browse(context.Background(), "_http._tcp", "local.", allEntries)
return err
}