package Ġio . github . daniel pe ach . plugin Ċ Ċ import Ġjava . io . Writer Ċ import Ġjava . lang . IllegalArgumentException Ċ import Ġjava . time . Duration Ċ Ċ /** Ċ Ġ* ĠAn Ġinstance Ġof Ġ[ ClientConfig ] Ġtells Ġa Ġ[ Manager ] Ġhow Ġto Ġconfigure Ġa Ġplugin . Ċ Ġ* Ċ Ġ* Ġ@ see Ġ[ Manager ] Ċ Ġ* Ċ Ġ* Ġ@ property Ġ[ cmd ] ĠThe Ġcommand Ġto Ġbe Ġused Ġto Ġstart Ġthe Ġplugin Ġsubprocess . Ċ Ġ* Ċ Ġ* Ġ@ property Ġ[ handshake Config ] ĠA Ġhandshake Ġthat Ġsets Ġthe Ġrequested Ġplugin Ġversion Ċ Ġ* Ġand Ġa Ġkey / value Ġverification Ġthat Ġmust Ġmatch Ġthe Ġserver 's Ġhandshake Ġconfig . Ċ Ġ* Ċ Ġ* Ġ@ property Ġ[ plugins ] ĠThe Ġlist Ġof Ġ[ Plugin ] s Ġthat Ġthe Ġclient Ġwill Ġhave Ġaccess Ġto . Ċ Ġ* Ċ Ġ* Ġ@ property Ġ[ versioned Plugins ] ĠA Ġset Ġof Ġinteger - versioned Ġ[ Plugin ] s . ĠThis Ġshould Ċ Ġ* Ġbe Ġset Ġinstead Ġof Ġ[ plugins ] Ġif Ġthere Ġis Ġa Ġrange Ġof Ġplugin Ġversions Ġacceptable Ġto Ġthe Ġclient . Ċ Ġ* Ċ Ġ* Ġ@ property Ġ[ start Timeout ] ĠThe Ġmaximum Ġtime Ġallowed Ġby Ġthe Ġclient Ġfor Ġthe Ġplugin Ġsubprocess Ġto Ġstart . Ċ Ġ* Ċ Ġ* Ġ@ property Ġ[ stdio Mode ] ĠDefines Ġhow Ġserver - side Ġplugin Ġlogs Ġshould Ġbe Ġhandled Ġby Ġthe Ġclient . Ċ Ġ* Ċ Ġ* Ġ@ property Ġ[ encryption Mode ] ĠDefines Ġthe Ġencryption Ġmode Ġfor Ġcommunication Ġbetween Ġthe Ġclient Ġand Ġplugin . Ċ Ġ* Ġ*/ Ċ data Ġclass ĠClient Config ( ĊĠ Ġinternal Ġval Ġcmd : ĠList < String >, ĊĠ Ġinternal Ġval Ġhandshake Config : ĠHand shake Config , ĊĠ Ġprivate Ġval Ġplugins : ĠList < Plugin <* >> Ġ= Ġempty List (), ĊĠ Ġprivate Ġval Ġversion ed Plugins : ĠMap < Int , ĠList < Plugin <* >>> Ġ= Ġempty Map (), ĊĠ Ġinternal Ġval Ġstart Timeout : ĠDuration Ġ= ĠDuration . of Minutes ( 1 ), ĊĠ Ġinternal Ġval Ġstd io Mode : ĠStd io Mode Ġ= ĠLog , ĊĠ Ġinternal Ġval Ġencryption Mode : ĠEncryption Mode Ġ= ĠPl aintext Ċ ) Ġ{ ĊĠ Ġinit Ġ{ ĊĠĠĠ Ġif Ġ( handshake Config . protocol Version Ġ!= Ġnull Ġ&& ĊĠĠĠĠĠ Ġversion ed Plugins [ handshake Config . protocol Version ] Ġ!= Ġnull Ġ&& ĊĠĠĠĠĠ Ġplugins . isNotEmpty () ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ( ĊĠĠĠĠĠĠĠ Ġ" versioned Plugins [ ${ handshake Config . protocol Version }] Ġwill Ġbe Ġoverwritten . Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠ Ġ" Either Ġsupply Ġan Ġempty Ġplugins Ġlist Ġor Ġremove Ġversion ed Plugins [ ${ handshake Config . protocol Version } ]. " ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( handshake Config . protocol Version Ġ== Ġnull Ġ&& Ġversion ed Plugins . isEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" One Ġof Ġprotocol Ġversion Ġor Ġversion ed Ġplugins Ġmust Ġbe Ġset .") ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġinternal Ġfun Ġget Version ed Plugins (): ĠMap < Int , ĠList < Plugin <* >>> Ġ{ ĊĠĠĠ Ġif Ġ( handshake Config . protocol Version Ġ!= Ġnull Ġ&& Ġplugins . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġversion ed Plugins Ġ+ Ġmap Of ( handshake Config . protocol Version Ġto Ġplugins ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġversion ed Plugins ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* Ġ[ Handshake Config ] Ġconfig ures Ġthe Ġpre - startup Ġhandshake Ġbetween Ġclient Ġand Ġserver . Ċ Ġ* Ċ Ġ* Ġ@ property Ġ[ protocol Version ] ĠThe Ġversion Ġthat Ġclients Ġmust Ġmatch Ġon Ġto Ġagree Ġthey Ċ Ġ* Ġcan Ġcommunicate . ĠThis Ġfield Ġis Ġnot Ġrequired Ġif Ġ[ ClientConfig . versioned Plugins ] Ġare Ġbeing Ġused . Ċ Ġ* Ċ Ġ* Ġ@ property Ġ[ magic Cookie Key ] ĠUsed Ġwith Ġ[ magic Cookie Value ], Ġthis Ġprovides Ġa Ġvery Ċ Ġ* Ġbasic Ġverification Ġthat Ġa Ġplugin Ġis Ġintended Ġto Ġbe Ġlaunched . ĠIt Ġis Ġnot Ġintended Ġto Ġbe Ġa Ġsecurity Ġfeature . Ċ Ġ* Ċ Ġ* Ġ@ property Ġ[ magic Cookie Value ] ĠUsed Ġwith Ġ[ magic Cookie Key ]. Ċ Ġ* Ġ*/ Ċ data Ġclass ĠHand shake Config ( ĊĠ Ġval Ġprotocol Version : ĠInt ? Ġ= Ġnull , ĊĠ Ġval Ġmagic Cookie Key : ĠString , ĊĠ Ġval Ġmagic Cookie Value : ĠString Ċ ) Ċ Ċ /** Ċ Ġ* Ġ[ Std io Mode ] Ġdefines Ġhow Ġserver - side Ġplugin Ġlogs Ġshould Ġbe Ġhandled Ġby Ġthe Ġclient . Ċ Ġ* Ġ*/ Ċ sealed Ġclass ĠStd io Mode Ċ Ċ /** Ċ Ġ* ĠThe Ġ[ Pipe To Writer ] Ġstd io Ġmode Ġforwards Ġserver - side Ġplugin Ġlogs Ġto Ġinstances Ġof Ġ[ Writer ]. Ċ Ġ* Ċ Ġ* Ġ@ property Ġ[ sync Stdout ] ĠA Ġwriter Ġfor Ġthe Ġplugin 's Ġstdout Ġchannel . Ċ Ġ* Ċ Ġ* Ġ@ property Ġ[ sync Stderr ] ĠA Ġwriter Ġfor Ġthe Ġplugin 's Ġstderr Ġchannel . Ċ Ġ* Ġ*/ Ċ class ĠPipe To Writer ( ĊĠ Ġval Ġsync Stdout : ĠWriter , ĊĠ Ġval Ġsync Stderr : ĠWriter Ċ ) Ġ: ĠStd io Mode () Ċ Ċ /** Ċ Ġ* ĠThe Ġ[ Log ] Ġstd io Ġmode Ġlogs Ġserver - side Ġplugin Ġlogs Ġalong side Ġthe Ġclient 's Ġlogs . Ċ Ġ* Ġ*/ Ċ object ĠLog Ġ: ĠStd io Mode () Ċ Ċ /** Ċ Ġ* ĠThe Ġ[ Drop ] Ġstd io Ġmode Ġignores Ġserver - side Ġplugin Ġlogs . Ċ Ġ* Ġ*/ Ċ object ĠDrop Ġ: ĠStd io Mode () Ċ Ċ /** Ċ Ġ* Ġ[ Encryption Mode ] Ġdefines Ġhow Ġcommunication Ġbetween Ġthe Ġclient Ġand Ġserver Ġis Ġencrypted . Ċ Ġ* Ġ*/ Ċ sealed Ġclass ĠEncryption Mode Ċ Ċ /** Ċ Ġ* ĠWhen Ġusing Ġthe Ġ[ Pl aintext ] Ġencryption Ġmode , Ġcommunication Ġbetween Ġclient Ġand Ġserver Ġwill Ġnot Ġbe Ġencrypted . Ċ Ġ* Ġ*/ Ċ object ĠPl aintext Ġ: ĠEncryption Mode () Ċ Ċ /** Ċ Ġ* ĠWhen Ġusing Ġthe Ġ[ Auto MT LS ] Ġencryption Ġmode , Ġthe Ġclient Ġand Ġserver Ġwill Ġautomatically Ġneg otiate Ġm TLS . Ċ Ġ* Ġ*/ Ċ object ĠAuto MT LS Ġ: ĠEncryption Mode () Ċ