tdlib-session-container/src/main/java/it/tdlight/tdlibsession/td/middle/direct/AsyncTdMiddleLocal.java

87 lines
3.0 KiB
Java
Raw Normal View History

package it.tdlight.tdlibsession.td.middle.direct;
2021-01-23 18:49:21 +01:00
import io.vertx.core.DeploymentOptions;
import io.vertx.core.json.JsonObject;
import io.vertx.reactivex.core.Vertx;
import it.tdlight.jni.TdApi;
import it.tdlight.jni.TdApi.Function;
import it.tdlight.jni.TdApi.Object;
import it.tdlight.tdlibsession.td.TdResult;
import it.tdlight.tdlibsession.td.middle.AsyncTdMiddle;
import it.tdlight.tdlibsession.td.middle.TdClusterManager;
import it.tdlight.tdlibsession.td.middle.client.AsyncTdMiddleEventBusClient;
import it.tdlight.tdlibsession.td.middle.server.AsyncTdMiddleEventBusServer;
2021-01-23 18:49:21 +01:00
import it.tdlight.utils.MonoUtils;
import java.nio.file.Path;
2021-10-02 16:48:56 +02:00
import java.time.Duration;
import org.warp.commonutils.error.InitializationException;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
2021-01-22 17:31:09 +01:00
import reactor.core.publisher.Sinks;
import reactor.core.publisher.Sinks.One;
public class AsyncTdMiddleLocal implements AsyncTdMiddle {
private final TdClusterManager masterClusterManager;
private final String botAlias;
2021-01-23 18:49:21 +01:00
private final int botId;
private final DeploymentOptions deploymentOptions;
private final Vertx vertx;
private final AsyncTdMiddleEventBusServer srv;
private final One<AsyncTdMiddle> cli = Sinks.one();
2021-01-24 19:13:46 +01:00
private final JsonObject implementationDetails;
2021-01-23 18:49:21 +01:00
2021-01-24 19:13:46 +01:00
public AsyncTdMiddleLocal(TdClusterManager masterClusterManager,
String botAlias,
int botId,
JsonObject implementationDetails) {
this.masterClusterManager = masterClusterManager;
this.botAlias = botAlias;
2021-01-23 18:49:21 +01:00
this.botId = botId;
2021-01-24 19:13:46 +01:00
this.implementationDetails = implementationDetails;
2021-01-23 18:49:21 +01:00
this.vertx = masterClusterManager.getVertx();
this.deploymentOptions = masterClusterManager
.newDeploymentOpts()
.setConfig(new JsonObject()
.put("botId", botId)
.put("botAlias", botAlias)
2021-01-24 19:13:46 +01:00
.put("local", true)
.put("implementationDetails", implementationDetails)
);
2021-01-23 18:49:21 +01:00
this.srv = new AsyncTdMiddleEventBusServer();
}
public Mono<AsyncTdMiddleLocal> start() {
2021-01-23 18:49:21 +01:00
return vertx
.rxDeployVerticle(srv, deploymentOptions).as(MonoUtils::toMono)
2021-01-22 17:31:09 +01:00
.single()
2021-01-23 18:49:21 +01:00
.then(Mono.fromSupplier(() -> new AsyncTdMiddleEventBusClient(masterClusterManager)))
.zipWith(AsyncTdMiddleEventBusClient.retrieveBinlog(vertx, Path.of("binlogs"), botId))
2021-01-24 19:13:46 +01:00
.flatMap(tuple -> tuple
.getT1()
.start(botId, botAlias, true, implementationDetails, tuple.getT2())
.thenReturn(tuple.getT1()))
2021-01-23 18:49:21 +01:00
.onErrorMap(InitializationException::new)
2021-01-22 17:31:09 +01:00
.doOnNext(this.cli::tryEmitValue)
.doOnError(this.cli::tryEmitError)
.thenReturn(this);
}
2021-02-25 11:21:03 +01:00
@Override
public Mono<Void> initialize() {
return cli.asMono().single().flatMap(AsyncTdMiddle::initialize);
}
@Override
2021-01-13 04:00:43 +01:00
public Flux<TdApi.Object> receive() {
2021-01-22 17:31:09 +01:00
return cli.asMono().single().flatMapMany(AsyncTdMiddle::receive);
}
@Override
2021-10-02 16:48:56 +02:00
public <T extends Object> Mono<TdResult<T>> execute(Function request, Duration timeout, boolean executeDirectly) {
return cli.asMono().single().flatMap(c -> c.execute(request, timeout, executeDirectly));
}
}