/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠNet flix , ĠInc . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . netflix . graphql . d gs . web flux . handlers Ċ Ċ import Ġcom . fasterxml . jackson . annotation . JsonProperty Ċ import Ġcom . fasterxml . jackson . module . kotlin . convert Value Ċ import Ġcom . netflix . graphql . d gs . reactive . D gs Reactive Query Executor Ċ import Ġorg . reactiv est ream s . Publisher Ċ import Ġorg . reactiv est ream s . Subscription Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . springframework . core . Res olvable Type Ċ import Ġorg . springframework . core . io . buffer . Data Buffer Ċ import Ġorg . springframework . core . io . buffer . Data Buffer Utils Ċ import Ġorg . springframework . http . codec . json . Jack son 2 Json Decoder Ċ import Ġorg . springframework . http . codec . json . Jack son 2 Json Encoder Ċ import Ġorg . springframework . util . MimeType Utils Ċ import Ġorg . springframework . web . reactive . socket . WebSocket Handler Ċ import Ġorg . springframework . web . reactive . socket . WebSocket Message Ċ import Ġorg . springframework . web . reactive . socket . WebSocket Session Ċ import Ġreactor . core . publisher . Flux Ċ import Ġreactor . core . publisher . Mono Ċ import Ġjava . util . concurrent . Concurrent HashMap Ċ Ċ class ĠD gs Reactive Websocket Handler ( private Ġval Ġd gs Reactive Query Executor : ĠD gs Reactive Query Executor ) Ġ: ĠWebSocket Handler Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġresol vable Type Ġ= ĠRes olvable Type . for Type ( Operation Message :: class . java ) ĊĠĠĠ Ġprivate Ġval Ġsubscriptions Ġ= ĠConcurrent HashMap < String , ĠMutable Map < String , ĠSubscription >>() ĊĠĠĠ Ġprivate Ġval Ġdecoder Ġ= ĠJack son 2 Json Decoder () ĊĠĠĠ Ġprivate Ġval Ġencoder Ġ= ĠJack son 2 Json Encoder ( decoder . object Mapper ) ĊĊĠĠĠ Ġoverride Ġfun Ġget Sub Protocols (): ĠList < String > Ġ= ĠlistOf (" graphql - ws ") ĊĊĠĠĠ Ġoverride Ġfun Ġhandle ( web Socket Session : ĠWebSocket Session ): ĠMono < Void > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġweb Socket Session . send ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġweb Socket Session . receive () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġmessage Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer : ĠData Buffer Ġ= ĠData Buffer Utils . retain ( message . payload ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoperation Message : ĠOperation Message Ġ= Ġdecoder . decode ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresol vable Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMime Type Utils . APPLICATION _ JSON , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġas ĠOperation Message ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( operation Message . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG QL _ CONNECTION _ INIT Ġ-> ĠFlux . just ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Websocket Message ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOperation Message ( G QL _ CONNECTION _ ACK ), Ġweb Socket Session ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG QL _ START Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquery Payload Ġ= Ġdecoder . object Mapper . convert Value < Query Payload >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoperation Message . payload Ġ?: Ġerror (" payload Ġ== Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug (" Starting Ġsubscription Ġ{} Ġfor Ġsession Ġ{}", Ġquery Payload , Ġweb Socket Session . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd gs Reactive Query Executor . execute ( query Payload . query , Ġquery Payload . variables ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Many Ġ{ Ġexecution Result Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpublisher : ĠPublisher < Any > Ġ= Ġexecution Result . getData () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFlux . from ( publisher ). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Websocket Message ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOperation Message ( G QL _ DATA , Ġit , Ġoperation Message . id ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweb Socket Session ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. do On Subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( operation Message . id Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubscriptions [ web Socket Session . id ] Ġ= Ġmutable Map Of ( operation Message . id Ġto Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. do On Complete Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweb Socket Session . send ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFlux . just ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Websocket Message ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOperation Message ( G QL _ COMPLETE , Ġnull , Ġoperation Message . id ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweb Socket Session ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). subscribe () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubscriptions [ web Socket Session . id ]?. remove ( operation Message . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Comp leting Ġsubscription Ġ{} Ġfor Ġconnection Ġ{}", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoperation Message . id , Ġweb Socket Session . id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. do OnError Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweb Socket Session . send ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFlux . just ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Websocket Message ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOperation Message ( G QL _ ERROR , ĠData Payload ( null , ĠlistOf ( it . message !! )), Ġoperation Message . id ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweb Socket Session ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). subscribe () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubscriptions [ web Socket Session . id ]?. remove ( operation Message . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Subscription Ġpublisher Ġerror Ġfor Ġinput Ġ{} Ġfor Ġsubscription Ġ{} Ġfor Ġconnection Ġ{}", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery Payload , Ġoperation Message . id , Ġweb Socket Session . id , Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG QL _ STOP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubscriptions [ web Socket Session . id ]?. remove ( operation Message . id )?. cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Client Ġstopped Ġsubscription Ġ{} Ġfor Ġconnection Ġ{}", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoperation Message . id , Ġweb Socket Session . id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFlux . empty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG QL _ CONNECTION _ TERMIN ATE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubscriptions [ web Socket Session . id ]?. values ?. forEach Ġ{ Ġit . cancel () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubscriptions . remove ( web Socket Session . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweb Socket Session . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug (" Connection Ġ{} Ġterminated ", Ġweb Socket Session . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFlux . empty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠFlux . empty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġto Websocket Message ( operation Message : ĠOperation Message , Ġsession : ĠWebSocket Session ): ĠWebSocket Message Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠWebSocket Message ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWebSocket Message . Type . TEXT , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġencoder . encode Value ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoperation Message , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession . buffer Factory (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresol vable Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMime Type Utils . APPLICATION _ JSON , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( D gs Reactive Query Executor :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠG QL _ CONNECTION _ INIT Ġ= Ġ" connection _ init " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠG QL _ CONNECTION _ ACK Ġ= Ġ" connection _ ack " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠG QL _ START Ġ= Ġ" start " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠG QL _ STOP Ġ= Ġ" stop " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠG QL _ DATA Ġ= Ġ" data " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠG QL _ ERROR Ġ= Ġ" error " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠG QL _ COMPLETE Ġ= Ġ" complete " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠG QL _ CONNECTION _ TERMIN ATE Ġ= Ġ" connection _ terminate " ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠData Payload ( val Ġdata : ĠAny ?, Ġval Ġerrors : ĠList < Any >? Ġ= Ġempty List ()) Ċ data Ġclass ĠOperation Message ( ĊĠĠĠ Ġ@ JsonProperty (" type ") Ġval Ġtype : ĠString , ĊĠĠĠ Ġ@ JsonProperty (" payload ") Ġval Ġpayload : ĠAny ? Ġ= Ġnull , ĊĠĠĠ Ġ@ JsonProperty (" id ", Ġrequired Ġ= Ġfalse ) Ġval Ġid : ĠString ? Ġ= Ġ"" Ċ ) Ċ Ċ data Ġclass ĠQuery Payload ( ĊĠĠĠ Ġ@ JsonProperty (" variables ") Ġval Ġvariables : ĠMap < String , ĠAny > Ġ= Ġempty Map (), ĊĠĠĠ Ġ@ JsonProperty (" extensions ") Ġval Ġextensions : ĠMap < String , ĠAny > Ġ= Ġempty Map (), ĊĠĠĠ Ġ@ JsonProperty (" operation Name ") Ġval Ġoperation Name : ĠString ?, ĊĠĠĠ Ġ@ JsonProperty (" query ") Ġval Ġquery : ĠString Ċ ) Ċ