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

113 lines
3.9 KiB
Java
Raw Normal View History

package it.tdlight.tdlibsession.td.middle.direct;
import static it.tdlight.tdlibsession.td.middle.server.AsyncTdMiddleEventBusServer.WAIT_DURATION;
2021-01-24 23:08:14 +01:00
import io.reactivex.Completable;
import io.vertx.core.json.JsonObject;
2021-01-24 23:08:14 +01:00
import io.vertx.reactivex.core.AbstractVerticle;
import it.tdlight.jni.TdApi;
import it.tdlight.jni.TdApi.Function;
import it.tdlight.jni.TdApi.Object;
import it.tdlight.tdlibsession.td.ResponseError;
import it.tdlight.tdlibsession.td.TdResult;
import it.tdlight.tdlibsession.td.direct.AsyncTdDirectImpl;
2021-01-13 04:00:43 +01:00
import it.tdlight.tdlibsession.td.direct.AsyncTdDirectOptions;
2021-01-24 19:13:46 +01:00
import it.tdlight.tdlibsession.td.direct.TelegramClientFactory;
import it.tdlight.tdlibsession.td.middle.AsyncTdMiddle;
import it.tdlight.tdlibsession.td.middle.TdClusterManager;
import it.tdlight.utils.MonoUtils;
2021-10-02 16:48:56 +02:00
import java.time.Duration;
2021-10-26 00:01:44 +02:00
import java.util.concurrent.atomic.AtomicReference;
2021-02-20 21:25:11 +01:00
import org.warp.commonutils.log.Logger;
import org.warp.commonutils.log.LoggerFactory;
2021-10-26 00:01:44 +02:00
import reactor.core.Disposable;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
2021-01-13 04:00:43 +01:00
import reactor.core.publisher.Sinks;
import reactor.core.publisher.Sinks.Empty;
2021-01-24 23:08:14 +01:00
import reactor.core.scheduler.Schedulers;
public class AsyncTdMiddleDirect extends AbstractVerticle implements AsyncTdMiddle {
private static final Logger logger = LoggerFactory.getLogger(AsyncTdMiddleDirect.class);
2021-01-24 19:13:46 +01:00
private final TelegramClientFactory clientFactory;
protected AsyncTdDirectImpl td;
private String botAddress;
private String botAlias;
2021-01-22 17:31:09 +01:00
private final Empty<Object> closeRequest = Sinks.empty();
public AsyncTdMiddleDirect() {
2021-01-24 19:13:46 +01:00
this.clientFactory = new TelegramClientFactory();
}
2021-01-22 17:31:09 +01:00
public static Mono<AsyncTdMiddle> getAndDeployInstance(TdClusterManager clusterManager,
String botAlias,
2021-01-24 19:13:46 +01:00
String botAddress,
JsonObject implementationDetails) {
var instance = new AsyncTdMiddleDirect();
2020-10-19 00:50:27 +02:00
var options = clusterManager.newDeploymentOpts().setConfig(new JsonObject()
.put("botAlias", botAlias)
2021-01-24 19:13:46 +01:00
.put("botAddress", botAddress)
.put("implementationDetails", implementationDetails));
2021-01-22 17:31:09 +01:00
return clusterManager.getVertx()
.rxDeployVerticle(instance, options)
.as(MonoUtils::toMono)
.doOnNext(_v -> logger.trace("Deployed verticle for bot " + botAlias + ", address: " + botAddress))
.thenReturn(instance);
}
@Override
2021-01-24 23:08:14 +01:00
public Completable rxStart() {
var botAddress = config().getString("botAddress");
if (botAddress == null || botAddress.isEmpty()) {
throw new IllegalArgumentException("botAddress is not set!");
}
this.botAddress = botAddress;
var botAlias = config().getString("botAlias");
if (botAlias == null || botAlias.isEmpty()) {
throw new IllegalArgumentException("botAlias is not set!");
}
this.botAlias = botAlias;
2021-01-24 19:13:46 +01:00
var implementationDetails = config().getJsonObject("implementationDetails");
if (implementationDetails == null) {
throw new IllegalArgumentException("implementationDetails is not set!");
}
2021-01-24 19:13:46 +01:00
this.td = new AsyncTdDirectImpl(clientFactory, implementationDetails, botAlias);
2021-01-24 23:08:14 +01:00
return Completable.complete();
}
@Override
2021-01-24 23:08:14 +01:00
public Completable rxStop() {
2021-10-26 00:01:44 +02:00
return Completable.fromRunnable(closeRequest::tryEmitEmpty);
}
2021-02-25 11:21:03 +01:00
@Override
public Mono<Void> initialize() {
2021-10-26 00:01:44 +02:00
return td.initialize();
2021-02-25 11:21:03 +01:00
}
@Override
2021-01-13 04:00:43 +01:00
public Flux<TdApi.Object> receive() {
return td
2021-01-23 01:41:42 +01:00
.receive(new AsyncTdDirectOptions(WAIT_DURATION, 100))
2021-01-13 04:00:43 +01:00
.takeUntilOther(closeRequest.asMono())
2021-01-26 12:34:59 +01:00
.doOnNext(s -> logger.trace("Received update from tdlib: {}", s.getClass().getSimpleName()))
2021-01-22 17:31:09 +01:00
.doOnError(ex -> logger.info("TdMiddle verticle error", ex))
2021-01-24 23:08:14 +01:00
.doOnTerminate(() -> logger.debug("TdMiddle verticle stopped"))
2021-09-09 12:10:50 +02:00
.subscribeOn(Schedulers.boundedElastic());
}
@Override
2021-10-21 00:21:43 +02:00
public <T extends Object> Mono<TdResult<T>> execute(Function<T> requestFunction,
2021-10-02 16:48:56 +02:00
Duration timeout,
boolean executeDirectly) {
2021-01-22 17:31:09 +01:00
return td
2021-10-02 16:48:56 +02:00
.<T>execute(requestFunction, timeout, executeDirectly)
2021-02-14 22:59:20 +01:00
.onErrorMap(error -> ResponseError.newResponseError(requestFunction, botAlias, error));
}
}