LibJF/libjf-config-network-v0/src/main/java/io/gitlab/jfronny/libjf/config/impl/network/rci/MirrorObject.java

54 lines
1.6 KiB
Java

package io.gitlab.jfronny.libjf.config.impl.network.rci;
import io.gitlab.jfronny.libjf.config.impl.network.*;
import net.fabricmc.fabric.api.networking.v1.PacketSender;
import net.minecraft.network.PacketByteBuf;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Consumer;
public class MirrorObject {
protected final PacketSender packetSender;
public MirrorObject(PacketSender packetSender) {
this.packetSender = packetSender;
}
protected <T> T synchronize(Consumer<Hold<T>> action) {
Object[] result = {null};
AtomicBoolean pause = new AtomicBoolean(true);
action.accept(with -> {
result[0] = with;
pause.set(false);
synchronized (result) {
result.notifyAll();
}
});
synchronized (result) {
while (pause.get()) {
try {
if (pause.get()) result.wait();
} catch (InterruptedException e) {
// ignored
}
}
}
return (T) result[0];
}
protected PacketByteBuf sendRequest(String name, PacketByteBuf body) {
return sendRequest(name, body, Map.of());
}
protected PacketByteBuf sendRequest(String name, PacketByteBuf body, Map<String, RequestHandler> temporaryHandlers) {
return this.<PMResponseHandler.Response>synchronize(hold -> {
RequestRouter.sendRequest(packetSender, name, body, new PMResponseHandler(hold::resume), temporaryHandlers);
}).get();
}
protected interface Hold<T> {
void resume(T with);
}
}