package Ġcom . ap ol log raph ql . apollo . subscription Ċ Ċ import Ġokhttp 3 . Request Ċ import Ġokhttp 3 . Response Ċ import Ġokhttp 3 . WebSocket Ċ import Ġok io . Buffer Ċ import Ġjava . lang . ref . Weak Reference Ċ import Ġjava . util . concurrent . atomic . Atomic Reference Ċ Ċ /** Ċ Ġ* Ġ[ Subscription Transport ] Ġimplementation Ġbased Ġon Ġ[ WebSocket ]. Ċ Ġ*/ Ċ class ĠWebSocket Subscription Transport Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġweb Socket Request : ĠRequest , ĊĠĠĠ Ġprivate Ġval Ġweb Socket ConnectionFactory : ĠWebSocket . Factory , ĊĠĠĠ Ġprivate Ġval Ġcallback : ĠSubscription Transport . Callback , ĊĠĠĠ Ġprivate Ġval Ġserializer : ĠOperation Message Serializer Ġ= ĠApollo Operation Message Serializer Ċ ) Ġ: ĠSubscription Transport Ġ{ ĊĠ Ġinternal Ġval Ġweb Socket Ġ= ĠAtomic Reference < WebSocket >() ĊĠ Ġinternal Ġval Ġweb Socket Listener Ġ= ĠAtomic Reference < WebSocket Listener >() ĊĊĠ Ġoverride Ġfun Ġconnect () Ġ{ ĊĠĠĠ Ġval Ġweb Socket Listener Ġ= ĠWebSocket Listener ( this ) ĊĠĠĠ Ġcheck ( this . web Socket Listener . compare AndSet ( null , Ġweb Socket Listener )) Ġ{ ĊĠĠĠĠĠ Ġ" Already Ġconnected " ĊĠĠĠ Ġ} ĊĠĠĠ Ġweb Socket . set ( web Socket ConnectionFactory . new WebSocket ( web Socket Request , Ġweb Socket Listener )) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġdisconnect ( message : ĠOperation Client Message ) Ġ{ ĊĠĠĠ Ġweb Socket . get AndSet ( null ) ĊĠĠĠĠĠĠĠ Ġ? . close ( 1 0 0 1 , Ġmessage . serialize ToJson ()) ĊĠĠĠ Ġrelease () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġsend ( message : ĠOperation Client Message ) Ġ{ ĊĠĠĠ Ġval Ġsocket Ġ= Ġweb Socket . get () Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠ Ġcallback . on Failure ( IllegalStateException (" Send Ġattempted Ġon Ġclosed Ġconnection ")) ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġsocket . send ( message . serialize ToJson ()) ĊĠ Ġ} ĊĊĠ Ġinternal Ġfun Ġon Open () Ġ{ ĊĠĠĠ Ġcallback . on Connected () ĊĠ Ġ} ĊĊĠ Ġinternal Ġfun Ġon Message ( message : ĠOperation Server Message ?) Ġ{ ĊĠĠĠ Ġcallback . on Message ( message ) ĊĠ Ġ} ĊĊĠ Ġinternal Ġfun Ġon Failure ( t : ĠThrowable ?) Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġcallback . on Failure ( t ) ĊĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠ Ġrelease () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġinternal Ġfun Ġon Closed () Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġcallback . on Closed () ĊĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠ Ġrelease () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġrelease () Ġ{ ĊĠĠĠ Ġweb Socket Listener . get AndSet ( null )?. release () ĊĠĠĠ Ġweb Socket . set ( null ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠOperation Client Message . serialize ToJson (): ĠString Ġ{ ĊĠĠĠ Ġval Ġbuffer Ġ= ĠBuffer () ĊĠĠĠ Ġserializer . write Client Message ( this , Ġbuffer ) ĊĠĠĠ Ġreturn Ġbuffer . read Utf 8 () ĊĠ Ġ} ĊĊĠ Ġinternal Ġclass ĠWebSocket Listener ( delegate : ĠWebSocket Subscription Transport ) Ġ: Ġokhttp 3 . WebSocket Listener () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġdelegate Ref Ġ= ĠWeak Reference ( delegate ) ĊĊĠĠĠ Ġoverride Ġfun Ġon Open ( web Socket : ĠWebSocket , Ġresponse : ĠResponse ) Ġ{ ĊĠĠĠĠĠ Ġdelegate Ref . get ()?. on Open () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Message ( web Socket : ĠWebSocket , Ġtext : ĠString ) Ġ{ ĊĠĠĠĠĠ Ġval Ġdelegate Ġ= Ġdelegate Ref . get () Ġ?: Ġreturn ĊĠĠĠĠĠ Ġdelegate . on Message ( delegate . serializer . read Server Message ( Buffer (). write Utf 8 ( text ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Failure ( web Socket : ĠWebSocket , Ġt : ĠThrowable , Ġresponse : ĠResponse ?) Ġ{ ĊĠĠĠĠĠ Ġdelegate Ref . get ()?. on Failure ( t ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Closing ( web Socket : ĠWebSocket , Ġcode : ĠInt , Ġreason : ĠString ) Ġ{ ĊĠĠĠĠĠ Ġdelegate Ref . get ()?. on Closed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Closed ( web Socket : ĠWebSocket , Ġcode : ĠInt , Ġreason : ĠString ) Ġ{ ĊĠĠĠĠĠ Ġdelegate Ref . get ()?. on Closed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrelease () Ġ{ ĊĠĠĠĠĠ Ġdelegate Ref . clear () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġ@ param Ġweb Socket Url ĠThe ĠURL Ġof Ġthe ĠGraphQL ĠWeb ĠSocket ĠAPI . ĊĠĠ Ġ* Ġ@ param Ġweb Socket ConnectionFactory ĠThe Ġ[ WebSocket . Factory ] Ġto Ġuse Ġto Ġcreate Ġthe Ġwebsocket s . ĊĠĠ Ġ* Ġ@ param Ġserializer ĠA Ġ[ Operation Message Serializer ] Ġthat Ġwill Ġbe Ġused Ġto Ġread Ġand Ġwrite Ġmessages . ĊĠĠ Ġ*/ ĊĠ Ġclass ĠFactory Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠĠĠ Ġweb Socket Url : ĠString , ĊĠĠĠĠĠ Ġprivate Ġval Ġweb Socket ConnectionFactory : ĠWebSocket . Factory , ĊĠĠĠĠĠ Ġprivate Ġval Ġserializer : ĠOperation Message Serializer Ġ= ĠApollo Operation Message Serializer ĊĠ Ġ) Ġ: ĠSubscription Transport . Factory Ġ{ ĊĠĠĠ Ġprivate Ġval Ġweb Socket Request : ĠRequest Ġ= ĠRequest . Builder () ĊĠĠĠĠĠĠĠ Ġ. url ( web Socket Url ) ĊĠĠĠĠĠĠĠ Ġ. add Header (" Sec - WebSocket - Protocol ", Ġ" graphql - ws ") ĊĠĠĠĠĠĠĠ Ġ. add Header (" Cookie ", Ġ"") ĊĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠ Ġoverride Ġfun Ġcreate ( callback : ĠSubscription Transport . Callback ): ĠSubscription Transport Ġ= ĊĠĠĠĠĠĠĠ ĠWebSocket Subscription Transport ( web Socket Request , Ġweb Socket ConnectionFactory , Ġcallback , Ġserializer ) ĊĠ Ġ} Ċ }