package Ġcom . lap an there . signals Ċ Ċ import Ġcom . lap an there . signals . transformers . InputStream Async Response Transformer Ċ import Ġkotlinx . coroutines . Coroutine Name Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Coroutine Start Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . async Ċ import Ġkotlinx . coroutines . future . await Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġsoftware . amazon . aw ssdk . services . s 3 . S 3 Async Client Ċ import Ġsoftware . amazon . aw ssdk . services . s 3 . model . GetObject Request Ċ import Ġsoftware . amazon . aw ssdk . services . s 3 . model . Head Object Request Ċ import Ġjava . io . InputStream Ċ import Ġjava . io . Sequence InputStream Ċ import Ġjava . time . Instant Ċ import Ġjava . util . Enumeration Ċ import Ġkotlin . coroutines . Coroutine Context Ċ Ċ internal Ġval ĠA VA IL ABLE _ PROCESS ORS Ġ= ĠRuntime . get Runtime (). available Processors () Ċ Ċ /** Ċ Ġ* ĠDownload Ġa Ġfile Ġfrom ĠS 3 Ġusing Ġmulti - part Ġdownload . Ċ Ġ* Ċ Ġ* Ġ@ param Ġbucket ĠThe Ġname Ġof Ġthe Ġbucket Ġcontaining Ġthe Ġobject . Ċ Ġ* Ġ@ param Ġkey ĠKey Ġof Ġthe Ġobject Ġto Ġdownload . Ċ Ġ* Ġ@ param Ġparallel ism ĠThe Ġnumber Ġof Ġparts Ġto Ġdownload Ġat Ġa Ġtime . Ċ Ġ* Ġ@ param Ġs 3 ĠA Ġ[ software . amazon . aw ssdk . services . s 3 . S 3 Async Client ] Ġto Ġbe Ġused Ġduring Ġthe Ġdownload . Ċ Ġ* Ġ@ param Ġchunk er ĠA Ġ[ Chunk er ] Ġthat Ġprovides Ġeach Ġchunk Ġsizes . Ċ Ġ* Ġ@ param Ġmut ator ĠA Ġfunction Ġthat Ġmut ates Ġthe Ġrequest Ġgiven Ġto Ġthe ĠS 3 Ġclient . Ċ Ġ* Ċ Ġ*/ Ċ public Ġclass ĠS 3 InputStream ( ĊĠĠĠ Ġbucket : ĠString , ĊĠĠĠ Ġkey : ĠString , ĊĠĠĠ Ġparallel ism : ĠInt Ġ= ĠA VA IL ABLE _ PROCESS ORS , ĊĠĠĠ Ġs 3 : ĠS 3 Async Client Ġ= ĠS 3 Async Client . create (), ĊĠĠĠ Ġchunk er : ĠChunk er Ġ= ĠDefault Chunk er (), ĊĠĠĠ Ġmut ator : Ġ( GetObject Request . Builder ) Ġ-> ĠUnit Ġ= Ġ{} Ċ ) Ġ: ĠInputStream (), ĠCor outine Scope Ġ{ ĊĠĠĠ Ġprivate Ġval Ġs 3 Object Ġ= Ġs 3 . head Object ( ĊĠĠĠĠĠĠĠ ĠHead Object Request . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. bucket ( bucket ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. key ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ). get () ĊĠĠĠ Ġprivate Ġval Ġparts Ġ= Ġbyte Range ( chunk er , Ġs 3 Object . content Length ()) ĊĠĠĠ Ġprivate Ġval Ġstreams Ġ= Ġparts . map Indexed Ġ{ Ġi , Ġ( begin , Ġend ) Ġ-> ĊĠĠĠĠĠĠĠ Ġasync ( Coroutine Name (" chunk -${ i Ġ+ Ġ 1 } "), ĠCor outine Start . LA ZY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs 3 . getObject ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGetObject Request . builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Mutation ( mut ator ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. bucket ( bucket ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. key ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. range (" bytes =$ begin -$ end ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInputStream Async Response Transformer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). await () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. to Mutable List () ĊĠĠĠ Ġprivate Ġval Ġbuffer : ĠSequence InputStream Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠSequence InputStream ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠEnumeration < InputStream > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġiterator Ġ= Ġstreams . iterator () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhas More Elements (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStarts Ġdownloading Ġthe Ġnext Ġchunks Ġahead . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstreams . take ( parallel ism ). forEach Ġ{ Ġit . start () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġiterator . hasNext () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnext Element (): ĠInputStream Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiterator . use Ġ{ Ġit . await () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġval Ġe Tag : ĠString ? Ġ= Ġs 3 Object . e Tag () ĊĠĠĠ Ġpublic Ġval Ġcontent Length : ĠLong ? Ġ= Ġs 3 Object . content Length () ĊĠĠĠ Ġpublic Ġval Ġlast Modified : ĠInstant ? Ġ= Ġs 3 Object . lastModified () ĊĠĠĠ Ġpublic Ġval Ġmetadata : ĠMap < String , ĠString > Ġ= Ġs 3 Object . metadata () ĊĠĠĠ Ġpublic Ġval ĠcontentType : ĠString ? Ġ= Ġs 3 Object . contentType () ĊĠĠĠ Ġpublic Ġval Ġcontent Encoding : ĠString ? Ġ= Ġs 3 Object . content Encoding () ĊĠĠĠ Ġpublic Ġval Ġcontent Disposition : ĠString ? Ġ= Ġs 3 Object . content Disposition () ĊĠĠĠ Ġpublic Ġval Ġcontent Language : ĠString ? Ġ= Ġs 3 Object . content Language () ĊĠĠĠ Ġpublic Ġval Ġversion Id : ĠString ? Ġ= Ġs 3 Object . version Id () ĊĠĠĠ Ġpublic Ġval Ġcache Control : ĠString ? Ġ= Ġs 3 Object . cache Control () ĊĠĠĠ Ġpublic Ġval Ġexpires : ĠInstant ? Ġ= Ġs 3 Object . expires () ĊĊĠĠĠ Ġoverride Ġfun Ġread (): ĠInt Ġ= Ġbuffer . read () ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġbuffer . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġcoroutine Context : ĠCor outine Context ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠDispatch ers . IO Ċ } Ċ Ċ internal Ġinline Ġfun Ġ< T , ĠR > ĠMutable Iterator < T >. use ( block : Ġ( T ) Ġ-> ĠR ): ĠR Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġblock ( this . next ()) ĊĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . remove () ĊĠĠĠ Ġ} Ċ } Ċ