package Ġmobile . agent platform Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . DialogInterface Ċ import Ġandroid . content . Intent Ċ import Ġandroid . net . Local Server Socket Ċ import Ġandroid . net . Local Socket Ċ import Ġandroid . net . Local SocketAddress Ċ import Ġandroid . os . AsyncTask Ċ import Ġandroid . support . v 7 . app . AlertDialog Ċ import Ġandroid . widget . Toast Ċ import Ġorg . json . JSONArray Ċ import Ġorg . json . JSONObject Ċ import Ġjava . io . BufferedReader Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ import Ġjava . io . InputStream Reader Ċ import Ġjava . lang . Exception Ċ import Ġjava . util .* Ċ Ċ class ĠSending App AsyncTask ( private Ġval Ġcontext : ĠContext , Ġprivate Ġval Ġapp Path : ĠFile ) Ġ: ĊĠĠĠ ĠAsync Task < String , ĠString , ĠPair < Boolean , ĠString ? >>() Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġalert Dialog : ĠAlertDialog ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġsocket Dir : ĠFile ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġpath ToS ock : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġserver Socket : ĠLocal Server Socket ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġport : ĠInt ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġtimestamp : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġnode Client : ĠLocal Socket ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġon Pre Execute () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Pre Execute () ĊĠĠĠĠĠĠĠ Ġcreate AlertDialog ()?. show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdo In Background ( var arg Ġparams : ĠString ?): ĠPair < Boolean , ĠString ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġresult : ĠPair < Boolean , ĠString ?> ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġdirectory Ġfor Ġstore Ġsocket Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! create Sock Dir ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPair ( true , ĠgetString ( R . string . sock _ dir _ create _ failed _ sharing _ fragment )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpublish Progress ( getString ( R . string . created _ sock _ dir _ sharing _ fragment )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġserver Ġsocket ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! create Server Socket ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserver Socket ?. close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPair ( true , ĠgetString ( R . string . server _ socket _ create _ failed _ sharing _ fragment )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpublish Progress ( getString ( R . string . created _ server _ socket _ sharing _ fragment )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠInit iate ĠNode . js Ġprocess ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( createNode Client () Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPair ( true , ĠgetString ( R . string . node _ process _ create _ failed _ sharing _ fragment )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpublish Progress ( getString ( R . string . init _ node _ sharing _ fragment )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= ĠPair ( false , ĠgetString ( R . string . cancel _ send _ sharing _ fragment )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHandle Ġserver Ġconnection ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode Client Ġ= Ġserver Socket ?. accept () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpublish Progress ( getString ( R . string . node _ connected _ sharing _ fragment )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode Client ?. send BufferSize Ġ= Ġ 1 0 2 4 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode Client ?. receive BufferSize Ġ= Ġ 1 0 2 4 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Reader Ġ= ĠInputStreamReader ( node Client ?. inputStream ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuff Reader Ġ= ĠBufferedReader ( input Reader ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmsg : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ({ Ġmsg Ġ= Ġbuff Reader . readLine (); Ġmsg Ġ} () Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( msg ?. contains (" message ") !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( JSONObject ( msg ). getString (" message ") Ġ== ĠMSG _ SERVER _ ERROR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= ĠPair ( true , ĠgetString ( R . string . error _ send _ server _ send _ sharing _ fragment )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( JSONObject ( msg ). getString (" message ") Ġ== ĠMSG _ SEND ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= ĠPair ( false , ĠgetString ( R . string . successfully _ sent _ sharing _ fragment )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Client Message ( msg !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= ĠPair ( true , ĠgetString ( R . string . generic _ error _ sharing _ fragment )) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver Socket ?. close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Progress Update ( var arg Ġprogress : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( progress [ 0 ] Ġ== ĠMSG _ CONNECTION S ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= ĠJSONObject ( progress [ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconnections Ġ= Ġmsg . get JSONArray (" connections ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselect NetworkInterface ( connections ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( context , Ġprogress [ 0 ], ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Post Execute ( result : ĠPair < Boolean , ĠString ?> ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġprefix Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġif Ġ( result . a ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprefix Ġ= Ġ" Error : Ġ" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠToast . makeText ( context , Ġprefix Ġ+ Ġresult . b , ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠ Ġalert Dialog ?. dismiss () ĊĠĠĠĠĠĠĠ Ġif Ġ( result . b Ġ== ĠgetString ( R . string . successfully _ sent _ sharing _ fragment )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( context , ĠQ r View Activity :: class . java ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra (" SEND _ FIN ISH ", Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . startActivity ( intent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate AlertDialog (): ĠAlertDialog ? Ġ{ ĊĠĠĠĠĠĠĠ Ġalert Dialog Ġ= Ġthis . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠAlertDialog . Builder ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Cancel able ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . create () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġalert Dialog ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetString ( id : ĠInt ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcontext . resources . getString ( id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Sock Dir (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsocket Dir Ġ= ĠFile ( context . files Dir . absolute File , Ġ" platform / sock ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsocket Dir ?. mkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠSecurity Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Server Socket (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġtimestamp Ġ= ĠDate (). time . toString () ĊĠĠĠĠĠĠĠ Ġpath ToS ock Ġ= Ġ"${ socket Dir ?. absolute Path }/ $ timestamp . sock " ĊĠĠĠĠĠĠĠ Ġval Ġlocal SocketAddress Ġ= ĠLocal SocketAddress ( path ToS ock , ĠLocal SocketAddress . Namespace . FILE SYSTEM ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsocket Ġ= ĠLocal Socket () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsocket . bind ( local SocketAddress ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver Socket Ġ= ĠLocal Server Socket ( socket . file Descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Node Client (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnative Client Ġ= ĠNative Client () ĊĠĠĠĠĠĠĠ Ġval Ġapp Config Ġ= ĠApp Config ( context ) ĊĠĠĠĠĠĠĠ Ġval Ġpath To Node Modules Ġ= Ġapp Config . get ( App Constant . KEY _ NODE _ MODULES _ DIR ) ĊĠĠĠĠĠĠĠ Ġval Ġpath To Apps Ġ= Ġapp Config . get ( App Constant . KEY _ APPS _ DIR ) ĊĠĠĠĠĠĠĠ Ġval Ġlogs Dir Ġ= ĠFile ( app Config . get ( App Constant . KEY _ LOG S _ DIR )) ĊĠĠĠĠĠĠĠ Ġlogs Dir . mkdir s () ĊĠĠĠĠĠĠĠ Ġval Ġpath To Logs Ġ= Ġlogs Dir . absolute Path Ġ+ Ġ"/ receive -$ timestamp . log " ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnative Client . start Node With Args ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" node ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"- e ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS CRIPT , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath ToS ock !! , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath To Node Modules , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath To Logs , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Path . absolute Path , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Path . name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath To Apps ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Client Message ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= ĠJSONObject ( message ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ( msg . getString (" message ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMSG _ CONNECTION S Ġ-> Ġpublish Progress ( MSG _ CONNECTION S , Ġmessage ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMSG _ SERVER _ OK Ġ-> Ġport Ġ= Ġmsg . getJSONObject (" server "). getInt (" port ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġselect NetworkInterface ( connections : ĠJSONArray ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcon ns Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġconnections . length ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconn Ġ= Ġconnections . getJSONObject ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcon ns . add ("${ conn . getString (" name ")} Ġ(${ conn . getString (" ip ") })\ n ${ conn . getString (" mac ") }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġalert Dialog : ĠAlertDialog ? Ġ= Ġthis . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠAlertDialog . Builder ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetTitle (" Select Ġnetwork Ġinterface ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Cancel able ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Items ( con ns . to Typed Array (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDialog Interface . OnClickListener Ġ{ Ġdialog , Ġwhich Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( context , ĠQ r View Activity :: class . java ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra (" IPV 4 ", Ġconnections . getJSONObject ( which ). getString (" ip ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra (" PORT ", Ġport . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . startActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . create () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġalert Dialog ?. show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMSG _ CONNECTION S Ġ= Ġ" connections " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMSG _ SEND Ġ= Ġ" send " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMSG _ SERVER _ ERROR Ġ= Ġ" server - error " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMSG _ SERVER _ OK Ġ= Ġ" server - list ening " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMSG _ CANCEL Ġ= Ġ" cancel " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠS CRIPT Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġpath ToS ock Ġ= Ġprocess . argv [ 1 ]; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġpath To Node Modules Ġ= Ġprocess . argv [ 2 ]; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġpath To Logs Ġ= Ġprocess . argv [ 3 ]; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġpath To App Ġ= Ġprocess . argv [ 4 ]; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconst ĠappName Ġ= Ġprocess . argv [ 5 ]; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġpath To Apps Ġ= Ġprocess . argv [ 6 ]; ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġfs Ġ= Ġrequire (' fs '); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġpath Ġ= Ġrequire (' path '); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġutil Ġ= Ġrequire (' util '); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġlog File Ġ= Ġfs . create Write Stream ( path To Logs , Ġ{ Ġflags : Ġ' a ', Ġauto Close : Ġtrue Ġ}); ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsole . error Ġ= Ġ( msg , Ġ... optional Params ) Ġ=> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog File . write ( util . format ( msg , Ġ... optional Params ) Ġ+ Ġ'\ n '); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess . stderr . write ( util . format ( msg , Ġ... optional Params ) Ġ+ Ġ'\ n '); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsole . warn Ġ= Ġ( msg , Ġ... optional Params ) Ġ=> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog File . write ( util . format ( msg , Ġ... optional Params ) Ġ+ Ġ'\ n '); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess . stdout . write ( util . format ( msg , Ġ... optional Params ) Ġ+ Ġ'\ n '); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsole . info Ġ= Ġ( msg , Ġ... optional Params ) Ġ=> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog File . write ( util . format ( msg , Ġ... optional Params ) Ġ+ Ġ'\ n '); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess . stdout . write ( util . format ( msg , Ġ... optional Params ) Ġ+ Ġ'\ n '); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsole . log Ġ= Ġ( msg , Ġ... optional Params ) Ġ=> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog File . write ( util . format ( msg , Ġ... optional Params ) Ġ+ Ġ'\ n '); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess . stdout . write ( util . format ( msg , Ġ... optional Params ) Ġ+ Ġ'\ n '); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsole . debug Ġ= Ġ( msg , Ġoptional Params ) Ġ=> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog File . write ( util . format ( msg , Ġ... optional Params ) Ġ+ Ġ'\ n '); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess . stdout . write ( util . format ( msg , Ġ... optional Params ) Ġ+ Ġ'\ n '); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}; ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodule . paths . push ( path To Node Modules ); ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess . on (' unc a ught Exception ', Ġ( err ) Ġ=> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsole . log (' unc a ught Exception '); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsole . log ( err ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}); ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġnet Ġ= Ġrequire (' net '); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconst ĠAd m Zip Ġ= Ġrequire (' adm - zip '); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġserver Ġ= Ġrequire (' http '). create Server (( req , Ġres ) Ġ=> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . write Head ( 4 0 3 , Ġ{ Ġ' Content - Type ': Ġ' text / plain ' Ġ}); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . end (' Forbidden '); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġio Ġ= Ġrequire (' socket . io ')( server ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġos Ġ= Ġrequire (' os '); ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġzip Ġ= Ġnew ĠAd m Zip (); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzip . add Local Folder ( path To App , ĠappName ); ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġio . on (' connection ', Ġsocket Ġ=> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsole . log (' connection '); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsocket . on (' request ', Ġ( args ) Ġ=> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsole . log (' request '); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsocket . emit (' send ', Ġzip . to Buffer (), Ġ() Ġ=> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠACK Ġfunction ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsole . log (' send - app '); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġmsg Ġ= Ġ{ Ġmessage : Ġ"$ MSG _ SEND ", ĠappName Ġ}; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient . write ( JSON . stringify ( msg ) Ġ+ Ġ"\ r \ n "); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsole . log ( msg ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}); ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserver . on (' error ', Ġ( error ) Ġ=> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġmsg Ġ= Ġ{ Ġmessage : Ġ"$ MSG _ SERVER _ ERROR ", Ġerror Ġ}; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient . write ( JSON . stringify ( msg ) Ġ+ Ġ"\ r \ n "); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsole . log ( msg ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġerror ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserver . listen ( 0 , Ġ( err ) Ġ=> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġmsg Ġ= Ġ{ Ġmessage : Ġ"$ MSG _ SERVER _ OK ", Ġserver : Ġserver . address () Ġ}; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient . write ( JSON . stringify ( msg ) Ġ+ Ġ"\ r \ n "); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsole . log ( msg ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( err ) Ġthrow Ġerr ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsole . log (' Socket Ġready Ġon Ġhttp :// localhost :' Ġ+ Ġserver . address (). port Ġ+ Ġ', Ġpid :' Ġ+ Ġprocess . pid ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}); ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġconnections Ġ= Ġ[]; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġnetwork Interfaces Ġ= Ġos . network Interfaces (); ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObject . keys ( network Interfaces ). forEach (( iface Name , Ġindex , Ġarray ) Ġ=> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġconnection Ġ= Ġ{}; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġalias Ġ= Ġ 0 ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Interfaces [ iface Name ]. forEach (( iface , Ġindex , Ġarray ) Ġ=> Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( iface . family Ġ!== Ġ' IPv 4 ' Ġ|| Ġiface . internal ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( alias Ġ=== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection . ip Ġ= Ġiface . address ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection . name Ġ= Ġiface Name ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection . mac Ġ= Ġiface . mac ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalias ++; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}); ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(!( Object . keys ( connection ). length Ġ=== Ġ 0 Ġ&& Ġconnection . constructor Ġ=== ĠObject )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnections . push ( connection ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}); ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġclient Ġ= Ġnet . create Connection ( path ToS ock , Ġ() Ġ=> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsole . log (' connected Ġto ĠIPC Ġserver '); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġmsg Ġ= Ġ{ Ġmessage : Ġ"$ MSG _ CONNECTION S ", Ġconnections Ġ}; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient . write ( JSON . stringify ( msg ) Ġ+ Ġ"\ r \ n "); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsole . log ( msg ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient . on (' data ', Ġ( data ) Ġ=> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġmsg Ġ= ĠJSON . parse ( data . toString ()); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsole . log ( msg ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġ{ Ġmessage Ġ} Ġ= Ġmsg ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( message Ġ== Ġ"$ MSG _ CANCEL ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient End (); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}); ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Ġclient End () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient . end (() Ġ=> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsole . log (' disconnected Ġfrom ĠIPC Ġserver \ n \ n '); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess . exit (); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠ Ġ} Ċ } Ċ