All Downloads are FREE. Search and download functionalities are using the official Maven repository.

tech.ydb.core.grpc.GrpcTransport Maven / Gradle / Ivy

package tech.ydb.core.grpc;

import java.net.URI;
import java.net.URISyntaxException;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ScheduledExecutorService;

import com.google.common.base.Preconditions;
import com.google.common.net.HostAndPort;
import io.grpc.MethodDescriptor;

import tech.ydb.core.Result;
import tech.ydb.core.utils.URITools;


/**
 * @author Sergey Polovko
 * @author Evgeniy Pshenitsin
 * @author Nikolay Perfilov
 */
public interface GrpcTransport extends AutoCloseable {
    // TODO: 
     CompletableFuture> unaryCall(
            MethodDescriptor method,
            GrpcRequestSettings settings,
            ReqT request);

     GrpcReadStream readStreamCall(
            MethodDescriptor method,
            GrpcRequestSettings settings,
            ReqT request);

     GrpcReadWriteStream readWriteStreamCall(
            MethodDescriptor method,
            GrpcRequestSettings settings);

    String getDatabase();

    ScheduledExecutorService getScheduler();

    @Override
    void close();

    static GrpcTransportBuilder forHost(HostAndPort hostAndPort, String database) {
        return new GrpcTransportBuilder(null, hostAndPort, database);
    }

    static GrpcTransportBuilder forHost(String host, int port, String database) {
        return new GrpcTransportBuilder(null, HostAndPort.fromParts(host, port), database);
    }

    static GrpcTransportBuilder forEndpoint(String endpoint, String database) {
        Preconditions.checkNotNull(endpoint, "endpoint is null");
        Preconditions.checkNotNull(database, "database is null");
        return new GrpcTransportBuilder(endpoint, null, database);
    }

    // [://][:]/ - main form
    // [://][:]/?database= - deprecated mode
    static GrpcTransportBuilder forConnectionString(String connectionString) {
        Preconditions.checkNotNull(connectionString, "connection string is null");
        String endpoint;
        String database;
        String scheme;
        try {
            URI uri = new URI(connectionString.contains("://") ? connectionString : "grpc://" + connectionString);
            endpoint = uri.getAuthority();
            Preconditions.checkNotNull(endpoint, "no endpoint in connection string");
            database = uri.getPath();
            Map> params = URITools.splitQuery(uri);
            List databaseList = params.get("database");
            if (databaseList != null && !databaseList.isEmpty()) {
                // depracted mode has high priority than main
                database = databaseList.get(0);
            }

            Preconditions.checkArgument(database != null && !database.isEmpty(), "no database in connection string");
            scheme = uri.getScheme();
        } catch (URISyntaxException | RuntimeException e) {
            throw new IllegalArgumentException("Failed to parse connection string '" + connectionString +
                    "'. Expected format: [://][:]/?database=", e);
        }
        GrpcTransportBuilder builder = new GrpcTransportBuilder(endpoint, null, database);
        if (scheme.equals("grpcs")) {
            builder.withSecureConnection();
        } else if (!scheme.equals("grpc")) {
            throw new IllegalArgumentException("Unknown protocol '" + scheme + "' in connection string");
        }
        return builder;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy