package Ġse . lt u . emap al . compute . io Ċ Ċ import Ġse . lt u . emap al . compute . util . Result Ċ import Ġse . lt u . emap al . compute . util . media . Media Decoder Ċ import Ġse . lt u . emap al . compute . util . media . Media En codable Ċ import Ġse . lt u . emap al . compute . util . media . Media En codable Exception Ċ import Ġse . lt u . emap al . compute . util . media . jackson . Jack son Media Converter Ċ import Ġse . lt u . emap al . compute . util . nio . ByteBuffer InputStream Ċ import Ġse . lt u . emap al . compute . util . nio . ByteBuffer OutputStream Ċ import Ġjava . io . IOException Ċ import Ġjava . io . InputStream Ċ import Ġjava . io . OutputStream Ċ import Ġjava . nio . ByteBuffer Ċ import Ġjava . nio . Byte Order Ċ import Ġjava . nio . channels . Byte Channel Ċ import Ġjava . nio . channels . Channel Ċ Ċ /** Ċ Ġ* ĠMan ages Ġcommunication Ġbetween Ġone Ġcompute Ġclient Ġand Ġone Ġcompute Ġservice . Ċ Ġ* Ċ Ġ* ĠAll Ġmessages Ġare Ġcopied Ġon Ġand Ġoff Ġa Ġsingle Ġ 3 2 ĠM b Ġbuffer . ĠNo Ġmessage Ġmay Ġexceed Ġthat Ġsize , Ġor Ġan Ċ Ġ* Ġexception Ġis Ġthrown . Ċ Ġ* Ċ Ġ* Ġ@ param Ġencoder ĠFunction Ġused Ġto Ġencode Ġmessages . Ċ Ġ* Ġ@ param Ġdecoder ĠFunction Ġused Ġto Ġdecode Ġmessages . Ċ Ġ* Ġ@ param Ġbyte Channel ĠChannel Ġused Ġfor Ġcommunication . Ċ Ġ*/ Ċ class ĠCompute Channel ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġencoder : Ġ( Media En codable , ĠOutputStream ) Ġ-> ĠUnit , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdecoder : Ġ( InputStream ) Ġ-> ĠResult < Media Decoder , ĠIOException >, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġbyte Channel : ĠByte Channel Ċ ) Ġ: ĠChannel Ġ{ ĊĠĠĠ Ġprivate Ġval Ġbuffer Ġ= ĠByteBuffer . allocate ( BUFFER _ SIZE ) ĊĊĠĠĠ Ġ/** ĠCreates Ġ[ Compute Channel ] Ġusing ĠJSON Ġas Ġmessage Ġencoding . Ġ*/ ĊĠĠĠ Ġconstructor ( byte Channel : ĠByte Channel ) Ġ: Ġthis ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġen codable , Ġoutput Ġ-> ĠJack son Media Converter . SM ILE . encode ( en codable , Ġoutput ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĠJack son Media Converter . SM ILE . decode ( it ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbyte Channel ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġbuffer . order ( Byte Order . BIG _ ENDIAN ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠSends Ġ[ message ] Ġover Ġchannel Ġand Ġawait s Ġresponse . Ġ*/ ĊĠĠĠ Ġfun Ġwrite ( message : ĠCompute Message ): ĠResult < Void ?, ĠIOException > Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( buffer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . rewind () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . limit ( buffer . capacity ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠByteBuffer OutputStream ( buffer ). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . buffer . position ( 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġencoder ( message , Ġit ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġit . buffer . position () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Size Ġ= Ġsize Ġ- Ġ 4 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . buffer . position ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . buffer . limit ( 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . buffer . put Int ( message Size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . buffer . rewind () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . buffer . limit ( size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbyte Channel . write ( it . buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResult . Success ( null ) ĊĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResult . Failure ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠW aits Ġfor Ġ[ Compute Message ] Ġto Ġbe Ġreceived Ġover Ġchannel . Ġ*/ ĊĠĠĠ Ġfun Ġread (): ĠResult < Compute Message , ĠMedia En codable Exception > Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( buffer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . rewind () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġbuffer . limit ( 4 ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbyte Channel . read ( it Ġas ĠByteBuffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . rewind () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . int ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . rewind () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . limit ( size ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbyte Channel . read ( it Ġas ĠByteBuffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . rewind () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠByteBuffer InputStream ( buffer ). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdecoder ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Error Ġ{ ĠMedia En codable Exception . wrap ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCompute Message . decode ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Error Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" USE LESS _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it Ġas ĠMedia En codable Exception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResult . Failure ( Media En codable Exception . wrap ( e )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠisOpen (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( buffer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbyte Channel . isOpen ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( buffer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbyte Channel . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĠThe Ġsize Ġof Ġthe Ġinternal Ġ[ ByteBuffer ] Ġused Ġwhen Ġreading Ġand Ġwriting Ġmessages . Ġ*/ ĊĠĠĠĠĠĠĠ Ġval ĠBUFFER _ SIZE Ġ= Ġ 3 2 Ġ* Ġ 1 0 2 4 Ġ* Ġ 1 0 2 4 ĊĠĠĠ Ġ} Ċ }