Skip to content

Commit 5ced391

Browse files
committed
factored out graphql server helper
1 parent 06df8e6 commit 5ced391

File tree

2 files changed

+56
-53
lines changed

2 files changed

+56
-53
lines changed

examples/graphql/server_graphql.py

Lines changed: 7 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,13 @@
11
import asyncio
2-
import json
32
import logging
43
import sys
54
from pathlib import Path
6-
from typing import AsyncGenerator, Tuple
75

8-
from graphql import build_schema, subscribe, parse
6+
from graphql import build_schema
97

10-
from rsocket.frame_helpers import str_to_bytes
11-
from rsocket.graphql.helpers import execute_query_in_payload, get_graphql_params
12-
from rsocket.helpers import create_future
13-
from rsocket.payload import Payload
14-
from rsocket.routing.request_router import RequestRouter
8+
from rsocket.graphql.server_helper import graphql_handler
159
from rsocket.routing.routing_request_handler import RoutingRequestHandler
1610
from rsocket.rsocket_server import RSocketServer
17-
from rsocket.streams.stream_from_async_generator import StreamFromAsyncGenerator
1811
from rsocket.transports.tcp import TransportTCP
1912

2013

@@ -33,54 +26,15 @@ async def results():
3326
return results()
3427

3528

36-
class GraphqlRequestHandler:
29+
with (Path(__file__).parent / 'rsocket.graphqls').open() as fd:
30+
schema = build_schema(fd.read())
3731

38-
def __init__(self):
39-
with (Path(__file__).parent / 'rsocket.graphqls').open() as fd:
40-
schema = build_schema(fd.read())
41-
42-
schema.query_type.fields['greeting'].resolve = greeting
43-
schema.subscription_type.fields['greetings'].subscribe = greetings
44-
45-
router = RequestRouter()
46-
47-
@router.response('graphql')
48-
async def graphql_query(payload: Payload):
49-
execution_result = await execute_query_in_payload(payload, schema)
50-
51-
response_data = str_to_bytes(json.dumps({
52-
'data': execution_result.data
53-
}))
54-
55-
return create_future(Payload(response_data))
56-
57-
@router.stream('graphql')
58-
async def graphql_subscription(payload: Payload):
59-
async def generator() -> AsyncGenerator[Tuple[Payload, bool], None]:
60-
data = json.loads(payload.data.decode('utf-8'))
61-
params = get_graphql_params(data, {})
62-
document = parse(params.query)
63-
64-
async for execution_result in await subscribe(
65-
schema,
66-
document,
67-
operation_name=params.operation_name
68-
):
69-
item = execution_result.data
70-
response_data = str_to_bytes(json.dumps({
71-
'data': item
72-
}))
73-
yield Payload(response_data), False
74-
75-
yield Payload(), True
76-
77-
return StreamFromAsyncGenerator(generator)
78-
79-
self.router = router
32+
schema.query_type.fields['greeting'].resolve = greeting
33+
schema.subscription_type.fields['greetings'].subscribe = greetings
8034

8135

8236
def handler_factory():
83-
return RoutingRequestHandler(GraphqlRequestHandler().router)
37+
return RoutingRequestHandler(graphql_handler(schema, 'graphql'))
8438

8539

8640
async def run_server(server_port):

rsocket/graphql/server_helper.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import json
2+
from typing import AsyncGenerator, Tuple
3+
4+
from graphql import subscribe, parse, GraphQLSchema
5+
6+
from rsocket.frame_helpers import str_to_bytes
7+
from rsocket.graphql.helpers import execute_query_in_payload, get_graphql_params
8+
from rsocket.helpers import create_future
9+
from rsocket.payload import Payload
10+
from rsocket.routing.request_router import RequestRouter
11+
from rsocket.streams.stream_from_async_generator import StreamFromAsyncGenerator
12+
13+
14+
def graphql_handler(schema: GraphQLSchema, route: str):
15+
router = RequestRouter()
16+
17+
@router.response(route)
18+
async def graphql_query(payload: Payload):
19+
execution_result = await execute_query_in_payload(payload, schema)
20+
21+
response_data = str_to_bytes(json.dumps({
22+
'data': execution_result.data
23+
}))
24+
25+
return create_future(Payload(response_data))
26+
27+
@router.stream(route)
28+
async def graphql_subscription(payload: Payload):
29+
async def generator() -> AsyncGenerator[Tuple[Payload, bool], None]:
30+
data = json.loads(payload.data.decode('utf-8'))
31+
params = get_graphql_params(data, {})
32+
document = parse(params.query)
33+
34+
async for execution_result in await subscribe(
35+
schema,
36+
document,
37+
operation_name=params.operation_name
38+
):
39+
item = execution_result.data
40+
response_data = str_to_bytes(json.dumps({
41+
'data': item
42+
}))
43+
yield Payload(response_data), False
44+
45+
yield Payload(), True
46+
47+
return StreamFromAsyncGenerator(generator)
48+
49+
return router

0 commit comments

Comments
 (0)