Files
cunicu/pkg/socket/server.go
2022-01-06 15:11:25 +01:00

83 lines
1.4 KiB
Go

package socket
import (
"sync"
"go.uber.org/zap"
"google.golang.org/grpc"
"riasc.eu/wice/pkg/pb"
"net"
"os"
)
type Server struct {
pb.SocketServer
listener net.Listener
grpc *grpc.Server
Requests chan interface{}
eventListeners map[chan *pb.Event]interface{}
eventListenersLock sync.Mutex
waitGroup sync.WaitGroup
waitOnce sync.Once
logger *zap.Logger
}
func Listen(network string, address string, wait bool) (*Server, error) {
logger := zap.L().Named("socket.server")
// Remove old unix sockets
if network == "unix" {
if err := os.RemoveAll(address); err != nil {
logger.Fatal("Failed to remove old socket", zap.Error(err))
}
}
l, err := net.Listen(network, address)
if err != nil {
return nil, err
}
s := &Server{
listener: l,
logger: logger,
grpc: grpc.NewServer(),
eventListeners: map[chan *pb.Event]interface{}{},
Requests: make(chan interface{}),
}
pb.RegisterSocketServer(s.grpc, s)
go s.grpc.Serve(l)
s.waitGroup.Add(1)
if wait {
s.logger.Info("Wait for control socket connection")
s.waitGroup.Wait()
}
return s, nil
}
func (s *Server) BroadcastEvent(e *pb.Event) error {
if e.Time == nil {
e.Time = pb.TimeNow()
}
s.eventListenersLock.Lock()
for ch := range s.eventListeners {
ch <- e
}
s.eventListenersLock.Unlock()
e.Log(s.logger, "Broadcasted event")
return nil
}