Request handling
This commit is contained in:
@@ -1,9 +1,12 @@
|
||||
package dev.selimaj.session;
|
||||
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.fasterxml.jackson.databind.node.TextNode;
|
||||
|
||||
import dev.selimaj.session.types.SessionResult;
|
||||
import dev.selimaj.session.types.Message;
|
||||
import dev.selimaj.session.types.Method;
|
||||
import dev.selimaj.session.types.MethodHandler;
|
||||
|
||||
import java.net.URI;
|
||||
import java.net.http.HttpClient;
|
||||
@@ -52,6 +55,19 @@ public final class Session {
|
||||
return listener.request(ws, method.getName(), req, method.getResClass());
|
||||
}
|
||||
|
||||
<Req extends JsonNode, Res extends JsonNode, Err extends JsonNode> void onRequest(Method<Req, Res, Err> method,
|
||||
MethodHandler<Req> handler) {
|
||||
MethodHandler<JsonNode> wrapper = (id, value) -> {
|
||||
try {
|
||||
return handler.handle(id, listener.mapper.treeToValue(value, method.getReqClass()));
|
||||
} catch (Exception e) {
|
||||
return SessionResult.error(TextNode.valueOf(e.getMessage()));
|
||||
}
|
||||
};
|
||||
|
||||
this.listener.methods.put(method.getName(), wrapper);
|
||||
}
|
||||
|
||||
public void close() throws Exception {
|
||||
ws.sendClose(0, "Session closed");
|
||||
}
|
||||
|
||||
@@ -13,9 +13,9 @@ import dev.selimaj.session.types.Message;
|
||||
import dev.selimaj.session.types.MethodHandler;
|
||||
|
||||
public class SessionListener implements WebSocket.Listener {
|
||||
public final ConcurrentHashMap<String, MethodHandler> methods = new ConcurrentHashMap<>();
|
||||
public final ConcurrentHashMap<String, MethodHandler<JsonNode>> methods = new ConcurrentHashMap<>();
|
||||
|
||||
private final ObjectMapper mapper = new ObjectMapper();
|
||||
final ObjectMapper mapper = new ObjectMapper();
|
||||
private final ConcurrentHashMap<Integer, CompletableFuture<JsonNode>> pending = new ConcurrentHashMap<>();
|
||||
private final AtomicInteger id = new AtomicInteger();
|
||||
|
||||
@@ -31,7 +31,7 @@ public class SessionListener implements WebSocket.Listener {
|
||||
}
|
||||
|
||||
if (msg instanceof Message.Request r) {
|
||||
MethodHandler handler = methods.get(r.method());
|
||||
MethodHandler<JsonNode> handler = methods.get(r.method());
|
||||
|
||||
if (handler != null) {
|
||||
handler.handle(r.id(), r.data())
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
package dev.selimaj.session.types;
|
||||
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
|
||||
public record HandlerResult(boolean isError, JsonNode value) {
|
||||
}
|
||||
@@ -1,10 +1,10 @@
|
||||
package dev.selimaj.session.types;
|
||||
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
|
||||
@FunctionalInterface
|
||||
public interface MethodHandler {
|
||||
CompletableFuture<HandlerResult> handle(int id, JsonNode data);
|
||||
public interface MethodHandler<Req extends JsonNode> {
|
||||
CompletableFuture<SessionResult> handle(int id, Req data);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user