package Ġde . es o . rx player . vertx Ċ Ċ import Ġcom . squareup . mos hi . M oshi Ċ import Ġcom . squareup . mos hi . Types Ċ import Ġcom . squareup . mos hi . kotlin . reflect . Kotlin Json Adapter Factory Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . Single Ċ import Ġio . reactivex . dis pos ables . Composite Disposable Ċ import Ġio . vertx . core . Service Helper Ċ import Ġio . vertx . core . http . HttpServer Request Ċ import Ġio . vertx . core . spi . Vert x Factory Ċ Ċ sealed Ġclass ĠRequest Handler ( ĊĠĠĠĠĠĠĠ Ġopen Ġval Ġpredicate : Ġ( String ) Ġ-> ĠBoolean Ċ ) Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġpredicate Ġused Ġto Ġmatch Ġthis Ġhandler Ġagainst Ġthe Ġincoming ĠURI ĊĠĠĠĠ Ġ* Ġ@ param Ġhandler Function Ġa Ġfunction Ġwhich Ġwill Ġbe Ġcalled Ġif Ġa Ġmatching Ġrequest Ġar rives , Ġproviding Ġuri Ġand Ġparams ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġdata Ġclass ĠGet Handler ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġpredicate : Ġ( String ) Ġ-> ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhandler Function : Ġ( String , ĠMap < String , ĠString >) Ġ-> ĠObservable < out ĠAny > ĊĠĠĠ Ġ) Ġ: ĠRequest Handler ( predicate ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġpredicate Ġused Ġto Ġmatch Ġthis Ġhandler Ġag ains Ġthe Ġincoming ĠURI ĊĠĠĠĠ Ġ* Ġ@ param Ġpayload Class Ġclass Ġof Ġthe Ġexpected Ġpayload Ġobject . ĠCan Ġbe Ġnull ĊĠĠĠĠ Ġ* Ġ@ param Ġhandler Function Ġa Ġfunction Ġwhich Ġwill Ġbe Ġcalled Ġif Ġa Ġmatching Ġrequest Ġar rives ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġdata Ġclass ĠPost Handler < P Ġ: ĠAny >( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġpredicate : Ġ( String ) Ġ-> ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpayload Class : ĠClass < P >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhandler Function : Ġ( String , ĠP ) Ġ-> ĠSingle < out ĠAny > ĊĠĠĠ Ġ) Ġ: ĠRequest Handler ( predicate ) Ċ } Ċ Ċ data Ġclass ĠWeb socket Request ( val Ġuri : ĠString , Ġval Ġid : ĠString , Ġval Ġsubscribe : ĠBoolean ) Ċ Ċ /** Ċ Ġ* ĠA ĠVert x - bas er Ġweb Ġservice Ġwhich Ġserves ĠHTTP Ġand ĠWebSocket Ġon Ġa Ġgiven Ġport . ĠActual Ġhandling Ġis Ġdeleg ated Ġto Ġgiven Ċ Ġ* Ġhandlers . Ċ Ġ* Ċ Ġ* Ġ@ param Ġport Ġport Ġto Ġrun Ġon Ċ Ġ* Ġ@ param Ġhandlers Ġa Ġlist Ġof Ġ[ RequestHandler ] Ġ- Ġ[ de . es o . rx player . vertx . RequestHandler . Get Handler ] Ġor Ġ[ de . es o . rx player . vertx . RequestHandler . Post Handler ] Ċ Ġ* Ġ@ param Ġserializer Ġa Ġfunction Ġwhich Ġconverts Ġany Ġobject Ġor Ġa Ġ[ List ] Ġor Ġobjects Ġto Ġa Ġvalid ĠJSON Ġstring Ċ Ġ* Ġ@ param Ġde serializer Ġa Ġfunction Ġwhich Ġconverts Ġa Ġvalid ĠJSON Ġstring Ġto Ġan Ġobject Ġof Ġa Ġgiven ĠClass Ċ Ġ*/ Ċ class ĠVert x Server ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġport : ĠInt , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġhandlers : ĠList < RequestHandler >, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġserializer : Ġ( Any ) Ġ-> ĠString , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġde serializer : Ġ( Class < out ĠAny >, ĠString ) Ġ-> ĠAny Ċ ) Ġ{ ĊĠĠĠ Ġval Ġm oshi : ĠM oshi Ġ= ĠM oshi . Builder (). add ( Kotlin Json Adapter Factory ()). build () ĊĊĠĠĠ Ġval Ġws Request M oshi Ġ= Ġm oshi . adapter < Websocket Request >( Types . getRaw Type ( Websocket Request :: class . java )) ĊĊĠĠĠ Ġfun Ġlisten () Ġ{ ĊĠĠĠĠĠĠĠ ĠService Helper . load Factory ( Vert x Factory :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. vertx () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. create HttpServer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. request Handler Ġ{ Ġrequest : ĠHttp Server Request Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuri Ġ= Ġrequest . uri () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġrequest . method (). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhandler : ĠRequest Handler ? Ġ= Ġhandler For ( uri , Ġmethod ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Observable : ĠObservable < out ĠAny > Ġ= Ġwhen Ġ( handler ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> ĠObservable . just (" No Ġhandler Ġdefined Ġfor Ġ$ method Ġ$ uri ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġwhen Ġ( handler ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRequest Handler . Post Handler < *> Ġ-> ĠSingle ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. create < String > Ġ{ Ġemitter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . body Handler Ġ{ Ġbody Buffer Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġcheck Ġif Ġlegal ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġbody Buffer . getString ( 0 , Ġbody Buffer . length ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . on Success ( body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġbody Ġ-> Ġde serializer ( handler . payload Class , Ġbody ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġpayload : ĠAny Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( handler Ġas ĠRequest Handler . Post Handler < Any >). handler Function ( uri , Ġpayload ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. to Observable () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRequest Handler . Get Handler Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparams Ġ= Ġrequest . params (). names () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit Ġto Ġrequest . params (). getAll ( it ). first () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toMap () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . handler Function ( uri , Ġparams ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Observable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġresponse Ġ-> Ġserializer ( response ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first Or Error () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ Ġjson : ĠString Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. response () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set StatusCode ( 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setStatus Message (" OK ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put Header (" content - type ", Ġ" application / json ; Ġcharset = utf - 8 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put Header (" Access - Control - Allow - Origin ", Ġ"* ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put Header (" Access - Control - Allow - Headers ", Ġ" content - type ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. end ( json ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ Ġerror Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. response () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set StatusCode ( 5 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setStatus Message (" FAIL ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put Header (" content - type ", Ġ" text / plain ; Ġcharset = utf - 8 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. end ( error . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. websocket Handler Ġ{ Ġweb Socket Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdis posable Ġ= ĠComposite Disposable () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweb Socket . frame Handler Ġ{ Ġframe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġws Message : ĠWeb socket Request Ġ= Ġws Request M oshi . fromJson ( frame . text Data ()) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ws Message . subscribe ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuri Ġ= Ġws Message . uri . replace ("\\ ? .* $ ". to Regex (), Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhandler For Ġ= Ġhandler For ( uri , Ġ" GET ") !! Ġas ĠRequest Handler . Get Handler ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler For . handler Function ( uri , Ġempty Map ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġserializer ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdata Ġclass ĠW s Message < T >( val Ġid : ĠString , Ġval Ġpayload : ĠT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" id ": Ġ"${ ws Message . id }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" payload ": Ġ$ it ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ Ġtext Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweb Socket . write Final Text Frame ( text ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("$ ws Message Ġcompleted ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġdis posable . add ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTODO () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweb Socket . close Handler Ġ{ Ġx Ġ-> Ġdis posable . dispose () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. listen ( port ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandler For ( uri : ĠString , Ġmethod : ĠString ): ĠRequest Handler ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġhandlers ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġhandler Ġ-> Ġif Ġ( method Ġ== Ġ" GET ") Ġhandler Ġis ĠRequest Handler . Get Handler Ġelse Ġhandler Ġis ĠRequest Handler . Post Handler < *> Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. find Ġ{ Ġhandler Ġ-> Ġhandler . predicate ( uri ) Ġ} ĊĠĠĠ Ġ} Ċ } Ċ