code: func JoinChannel(reqCtx reqContext.Context, request JoinChannelRequest, targets []fab.ProposalProcessor, opts ...Opt) error {
  
  	if request.GenesisBlock == nil {
  		return errors.New("missing block input parameter with the required genesis block")
  	}
  
  	optionsValue := getOpts(opts...)
  
  	cir, err := createJoinChannelInvokeRequest(request.GenesisBlock)
  	if err != nil {
  		return errors.WithMessage(err, "creation of join channel invoke request failed")
  	}
  
  	var errors1 multi.Errors
  	var mutex sync.Mutex
  	var wg sync.WaitGroup
  
  	wg.Add(len(targets))
  
  	for _, t := range targets {
  		target := t
  		go func() {
  			defer wg.Done()
  			if _, err := queryChaincodeWithTarget(reqCtx, cir, target, optionsValue); err != nil {
  				mutex.Lock()
  				errors1 = append(errors1, err)
  				mutex.Unlock()
  			}
  		}()
  	}
  
  	wg.Wait()
  
  	return errors1.ToError()
  }
docs: // JoinChannel sends a join channel proposal to the target peer.
  //
  // TODO extract targets from request into parameter.