Files
work_cation/service/zeroconf.go
T
2024-10-12 00:38:18 +08:00

68 lines
1.5 KiB
Go

package service
import (
"context"
"fmt"
"github.com/grandcat/zeroconf"
"time"
"work_cation/cfg"
"work_cation/models"
)
type zeroconfService struct {
server *zeroconf.Server
}
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() (chan *models.Online, error) {
resolver, err := zeroconf.NewResolver(nil)
if err != nil {
return nil, err
}
allEntries := make(chan *zeroconf.ServiceEntry)
useEntries := make(chan *models.Online)
go func(results <-chan *zeroconf.ServiceEntry) {
for entry := range results {
if entry.ServiceInstanceName() == fmt.Sprintf("%s._http._tcp.local.", cfg.T.ZeroconfKey) {
online, err := models.NewOnline(entry)
if err != nil {
continue
}
useEntries <- online
}
}
}(allEntries)
ctx, cancel := context.WithCancel(context.Background())
err = resolver.Browse(ctx, "_http._tcp", "local.", allEntries)
if err != nil {
cancel()
return nil, err
}
time.AfterFunc(10*time.Second, cancel)
return useEntries, nil
}