func extractRemoteAddr(stream pb.StreamService_MessageStreamServer) string {
	p, ok := peer.FromContext(stream.Context())
	if !ok {
		return ""
	}
	if p.Addr == nil {
		return ""
	}
	return p.Addr.String()
}
extractRemoteAddr returns address of attached peer
package cleisthenes
import (
	"context"
	"net"
	"time"
	"github.com/DE-labtory/iLogger"
	"github.com/google/uuid"
	"google.golang.org/grpc"
	"google.golang.org/grpc/peer"
	"google.golang.org/grpc/reflection"
	"github.com/DE-labtory/cleisthenes/pb"
)
type ConnHandler func(conn Connection)
type ErrHandler func(err error)
type GrpcServer struct {
	connHandler ConnHandler
	errHandler  ErrHandler
	addr        Address
	lis         net.Listener
}
func NewServer(addr Address) *GrpcServer {
	return &GrpcServer{
		addr: addr,
	}
}
func (s GrpcServer) MessageStream(streamServer pb.StreamService_MessageStreamServer) error {
	ip := extractRemoteAddr(streamServer)
	_, cancel := context.WithCancel(context.Background())
	streamWrapper := NewServerStreamWrapper(streamServer, cancel)
	conn, err := NewConnection(Address{Ip: ip}, uuid.New().String(), streamWrapper)
	if err != nil {
		return err
	}
	if s.connHandler != nil {
		s.connHandler(conn)
	}
	return nil
}