diff --git a/src/main/java/io/moderne/jsonrpc/JsonRpc.java b/src/main/java/io/moderne/jsonrpc/JsonRpc.java
index a102057..7850422 100644
--- a/src/main/java/io/moderne/jsonrpc/JsonRpc.java
+++ b/src/main/java/io/moderne/jsonrpc/JsonRpc.java
@@ -18,13 +18,11 @@
import io.moderne.jsonrpc.formatter.JsonMessageFormatter;
import io.moderne.jsonrpc.formatter.MessageFormatter;
import io.moderne.jsonrpc.handler.MessageHandler;
-import lombok.RequiredArgsConstructor;
import java.io.EOFException;
import java.util.Map;
import java.util.concurrent.*;
-@RequiredArgsConstructor
public class JsonRpc {
private final ForkJoinPool forkJoin = new ForkJoinPool(
4, ForkJoinPool.defaultForkJoinWorkerThreadFactory, null, true);
@@ -45,6 +43,11 @@ public JsonRpc(MessageHandler messageHandler) {
this(messageHandler, new JsonMessageFormatter());
}
+ public JsonRpc(MessageHandler messageHandler, MessageFormatter formatter) {
+ this.messageHandler = messageHandler;
+ this.formatter = formatter;
+ }
+
public
JsonRpc rpc(String name, JsonRpcMethod
method) {
methods.put(name, method);
return this;
@@ -105,18 +108,7 @@ protected void compute() {
messageHandler.send(JsonRpcError.methodNotFound(errorId, errorMethod), formatter)
).fork();
} else {
- ForkJoinTask.adapt(() -> {
- try {
- Object response = method.convertAndHandle(request.getParams(), formatter);
- if (response != null) {
- messageHandler.send(new JsonRpcSuccess(request.getId(), response), formatter);
- } else {
- messageHandler.send(JsonRpcError.internalError(request.getId(), "Method returned null"), formatter);
- }
- } catch (Exception e) {
- messageHandler.send(JsonRpcError.internalError(request.getId(), e), formatter);
- }
- }).fork();
+ ForkJoinTask.adapt(() -> dispatch(request, method)).fork();
}
}
} catch (EOFException e) {
@@ -157,6 +149,22 @@ protected void compute() {
return this;
}
+ private void dispatch(JsonRpcRequest request, JsonRpcMethod> method) {
+ JsonRpcMessage outbound;
+ try {
+ Object result = method.convertAndHandle(request.getParams(), formatter);
+ // Wrap the handler's return value so the on-wire representation
+ // goes through the same RawJson + Jackson serializer pipeline
+ // as inbound-converted values.
+ outbound = result != null
+ ? new JsonRpcSuccess(request.getId(), RawJson.of(result))
+ : JsonRpcError.internalError(request.getId(), "Method returned null");
+ } catch (Exception e) {
+ outbound = JsonRpcError.internalError(request.getId(), e);
+ }
+ messageHandler.send(outbound, formatter);
+ }
+
public void shutdown() {
shutdown = true;
forkJoin.shutdownNow();
diff --git a/src/main/java/io/moderne/jsonrpc/JsonRpcIdDeserializer.java b/src/main/java/io/moderne/jsonrpc/JsonRpcIdDeserializer.java
index 41ad2cc..1208712 100644
--- a/src/main/java/io/moderne/jsonrpc/JsonRpcIdDeserializer.java
+++ b/src/main/java/io/moderne/jsonrpc/JsonRpcIdDeserializer.java
@@ -16,33 +16,32 @@
package io.moderne.jsonrpc;
import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.core.ObjectCodec;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
-import com.fasterxml.jackson.databind.JsonNode;
import java.io.IOException;
public class JsonRpcIdDeserializer extends JsonDeserializer