mirror of
https://codeberg.org/cunicu/cunicu.git
synced 2025-10-05 16:57:01 +08:00
83 lines
1.4 KiB
Go
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
|
|
}
|