code: @Restricted(Beta.class)
      public void setChannel(@Nonnull ChannelBuilder cb,
                             @Nonnull CommandTransport commandTransport,
                             @CheckForNull Channel.Listener listener) throws IOException, InterruptedException {
          for (ChannelConfigurator cc : ChannelConfigurator.all()) {
              cc.onChannelBuilding(cb,this);
          }
  
          OutputStream headerStream = cb.getHeaderStream();
          if (headerStream == null) {
              LOGGER.log(Level.WARNING, "No header stream defined when setting channel for computer {0}. " +
                      "Launch log won't be printed", this);
          }
          Channel channel = cb.build(commandTransport);
          setChannel(channel, headerStream, listener);
      }
docs: Creates a {@link Channel} from the given Channel Builder and Command Transport.
  This method can be used to allow {@link ComputerLauncher}s to create channels not based on I/O streams.
  
  @param cb
  Channel Builder.
  To print launch logs this channel builder should have a Header Stream defined
  (see {@link ChannelBuilder#getHeaderStream()}) in this argument or by one of {@link ChannelConfigurator}s.
  @param commandTransport
  Command Transport
  @param listener
  Gets a notification when the channel closes, to perform clean up. Can be {@code null}.
  By the time this method is called, the cause of the termination is reported to the user,
  so the implementation of the listener doesn't need to do that again.
  @since 2.127