code: func (s *ServergRPC) Query(ctx context.Context, in *pb.DnsPacket) (*pb.DnsPacket, error) {
  	msg := new(dns.Msg)
  	err := msg.Unpack(in.Msg)
  	if err != nil {
  		return nil, err
  	}
  
  	p, ok := peer.FromContext(ctx)
  	if !ok {
  		return nil, errors.New("no peer in gRPC context")
  	}
  
  	a, ok := p.Addr.(*net.TCPAddr)
  	if !ok {
  		return nil, fmt.Errorf("no TCP peer in gRPC context: %v", p.Addr)
  	}
  
  	r := &net.IPAddr{IP: a.IP}
  	w := &gRPCresponse{localAddr: s.listenAddr, remoteAddr: r, Msg: msg}
  
  	s.ServeDNS(ctx, w, msg)
  
  	packed, err := w.Msg.Pack()
  	if err != nil {
  		return nil, err
  	}
  
  	return &pb.DnsPacket{Msg: packed}, nil
  }
docs: // Query is the main entry-point into the gRPC server. From here we call ServeDNS like
  // any normal server. We use a custom responseWriter to pick up the bytes we need to write
  // back to the client as a protobuf.