2020-10-14 01:38:44 +02:00
|
|
|
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;
|
2020-10-28 12:04:42 +01:00
|
|
|
import it.tdlight.jni.TdApi;
|
2020-10-14 01:38:44 +02:00
|
|
|
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;
|
2020-10-28 12:04:42 +01:00
|
|
|
import it.tdlight.tdlibsession.td.middle.TdClusterManager;
|
2020-10-14 01:38:44 +02:00
|
|
|
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;
|
2020-10-14 01:38:44 +02:00
|
|
|
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;
|
2020-10-14 01:38:44 +02:00
|
|
|
|
|
|
|
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;
|
2020-10-14 01:38:44 +02:00
|
|
|
|
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) {
|
2020-10-14 01:38:44 +02:00
|
|
|
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();
|
2020-10-14 01:38:44 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
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);
|
2020-10-14 01:38:44 +02:00
|
|
|
}
|
|
|
|
|
2021-02-25 11:21:03 +01:00
|
|
|
@Override
|
|
|
|
public Mono<Void> initialize() {
|
|
|
|
return cli.asMono().single().flatMap(AsyncTdMiddle::initialize);
|
|
|
|
}
|
|
|
|
|
2020-10-14 01:38:44 +02:00
|
|
|
@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);
|
2020-10-14 01:38:44 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public <T extends Object> Mono<TdResult<T>> execute(Function request, boolean executeDirectly) {
|
2021-01-22 17:31:09 +01:00
|
|
|
return cli.asMono().single().flatMap(c -> c.execute(request, executeDirectly));
|
2020-10-14 01:38:44 +02:00
|
|
|
}
|
|
|
|
}
|