package Ġnet . just m achinery . shade Ċ Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . html .* Ċ import Ġmu . K Logging Ċ import Ġnet . just m achinery . shade . component .* Ċ import Ġnet . just m achinery . shade . render . shade ToString Ċ import Ġnet . just m achinery . shade . render . shade To Writer Ċ import Ġnet . just m achinery . shade . utility .* Ċ import Ġjava . io . Writer Ċ import Ġjava . time . Duration Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . Concurrent HashMap Ċ import Ġkotlin . coroutines . Coroutine Context Ċ import Ġkotlin . reflect . K Class Ċ import Ġkotlin . reflect . full . is Subclass Of Ċ Ċ /** Ċ Ġ* ĠConfiguration Ġobject . Ċ Ġ*/ Ċ class ĠSh ade Root ( ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWeb socket ĠURL Ġat Ġwhich Ġthe Ġsh ade Ġendpoint Ġwill Ġbe Ġaccessible ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġendpoint Ġ: ĠString , ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHost Ġto Ġuse Ġfor Ġwebsocket ĠURL ; Ġuse Ġsame Ġhost Ġas Ġpage Ġdelivered Ġover Ġif Ġnull ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġhost Ġ: ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġis Ġcalled Ġafter Ġa Ġcomponent Ġis Ġconstructed , Ġand Ġcould Ġbe Ġused Ġto Ġe . g . Ġinject Ġdependencies . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġafter Construct Component Ġ: Ġ( Advanced Component < *, Ġ*> )-> Unit Ġ= Ġ{}, ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġwhenever Ġan Ġexception Ġis Ġthrown Ġin Ġa Ġclient 's ĠJS Ġpage Ġthat Ġcannot Ġbe Ġmapped Ġto Ġor Ġis Ġnot Ġhandled Ġby Ġan Ġ[ ErrorHandler ] Ġin Ġa Ġ[ Shade Context ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġon Un caught Javascript Exception Ġ: Ġ( Client , ĠJavascript Exception )-> Unit Ġ= Ġ{ Ġclient , Ġerr Ġ-> ĊĠĠĠĠĠĠĠ Ġlogger . error ( err ){ Ġ" Un caught ĠJS Ġexception Ġfor Ġclient Ġ${ client . clientId }" Ġ} ĊĠĠĠ Ġ}, ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFor Ġtesting Ġpurposes . ĊĠĠĠĠ Ġ* ĠAn Ġextra Ġdelay Ġto Ġadd Ġbefore Ġpassing Ġreceiving Ġor Ġsending Ġany Ġmessages Ġto Ġthe Ġclient , Ġto Ġsimulate Ġpoor Ġconnections . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġsimulate Extra Delay Ġ: ĠDuration ? Ġ= Ġnull , ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBase Ġcontext Ġused Ġto Ġlaunch Ġall Ġcor outines Ġby Ġdefault . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġcontext Ġ: ĠCor outine Context Ġ= ĠDispatch ers . Default , ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMaximum Ġacceptable Ġdelay Ġbetween Ġa Ġclient Ġloading Ġa Ġpage Ġand Ġconnecting Ġback Ġvia Ġwebsocket Ġbefore Ġits Ġdata Ġis Ġremoved ĊĠĠĠĠ Ġ* Ġ( and Ġit Ġhas Ġto Ġreload Ġthe Ġpage Ġif Ġit Ġwants Ġto Ġadd Ġinter activity ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġmaximum Accept able Connection Delay Ġ: ĠDuration Ġ= ĠDuration . of Seconds ( 3 0 ), ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFor Ġadding Ġthe ĠSh ade Ġclient Ġscript , Ġit Ġcan Ġbe Ġeither Ġadded Ġas Ġan Ġinline Ġscript Ġat Ġfirst Ġrender Ġor Ġas Ġa Ġscript Ġwith Ġa Ġgiven Ġpath . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġadd Script Strategy : ĠAdd Script Strategy Ġ= ĠAdd Script Strategy . Inline ( production Ġ= Ġtrue ) Ċ ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ: ĠK Logging () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsh ade Dev Script Ġby Ġlazy Ġ{ ĠClassLoader . getSystem ClassLoader (). getResource (" js / shade - bundle . js ") !!. read Text () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġsh ade Prod Script Ġby Ġlazy Ġ{ ĠClassLoader . getSystem ClassLoader (). getResource (" js / shade - bundle - min . js ") !!. read Text () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġ< T Ġ: ĠAny , ĠRender In Ġ: ĠTag > Ġconstruct Component ( clazz Ġ: ĠK Class < out ĠAdvanced Component < T , ĠRender In >>, Ġprops Ġ: ĠComponent Init Data < T >) Ġ: ĠAdvanced Component < T , ĠRender In > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcomponent Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclazz Ġ== ĠFunction Component :: class Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomponent Pass Props . with Value ( props ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFunction Component < Render In >() Ġas ĠAdvanced Component < T , ĠRender In > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclazz . is Subclass Of ( Component :: class ) Ġ|| Ġclazz . is Subclass Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠComponent In Tag :: class ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomponent Pass Props . with Value ( props ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclazz . java . getDeclared Constructor (). also Ġ{ Ġit . is Accessible Ġ= Ġtrue Ġ}. newInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclazz . java . getDeclared Constructor ( Component Init Data :: class . java ). also Ġ{ Ġit . is Accessible Ġ= Ġtrue Ġ}. newInstance ( props ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} !! ĊĠĠĠĠĠĠĠ Ġcomponent . initialize Props ( props . props ) ĊĠĠĠĠĠĠĠ Ġafter Construct Component ( component ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcomponent ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInstall s Ġthe ĠSh ade Ġframework Ġand Ġbegins Ġrendering Ġwithin Ġcb (), Ġreturning Ġoutput Ġas Ġa ĠString ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġrender ( cb Ġ: Ġ( Shade Root Render . ()-> Unit )) Ġ: ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconsumer Ġ= Ġsh ade ToString () ĊĠĠĠĠĠĠĠ Ġreturn Ġrender Impl ( consumer , Ġcb ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAs Ġ[ render ] Ġbut Ġwrites Ġoutput Ġto Ġ[ writer ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġrender ( writer : ĠWriter , Ġcb Ġ: Ġ( Shade Root Render . ()-> Unit )) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconsumer Ġ= Ġsh ade To Writer ( writer ) ĊĠĠĠĠĠĠĠ Ġreturn Ġrender Impl ( consumer , Ġcb ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< T > Ġrender Impl ( consumer : ĠTag Consumer < T >, Ġcb Ġ: Ġ( Shade Root Render . ()-> Unit )) Ġ: ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġconsumer . on Tag Content Unsafe Ġ{ Ġ+" <! doctype Ġhtml >" Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġconsumer . html Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclient Ġ= Ġcreate Client () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrender Component As Root ( client , Ġthis , Ġcb . eq L ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrender Component As Root ( ĊĠĠĠĠĠĠĠ Ġclient Ġ: ĠClient , ĊĠĠĠĠĠĠĠ Ġbuilder Ġ: ĠHTML , ĊĠĠĠĠĠĠĠ Ġcb Ġ: ĠEq Lambda < Shade Root Render . ()-> Unit > ĊĠĠĠ Ġ){ ĊĠĠĠĠĠĠĠ Ġval Ġprop Obj Ġ= ĠComponent Init Data ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient Ġ= Ġclient , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprops Ġ= Ġcb , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrender In Ġ= Ġbuilder :: class , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtree Depth Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ġ= ĠSh ade Context . empty ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġcomponent Ġ= Ġconstruct Component ( Shade Root Component :: class , Ġprop Obj ) Ġas ĠSh ade Root Component ĊĠĠĠĠĠĠĠ Ġclient . render Root ( builder , Ġcomponent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠJust Ġcreates Ġa Ġnew Ġclient . ĊĠĠĠĠ Ġ* ĠYou Ġprobably Ġdon 't Ġwant Ġto Ġuse Ġthis Ġdirectly . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcreate Client () Ġ: ĠClient Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= ĠUUID . randomUUID () ĊĊĠĠĠĠĠĠĠ Ġval Ġclient Ġ= ĠClient ( id , Ġthis ) ĊĊĠĠĠĠĠĠĠ Ġclient . coroutine Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( maximum Accept able Connection Delay . to Millis ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif (! client . connected ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġclient DataMap . remove ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata ?. cleanup () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclient DataMap [ id ] Ġ= Ġclient ĊĠĠĠĠĠĠĠ Ġwith Logging Info (" shade ClientId " Ġto Ġid . toString ()){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Created Ġnew Ġclient Ġid " Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġclient ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġa Ġhandler . ĊĠĠĠĠ Ġ* Ġ[ send ] Ġshould Ġsend Ġdata Ġto Ġthe Ġclient Ġover Ġwebsocket , Ġand Ġ[ disconnect ] Ġshould Ġbe Ġcalled Ġwhen Ġthe Ġclient Ġdisconnect s ĊĠĠĠĠ Ġ* ĠYou Ġshould Ġtake Ġcare Ġof Ġcalling Ġ[ MessageHandler . on Message ] Ġand Ġ[ MessageHandler . on Disconnect ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġhandler ( send Ġ: Ġ( String )-> Unit , Ġdisconnect Ġ: Ġ() -> Unit ) Ġ= ĠMessage Handler ( send , Ġdisconnect ) ĊĊĠĠĠ Ġprivate Ġval Ġclient DataMap Ġ= ĠConcurrent HashMap < UUID , ĠClient >() ĊĠĠĠ Ġfun Ġall Clients () Ġ: ĠCollection < Client > Ġ= Ġclient DataMap . values ĊĊĠĠĠ Ġinner Ġclass ĠMessage Handler Ġinternal Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġsend Ġ: Ġ( String )-> Unit , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdisconnect Ġ: Ġ() -> Unit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar ĠclientId Ġ: ĠUUID ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġclient Data Ġ: ĠClient ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun ĠsendMessage ( error Tag Ġ: ĠString ?, Ġmessage Ġ: ĠString ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( simulate Extra Delay Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend ("${ error Tag Ġ?: Ġ"" }| $ message ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGlobal Scope . launch ( context ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( simulate Extra Delay !!. to Millis ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend ("${ error Tag Ġ?: Ġ"" }| $ message ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThis Ġshould Ġbe Ġcalled Ġby Ġyour Ġweb Ġframework Ġwhen Ġa Ġwebsocket Ġreceives Ġa Ġmessage . ĊĠĠĠĠĠĠĠĠ Ġ* ĠIde ally , Ġthe Ġweb Ġframework Ġshould Ġprocess Ġthese Ġmessages Ġse quent ially Ġfor Ġa Ġgiven Ġwebsocket . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġon Message ( message Ġ: ĠString ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( message . isEmpty ()) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( simulate Extra Delay Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Message ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGlobal Scope . launch ( context ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( simulate Extra Delay !!. to Millis ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Message ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġprocess Message ( message Ġ: ĠString ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( this ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Logging Info (" shade ClientId " Ġto ĠclientId . toString ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ Ġ" Message Ġreceived : Ġ${ message . el lip size After ( 2 0 0 )}" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( client Data Ġ== Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠclientId Ġ= ĠUUID . fromString ( message ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch ( t Ġ: ĠIllegalArgumentException ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Not Ġa ĠUUID : Ġ${ message . el lip size After ( 2 0 0 )}" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisconnect () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient Data Ġ= Ġclient DataMap [ clientId ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( client Data Ġ== Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Client ĠID Ġexpired Ġor Ġinvalid : Ġ$ clientId " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsendMessage ( null , Ġ" window . location . reload ( true )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisconnect () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient Data !!. set Handler ( this @ MessageHandler ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( tag , Ġdata ) Ġ= Ġmessage . split (' |', Ġlimit Ġ= Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Ġby Ġlazy Ġ{ ĠJavascript Exception ( gson . fromJson ( data , ĠJavascript Exception Details :: class . java )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( tag Ġ== Ġ" E "){ Ġ// Global Ġcaught Ġerror ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ Ġon Un caught Javascript Exception ( client Data !! , Ġerror ) Ġ} Ġcatch ( t Ġ: ĠThrowable ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ( t ) Ġ{ Ġ" While Ġhandling Ġun caught Ġglobal ĠJavaScript Ġerror " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ġ// Attached Ġto Ġa Ġcallback ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Error Ġ= Ġtag . startsWith (' E ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcallback Id Ġ= Ġtag . drop While Ġ{ Ġit Ġ== Ġ' E ' Ġ}. to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( isError ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient Data !!. on Callback Js Error ( callback Id , Ġerror ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient Data !!. call Callback ( callback Id , Ġdata . if Blank Ġ{ Ġnull Ġ} ?. let Ġ{ ĠJson ( it ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġon Disconnect (){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( this ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Logging Info (" shade ClientId " Ġto ĠclientId . toString ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Client Ġdisconnected " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠclientId ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġclient DataMap . remove ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata ?. cleanup () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ sealed Ġclass ĠAdd Script Strategy Ġ{ ĊĠĠĠ Ġdata Ġclass ĠInline ( val Ġproduction Ġ: ĠBoolean ) Ġ: ĠAdd Script Strategy () ĊĠĠĠ Ġdata Ġclass ĠAt Path ( val Ġpath Ġ: ĠString ) Ġ: ĠAdd Script Strategy () Ċ } Ċ Ċ interface ĠSh ade Root Render Ġ{ ĊĠĠĠ Ġfun Ġhead ( cb Ġ: ĠSh ade Root Component .( HEAD )-> Unit ) ĊĠĠĠ Ġfun Ġbody ( cb Ġ: ĠSh ade Root Component .( BODY )-> Unit ) Ċ } Ċ Ċ class ĠSh ade Root Component Ġ: ĠComponent In Tag < Eq Lambda < Shade Root Render . () Ġ-> ĠUnit >, ĠHTML >(), ĠSh ade Root Render Ġ{ ĊĠĠĠ Ġprivate Ġclass ĠRendering Data Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhead C bs Ġ= ĠArrayList < Shade Root Component .( HEAD )-> Unit >( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġbody C bs Ġ= ĠArrayList < Shade Root Component .( BODY )-> Unit >( 1 ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġvar Ġrendering Ġ: ĠRendering Data ? Ġ= Ġnull ĊĠĠĠ Ġoverride Ġfun ĠHTML . render () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrender Ġ= ĠRendering Data () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrendering Ġ= Ġrender ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprops . raw ( this @ Shade Root Component ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhead Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeta ( charset Ġ= Ġ" UTF - 8 ") Ġ{ Ġ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Shade Script () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrender . head C bs . forEach Ġ{ Ġit ( this ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrender . body C bs . forEach Ġ{ Ġit ( this ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrendering Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠHEAD . add Shade Script (){ ĊĠĠĠĠĠĠĠ Ġscript Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunsafe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// language = JavaScript Ġ 1 . 8 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġraw ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwindow . shade Endpoint Ġ= Ġ"${ client . root . endpoint }"; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwindow . shade Host Ġ= Ġ${ if Ġ( client . root . host Ġ!= Ġnull ) Ġ"\" ${ client . root . host }\ "" Ġelse Ġ" null "}; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwindow . shade Id Ġ= Ġ"${ client . clientId }"; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwhen ( val Ġstrat Ġ= Ġclient . root . add Script Strategy ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAdd Script Strategy . Inline Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscript Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasync Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunsafe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġraw ( if ( strat . production ) ĠSh ade Root . shade Prod Script Ġelse ĠSh ade Root . shade Dev Script ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAdd Script Strategy . At Path Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscript ( src Ġ= Ġstrat . path ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasync Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġhead ( cb Ġ: ĠSh ade Root Component .( HEAD )-> Unit ){ ĊĠĠĠĠĠĠĠ Ġrendering !!. head C bs . add ( cb ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġbody ( cb Ġ: ĠSh ade Root Component .( BODY )-> Unit ){ ĊĠĠĠĠĠĠĠ Ġrendering !!. body C bs . add ( cb ) ĊĠĠĠ Ġ} Ċ }