package Ġcom . alternative infra structures . noise . storage Ċ Ċ import Ġcom . alternative infra structures . noise . Noise Database Ċ import Ġcom . alternative infra structures . noise . models . Remote Identity Ċ Ċ import Ġcom . ra iz labs . android . db flow . annotation . ForeignKey Ċ import Ġcom . ra iz labs . android . db flow . annotation . Index Ċ import Ġcom . ra iz labs . android . db flow . annotation . Table Ċ Ċ import Ġorg . wh isper systems . lib signal . Identity Key Ċ import Ġorg . wh isper systems . lib signal . Invalid Key Exception Ċ import Ġorg . wh isper systems . lib signal . ecc . E CP ublic Key Ċ Ċ import Ġjava . io . ByteArray InputStream Ċ import Ġjava . io . ByteArray OutputStream Ċ import Ġjava . io . IOException Ċ Ċ import Ġio . reactivex . Single Ċ import Ġok io . Ok io Ċ import Ġok io . Utf 8 Ċ import Ġjava . util .* Ċ Ċ @ Table ( database Ġ= ĠNo ise Database :: class ) Ċ class ĠIdentity Anno uncement Message Ġ: ĠUnknown Message Ġ{ ĊĊĠĠĠ Ġ@ ForeignKey ( stub bed Relationship Ġ= Ġtrue ) ĊĠĠĠ Ġ@ Index ĊĠĠĠ Ġvar Ġidentity : ĠRemote Identity ? Ġ= Ġnull ĊĊĠĠĠ Ġconstructor () Ġ{} ĊĊĠĠĠ Ġ@ Throws ( Invalid Key Exception :: class , ĠIOException :: class ) ĊĠĠĠ Ġprotected Ġconstructor ( message : ĠUnknown Message ) Ġ: Ġsuper ( message ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Message Types [ public Type ] Ġ!= ĠIdentity Anno uncement Message :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠClass CastException () ĊĊĠĠĠĠĠĠĠ Ġval Ġpayload Source Ġ= ĠOk io . buffer ( Ok io . source ( ByteArray InputStream ( payload . blob ))) ĊĊĠĠĠĠĠĠĠ Ġval Ġusername Length Ġ= Ġpayload Source . read Byte () ĊĠĠĠĠĠĠĠ Ġval Ġusername Ġ= Ġpayload Source . readString ( username Length . to Long (), ĠUnknown Message . PAYLOAD _ CHARSET ) ĊĠĠĠĠĠĠĠ Ġval ĠdeviceId Ġ= Ġpayload Source . readInt () ĊĠĠĠĠĠĠĠ Ġval Ġidentity Key Bytes Ġ= Ġpayload Source . read ByteArray ( IDENTITY _ KEY _ SIZE . to Long ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġidentity Key Ġ= ĠIdentity Key ( identity Key Bytes , Ġ 0 Ġ/* offset */) ĊĠĠĠĠĠĠĠ Ġval Ġidentity Ġ= ĠRemote Identity ( username , ĠdeviceId , Ġidentity Key ) ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠAdd Ġa Ġmechanism Ġto Ġwait Ġfor Ġthis Ġto Ġfinish Ġsaving ? ĊĠĠĠĠĠĠĠ Ġidentity . save (). subscribe () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsave (): ĠSingle < Boolean > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġidentity !!. save (). flatMap Ġ{ ĠBoolean Ġ-> Ġsuper . save () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Throws ( Payload Too Large Exception :: class ) ĊĠĠĠĠĠĠĠ Ġfun Ġraw Create And Sign Async ( payload : ĠByteArray , Ġzero Bits : ĠByte , Ġpublic Type : ĠUUID ): ĠSingle < Unknown Message > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUnknown Message . raw Create And Sign Async ( payload , Ġzero Bits , Ġpublic Type ) ĊĊĠĠĠĠĠĠĠ Ġ@ Throws ( Unknown Message . Payload Too Large Exception :: class , ĠIOException :: class ) ĊĠĠĠĠĠĠĠ Ġfun Ġcreate And Sign Async ( identity : ĠRemote Identity , Ġzero Bits : ĠByte ): ĠSingle < Unknown Message > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpayload Stream Ġ= ĠByteArrayOutputStream () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpayload Sink Ġ= ĠOk io . buffer ( Ok io . sink ( payload Stream )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpayload Sink . write Byte ( Utf 8 . size ( identity . username ). to Byte (). toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpayload Sink . writeString ( identity . username , ĠUnknown Message . Companion . PAYLOAD _ CHARSET ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpayload Sink . writeInt ( identity . deviceId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpayload Sink . write ( identity . identity Key . serialize (), Ġ 0 Ġ/* offset */, ĠIDENTITY _ KEY _ SIZE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpayload Sink . flush () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIdentity Anno uncement Message . raw Create And Sign Async ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpayload Stream . toByteArray (), Ġzero Bits , ĠMessage Types [ Identity Anno uncement Message :: class . java ] !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠT une Ġthis Ġvalue ĊĠĠĠĠĠĠĠ Ġval ĠDEFAULT _ ZERO _ BITS : ĠByte Ġ= Ġ 2 2 ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠIDENTITY _ KEY _ SIZE Ġ= ĠE CP ublic Key . KEY _ SIZE ĊĠĠĠ Ġ} Ċ } Ċ