Files
tessera/services/data_service/internal/server/grpc_streaming_server.go

50 lines
1.2 KiB
Go

package server
import (
"fmt"
"github.com/google/uuid"
pb "gitlab.michelsen.id/phillmichelsen/tessera/pkg/pb/data_service"
"gitlab.michelsen.id/phillmichelsen/tessera/services/data_service/internal/manager"
)
type GRPCStreamingServer struct {
pb.UnimplementedDataServiceStreamingServer
manager *manager.Manager
}
func NewGRPCStreamingServer(m *manager.Manager) *GRPCStreamingServer {
return &GRPCStreamingServer{manager: m}
}
func (s *GRPCStreamingServer) ConnectStream(req *pb.ConnectStreamRequest, stream pb.DataServiceStreaming_ConnectStreamServer) error {
streamUUID, err := uuid.Parse(req.StreamUuid)
if err != nil {
return fmt.Errorf("invalid UUID: %w", err)
}
ch, err := s.manager.ConnectClientStream(streamUUID)
if err != nil {
return fmt.Errorf("failed to connect: %w", err)
}
for {
select {
case <-stream.Context().Done():
s.manager.DisconnectClientStream(streamUUID)
return nil
case msg, ok := <-ch:
if !ok {
return nil
}
if err := stream.Send(&pb.Message{
Identifier: &pb.Identifier{Key: msg.Identifier.Key()},
Payload: msg.Payload,
Encoding: string(msg.Encoding),
}); err != nil {
return err
}
}
}
}