Skip to content

Commit 4dbd471

Browse files
committed
Implement fallback websocket protocol
1 parent eca7e6d commit 4dbd471

8 files changed

+56
-18
lines changed

src/main/java/graphql/servlet/GraphQLObjectMapper.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,10 @@ public GraphQLRequest readGraphQLRequest(InputStream inputStream) throws IOExcep
6969
return getGraphQLRequestMapper().readValue(inputStream);
7070
}
7171

72+
public GraphQLRequest readGraphQLRequest(String text) throws IOException {
73+
return getGraphQLRequestMapper().readValue(text);
74+
}
75+
7276
public List<GraphQLRequest> readBatchedGraphQLRequest(InputStream inputStream) throws IOException {
7377
MappingIterator<GraphQLRequest> iterator = getGraphQLRequestMapper().readValues(inputStream);
7478
List<GraphQLRequest> requests = new ArrayList<>();

src/main/java/graphql/servlet/GraphQLWebsocketServlet.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ public class GraphQLWebsocketServlet extends Endpoint {
3333

3434
private static final String HANDSHAKE_REQUEST_KEY = HandshakeRequest.class.getName();
3535
private static final String PROTOCOL_HANDLER_REQUEST_KEY = SubscriptionProtocolHandler.class.getName();
36+
private static final CloseReason ERROR_CLOSE_REASON = new CloseReason(CloseReason.CloseCodes.UNEXPECTED_CONDITION, "Internal Server Error");
3637

3738
private static final List<SubscriptionProtocolFactory> subscriptionProtocolFactories = Collections.singletonList(new ApolloSubscriptionProtocolFactory());
3839
private static final SubscriptionProtocolFactory fallbackSubscriptionProtocolFactory = new FallbackSubscriptionProtocolFactory();
@@ -45,7 +46,15 @@ public class GraphQLWebsocketServlet extends Endpoint {
4546
}
4647

4748
private final Map<Session, WsSessionSubscriptions> sessionSubscriptionCache = new HashMap<>();
48-
private final CloseReason ERROR_CLOSE_REASON = new CloseReason(CloseReason.CloseCodes.UNEXPECTED_CONDITION, "Internal Server Error");
49+
private final GraphQLQueryInvoker queryInvoker;
50+
private final GraphQLInvocationInputFactory invocationInputFactory;
51+
private final GraphQLObjectMapper graphQLObjectMapper;
52+
53+
public GraphQLWebsocketServlet(GraphQLQueryInvoker queryInvoker, GraphQLInvocationInputFactory invocationInputFactory, GraphQLObjectMapper graphQLObjectMapper) {
54+
this.queryInvoker = queryInvoker;
55+
this.invocationInputFactory = invocationInputFactory;
56+
this.graphQLObjectMapper = graphQLObjectMapper;
57+
}
4958

5059
@Override
5160
public void onOpen(Session session, EndpointConfig endpointConfig) {
@@ -61,11 +70,7 @@ public void onOpen(Session session, EndpointConfig endpointConfig) {
6170
@Override
6271
public void onMessage(String text) {
6372
try {
64-
// subscriptionProtocolHandler.onMessage(request, text, );
65-
// query(getGraphQLRequestMapper().readValue(text), invocationInputFactory.create(request), (executionResult) -> {
66-
// Object data = executionResult.getData();
67-
// session.getBasicRemote().sendText();
68-
// });
73+
subscriptionProtocolHandler.onMessage(request, session, text);
6974
} catch (Throwable t) {
7075
log.error("Error executing websocket query for session: {}", session.getId(), t);
7176
closeUnexpectedly(session, t);
@@ -106,7 +111,7 @@ public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request,
106111
}
107112

108113
SubscriptionProtocolFactory subscriptionProtocolFactory = getSubscriptionProtocolFactory(accept);
109-
sec.getUserProperties().put(PROTOCOL_HANDLER_REQUEST_KEY, subscriptionProtocolFactory);
114+
sec.getUserProperties().put(PROTOCOL_HANDLER_REQUEST_KEY, subscriptionProtocolFactory.createHandler(invocationInputFactory, queryInvoker, graphQLObjectMapper));
110115

111116
if(request.getHeaders().get(HandshakeResponse.SEC_WEBSOCKET_ACCEPT) != null) {
112117
response.getHeaders().put(HandshakeResponse.SEC_WEBSOCKET_ACCEPT, allSubscriptionProtocols);

src/main/java/graphql/servlet/internal/ApolloSubscriptionProtocolFactory.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
package graphql.servlet.internal;
22

3+
import graphql.servlet.GraphQLInvocationInputFactory;
4+
import graphql.servlet.GraphQLObjectMapper;
5+
import graphql.servlet.GraphQLQueryInvoker;
6+
37
/**
48
* @author Andrew Potter
59
*/
@@ -9,7 +13,7 @@ public ApolloSubscriptionProtocolFactory() {
913
}
1014

1115
@Override
12-
public SubscriptionProtocolHandler createHandler() {
16+
public SubscriptionProtocolHandler createHandler(GraphQLInvocationInputFactory invocationInputFactory, GraphQLQueryInvoker queryInvoker, GraphQLObjectMapper graphQLObjectMapper) {
1317
return new ApolloSubscriptionProtocolHandler();
1418
}
1519
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
package graphql.servlet.internal;
22

3+
import javax.websocket.Session;
34
import javax.websocket.server.HandshakeRequest;
4-
import java.util.function.Function;
55

66
/**
77
* @author Andrew Potter
88
*/
99
public class ApolloSubscriptionProtocolHandler implements SubscriptionProtocolHandler {
1010
@Override
11-
public void onMessage(HandshakeRequest request, String text, Function query) {
11+
public void onMessage(HandshakeRequest request, Session session, String text) {
1212

1313
}
1414
}
Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
package graphql.servlet.internal;
22

3+
import graphql.servlet.GraphQLInvocationInputFactory;
4+
import graphql.servlet.GraphQLObjectMapper;
5+
import graphql.servlet.GraphQLQueryInvoker;
6+
37
/**
48
* @author Andrew Potter
59
*/
@@ -9,7 +13,7 @@ public FallbackSubscriptionProtocolFactory() {
913
}
1014

1115
@Override
12-
public SubscriptionProtocolHandler createHandler() {
13-
return new FallbackSubscriptionProtocolHandler();
16+
public SubscriptionProtocolHandler createHandler(GraphQLInvocationInputFactory invocationInputFactory, GraphQLQueryInvoker queryInvoker, GraphQLObjectMapper graphQLObjectMapper) {
17+
return new FallbackSubscriptionProtocolHandler(queryInvoker, invocationInputFactory, graphQLObjectMapper);
1418
}
1519
}
Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,31 @@
11
package graphql.servlet.internal;
22

3+
import graphql.servlet.GraphQLInvocationInputFactory;
4+
import graphql.servlet.GraphQLObjectMapper;
5+
import graphql.servlet.GraphQLQueryInvoker;
6+
7+
import javax.websocket.Session;
38
import javax.websocket.server.HandshakeRequest;
4-
import java.util.function.Function;
59

610
/**
711
* @author Andrew Potter
812
*/
913
public class FallbackSubscriptionProtocolHandler implements SubscriptionProtocolHandler {
10-
@Override
11-
public void onMessage(HandshakeRequest request, String text, Function query) {
1214

15+
private final GraphQLQueryInvoker queryInvoker;
16+
private final GraphQLInvocationInputFactory invocationInputFactory;
17+
private final GraphQLObjectMapper graphQLObjectMapper;
18+
19+
public FallbackSubscriptionProtocolHandler(GraphQLQueryInvoker queryInvoker, GraphQLInvocationInputFactory invocationInputFactory, GraphQLObjectMapper graphQLObjectMapper) {
20+
this.queryInvoker = queryInvoker;
21+
this.invocationInputFactory = invocationInputFactory;
22+
this.graphQLObjectMapper = graphQLObjectMapper;
23+
}
24+
25+
@Override
26+
public void onMessage(HandshakeRequest request, Session session, String text) throws Exception {
27+
session.getBasicRemote().sendText(graphQLObjectMapper.serializeResultAsJson(
28+
queryInvoker.query(invocationInputFactory.create(graphQLObjectMapper.readGraphQLRequest(text), request))
29+
));
1330
}
1431
}

src/main/java/graphql/servlet/internal/SubscriptionProtocolFactory.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
package graphql.servlet.internal;
22

3+
import graphql.servlet.GraphQLInvocationInputFactory;
4+
import graphql.servlet.GraphQLObjectMapper;
5+
import graphql.servlet.GraphQLQueryInvoker;
6+
37
/**
48
* @author Andrew Potter
59
*/
@@ -14,5 +18,5 @@ public String getProtocol() {
1418
return protocol;
1519
}
1620

17-
public abstract SubscriptionProtocolHandler createHandler();
21+
public abstract SubscriptionProtocolHandler createHandler(GraphQLInvocationInputFactory invocationInputFactory, GraphQLQueryInvoker queryInvoker, GraphQLObjectMapper graphQLObjectMapper);
1822
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package graphql.servlet.internal;
22

3+
import javax.websocket.Session;
34
import javax.websocket.server.HandshakeRequest;
4-
import java.util.function.Function;
55

66
/**
77
* @author Andrew Potter
88
*/
99
public interface SubscriptionProtocolHandler {
10-
void onMessage(HandshakeRequest request, String text, Function query);
10+
void onMessage(HandshakeRequest request, Session session, String text) throws Exception;
1111
}

0 commit comments

Comments
 (0)