// ĠCopyright Ġ 2 0 2 1 ĠThe ĠCross - Media ĠMeasurement ĠAuthors Ċ // Ċ // ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ // Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ // ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ // Ċ // ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ // Ċ // ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ // Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ // ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ // ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ // Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ċ package Ġorg . wf an et . panel match . common . storage Ċ Ċ import Ġcom . google . protobuf . ByteString Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . on Each Ċ import Ġorg . wf an et . measurement . storage . Storage Client Ċ Ċ /** ĠStorage Client Ġidentical Ġto Ġ[ delegate ] Ġthat Ġthrows Ġif Ġblobs Ġare Ġlarger Ġthan Ġ[ size Limit Bytes ]. Ġ*/ Ċ class ĠSize Limit ed Storage Client ( ĊĠ Ġprivate Ġval Ġsize Limit Bytes : ĠLong , ĊĠ Ġprivate Ġval Ġdelegate : ĠStorage Client Ċ ) Ġ: ĠStorage Client Ġ{ ĊĠ Ġoverride Ġval Ġdefault BufferSize Bytes : ĠInt ĊĠĠĠ Ġget () Ġ= Ġdelegate . default BufferSize Bytes ĊĊĠ Ġoverride Ġsuspend Ġfun Ġcreate Blob ( blob Key : ĠString , Ġcontent : ĠFlow < ByteString >): ĠStorage Client . Blob Ġ{ ĊĠĠĠ Ġreturn Ġdelegate . create Blob ( blob Key , Ġcontent . limit Size ( size Limit Bytes )) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġget Blob ( blob Key : ĠString ): ĠStorage Client . Blob ? Ġ{ ĊĠĠĠ Ġval Ġdelegate Blob Ġ= Ġdelegate . get Blob ( blob Key ) Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġreturn ĠBlob ( this , Ġsize Limit Bytes , Ġdelegate Blob ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġclass ĠBlob ( ĊĠĠĠ Ġoverride Ġval Ġstorage Client : ĠStorage Client , ĊĠĠĠ Ġprivate Ġval Ġsize Limit Bytes : ĠLong , ĊĠĠĠ Ġprivate Ġval Ġdelegate : ĠStorage Client . Blob ĊĠ Ġ) Ġ: ĠStorage Client . Blob Ġ{ ĊĠĠĠ Ġoverride Ġval Ġsize : ĠLong Ġby Ġlazy Ġ{ ĊĠĠĠĠĠ Ġval Ġtrue Size Ġ= Ġdelegate . size ĊĠĠĠĠĠ Ġrequire ( true Size Ġ<= Ġsize Limit Bytes ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" Blob Ġis Ġ$ true Size Ġbytes , Ġwhich Ġexceeds Ġallowed Ġsize Ġof Ġ$ size Limit Bytes Ġbytes " ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġtrue Size ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdelete () Ġ{ ĊĠĠĠĠĠ Ġdelegate . delete () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġread ( buffer Size Bytes : ĠInt ): ĠFlow < ByteString > Ġ{ ĊĠĠĠĠĠ Ġreturn Ġdelegate . read ( buffer Size Bytes ). limit Size ( size Limit Bytes ) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠFlow < ByteString >. limit Size ( size Limit Bytes : ĠLong ): ĠFlow < ByteString > Ġ{ ĊĠ Ġvar Ġsize Ġ= Ġ 0 L ĊĠ Ġreturn Ġon Each Ġ{ ĊĠĠĠ Ġsize Ġ+= Ġit . size () ĊĠĠĠ Ġrequire ( size Ġ<= Ġsize Limit Bytes ) Ġ{ Ġ" Ex ceeds Ġmaximum Ġallowed Ġsize Ġof Ġ$ size Limit Bytes Ġbytes " Ġ} ĊĠ Ġ} Ċ } Ċ