tdlib-session-container/src/main/java/it/tdlight/tdlibsession/td/WrappedReactorTelegramClient.java

93 lines
3.1 KiB
Java
Raw Normal View History

2021-02-13 17:42:22 +01:00
package it.tdlight.tdlibsession.td;
import it.tdlight.common.ReactiveTelegramClient;
2021-10-04 00:28:45 +02:00
import it.tdlight.common.Signal;
import it.tdlight.common.SignalListener;
import it.tdlight.common.UpdatesHandler;
2021-02-13 17:42:22 +01:00
import it.tdlight.jni.TdApi;
2021-02-25 11:21:03 +01:00
import it.tdlight.utils.MonoUtils;
2021-10-02 16:48:56 +02:00
import java.time.Duration;
2021-10-04 00:28:45 +02:00
import java.util.concurrent.atomic.AtomicReference;
2021-08-05 17:33:21 +02:00
import org.jetbrains.annotations.NotNull;
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
import reactor.core.CoreSubscriber;
2021-02-13 17:42:22 +01:00
import reactor.core.publisher.Flux;
2021-08-05 17:33:21 +02:00
import reactor.core.publisher.FluxSink.OverflowStrategy;
2021-02-13 17:42:22 +01:00
import reactor.core.publisher.Mono;
2021-10-04 00:28:45 +02:00
import reactor.core.scheduler.Schedulers;
2021-02-13 17:42:22 +01:00
public class WrappedReactorTelegramClient implements ReactorTelegramClient {
private final ReactiveTelegramClient reactiveTelegramClient;
2021-10-04 00:28:45 +02:00
private final AtomicReference<Flux<Signal>> multicastSignals = new AtomicReference<>(null);
2021-02-13 17:42:22 +01:00
public WrappedReactorTelegramClient(ReactiveTelegramClient reactiveTelegramClient) {
this.reactiveTelegramClient = reactiveTelegramClient;
}
2021-02-25 11:21:03 +01:00
public Mono<Void> initialize() {
return MonoUtils
2021-10-04 00:28:45 +02:00
.fromBlockingEmpty(() -> {
reactiveTelegramClient.createAndRegisterClient();
Flux<Signal> signalsFlux = Flux
.<Signal>create(sink -> {
reactiveTelegramClient.setListener(sink::next);
sink.onCancel(reactiveTelegramClient::cancel);
sink.onDispose(reactiveTelegramClient::dispose);
}, OverflowStrategy.BUFFER)
.subscribeOn(Schedulers.boundedElastic())
.takeWhile(Signal::isNotClosed);
Flux<Signal> refCountedSharedSignalsFlux = signalsFlux.publish().refCount();
multicastSignals.set(refCountedSharedSignalsFlux);
});
2021-02-25 11:21:03 +01:00
}
2021-02-13 17:42:22 +01:00
@Override
2021-02-25 11:21:03 +01:00
public Flux<TdApi.Object> receive() {
return Flux
2021-10-04 00:28:45 +02:00
.defer(() -> {
Flux<Signal> flux = multicastSignals.get();
if (flux == null) {
return Flux.error(new IllegalStateException("TDLib session not started"));
} else {
return flux;
2021-08-05 17:33:21 +02:00
}
2021-10-04 00:28:45 +02:00
})
2021-04-11 14:57:05 +02:00
.handle((item, sink) -> {
2021-02-25 11:21:03 +01:00
if (item.isUpdate()) {
2021-04-11 14:57:05 +02:00
sink.next(item.getUpdate());
2021-10-04 00:28:45 +02:00
} else if (item.isException()) {
sink.error(item.getException());
2021-02-25 11:21:03 +01:00
} else {
2021-04-11 14:57:05 +02:00
sink.error(new IllegalStateException("This shouldn't happen. Received unknown ReactiveItem type"));
2021-02-25 11:21:03 +01:00
}
});
2021-02-13 17:42:22 +01:00
}
/**
* Sends a request to the TDLib.
*
2021-10-02 16:48:56 +02:00
* @param query Object representing a query to the TDLib.
* @param timeout Response timeout.
2021-02-13 17:42:22 +01:00
* @return a publisher that will emit exactly one item, or an error
2021-10-02 16:48:56 +02:00
* @throws NullPointerException if query is null.
2021-02-13 17:42:22 +01:00
*/
@Override
2021-10-21 00:21:43 +02:00
public <T extends TdApi.Object> Mono<TdApi.Object> send(TdApi.Function<T> query, Duration timeout) {
2021-10-02 16:48:56 +02:00
return Mono.from(reactiveTelegramClient.send(query, timeout)).single();
2021-02-13 17:42:22 +01:00
}
/**
* Synchronously executes a TDLib request. Only a few marked accordingly requests can be executed synchronously.
*
* @param query Object representing a query to the TDLib.
* @return request result or {@link TdApi.Error}.
* @throws NullPointerException if query is null.
*/
@Override
2021-10-21 00:21:43 +02:00
public <T extends TdApi.Object> TdApi.Object execute(TdApi.Function<T> query) {
2021-04-13 21:48:36 +02:00
return reactiveTelegramClient.execute(query);
2021-02-13 17:42:22 +01:00
}
}