code: public Optional<T> blockOptional(Duration timeout) {
  		BlockingOptionalMonoSubscriber<T> subscriber = new BlockingOptionalMonoSubscriber<>();
  		Operators.onLastAssembly(this).subscribe(Operators.toCoreSubscriber(subscriber));
  		return subscriber.blockingGet(timeout.toMillis(), TimeUnit.MILLISECONDS);
  	}
docs: Subscribe to this {@link Mono} and <strong>block</strong> until a next signal is
  received, the Mono completes empty or a timeout expires. Returns an {@link Optional}
  for the first two cases, which can be used to replace the empty case with an
  Exception via {@link Optional#orElseThrow(Supplier)}.
  In case the Mono itself errors, the original exception is thrown (wrapped in a
  {@link RuntimeException} if it was a checked exception).
  If the provided timeout expires, a {@link RuntimeException} is thrown.
  
  <p>
  <img class="marble" src="doc-files/marbles/blockOptionalWithTimeout.svg" alt="">
  <p>
  Note that each block() will trigger a new subscription: in other words, the result
  might miss signal from hot publishers.
  
  @param timeout maximum time period to wait for before raising a {@link RuntimeException}
  
  @return T the result