package Ġcom . arian e graphql . server Ċ Ċ import Ġcom . arian e graphql . k tx . to GraphQL Response Ċ import Ġcom . arian e graphql . server . async .* Ċ import Ġcom . arian e graphql . server . context . Context Resolver Ċ import Ġcom . arian e graphql . server . extensions . to GraphQL Response Ċ import Ġcom . arian e graphql . server . graphql .* Ċ import Ġcom . arian e graphql . server . json . Json Serializer Ċ import Ġcom . arian e graphql . server . listener . RequestListener Ċ import Ġcom . arian e graphql . server . listener . Subscription Listener Ċ import Ġcom . arian e graphql . server . playground .* Ċ import Ġcom . arian e graphql . server . request .* Ċ import Ġcom . arian e graphql . server . response . HttpResponse Ċ import Ġgraphql . GraphQL Ċ import Ġkotlinx . coroutines . flow .* Ċ Ċ class ĠA ri ane Server Impl ( ĊĠĠĠ Ġprivate Ġval Ġschema : ĠGraphQL , ĊĠĠĠ Ġprivate Ġval Ġis Play ground Enabled : ĠBoolean , ĊĠĠĠ Ġprivate Ġval Ġcontext Resolver : ĠContext Resolver <* >, ĊĠĠĠ Ġprivate Ġval Ġrequest Listener : ĠRequest Listener ?, ĊĠĠĠ Ġprivate Ġval Ġsubscription Listener : ĠSubscription Listener ?, ĊĠĠĠ Ġjson Serializer : ĠJsonSerializer , ĊĠĠĠ Ġplay ground Renderer : ĠPlay ground Renderer Ġ= ĠPlay ground Renderer Impl (), ĊĠĠĠ Ġrequest Perform er : ĠRequest Perform er Ġ= ĠRequest Perform er Impl ( schema ), ĊĠĠĠ Ġsubscription Handler : ĠSubscription Handler Ġ= ĠSubscription Handler Impl ( json Serializer , Ġrequest Perform er , Ġrequest Listener , Ġsubscription Listener ) Ċ ) Ġ: ĠA ri ane Server , ĠPlay ground Renderer Ġby Ġplay ground Renderer , ĠJsonSerializer Ġby Ġjson Serializer , ĠRequest Perform er Ġby Ġrequest Perform er , ĊĠĠĠ ĠSubscription Handler Ġby Ġsubscription Handler Ġ{ ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġhandle HttpRequest ( httpRequest : ĠHttpRequest , Ġon Response : Ġsuspend Ġ( HttpResponse ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequest Listener ?. on Received ( httpRequest ) ĊĠĠĠĠĠĠĠ Ġif Ġ( is Play ground Enabled Ġ&& Ġis Play ground Request ( httpRequest )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Response ( render Explorer ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġgraph QL Request Ġ= Ġparse Request ( httpRequest . body ) ĊĊĠĠĠĠĠĠĠ Ġrequest Listener ?. on Parsed ( graph QL Request ) ĊĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġperform Request ( graph QL Request , Ġcontext Resolver . resolve Context ( httpRequest ), Ġrequest Listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġexecution Result Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġexecution Result . to GraphQL Response () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Listener ?. on Executed ( response ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. getOrElse Ġ{ Ġerror Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġerror . to GraphQL Response () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Listener ?. onError ( error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ ĠHttpResponse ( serialize Response ( it ), ĠCONTENT _ TYPE ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġon Response ( response ) ĊĠĠĠĠĠĠĠ Ġrequest Listener ?. on Resp on ded () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġhandle WebSocket Message ( ws Request : ĠWebSocket Request ): ĠFlow < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġws Payload Ġ= Ġparse WebSocket Payload ( ws Request . body ) Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġflow Of ( serialize WebSocket Payload ( connection Error )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġws Payload . is Connection Init Ġ-> Ġinit Subscription ( ws Request , Ġcontext Resolver ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġws Payload . is Start Ġ-> Ġstart Subscription ( ws Request , Ġws Payload ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġws Payload . is Stop Ġ-> Ġstop Subscription ( ws Request , Ġws Payload ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġws Payload . is Connection Terminate Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Subscription ( ws Request . sessionId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty Flow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġflow Of ( serialize WebSocket Payload ( connection Error )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. getOrElse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflow Of ( serialize WebSocket Payload ( connection Error )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġhandle Closed WebSocket ( sessionId : ĠString ) Ġ= Ġend Subscription ( sessionId ) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCONTENT _ TYPE Ġ= Ġ" application / json " ĊĠĠĠ Ġ} Ċ }