package Ġclient . common . data Ċ Ċ import Ġio . ktor . client . HttpClient Ċ import Ġio . ktor . client . call . HttpClient Call Ċ import Ġio . ktor . client . features . HttpClient Feature Ċ import Ġio . ktor . client . features . websocket . Client WebSocket Session Ċ import Ġio . ktor . client . features . websocket . Default Client WebSocket Session Ċ import Ġio . ktor . client . features . websocket . web Socket Ċ import Ġio . ktor . client . request . Client Upgrade Content Ċ import Ġio . ktor . client . request . HttpRequest Builder Ċ import Ġio . ktor . client . request . HttpRequest Pipeline Ċ import Ġio . ktor . client . statement . HttpResponse Container Ċ import Ġio . ktor . client . statement . HttpResponse Pipeline Ċ import Ġio . ktor . http .* Ċ import Ġio . ktor . http . c io . websocket . Default WebSocket Session Ċ import Ġio . ktor . http . c io . websocket . Frame Type Ċ import Ġio . ktor . http . c io . websocket . WebSocket Session Ċ import Ġio . ktor . http . websocket . websocket Server Accept Ċ import Ġio . ktor . util . Attribute Key Ċ import Ġio . ktor . util . Internal API Ċ import Ġio . ktor . util . encode Base 6 4 Ċ import Ġio . ktor . utils . io . core . build Packet Ċ import Ġio . ktor . utils . io . core . read Bytes Ċ import Ġio . ktor . utils . io . core . write Text Ċ Ċ /** Ċ Ġ* ĠClient ĠWebSocket Ġfeature . Ċ Ġ* Ċ Ġ* Ġ@ property Ġping Interval Ġ- Ġinterval Ġbetween Ġ[ Frame Type . PING ] Ġmessages . Ċ Ġ* Ġ@ property Ġmax Frame Size Ġ- Ġmax Ġsize Ġof Ġsingle Ġwebsocket Ġframe . Ċ Ġ*/ Ċ class ĠWebSocket s ( ĊĠĠĠ Ġval Ġping Interval : ĠLong Ġ= Ġ- 1 L , ĊĠĠĠ Ġval Ġmax Frame Size : ĠLong Ġ= ĠInt . MAX _ VALUE . to Long () Ċ ) Ġ{ ĊĠĠĠ Ġ@ Suppress (" K Doc Missing Documentation ") ĊĠĠĠ Ġcompanion Ġobject ĠFeature Ġ: ĠHttpClient Feature < Unit , ĠWebSocket s > Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġkey : ĠAttribute Key < WebSocket s > Ġ= ĠAttribute Key (" Websocket ") ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġprepare ( block : ĠUnit . () Ġ-> ĠUnit ): ĠWebSocket s Ġ= ĠWebSocket s () ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinstall ( feature : ĠWebSocket s , Ġscope : ĠHttpClient ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope . request Pipeline . intercept ( HttpRequest Pipeline . Render ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! context . url . protocol . is Websocket ()) Ġreturn @ intercept ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproceed With ( WebSocket Content ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope . response Pipeline . intercept ( HttpResponse Pipeline . Transform ) Ġ{ Ġ( info , Ġsession ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( session Ġ! is ĠWebSocket Session ) Ġreturn @ intercept ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( info . type Ġ== ĠDefault Client WebSocket Session :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclient Session : ĠDefault Client WebSocket Session Ġ= Ġwith ( feature ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDefault Client WebSocket Session ( context , Ġsession . as Default ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproceed With ( HttpResponse Container ( info , Ġclient Session )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ intercept ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= ĠHttpResponse Container ( info , ĠDeleg ating Client WebSocket Session ( context , Ġsession )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproceed With ( response ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠWebSocket Session . as Default (): ĠDefault WebSocket Session Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġis ĠDefault WebSocket Session ) Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġreturn ĠDefault WebSocket Session ( this , Ġping Interval , Ġmax Frame Size ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Suppress (" K Doc Missing Documentation ") Ċ class ĠWebSocket Exception ( message : ĠString ) Ġ: ĠIllegalStateException ( message ) Ċ Ċ class ĠDeleg ating Client WebSocket Session ( ĊĠĠĠ Ġoverride Ġval Ġcall : ĠHttpClient Call , Ġsession : ĠWebSocket Session Ċ ) Ġ: ĠClient WebSocket Session , ĠWebSocket Session Ġby Ġsession Ċ Ċ private Ġconst Ġval ĠWEB SOCKET _ VERSION Ġ= Ġ" 1 3 " Ċ private Ġconst Ġval ĠNON CE _ SIZE Ġ= Ġ 1 6 Ċ Ċ @ Use Experimental ( Internal API :: class ) Ċ class ĠWebSocket Content Ġ: ĠClient Upgrade Content () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġnonce : ĠString Ġ= Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnonce Ġ= Ġgenerate Nonce ( NON CE _ SIZE ) ĊĠĠĠĠĠĠĠ Ġappend ( nonce . encode Base 6 4 ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġheaders : ĠHeaders Ġ= ĠHeaders Builder (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġappend ( HttpHeaders . Upgrade , Ġ" websocket ") ĊĠĠĠĠĠĠĠ Ġappend ( HttpHeaders . Connection , Ġ" upgrade ") ĊĊĠĠĠĠĠĠĠ Ġappend ( HttpHeaders . Sec WebSocket Key , Ġnonce ) ĊĠĠĠĠĠĠĠ Ġappend ( HttpHeaders . Sec WebSocket Version , ĠWEB SOCKET _ VERSION ) ĊĠĠĠ Ġ}. build () ĊĊĠĠĠ Ġoverride Ġfun Ġverify ( headers : ĠHeaders ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġserver Accept Ġ= Ġheaders [ HttpHeaders . Sec WebSocket Accept ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġerror (" Server Ġshould Ġspecify Ġheader Ġ${ HttpHeaders . Sec WebSocket Accept }") ĊĊĠĠĠĠĠĠĠ Ġval Ġexpected Accept Ġ= Ġwebsocket Server Accept ( nonce ) ĊĠĠĠĠĠĠĠ Ġcheck ( expected Accept Ġ== Ġserver Accept ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Failed Ġto Ġverify Ġserver Ġaccept Ġheader . ĠExpected : Ġ$ expected Accept , Ġreceived : Ġ$ server Accept " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" WebSocket Content " Ċ } Ċ Ċ fun Ġgenerate Nonce ( size : ĠInt ): ĠByteArray Ġ= Ġbuild Packet Ġ{ ĊĠĠĠ Ġwhile Ġ( this . size Ġ< Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwrite Text ( generate Nonce ()) ĊĠĠĠ Ġ} Ċ }. read Bytes ( size ) Ċ Ċ expect Ġfun Ġgenerate Nonce (): ĠString Ċ Ċ suspend Ġfun ĠHttpClient . meme Socket ( ĊĠĠĠ Ġmethod : ĠHttpMethod Ġ= ĠHttpMethod . Get , Ġhost : ĠString Ġ= Ġ" localhost ", Ġport : ĠInt Ġ= ĠDEFAULT _ PORT , Ġpath : ĠString Ġ= Ġ"/", Ġprotocol : ĠURL Protocol , ĊĠĠĠ Ġrequest : ĠHttpRequest Builder . () Ġ-> ĠUnit Ġ= Ġ{}, Ġblock : Ġsuspend ĠDefault Client WebSocket Session . () Ġ-> ĠUnit Ċ ): ĠUnit Ġ= Ġweb Socket ( ĊĠĠĠ Ġmethod , Ġhost , Ġport , Ġpath , Ġrequest Ġ= Ġ{ ĊĠĠĠĠĠĠĠ Ġurl . protocol Ġ= Ġprotocol ĊĠĠĠĠĠĠĠ Ġurl . port Ġ= Ġport ĊĊĠĠĠĠĠĠĠ Ġrequest () ĊĠĠĠ Ġ}, Ġblock Ġ= Ġblock Ċ )