code: @NotNull
    public CompletableFuture<Meta> upload(@NotNull final StreamProvider streamProvider) {
      final CompletableFuture<Meta> future = new CompletableFuture<>();
      getPool().submit(() -> {
        try {
          future.complete(Client.generateMeta(streamProvider));
        } catch (Throwable e) {
          future.completeExceptionally(e);
        }
      });
      return future.thenCompose(meta -> upload(meta, streamProvider));
    }
docs: This method computes stream metadata and upload object.
  
  @param streamProvider Stream provider.
  @return Return future with upload result.