package Ġv ip . fre nd y Ċ Ċ import Ġfre emark er . cache . Class Template Loader Ċ import Ġfre emark er . cache . File Template Loader Ċ import Ġfre emark er . cache . Multi Template Loader Ċ import Ġkotlinx . coroutines . experimental . channels . consume Each Ċ import Ġorg . jetbrains . ktor . netty .* Ċ import Ġorg . jetbrains . ktor . routing .* Ċ import Ġorg . jetbrains . ktor . application .* Ċ import Ġorg . jetbrains . ktor . host .* Ċ import Ġorg . jetbrains . ktor . response .* Ċ import Ġorg . jetbrains . ktor . application . install Ċ import Ġorg . jetbrains . ktor . content . default Resource Ċ import Ġorg . jetbrains . ktor . content . resources Ċ import Ġorg . jetbrains . ktor . content . static Ċ import Ġorg . jetbrains . ktor . features . Call Logging Ċ import Ġorg . jetbrains . ktor . features . Default Headers Ċ import Ġorg . jetbrains . ktor . fre emark er . Free Marker Ċ import Ġorg . jetbrains . ktor . fre emark er . Free Marker Content Ċ import Ġorg . jetbrains . ktor . sessions .* Ċ import Ġorg . jetbrains . ktor . util . next Nonce Ċ import Ġorg . jetbrains . ktor . websocket .* Ċ import Ġv ip . fre nd y . chat . Chat Room Server Ċ import Ġv ip . fre nd y . chat . Chat Session Ċ import Ġjava . io . File Ċ import Ġjava . time . Duration ĊĊ Ċ private Ġval Ġm Chat Server Ġ= ĠChat Room Server () Ċ Ċ fun ĠApplication . module () Ġ{ ĊĠĠĠ Ġinstall ( Default Headers ) ĊĠĠĠ Ġinstall ( Call Logging ) ĊĠĠĠ Ġinstall ( Free Marker , Ġ{ ĊĠĠĠĠĠĠĠ Ġtemplate Loader Ġ= ĠMulti Template Loader ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile Template Loader ( File (" src / main / resources / templates / ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClass Template Loader ( Application :: class . java . class Loader , Ġ" templates ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ}) ĊĠĠĠ Ġinstall ( WebSocket s ) Ġ{ ĊĠĠĠĠĠĠĠ Ġping Period Ġ= ĠDuration . of Minutes ( 1 ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġinstall ( Routing ) Ġ{ ĊĠĠĠĠĠĠĠ Ġget ("/ hello ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġcall . request . query Parameters [" name "] Ġ?: Ġ" anonymous " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= Ġmap Of < String , ĠAny >(" name " Ġto Ġname ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( Free Marker Content (" hello . ft l ", Ġmodel , Ġet ag Ġ= Ġ"")) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinstall ( Sessions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcookie < Chat Session >(" CHAT _ SESSION ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġintercept ( Application Call Pipeline . Infrastructure ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( call . sessions . get < Chat Session >() Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . sessions . set ( Chat Session ( next Nonce ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġweb Socket ("/ ws /{ room ? }") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsession Ġ= Ġcall . sessions . get < Chat Session >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( session Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose ( Close Reason ( Close Reason . Codes . VI OL ATED _ POLICY , Ġ" No Ġsession ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ web Socket ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Chat Server . member Join ( session . id , Ġthis , Ġcall . parameters [" room "]) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġincoming . consume Each Ġ{ Ġframe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( frame Ġis ĠFrame . Text ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Chat Server . received Message ( session . id , Ġframe . read Text (), Ġcall . parameters [" room "]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Chat Server . member Left ( session . id , Ġthis , Ġcall . parameters [" room "]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġstatic Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Resource (" index . html ", Ġ" web ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresources (" web ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠĠĠ Ġval Ġapplication Environment Ġ= Ġcommand Line Environment ( args ) ĊĠĠĠ ĠNet ty Application Host ( application Environment ). start () Ċ }