11import asyncio
2- import json
32import logging
43import sys
54from 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
159from rsocket .routing .routing_request_handler import RoutingRequestHandler
1610from rsocket .rsocket_server import RSocketServer
17- from rsocket .streams .stream_from_async_generator import StreamFromAsyncGenerator
1811from 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
8236def handler_factory ():
83- return RoutingRequestHandler (GraphqlRequestHandler (). router )
37+ return RoutingRequestHandler (graphql_handler ( schema , 'graphql' ) )
8438
8539
8640async def run_server (server_port ):
0 commit comments