diff --git a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/subscriptions/DefaultSubscriptionSession.java b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/subscriptions/DefaultSubscriptionSession.java index c8f17cf2..8073a302 100644 --- a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/subscriptions/DefaultSubscriptionSession.java +++ b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/subscriptions/DefaultSubscriptionSession.java @@ -53,8 +53,8 @@ public void sendDataMessage(String id, Object payload) { } @Override - public void sendErrorMessage(String id) { - + public void sendErrorMessage(String id, Object payload) { + send(mapper.serialize(payload)); } @Override diff --git a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/subscriptions/SessionSubscriber.java b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/subscriptions/SessionSubscriber.java index 12cfa157..0dcc2140 100644 --- a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/subscriptions/SessionSubscriber.java +++ b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/subscriptions/SessionSubscriber.java @@ -1,8 +1,13 @@ package graphql.kickstart.execution.subscriptions; import graphql.ExecutionResult; + +import java.util.Collections; import java.util.HashMap; import java.util.Map; + +import graphql.GraphQLError; +import graphql.kickstart.execution.error.GenericGraphQLError; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.reactivestreams.Subscriber; @@ -29,6 +34,7 @@ public void onSubscribe(Subscription subscription) { public void onNext(ExecutionResult executionResult) { Map result = new HashMap<>(); result.put("data", executionResult.getData()); + session.sendDataMessage(id, result); subscriptionReference.get().request(1); } @@ -36,8 +42,12 @@ public void onNext(ExecutionResult executionResult) { @Override public void onError(Throwable throwable) { log.error("Subscription error", throwable); + + Map payload = new HashMap<>(); + payload.put("errors", Collections.singletonList(new GenericGraphQLError(throwable.getMessage()))); + session.unsubscribe(id); - session.sendErrorMessage(id); + session.sendErrorMessage(id, payload); } @Override diff --git a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/subscriptions/SubscriptionSession.java b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/subscriptions/SubscriptionSession.java index cec8638e..5ec6f47a 100644 --- a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/subscriptions/SubscriptionSession.java +++ b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/subscriptions/SubscriptionSession.java @@ -19,7 +19,7 @@ public interface SubscriptionSession { void sendDataMessage(String id, Object payload); - void sendErrorMessage(String id); + void sendErrorMessage(String id, Object payload); void sendCompleteMessage(String id); diff --git a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/subscriptions/apollo/ApolloSubscriptionSession.java b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/subscriptions/apollo/ApolloSubscriptionSession.java index db1918d6..871321d2 100644 --- a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/subscriptions/apollo/ApolloSubscriptionSession.java +++ b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/subscriptions/apollo/ApolloSubscriptionSession.java @@ -18,8 +18,8 @@ public void sendDataMessage(String id, Object payload) { } @Override - public void sendErrorMessage(String id) { - sendMessage(new OperationMessage(Type.GQL_ERROR, id, null)); + public void sendErrorMessage(String id, Object payload) { + sendMessage(new OperationMessage(Type.GQL_ERROR, id, payload)); } @Override diff --git a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/subscriptions/apollo/SubscriptionConnectionInitCommand.java b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/subscriptions/apollo/SubscriptionConnectionInitCommand.java index e884954a..e58f0a44 100644 --- a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/subscriptions/apollo/SubscriptionConnectionInitCommand.java +++ b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/subscriptions/apollo/SubscriptionConnectionInitCommand.java @@ -19,8 +19,8 @@ public void apply(SubscriptionSession session, OperationMessage message) { connectionListeners.forEach(it -> it.onConnect(session, message)); session.sendMessage(new OperationMessage(Type.GQL_CONNECTION_ACK, message.getId(), null)); } catch (Throwable t) { - session.sendMessage( - new OperationMessage(Type.GQL_CONNECTION_ERROR, message.getId(), t.getMessage())); + log.error("Cannot initialize subscription command '{}'", message, t); + session.sendMessage(new OperationMessage(Type.GQL_CONNECTION_ERROR, message.getId(), t.getMessage())); } } diff --git a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/subscriptions/WebSocketSendSubscriber.java b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/subscriptions/WebSocketSendSubscriber.java index a7dec57b..44e819f4 100644 --- a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/subscriptions/WebSocketSendSubscriber.java +++ b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/subscriptions/WebSocketSendSubscriber.java @@ -35,7 +35,7 @@ public void onNext(String message) { @Override public void onError(Throwable t) { - + log.error("WebSocket error", t); } @Override