package Ġcom . ap ol log raph ql . apollo 3 . mock server Ċ Ċ import ĠBuffer Ċ import Ġkotlinx . coroutines . Del icate Cor outines Api Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . launch Ċ import Ġnet . Address Info Ċ import Ġnet . Socket Ċ import Ġnet . create Server Ċ import Ġok io . Sink Ċ import Ġok io . Timeout Ċ import Ġok io . buffer Ċ import Ġorg . kh ronos . webgl . Int 8 Array Ċ import Ġorg . kh ronos . webgl . Uint 8 Array Ċ import Ġkotlin . coroutines . resume Ċ import Ġkotlin . coroutines . suspend Coroutine Ċ Ċ actual Ġclass ĠMock Server Ġactual Ġconstructor ( override Ġval Ġmock Server Handler : ĠMock Server Handler ) Ġ: ĠMock Server Interface Ġ{ ĊĊĠ Ġprivate Ġval Ġrequests Ġ= Ġmutable ListOf < Mock Request >() ĊĊĠ Ġprivate Ġvar Ġurl : ĠString ? Ġ= Ġnull ĊĊĠ Ġ@ Opt In ( Del icate Cor outines Api :: class ) ĊĠ Ġprivate Ġval Ġserver Ġ= Ġcreate Server Ġ{ Ġsocket Ġ-> ĊĠĠĠ Ġval Ġrequest Body Ġ= Ġok io . Buffer () ĊĠĠĠ Ġsocket . on (" data ") Ġ{ Ġchunk Ġ-> ĊĠĠĠĠĠ Ġwhen Ġ( chunk ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠString Ġ-> Ġrequest Body . write Utf 8 ( chunk ) ĊĠĠĠĠĠĠĠ Ġis ĠBuffer Ġ-> Ġrequest Body . write ( chunk . as ByteArray ()) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Unexpected Ġchunk Ġtype : Ġ${ chunk :: class }") ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġval Ġrequest Ġ= Ġread Request ( request Body ) !! ĊĠĠĠĠĠ Ġrequests . add ( request ) ĊĊĠĠĠĠĠ Ġval Ġmock Response Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġmock Server Handler . handle ( request ) ĊĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠException (" Mock Server Handler . handle () Ġthrew Ġan Ġexception : Ġ${ e . message }", Ġe ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ ĠGlobal Scope . launch Ġ{ ĊĠĠĠĠĠĠĠ Ġdelay ( mock Response . delay Millis ) ĊĠĠĠĠĠĠĠ Ġwrite Response ( Socket Sink ( socket ). buffer (), Ġmock Response , Ġrequest . version ) ĊĠĠĠĠĠĠĠ Ġsocket . end () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ}. listen () ĊĊĠ Ġoverride Ġsuspend Ġfun Ġurl () Ġ= Ġurl Ġ?: Ġsuspend Coroutine Ġ{ Ġcont Ġ-> ĊĠĠĠ Ġurl Ġ= Ġ" http :// localhost :${ server . address (). unsafe Cast < Address Info >(). port }/ " ĊĠĠĠ Ġserver . on (" list ening ") Ġ{ Ġ_ Ġ-> ĊĠĠĠĠĠ Ġcont . resume ( url !! ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġenqueue ( mock Response : ĠMock Response ) Ġ{ ĊĠĠĠ Ġ( mock Server Handler Ġas ? ĠQueue Mock Server Handler )?. enqueue ( mock Response ) ĊĠĠĠĠĠĠĠ Ġ?: Ġerror (" A pol lo : Ġcannot Ġcall ĠMock Server . enqueue () Ġwith Ġa Ġcustom Ġhandler ") ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġtake Request (): ĠMock Request Ġ{ ĊĠĠĠ Ġreturn Ġrequests . remove First () ĊĠ Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġstop () Ġ= Ġsuspend Coroutine < Unit > Ġ{ Ġcont Ġ-> ĊĠĠĠ Ġserver . close Ġ{ ĊĠĠĠĠĠ Ġcont . resume ( Unit ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠUint 8 Array . as ByteArray (): ĠByteArray Ġ{ ĊĠĠĠ Ġreturn ĠInt 8 Array ( buffer , Ġbyte Offset , Ġlength ). unsafe Cast < ByteArray >() ĊĠ Ġ} ĊĊĠ Ġprivate Ġclass ĠSocket Sink ( private Ġval Ġsocket : ĠSocket ) Ġ: ĠS ink Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġwrite ( source : Ġok io . Buffer , Ġbyte Count : ĠLong ) Ġ{ ĊĠĠĠĠĠ Ġsocket . write ( source . read Utf 8 ( byte Count )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{} ĊĠĠĠ Ġoverride Ġfun Ġflush () Ġ{} ĊĠĠĠ Ġoverride Ġfun Ġtimeout () Ġ= ĠTimeout . NONE ĊĠ Ġ} Ċ } Ċ