Files
boc/aamos-ledger-rust/target/debug/deps/libtower-b162028a41a7f1f9.rmeta
T

2262 lines
714 KiB
Plaintext
Raw Normal View History

rust
& #rustc 1.96.0 (ac68faa20 2026-05-25)ÁÀ뉊]!ÜÛê(¹Þ—šên-5be7b69c3ff7b5b8ÁíàÄTËŸ ÜJîÄ)'ß\¥!-3d1337db07d0b3aeÁ¤²XctÔ'ÐÓ©z¨ɽÓ-a4945860e1c53b00Á¤°ð ¾ä-±($²ï=©Ã-7e98a21bfd32b0edÁòÖÀH•‘PIÓHã#£-055f30b747f859b6Árustc_std_workspace_coreÁ­Cçß^ò½èÝ$­Çÿ+Cé-c4878ee60b2242c9ÁŸÃï+Ñ]ŠqB<ÏïW#-8dd1dd90e70d0b6aÁ miniz_oxideÁ€š»J(P>àö÷g\K-1eb618da2918ab7fÁadler2ÁÆ;+Þ®5¥Ìýݰ¦ÛLˆ-f7919172d268e069Á hashbrownÁPäV9ÒÆèÜ"ÊÖVŽ\-0fc2184a5da6723aÁrustc_std_workspace_allocÁs&ØòØy¯s•bæ!‰ýŠ-97e4bf30be240674Á
std_detectÁhŠBîÙºÌI®ËÅš-9dbbf8346ba7ac8bÁrustc_demangleÁûë9´Ç×@Œ’ùXFº-f33013f239bf9f14Ácfg_ifÁÜLhž§Œaã¯>­-0a71c8f33a838301Á addr2lineÁ׎Þ!]8V$É@@-e618e6be60e87ba2ÁgimliÁ¸
°µ~Î1‹Ñt ðÁ€w-1f7768a68858f670ÁobjectÁ
áPÃ?­À¶¼QHJ¥-914cd6a4dbe590d1ÁmemchrÁ›º«8Ór­2Ù $¨ûib-cf21ca6f2bb15dcdÁë
‹ás«LÖ€îâƒ×ɯŒ-ee6f3747e38367f0ÁtokioÁ,¿¢¨˜É0!ñ?-…”¼9-3beca82a6f76b5d4Ápin_project_liteÁ·x¼+Ä`·á¨›t—¸Íœ-2dc344ecc91b59efÁmioÁGùj0ðÔ·â"FÆ#0Q-3545320490828222Áæ\‹±ÔcdùÀTƒ-f86f80b348d33b13ÁbytesÁ`²['3_²µÆ=üå¥-d4f44708ed5da7b6Ásocket2ÁsT›¸n>~RÊ1G/R-c161f09f0083d1e0Á
tower_serviceÁ:`¡{¶aÛ¬í"aô-3b2010b03e380b78Á tower_layerÁX*ø6êWHNᕈf§-ee72e88a461fccddÁ futures_coreÁÆöc$޳–º¾v¸dK-ac1e9cdb826f83c0Á futures_utilÁNdpµÙærC˜ÊÉíNá-c6fee091c887f5ffÁ futures_taskÁÀð‘ôRî-Ø¡±ê¹-b68ad6d97da04350Á futures_sinkÁL1T𽉤
¾
Èþ.-14e3b8a05e30b9eeÁslabÁ³=E–¿Ü;Ö¾t,)ã(-82737aed38d266b2Á
futures_ioÁTo«Š§ J­íZu\Ȩ-94612345b0215f77Áì­†°<šÒ"®9eæ·3š¶Ø-809318e8f6183885Á sync_wrapperÁTÃ@Oø~:åÍžêƒE¦«-fb4745e3f4df95dbÁbalanceÁ<»9»Û
œ9bufferÁ4ç9»ø
”Ê9discoverÁD”:»¤õ9filterÁ4Á:»²”¤:hedgeÁ,ë:»ÎŒÏ:limitÁ,”;»éŒø:¬$¼;»¬„¡; load_shedÁLè;» load-shedÁ¬È;makeÁ$•<»Â„ú; ready_cacheÁ\Ã<» ready-cacheÁ¼¡< reconnectÁLö<»ˆ¬Ö<testsÁ,™0$Ž0)§,×1$Ì1p _obj_safeÁLì spawn_readyÁ\Ò=» spawn-readyÁ¼°=steerÁ,>»šŒå=Ó§,‡,$ü+ù
sample_floyd2Álß»Û
œ»ù§ MakeServiceÁ\ªA»Â„Ã@sealedÁ4ûB»Û
œ¸B»¤ÍB»Â„ãBü·B=ÀmacrosÁ
opaque_futureÁretryÁbackoffÁ MakeBackoffÁBackoffÁ make_backoffÁÖFutureÁ next_backoffÁ£æ £Öä£baseÁjitterÁ£þ#>%×budgetÁ(
tps_budgetÁ)))))))))) ) TpsBudgetÁ4
generationÁ4reserveÁ4slotsÁ4windowÁ4writerÁ4deposit_amountÁ4withdraw_amountÁ)<æ <expireÁ<sumÁ? <putÁ<try_getÁ)CdepositÁCwithdrawÁ)F>)H×((BudgetÁK¦K´futureÁNNNNNNNNNN N
NZ¡Z¤ZRequestÁZæ N_¡_¤_Â_°_Š layerÁeeeh¡hæ ek¡k¤kServiceÁkþpolicyÁppPolicyÁrReqÁrResÁrrþrŽr
clone_requestÁ¡¤æ get_refÁget_mutÁ
into_innerÁˆ¡ˆ¤ˆÂˆResponseÁˆErrorÁˆþˆ
poll_readyÁˆÑtimeoutÁerrorÁæ ˜×÷¥¥¥æ ¨¨¥¨¨°¨Š þ®®®®²æ ®´¤´´þ¿¥¿æ ¿ã¿ò¿Å¤ÅÂůſÅþÅÔÅÑutilÁÍÎÎÎÎÎÎÎÎÎÎ Î
Î ÎÛ¤ÛÛ×ÎßF1ÁßF2ÁßŸßæ Îäíä÷äŸä×Îéíé÷éŸé°éŠ Îï¤ïïæ ïþÎô¤ôôÂôFutÁô¯ô¿ôþôÔôÑÎþþæ ΤþÍboxedÁþBoxLayerÁInÁ¥¦"ß"¥¦æ  žß"ž¥ž¦žžžþ¥ß"¥¥¥¦¥¥ƒ«ß"«¥«¦««× layer_cloneÁ±±±±±±±±±BoxCloneServiceLayerÁºß"º¥º¦ºº’"±Àß"À¥À¦ÀÀæ ÅÅ ±Èß"ȥȦÈÈÈþ±Ïß"ϥϦÏσ±Õß"Õ¥Õ¦ÕÕ×layer_clone_syncÁÛÛÛÛÛÛÛÛÛBoxCloneSyncServiceLayerÁäß"ä¥ä¦ää’"Ûêß"ê¥ê¦êêæ ïï Ûòß"ò¥ò¦òòòþÛùß"ù¥ù¦ùùƒÛÿß"ÿ¥ÿ¦ÿÿ×ç 
  
BoxServiceÁ¥¦innerÁ BoxFutureÁ˜¥˜¥¦æ Ÿ¤Ÿ þ¢¤¤¥¤¦¤¤¯¤¿¤þ¤Ô¤Ñ­¥­¦­­×unsyncÁ²²²²²²²²²² ²
²UnsyncBoxServiceÁ¾¥¾¦¾¾Þ*²UnsyncBoxFutureÁÃ¥Ã²Æ¥Æ¦ÆÆæ ʤÆþ̤²Î¥Î¦ÎίοÎþÎÔÎѲץצ××ײܤÜÂܯܿÜþÜÔÜÑÍ boxed_cloneÁêêêêêêêêêê ê
êBoxCloneServiceÁö
ö¥ö¦ööˆêü¥ü¦üüæ ¤ üþƒ¤ê¥¦¯¿þÔÑêŽ¥Ž¦ŽŽƒê CloneServiceÁ£ clone_boxÁ꣥¬2êš¥š¦šš×Íboxed_clone_syncÁŸŸŸŸŸŸŸŸŸŸ Ÿ
ŸBoxCloneSyncServiceÁ«
«¥«¦««ˆŸ±¥±¦±±æ µ¤µ ±þ¸¤Ÿº¥º¦ºº¯º¿ºþºÔºÑŸÃ¥Ã¦Ãß2ȣȬ2ŸË£Ë¥Ë¬2ŸÏ¥Ï¦ÏÏ×Ícall_allÁÔžÕÕÕÕÕÕÕÕÕÕ Õ
ÕáSvcÁá¤á¢á×ÕDriveÁææis_emptyÁæpushÁæŠ Õëè6ë¤ë¢ëæ ëë take_serviceÁë unorderedÁÕóè6ó¤ó¢óó poll_nextÁÔorderedÁùùùùùùùùùù ù
ùè6¤æ ñ7…8ùŒè6Œ¤ŒŒ»8ù 7°7Š Ô…8 
¢è6¢¤¢æ ¢¢ñ7¨è6¨¤¨¨»8­­ 7­°7­Š ÔÔÔÍeitherÁµµµµµµµµµµ¿¿¿Â¿¯¿¿¿þ¿Ô¿ÑµÈÈȰȊ µÍ¤ÍÍÍÍþÍfuture_serviceÁÓÓÓÓÓÓÓÓÓ¨=ÜܤܣÜÓáá¤áæ Óåå¤å×Óéé¤é×Óíí¤í£íí¯í¿íþíÔíÑÍÙ÷÷÷÷÷÷÷÷÷÷¤×÷¤æ þ÷Š¤ŠŠÂŠ¿Š¯Š¿ŠþŠÔŠÑ÷æ ÷¤þÍ map_requestÁœœœœœœœ£¤££×œ§¤§§æ §þœ¬¤¬¬R1Á¬R2Á¬¯¬¿¬þ¬Ô¬Ñœæ œ¹¤¹¹¹þÍ map_responseÁ¾¾¾¾¾¾¾¾¾¾È¤ÈÈ׾̤ÌÌæ Ìþ¾Ñ¤ÑÑÂѯѯѿÑþÑÔÑѾÛÛæ ¾Þ¤ÞÞÞþÍ
map_resultÁããããããããããí¤íí×ãñ¤ññæ ñþãö¤ööÂö¯ö¿ö¯ö¿öþöÔöÑãæ ã¤þÍ
map_futureÁ¤æ þãòš£š¤šš¥šš¥!š¯š¿šþšÔšÑ¦¤¦¦×ªªæ ­¤­­­þ²²×ÍoneshotÁµµµµµµµµµµ µÀ¤ÀéÀ not_readyÁÀcalledÁµÅ¤ÅéÅ׵ɤÉéÉæ µÍ¤ÍéͰ͊ ÍoptionalÁÒüÓÓÓÓ׿ ÓÙ×ÓÒ÷ÜÜÜÜÜÜÜÜÜå¥åæ Üèè¥èè°èŠ ÒÒÒÒÒÒó¥óæ õÂÒ÷¥÷Â÷¯÷¿÷þ÷Ô÷Ñþ ÍreadyÁ 
 ReadyOneshotÁŒ¥ŒÂŒÞ*Œ_pÁ¥Â¥Âæ ˜¥˜Â˜°˜Š ¥Â×È¡
¡'aÁ¡¥¡Â¡ˆ§¥§Âª‡Pª¥ªÂªæ ¯‡P¯¥¯Â¯°¯Š µ¥µÂµ×Í
service_fnÁ¹¹¹¹¹¹¹­QÀ¥¹Â¥Â׹ťÅÅÂÅ£ÅůſÅþÅÔÅÑÍthenÁÐÐÐÐÐÐÐÐÐÐ Ð
ÐܤÜÜ×Ðà¤ààæ àþÐå¤ååÂå¯å¿å¥!å¯å¿åþåÔåÑÐññæ Ðô¤ôôôþÍrngÁùùùùùùùRngÁnext_u64Ánext_f64Á
next_rangeÁù£§Uùæ ù>ù   with_hasherÁùŽ Ž §UÍÍÍÍÍÍÍÍÍÍ Í
Í Í Í
ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ Í!Í"Í#Í$Í%Í&Í'Í(Í)Í*Í+Í,Í-Í.ÍüÀ Í÷       Í
ServiceExtÁÊ ÂÊ ŒNÊ 
ready_oneshotÁÊ ˆJÊ ”6Ï ¤Ê Ñ Ê ®CÓ Ó ¯Ê ÙÖ Ö ¿Ê ¸EÙ Ù ¯Ù ¿Ê °AÝ Ý 
NewRequestÁÊ ×Rà à ¯à ¿à ¥!Ê ÈGå å ¥!å ¯å ¿Ê "Ê Þ/Íì ¥ì ÂÍ option_layerÁï builderÁñ ñ ñ ñ ñ ñ ñ ø >ñ ú æ ñ ü ü þþ ¥ü ¥[
¥ü layer_fnÁ
ü Ž
¡ü íü °A

¸B
ÂBü ®C
ü Ù
ü ÈG
ü ×R
ü 
ü ¸E
ü ü serviceÁ˜
¤ü ­Qš
ü  check_cloneÁü check_service_cloneÁ
¤ü 
check_serviceÁŸ
¤Ÿ
¥Ÿ
¦Ÿ
ü "¤
¤¤
£ü Þ/§
¤§
£ü ÿ2ª
¤ª
£ñ ­
­
×ñ °
¤°
°
°
þþµ
µ
µ
µ
µ
ûº
º
º
BoxErrorÁExponentialBackoffMakerÁÅ
£Å
minÁÅ
maxÁÅ
ßÅ
óTË
£Ë
×Î
£Î
ƒExponentialBackoffÁÑ
£Ñ
þ`Ñ
‰aÑ
ßÑ
óTÑ

iterationsÁ Ø
£Ø
×
Û
£Û
ƒInvalidBackoffÁÞ
Þ
ˆ á
×)
GenerationÁã
Öã
timeÁ)æ
×NResponseFutureÁè
¡è
¤è
Âè
requestÁè
Žè
ºNï
¡ï
¤ï
Âï
×Nô
õ
¡õ
¤õ
Âô
__assert_not_repr_packedÁù
¡ù
¤ù
Âô

ProjectionÁý
'__pinÁý
¡ý
¤ý
Âý
Ócý
Žý
ºô

ProjectionRefÁ ƒe ¡ ¤ Â Óc Ž ºõ
projectÁ ƒeõ
 project_refÁ ƒeô
__OriginÁ ƒe ¡ ¤ Â __dummy_lifetimeÁ Óc Ž ºô
š ƒeš ¡š ¤š Âô
MustNotImplDropÁô
  ¥ô
¢ ¡¢ ¤¢ ÂNStateÁ¦ ¦ ¡¦ CalledÁ© ÷¦ WaitingÁ« waitingÁ¦ RetryingÁ­
N¯ ¯ ¡¯ ×N StateProjÁ³ ƒe³ ³ ¡³ ¢h· ÷³ ¸h¹ Çh³ Öh»
N½ ¾ ¾ ¡¾ ŽfÁ ƒe½ Àfà ƒeà à ¡Ã ðfà ¢hà ¸hà Öh½ Ë ƒeË Ë ¡½ Åg½ Ð ¥½ Ò Ò ¡e
RetryLayerÁÕ ¡Õ ËeØ ¡Ø ×eÛ ¡Û ƒRetryÁÞ ¡Þ ¤Þ ËÞ ë]ã ¡ã ¤ã ƒç ¡ç ¤ç ×ë ì ¡ì ¤ë ¹dï ¡ï ¤ë ñdò ƒeò ¡ò ¤ò Ëò ë]ë Áeø ƒeø ¡ø ¤ø Ëø ë]ì Žfþ ƒeì ¥f ƒeë Àf ƒe ¡ ¤ ðf Ë ë]ë  ƒe ¡ ¤ë Ågë Ž ¥ë  ¡ ¤ElapsedÁ
 ˆ ט >¥cš ¥š responseÁš sleepÁž ¥ž ס ¢ ¥¡ ¹d¤ ¥¡ ñd¦ ƒe¦ ¥¦ ²o¦ Âo¡ Áe« ƒe« ¥« ²o« Âo¢ Žf° ƒe¢ ¥f² ƒe¡ Àf´ ƒe´ ¥´ ðf´ ²o´ Âo¡ º ƒeº ¥¡ Åg¡ ¾ ¥¡ À ¥® TimeoutLayerÁ í®Ä ×®Æ ƒTimeoutÁÈ ¥È Þ*È íÌ ¥Ì ×Ï ¥Ï ƒÎAndThenÁÒ ¤Ò Ò Þ*Ò ±Î× ¤× × ƒÎ
AndThenFutureÁÛ íÛ ÷Û ŸÛ Þ*Îà á íá ÷á Ÿà ¹då íå ÷å Ÿà ñdé ƒeé íé ÷é Ÿé Þ*à Áeï ƒeï íï ÷ï Ÿï Þ*á Žfõ ƒeá ¥f÷ ƒeà Àfù ƒeù íù ÷ù Ÿù ðfù Þ*à 
ƒe
í
÷
Ÿà Ågà 
¥à ˆ
íˆ
÷ˆ
ŸÎ AndThenLayerÁŒ
Œ
±Î 

ƒÎ


ײ UnsyncBoxedÁ
¤
Þ*²˜
¤˜
×ÕCallAllÁ
è6
¤
¢
ë]
streamÁ
queueÁ
eofÁ
curr_reqÁÕ¤
¥
è6¥
¤¥
¢¤
¹d©
è6©
¤©
¢¤
ñd­
ƒe­
è6­
¤­
¢­
ë]­
ïw­
ýw­
Šx­
•x¤
Áe·
ƒe·
è6·
¤·
¢·
ë]·
ïw·
ýw·
Šx·
•x¥
ŽfÁ
ƒe¥
¥fÃ
ƒe¤
ÀfÅ
ƒeÅ
è6Å
¤Å
¢Å
ðfÅ
ë]Å
ïwÅ
ýwÅ
ŠxÅ
•x¤
Ð
ƒeÐ
è6Ð
¤Ð
¢¤
Åg¤
Ö
¥¤
Ø
è6Ø
¤Ø
¢ùÀwÜ
è6Ü
¤Ü
Þ*ùà
è6à
¤à
×ùä
å
è6å
¤ä
¹dè
è6è
¤ä
ñdë
ƒeë
è6ë
¤ë
Þ*ä
Áeð
ƒeð
è6ð
¤ð
Þ*å
Žfõ
ƒeå
¥f÷
ƒeä
Àfù
ƒeù
è6ù
¤ù
ðfù
Þ*ä
ÿ
ƒeÿ
è6ÿ
¤ä
Ågä
¥ä
è6¤CallAllUnorderedÁè6¤Þ*è6¤×è6¤¹dè6¤ñd˜ƒe˜è6˜¤˜Þ*Áeƒeè6¤Þ*Žf¢ƒe¥f¤ƒeÀf¦ƒe¦è6¦¤¦ðf¦Þ*¬ƒe¬è6¬¤Åg±¥³è6³¤µEitherÁLeftÁ¹
¹ˆRightÁ¼
¼ˆµ¿¿¿ƒµÃÃµÆÆÆ×µEitherResponseFutureÁÊÊʵÎÏÏιdÒÒÎñdÕƒeÕÕÕÎÁeÚƒeÚÚÚÏŽf߃eÏ¥fáƒeÎÀfãƒeãããðfãÎéƒeééÎÅgÎî¥ÎððµKindÁóóóöÞ*óÏøÞ*µKindProjÁúƒeúúúþÞ*úÏÞ*µƒƒƒŽfƒeÀfˆƒeˆˆˆðfˆˆÏƒeÅg¥Ó
FutureServiceÁ¤ºÓ¤ƒÓ…h¡¡¤¡þ¤
¤ˆ¡§
§ˆÓªª¤ªƒ÷MapErrÁ®¤®®Þ*®±÷³¤³³ƒ÷ MapErrLayerÁ··±÷ººƒ÷½½×÷ÀÀŸÀæ ÷ ÄÄŸÄ×÷
ÈȟȰȊ ÷ MapErrFutureÁÍÍŸÍÞ*÷ÑÒҟѹdÕÕŸÑñd؃eØØŸØÞ*ÑÁe݃eÝÝŸÝÞ*ÒŽfâƒeÒ¥fäƒeÑÀfæƒeææŸæðfæÞ*ÑìƒeììŸÑÅgÑñ¥ÑóóŸœ
MapRequestÁö¤ööÞ*ö±œû¤ûûƒœMapRequestLayerÁÿÿ±œƒœ×¾ MapResponseÁˆ¤ˆˆÞ*ˆ±¾¤ƒ¾MapResponseLayerÁ±¾×¾ƒ¾ššŸšæ ¾ žžŸž×¾
¢¢Ÿ¢°¢Š ¾MapResponseFutureÁ§§Ÿ§Þ*¾«¬¬Ÿ«¹d¯¯Ÿ«ñd²ƒe²²Ÿ²Þ*«Áe·ƒe··Ÿ·Þ*¬Žf¼ƒe¬¥f¾ƒe«ÀfÀƒeÀÀŸÀðfÀÞ*«ÆƒeÆÆŸ«Åg«Ë¥«ÍÍŸã MapResultÁФÐÐÞ*бãÕ¤ÕÕƒãMapResultLayerÁÙÙ±ãÜÜ×ãß߃ãââŸâæ ã ææŸæ×ã
êêŸê°êŠ ãMapResultFutureÁïïŸïÞ*ãóôôŸó¹d÷÷ŸóñdúƒeúúŸúÞ*óÁeÿƒeÿÿŸÿÞ*ôŽfƒeô¥fƒeóÀfˆƒeˆˆŸˆðfˆÞ*óŽƒeŽŽŸóÅgó¥óŸ MapFutureÁ˜¤˜˜Þ*˜±¤ƒMapFutureLayerÁ¡¡±¤¤ƒµOneshotÁ§¤§é§ºµ«¤«é«×µ¯°¤°é¯¹d³¤³é¯ñdƒe¤éº¯Áe»ƒe»¤»é»º°ŽfÀƒe°¥fƒe¯ÀfăeĤÄéÄðfĺ¯ÊƒeʤÊé¯Åg¯Ï¥¯Ñ¤Ñéµ…hÔ¤ÔéÔNotReadyÁ×svcÁ×reqÁÔ¢hÚfutÁÔDoneÁÜ
µ†iÞƒeÞ¤ÞéÞ×›âç›âò›Þ¢h兜ޜç
µéê¤êéêŽfíƒeéÀfïƒeï¤ïéïðfï×›ï¢hïœé÷ƒe÷¤÷ééÅgéü¥éþ¤þéÓ©
ˆÓ×Ü¥c¥Þ*Ü¥×ÜŒ¥Œ¹d¥Œñdƒe¥Þ*ŒÁeƒe¥Þ*Žfƒe¥fƒeŒÀfƒe¥ðfÞ*Œ¢ƒe¢¥ŒÅgŒ¦¥Œ¨¥ÒOptionalÁª¥ªÞ*Ò­¥­×¹ ServiceFnÁ°¥°±¹³¥¹µ¥µƒÐThenÁ¸¤¸¸Þ*¸±Ð½¤½½ƒÐ ThenLayerÁÁÁ±ÐÄÄ×ÐÇǃÐÊíÊ÷ÊŸÊæ Ð ÏíÏ÷ÏŸÏ×Ð
ÔíÔ÷ÔŸÔ°ÔŠ Ð
ThenFutureÁÚíÚ÷ÚŸÚÞ*Ðßàíà÷àŸß¹däíä÷äŸßñdèƒeèíè÷èŸèÞ*ßÁeîƒeîíî÷îŸîÞ*àŽfôƒeà¥föƒeßÀføƒeøíø÷øŸøðføÞ*ßÿƒeÿíÿ÷ÿŸßÅgߥßí÷Ÿù HasherRngÁhasherÁcounterÁùƒù×ñ ServiceBuilderÁþñ ˜˜ƒ




"
&
&
&
>
?
A
B
D
E
I
I
I
L
M
d
d
d
o
w
w
w
x
x









­
­
­
·
Â
Ã
Ë
Ë
Ë
Ì
Þ
Þ
Þ
è
è
è
î
î
î
ü
ü
ü
ý

¤
ª
°
°
°
Î
Ô
Ú
Ú
Ú
ø
þ



«
«
«
¬
±
±
±
Õ
Õ
Õ
Ö
Û
Û
Û
â
â
â
ã
Œ
Œ
Œ




ž
ž
ž
Á
Á
Á
Â
Ç
Ê
Î
Ó
Ó
Ó
å
å
å
è
é
ê
ê
ê
ñ
ø
ø
ø
Š








§
¬
¬
¬
¯
°
±
±
±
Æ
Æ
Æ
Ç
Ì
Ì
Ì
Ò
è
è
è
ì
ì
ì
õ
õ
õ
ö








¦
¦
¦
´
´
´
µ
½
Ë
Ë
Ë
Ù
Ù
Ù
Ú
â
ð
ð
ð
ÿ
ÿ
ÿ

ˆ

˜
¤
¤
¤
¥
©
©
©
±
´
´
´
È
È
È
Ñ
Ñ
Ñ
Ú
Ú
Ú
í
í
í
ý
ý
ý
þ
œ
œ
œ
 
 
 
§
´
´
´
µ
¸
¸
¸
Ä
Ä
Ä
Î
Î
Î
Ï
ß
ß
ß
ï
ï
ï
ð
ø


ƒ


Ì
˜
¯
¯
¯
´
Í
Í
Í
Ð
Ú
Ú
Ú
Ý
â
â
â
ç
ç
ç
ó
ó
ó
ù
²
²
²
Ú
Ú
Ú
Ý
æ
ê
ê
ê
ï



 
 
 
¤
Å
Å
Å
Ç
Î
Î
Î
Ñ
Ú
å




š
š
š
©
ã
ã
ã
è




Â
É
É
É
Ò
 
­

¼
¿
¿
¿
Ç
Ç
Ç
Ì
Ì
Ì
Õ
þ









¡
¡
¡
¦
¦
¦
¯
Ø
Þ
Þ
Þ
á
é
é
é
î
î
î
÷
 
¦
®
®
®
³







¯
¯
¯
·
À
Æ
Æ
Æ
É
Ó
Ó
Ó
Ù
Ù
Ù
ä




š
 Ï r ½
ÈÕ
惰íðÊÎû¥€ Ê ¿cÅ
Å
×`Ç
þ`È
‰aÉ
ßÊ
óTÇ<žÕÉPx£Ø•¹¿cÑ
Ñ
ËaÓ
þ`Ô
‰aÕ
ßÖ
óT×
b,\»Dã¹Øû¹•¹û¹³Å
Å
×`Ç
þ`È
‰aÉ
ßÊ
óTÇ<žÕÉPxꦃ§ùŽ‘§ùþ-<ª Xô§ÖJÖJ RandomStateÁ×Jk0ÁˆØJk1Áˆ‰ÌkqÇËŸ¿cÞ
Þ
ß
Æbà
ˆ l.E9›ž°wÄcÙ¼¾Ù¼¿cã
ã
ôbä
Ö)å
Žc)§Êž¬b¹'K44ä5ô)6)7)8Ÿ)9¬):¹);Î)BêRL_œÓ³å½¿c彿cè
è
¥cì
ÓcNí
ŽNî
ºNÁ<ƒ¢…"8‡¡¤Â“íè
è
¥cì
ÓcNí
ŽNî
ºNÁ<ƒ¢…"8‡¡¤ÂŸ ¥Ÿ 辿c¦ © ¢hª ÷N« ¸h¬ ÇhN­ ® Öh߇ŒVJRù_ˆÀ“í¦ © ¢hª ÷N« ¸h¬ ÇhN­ ® Öh߇ŒVJRù_¡Ï ¡ÀÏ ¹À‚Øè¾¿cÕ Õ k× Ëe†ÂûE#㫿بÂڨ±¿ØÞ Þ Öká Ëâ ë]®5ŒÊ~Ö¼o«¿±¿¿cú“íÞ Þ Öká Ëâ ë]®5ŒÊ~Ö¼oˆÀŽÀ ¡À úÂú·¿¿c   ín ˆ ,‚ÌE,³¢³¸ÄÄc¸Ä¾¸Ä¿cš š ¥cœ ²o Âoˆy‰8÷‚?è¡À“íš š ¥cœ ²o Âoˆy‰8÷‚?襽 ¡À½ ’łؚ š ¥cœ ²o Âoˆy‰8÷‚?èÁ¿c  ßqà í®1„8µ~Ú4²ØûÆÚûƤ¿cÈ È •rÊ Þ*Ë í<òg%¨×Û
¡ÀØÌÇÈ È •rÊ Þ*Ë í<òg%¨×Û
¿ÇÂØÒ Ò ærÕ Þ*ÎÖ ±Î”¼ùkÛÅ2¿ÇóÁ¿cæÈ“íÛ Û ²sß Þ*ÎL59bÚšEší÷Ÿ
¡À
Û Û ²sß Þ*ÎL59bÚšEší÷Ÿ¿cÊ‚ØÊØŒ
Œ
ºvŽ
±Î)uófbs$ðÁ¿cëÊæÈ·¿ÚŒ
Œ
ºvŽ
±Î)uófbs$ðóÁ¿ÇÚÏ""º.TÓ¼H…¯ß"’Ʀ¨ÌØúË¿cúËÚºº%¿"±D–µÙPç¨Ì’Æ²Ì¸Ì¨ÌØßÌ¿cßÌÚääÚ'é"Û§=ýý*'¨Ì’Æ²Ì¸Ì¨ÌØ¾Í¿c¾Í´*Þ*¹~–Fp¾¡À¦¡À¿cœÎ¿c

ˆw
Þ*²£²íoõ÷¿Ç¾¾ý,ÂÞ*²œ†Ôÿ ¡ÀÎÎÔΡÀ¿c¨ÏðÎÙÈöö÷¨0ûˆê bßd”?S¡ÀÎÎÔΡÀØ…Ð’Æã¹¿c…Ы«¬Î3°ˆŸ ÜyKךL€¡ÀÎÎÔΡÀØòÐÈ’Æã¹¿còГí

ÀwŸ
ë]Õ 
ïwÕ¡
ýwÕ¢
ŠxÕ£
•xÕ`þ¨mqš4è6ŽÀ¢Õ
¡ÀÕ


ÀwŸ
ë]Õ 
ïwÕ¡
ýwÕ¢
ŠxÕ£
•xÕ`þ¨mqš4è6±¿¢¿cáÒEáÒ¿cÜ
Ü
Àwß
Þ*ùy¿ ãü‰j3¿Ó±¿“íÜ
Ü
Àwß
Þ*ùy¿ ãü‰j3¿ÒŽÀƒ¡ÀƒëÓEëÓæå å FuturesOrderedÁç in_progress_queueÁ¿ è queued_outputsÁ¿ é next_incoming_indexÁ¿ ê next_outgoing_indexÁ¿ ž
¹ýy[mÁÁ¿c°~ŒÞ*oq:¬Ä|r¿Ó±¿“í°~ŒÞ*oq:¬Ä|r¿ÒŽÀ°¡À°ºÖEºÖæé"é"FuturesUnorderedÁë"ready_to_run_queueÁŽ!ì"head_allÁŽ!í"
is_terminatedÁŽ!/9¸Ö‰ÁÁعº»ˆ¼½Ï¾ˆ ÊöÞ‚‚œŠ áØ¿cáØáØ·¿“íÊʸ‚͵݅6{eJøÉí¡ÀíÊʸ‚͵݅6{eJøÉ«Ù±Ù“íóö÷Þ*µøÏùÞ*µ&mi·~’Ú˜Ú¡Àóö÷Þ*µøÏùÞ*µ&mi·~«Ù±Ù‚ذÚÚ¹º»ˆ¼½Ï¾ˆ ÊöÞ‚‚œ’Ú˜Ú¿ÇØ¼‡œºÓ(Ë—œ†UÁ±¿¿c‘ÝØ¡¤¥þ¦ˆÓ§¨©ˆÓ£»%²¤Æ1Á±¿¿cÚݑݣخ®åˆ±Þ*÷²±÷^Ýð—î¿ÇóÁ¿cÒÞØ··°‰¹±÷¼¥ëxD%¿Á¿c§ß“íÍÍÜŠÐÞ*÷{äh¬;~7©óÁÇÊð¡ÀðÍÍÜŠÐÞ*÷{äh¬;~7©ÁŸ¿c¶à‚ضàÒÞ·¿Ú··°‰¹±÷¼¥ëxD%¿óÁ¿ÇØöö£ùÞ*œú±œÚëó‰Vh0…¿ÇóÁ¿cÙáÙá¸BØÿÿò±œàF¾&î@ë„Á¿c¾âÚÿÿò±œàF¾&î@ë„óÁ¿Ç؈ˆÃŽÞ*¾Œ±¾PÓ÷Ì_iD¿ÇóÁ¿cÁã¿c±¾ÅÛ@>FgÏÁØ–ä“í§§ÄªÞ*¾OK›FPóÁÇÊÊ¡Àʧ§ÄªÞ*¾OK›FPÁéà¿c¥å‚Ø¥åÁã·¿Ú±¾ÅÛ@>FgÏóÁ¿ÇØÐÐÓÞ*ãÔ±ãÈ›Ñ>†H¿ÇóÁ¿cÆæ¿cÙÙÞ“Û±ãb8…ÎýÁØ›ç“íïïòÞ*ãÐvKΨ}ùóÁÇÊ¡ÀïïòÞ*ãÐv
ËÊ'¿ÇóÁ˜˜×—Þ*œ±šdMo
ËÊ'±¿ã¹¿cË騡¡¥˜£±Õ‡Ç‚¥ÁÚ¡¡¥˜£±Õ‡Ç‚¥óÁ¿Ç¿cïê¿c§§à˜ªºµ2 ! 19¾¿Çé“í§§à˜ªºµ2 ! 19¾±¿éΡÀÎòë“íÔ××›Øç›µÙò›µÚ¢hÛ…œµÜÝœaTZ*eN±¿æìû¡ÀûÔ××›Øç›µÙò›µÚ¢hÛ…œµÜÝœaTZ*eN¿Ç¥ì¿c‹î‚Øòë¿c©ƒˆÓ N QöŽ*ÕÄc˜ï¾˜ï¿c¥cˆÞ*Üçk;ôï|¡À“í¥cˆÞ*Üçk;ôï|’Æ¥¡À¥çï‚Ø¥cˆÞ*Üçk;ôï|Á¿cªªâ ¬Þ*Ò–¸Èúêlóð¡ÀªñÙȓ파ÐNÞ*üN 4#WR.¡ÀÙÈ‚Øóñ¿cóñ“í¡¡¢È¦ˆ ›Mëó´“*8’Æ·¿‚Ø¡¡¢È¦ˆ ›Mëó´“*‡P’Æ·¿¿cÔòŠ °°—¡²±¹×èСÀØíó¿cíóíó·¿Ø¸¸Ú¡»Þ*м±ÐwnA!+Z”5¿ÇóÁ¿cËô¿cÁÁ£¢Ã±Ðx,²·›½ˆÁØ õ“íÚÚå£ÞÞ*ÐÐ!Ëô/ÞR¢éÉïÉõÉ¡ÀÚÚå£ÞÞ*ÐÐ!Ëô/ÞR¢»ÊÁÊÇÊ¿c³ö‚سöËô·¿ÚÁÁ£¢Ã±Ðx,²·›½ˆóÁ¿ÇžBoxÁ¡ˆˆ¢ˆl }.xÏã¹çEçEèEGlobalÁ ¿±‡§í#Øê¦ƒ§ùŽ‘§ùþ-<ª Xô§¿cÐø³Ì»ÐøÊ ¡ÀÙÈØʧþñ ‚éX¹;9éè³ʧþñ ‚éX¹;9éèääIdentityÁåüNÅÝüdõ«Ò¿cÊùÚʧþñ ‚éX¹;9éè¿ÇË
Å
Ø
Ñ
á
Þ
æ
ã
H
è
¯ ¦ Ø Õ ç Þ  ž š Ä Â Ì È ÛÒ äÛ
Œ
«Õºÿä­˜

×¾šöÏ«á
à
Ü
Æåé¡®½·ÄÍ£öÿȈž§íÐÜÙæï¦˜²¡«§ÅÔ­ªŒµ¡Â°Ü¸ÄÁÏÚ­
Î
Å
Û
Ñ
Û Õ ã Þ Æ Â Ï È × Ò
Œ
¥ÏºùäŽö뿪¡³®º·ûöÿˆÕÐßÙ˜¤¡µ°½¸ÇÁ˜Å
Ñ
#Å
F  ø %Þ
˜ Ù'Þ
š ÛC è
Ë ¦ Þ º š
Û Ð

ÿ
Ü
¬éÊóìÍÆ§Žïʧ÷Ô¢Œ§¡ÿÚ  ¢ è
Ð Ò ¦ _è
¨š éÛ ÈÊÈÍ¢§êïͧ蘌¯¡ÔÚkÕ ´ Œ
žÈºòäÍ·¹ÿÞÙ­¡ôÁ°
Ž Þ ˆÞ ÅÈ ôÒ ¤Î¾Ü
öº«¿íŠ®¬öшöК˜÷ªÅ°å¸¾ À š
ˆ
Û ËÖ
Ø

ó
Ά
¨Ü
å ­é"±³Ã³°îðÊóñóÍËͧïÏѧüþÔ¦¨ÚŽ ì ¿c8á
ØÙ³Äc ¾K“íŸ Ï 
‚Ø
ÚS a
½ ~


ÈÕ
E
ľ
°Š 
í
ð
Ê

Î
û
¥


Ê ¬™ Õ «¿ ­´jüëI¨Â«¿«¿iË7<Ìû
 Þ «¿±¿ šüÁ
YúÂ
«¿
±¿
«¿±¿Ë&ë])Væ    èïü¹6¸ÄZ ÄË   â é ³ü•T ûÆ ­Ö­ÖDurationÁ®ÖsecsÁâ}¯ÖnanosÁâ}Zµ–²ª ‘Œ±í,‚
<‰
Ôø
È ¡À 
˜
Áü¸`
ÌÇ
¡À
‘Œ
¡À‘ŒÞ*&í)V ©  ¤Ÿ Ò ¿ÇóÁ ² ¹ òüìM æÈ$ ¿Ç óÁ  óÁ¿ÇÞ*&±)V ´ ”¥ Œ
Á  ½ üüA ëÊ$– Á  Áj±7   Û¼¿Ó ƒ
4


 Û¼±¿FüØ ’ 
¿Ó±¿ÉÓ
 é
ð
ïüýó áÒ”» ¿Ó<• ±¿ ÉÓ Û¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ¿Óh¿Ói±¿>ÉÓ4Û¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ³’oë]×ïwÚýwݬ¥ ¡Á±¿ ¹ü‹: Á±¿ ÄËäüÝn‘ÝÁÚÝœÁœ÷? ¼
,¿
œ³
®¿ÇóÁ Å
Ì
ˆü€L
ÒÞ
¿Ç,
óÁ 
óÁ¿ÇÞ*&±)V 
Œ„
·Á 

üÛ@
§ß
Á ì
Áj±7 ó¼ß ö¿ÇóÁ õüªü¬PÙá¿ÇóÁ Ç¿ÇóÁÞ*&±)V ެü
 ÿÁ ¸üÓ
D¾â
Á ä
Áj±7 ,‡ Äö ˆ¿ÇóÁ ÏüÃQÁã¿ÇóÁ ÞóÁ¿ÇÞ*&±)V ´ï Á ÝüÆE–äÁ ×Áj±7 á´Õ пÇóÁ êñôü¢OÆæ¿ÇóÁ ½óÁ¿ÇÞ*&±)V œ¤‹ ÙÁ ž¥ƒüâC›çÁ óÁj±7 ÊŒ¼ ˜¿ÇóÁ ÌÓü‰JËé¿ÇóÁ ¤¿ÇóÁŠÞ*&±)V ŽT‡ ¡Á ¬üÞ9ïêÁ ïÁk±7îóÜÝ Ô¿Ç¥ì ÷þÃüž`‹î¿Ç±Û¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡z٥칿ÇÚ™¦Ïç›lò›+Ť¶ Ô¿Ç¥ì ÉÐÄü„L‹î¿Ç¥ì …¨y…œB üœ ­· Û¼¥ì ºX
_„œ
ÿǥìtf »üÿ
H §¿Ç¥ì ÆÍüÊ
ƒÌòë
¿ÇÛ
¥ìã
‹î ¿Ç ™¦¥ìç›;ò›?{”¡ ª¡À ²¹õüˆ±ªñÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ¡Àþ«°Þ*}
l<— Û¼¡À ž ÙÈüøO Œ¡ÀÙÈ ÆÍüÉóñ¡Àþ«Æ¡ÀÆ PhantomDataÁFu\»ŸÄ­Ëë]Uy ,Œ† ¸¿ÇóÁ ãüÓJËô¿ÇóÁ îóÁ¿ÇÞ*&±)V î ÁÁ ð÷óü¹> õÁ ÊÁj±7

&üÇ> µú û ü¢i†úµúx Ì‹. Þ
ß
%Ù¼1 :A”\   $¸Ä07>ü‹
# ö¡ÀÎÎÔÎ%÷2…Ð>žæö¡ˆˆ¢ˆl }.xÏ¡À ¡À„¾„¾PinÁ†¾ ˜X$]È=„kt•žæö¡ˆˆ¢ˆl }.xς؃ØÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
ÎÎÔÎÌìø
¡ÀÔÎ ¡ÀÎÎÌìø¡©ü“' «¡ÀÎÎÔÎ%¬2òÐ>žæö¡ˆˆ¢ˆl }.xÏÈ¡À ¡À·µ
¡ÀÔÎ ¡ÀÎÎ ÌìøÅÌ «Ù±Ù º-áØ9«ÙAH,“ «Ù±Ù ½-áØ9±ÙAH4…! ¡Á±¿ ¥-ÚÝ9ÁAH<”! ¡Á±¿ ¨-ÚÝ9±¿AH| %˜ï18?üá
 ¡’Æ·¿#¢0¡¡¢È¦ˆ ›Mëó´“*’Æ·¿tŒŒÐNÞ*üN 4#WR. ’Æ·¿½ÄÍñ µ
Ä
À­QTë? À¿
ßXT÷?Ê À
ʧt¬@Á
LayerÁ,ÜAÚÂ
<ŠBÃ
ü‡DüÌ2/ `async fn(Request) -> Result<Response, Error>`Áÿú # OverviewÁúü–FC Tower is a library of modular and reusable components for buildingÁüÝ*' robust networking clients and servers.ÁˆúüŒJG Tower provides a simple core abstraction, the [`Service`] trait, whichÁü×OL represents an asynchronous function taking a request and returning either aÁü§PM response or an error. This abstraction can be used to model both clients andÁ servers.Áúü‰PM Generic components, like [`timeout`], [rate limiting], and [load balancing],ÁüÚIF can be modeled as [`Service`]s that wrap some inner service and applyÁü¤PM additional behavior before or after the inner service is called. This allowsÁüõTQ implementing these components in a protocol-agnostic, composable way. Typically,ÁüÊ2/ such services are referred to as _middleware_.Áýúü FC An additional abstraction, the [`Layer`] trait, is used to composeÁüÈ JG middleware with [`Service`]s. If a [`Service`] can be thought of as anÁü“
PM asynchronous function from a request type to a response type, a [`Layer`] isÁüä
PM a function taking a [`Service`] of one type and returning a [`Service`] of aÁüµ NK different type. The [`ServiceBuilder`] type is used to add middleware to aÁü„ 52 service by composing it with multiple [`Layer`]s.Áº úÔ¾  ## The Tower EcosystemÁÙ úüÝ -* Tower is made up of the following crates:Á
úä
 * [`tower`] (this crate)Á¼¬
 * [`tower-service`]Á¬Ä
 * [`tower-layer`]Á¤Ú
 * [`tower-test`]Áï
úüó
OL Since the [`Service`] and [`Layer`] traits are important integration pointsÁüÃKH for all libraries using Tower, they are kept as stable as possible, andÁüMJ breaking changes are made rarely. Therefore, they are defined in separateÁüÝFC crates, [`tower-service`] and [`tower-layer`]. This crate containsÁü¤EB re-exports of those core traits, implementations of commonly-usedÁüêMJ middleware, and [utilities] for working with [`Service`]s and [`Layer`]s.Áü¸OL Finally, the [`tower-test`] crate provides tools for testing programs usingÁTˆ Tower.Áú\— # UsageÁ£úü§OL Tower provides an abstraction layer, and generic implementations of variousÁü÷OL middleware. This means that the `tower` crate on its own does *not* provideÁüÇLI a working implementation of a network client or server. Instead, Tower'sÁü”FC [`Service` trait][`Service`] provides an integration point betweenÁüÛIF application code, libraries providing middleware implementations, andÁü¥GD libraries that implement servers and/or clients for various networkÁ protocols.Áüúü€OL Depending on your particular use case, you might use Tower in several ways:ÁÐúüÔKH * **Implementing application logic** for a networked program. You mightÁü MJ use the [`Service`] trait to model your application's behavior, and useÁüîNK the middleware [provided by this crate](#modules) and by other librariesÁü½IF to add functionality to clients and servers provided by one or moreÁü‡ protocol implementations.Áü§OL * **Implementing middleware** to add custom behavior to network clients andÁü÷LI servers in a reusable manner. This might be general-purpose middlewareÁüÄOL (and if it is, please consider releasing your middleware as a library forÁü”KH other Tower users!) or application-specific behavior that needs to beÁüà1. shared between multiple clients or servers.Áü’KH * **Implementing a network protocol**. Libraries that implement networkÁüÞGD protocols (such as HTTP) can depend on `tower-service` to use theÁü¦MJ [`Service`] trait as an integration point between the protocol and userÁüôPM code. For example, a client for some protocol might implement [`Service`],ÁüÅHE allowing users to add arbitrary Tower middleware to those clients.ÁüŽLI Similarly, a server might be created from a user-provided [`Service`].ÁÛúüßJG Additionally, when a network protocol requires functionality alreadyÁüª PM provided by existing Tower middleware, a protocol implementation might useÁüû FC Tower middleware internally, as well as as an integration point.ÁÂ!ú´Æ! ## Library SupportÁÝ!úüá!NK A number of third-party libraries support Tower and the [`Service`] trait.Áü°":7 The following is an incomplete list of such libraries:Áë"úüï"B? * [`hyper`]: A fast and correct low-level HTTP implementation.Áü²#JG * [`tonic`]: A [gRPC-over-HTTP/2][grpc] implementation built on top ofÁüý#PM [`hyper`]. See [here][tonic-examples] for examples of using [`tonic`] withÁdÎ$ Tower.ÁüÛ$<9 * [`warp`]: A lightweight, composable web framework. SeeÁü˜%DA [here][warp-service] for details on using [`warp`] with Tower.ÁüÝ%52 * [`tower-lsp`]: implementations of the [LanguageÁü“&+( Serv
Ä
À¥ ­Q¦ À¿
ßX¥ Ê À
ʧ¤ Á
ÿ½Ÿ ÚÂ
ž Ã

!!!¬€949Ôo»û»¼%»²”B»Â„Zü cünl| Š
  Õ,   +   œ, 8¸ & 8û$˜
ž8 8!, ©8Ð & ®8¼ ´, µ  Ã, ·8paramÁ,¸& ½8¼$ Ä Å Æ È, Ê8actualÁ& Ñ8´Ò% Ô*× Ú ÿ K8ò„ä'ô8 pin_projectÁ  ƒ ,   ˜+   , 8¸ 
8§8, ²8Ð  ·, ¸ ¹ À, º8à$ Á Â Ã Å + × Ø Ü8ÿ
Ù8Þ*& ó, õ8¥‚8 ¢, £ ¤ «, ¥8à$ ¬ ­ ®, °8Ð  µ,  · ¾, ¸8à$ ¿ À Á à Ö8Ñ Ô Ú88 Ü8æ ß â ñ8Þ*& è, ê8¥‚(ó8 û Ì8$  ¾8Þ*8 å, æ ç î, è8à$ ï ð ñ8Àó'ö8×ø'û8p8
ƒ, 8Ð  Œ,  Ž , 8à,$   ˜ š Ù
8 ¨8׫ ® Õ ¯8$ ´8± & · ¹8º8À¾'Á8×Ã'Æ8ˆ Ñ:8Ò Ô(×8ÀÚ'Ý8×ß'â8Í ë Ï
8± ý þ8 debug_tupleÁ\ÿ Š œ8ÔL‹   , 8Ð $— 8 £ ¸ ¤8ë ° ± ·7...Á ¹8finishÁ À Á8 è, é ê ñ, ë8à$ ò ó ô8Àö'ù8÷'8þ8
Š, Ž8Ð $ ,   œ, 8à,—$  ž Ÿ8$, »8¥‚& Â8ÀÄ'Ç8÷'Ï8þ$ × á ù !8!8° û ý, þ8¥‚4ÿ88À'Œ8÷'8þ4 œ'8°% ¥+ ³ ´ »8Ý8 É8Š  Ð 8& Õ8À×'Ú8ÿ
Ü'ß8ôá ä å8æ8 î$ ï8cxÁñ& ó õ8ö8Àú'ý8taskÁ$ÿ'ƒ 8k<…  Œ :8  ( 8À'˜ 8Ø’'ž 8·$   ¤ 8'© 8° ±  ³  ï  8 É 8Žf Ñ  Ò  Ó 8Þ* Ù 8Š  Þ  á 8¡’ß l=ü.+ Middleware for retrying "failed" requests.Á»ŽŒ‡=Ì=,£=(NepÞ ë kTŽÕ yÜrz¥ctËè
{õ‚|k<ŽÌ~·$—œØ|0üNK This module contains generic [backoff] utilities to be used with the retryÁTO layer.ÁZúü^MJ The [`Backoff`] trait is a generic way to represent backoffs that can useÁœ¬ any timer type.ÁÀúüÄ?< [`ExponentialBackoffMaker`] implements the maker type for Áü„NK [`ExponentialBackoff`] which implements the [`Backoff`] trait and providesÁüÓA> a batteries included exponential backoff and jitter strategy.Áúü™@= [backoff]: https://en.wikipedia.org/wiki/Exponential_backoffÁ<8Å
Ñ
Þ
ß
t<éÄcþ‚Ø­Ö Žc$¯‰U
ê¦ œUØ
Œßwœö[\¨M„º?A02¬›üß;8 Trait used to construct [`Backoff`] trait implementors.ÁÎìü›¾†ž†žÍ쎞´èžºžÑž¬èü·,) The backoff type produced by this maker.Á<íü«,ü„" Constructs a new backoff type.Ád® Žžž »
ŽžŒµüÛHE A backoff trait where a single mutable reference represents a singleÁü¤JG backoff session. Implementors must also implement [`Clone`] which willÁüïEB reset the backoff back to the default state for the next session.Á<¿†žüµ†ž†žÍ쎞ü¯ !‚Ø…£œ¼ …£ƒØý¢-•£!¦£ü¯ üÍKH The future associated with each backoff. This usually will be some sortÁl 
of timer.Á4´ ü‰
+üÖ .+ Initiate the next backoff in the sequence.ÁdŒ
œ œŽž…£

Žž
ü…4£Íìã¹ Šã¹µ•¹ü¸üÀ&# Create a new `ExponentialBackoff`.Áëú # ErrorÁƒúü‹)& Returns a config validation error if:Áœ¹ - `min` > `max`Á„Ñ
- `max` == 0Á´æ - `jitter` < `0.0`ÁÄ - `jitter` > `100.0`Á¬ž - `jitter` is NaNÁ¿‘Œ‘Œã¹Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
•¹Ù¼
ã¹þ`̉aéß4†óTüˆL£ü¥ ¦ÈØã¹•¹-/û¹ü†+d‰ •¹•¹ 
ã¹$›üù"£ü¥ þ¦û¹ü¢ ž žû¹‘Œ ª
ã¹ü×#<4Ú#Ÿ Ÿû¹‘Œ‘Œ á#
ã¹$æ#Ô$ì#üñ(;£  ü¥ ö(¦¨)û¹!""\³)4¸)îZîZSleepÁïZÞ*ñUðZentryÁñU´FVEX·XáüÚ)*dÝ)   û¹û¹ ê)
"ã¹$ï)üž+(þº$´$¤Í+<Ð+þº##
$üµ.Ù¼&Åc&üÛ.BÞ.¡¢£ ¡Ù¼ ¢ c cˆ¢cµ
 `£cbufÁ `àB¤GS
£Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
ŸÈŸÈ È¿ éBL% â.%
&$ã.± é.üÚ/)Ù¼tAüMJ A retry "budget" for allowing only a certain amount of retries over time.ÁNúüR&# # Why budgets and not max retries?Áyúü}FC The most common way of configuring retries is to specify a maximumÁüÄ[X number of retry attempts to perform before giving up. This is a familiar idea to anyoneÁü c` who’s used a web browser: you try to load a webpage, and if it doesn’t load, you try again.Áü„JG If it still doesn’t load, you try a third time. Finally you give up.ÁÏúüÓUR Unfortunately, there are at least two problems with configuring retries this way:Á©úü­IF **Choosing the maximum number of retry attempts is a guessing game.**Áü÷if You need to pick a number that’s high enough to make a difference when things are somewhat failing,Áüágd but not so high that it generates extra load on the system when it’s really failing. In practice,ÁüÉa^ you usually pick a maximum retry attempts number out of a hat (e.g. 3) and hope for the best.Á«úü¯C@ **Systems configured this way are vulnerable to retry storms.**Áüóa^ A retry storm begins when one service starts to experience a larger than normal failure rate.ÁüÕfc This causes its clients to retry those failed requests. The extra load from the retries causes theÁü¼ c` service to slow down further and fail more requests, triggering more retries. If each client isÁü 
da configured to retry up to 3 times, this can quadruple the number of requests being sent! To makeÁü… kh matters even worse, if any of the clients’ clients are configured with retries, the number of retriesÁüñ tq compounds multiplicatively and can turn a small number of errors into a self-inflicted denial of service attack.Áæ úüê kh It's generally dangerous to implement retries without some limiting factor. [`Budget`]s are that limit.ÁÖ
ú
 # ExamplesÁé
ú
 ```rustÁüù
! use std::{future, sync::Arc};ÁúüŸ<9 use tower::retry::{budget::{Budget, TpsBudget}, Policy};ÁÜú´à type Req = String;Á´÷ type Res = String;ÁŽúÜ’ #[derive(Clone, Debug)]ÁÄ® struct RetryPolicy {ÁüÇ budget: Arc<TpsBudget>,Áíúüñ1. impl<E> Policy<Req, Res, E> for RetryPolicy {Áü£(% type Future = future::Ready<()>;ÁÌúüÐa^ fn retry(&mut self, req: &mut Req, result: &mut Result<Res, E>) -> Option<Self::Future> {ÁÔ² match result {ÁÔÍ Ok(_) => {Áüè85 // Treat all `Response`s as success,Áü¡;8 // so deposit budget and don't retry...ÁüÝ*' self.budget.deposit();ÁĈ NoneÁŒ¡ܳ Err(_) => {ÁüÏ63 // Treat all errors as failures...Áü†GD // Withdraw the budget, don't retry if we overdrew.ÁüÎ:7 let withdrew = self.budget.withdraw();Áü‰" if !withdrew {Áü¬$! return None;Á¬Ñçúüë! // Try again!Áü+( Some(future::ready(()))ÁŒ¹ØÈ
ãúüç?< fn clone_request(&mut self, req: &Req) -> Option<Req> {Áì§ Some(req.clone())Áò̸ğó4I)KäL‡4J”Þü85 Transactions Per Minute (Tps) Budget implementationsÁ
×I¤,)+ AtomicIsizeÁ\kÝÃ).®Dx¼À)/¤,µ>)0­Ö)1InstantÁ<ÁóV)2ÜK)3>™Ä>ü>*vxgit[¤´FlÏ9¤ûüß?< A Transactions Per Minute config for managing retry tokens.ÁŸúü£QN [`TpsBudget`] uses a token bucket to decide if the request should be retried.Áõúüù`] [`TpsBudget`] works by checking how much retries have been made in a certain period of time.ÁüÚ]Z Minimum allowed number of retries are effectively reset on an interval. Allowed number ofÁü¸A> retries depends on failed request count in recent time frame.ÁúúüþPM For more info about [`Budget`], please see the [module-level documentation].ÁÏúüÓ'$ [module-level documentation]: superÁL†å½BêRL_œÓ56789:;ì–T)44µ>µ>¤·>Þ*£>¸>poisonÁ£>¹>dataÁ£>Ë»™z™g—§½)44Ì©)44žæö¡ˆˆ¢ˆl }.xÏ
¤]¤]V¦]Á‚]üß3ø¤”&ø„ý)44‘Œœí)44ÉØ¬º )44´Ž

)44 å½=>?ABüçGüŽ IF Create a [`TpsBudget`] that allows for a certain percent of the totalÁÜÜ  requests to be retried.Áü úü„
HE - The `ttl` is the duration of how long a single `deposit` should be矄
30 considered. Must be between 1 and 60 seconds.Áü‰MJ - The `min_per_sec` is the minimum rate of retries allowed to accommodateÁüÛIF clients that have just started issuing requests, or clients that doÁü©)& not issue many requests per window.Áü×JG - The `retry_percent` is the percentage of calls to `deposit` that canÁü¦DA be retried. This is in addition to any retries allowed for viaÁüï0- `min_per_sec`. Must be between 0 and 1000.Á¤úü¬LI As an example, if `0.1` is used, then for every 10 calls to `deposit`,ÁüýEB 1 retry will be allowed. If `2.0` is used, then every `deposit`ÁÜÇ allows for 2 retries.Áå½<<
=ttlÁò min_per_secÁ\
retry_percentÁl“„¯ )¤ ¤å½< ¹ <
>´“&&)¥ ¥å½< š&<
?$&4Å'?<closure_kind>Á@<closure_signature>Á@<upvars>Á@@?@ ÉØÌÔ)×))¦ ¦å½< Û)<
A$Ü)amtÁâ)üÈ*%<Ë*)§ §å½< Ó*<
B$Ô*ˆäÚ*Ìâ,å½DELMDEŒ‚-<…-¨ ¨å½C -C
D$Ž-ÔÇ-DÊ-© ©å½C Ó-C
E$Ô-Ô˜.å½G´G¤¹.<¼.å½FF
Gì’/å½IÀcIü¶/8¹/ª«¬ ªå½ « c cˆ¢cµ
 `£c¢° `àB¤GS
¬ɱH ½/H
I$¾/± Ä/¬û&
ü“P¹Ôäúüè&# [module-level documentation]: selfÁ4™KK†žüÅK†ž†žLMLMML”ˆü¦HE Store a "deposit" in the budget, which will be used to permit futureÁ„ó
withdrawals.Á<­ ­ŽžK K
LŽž$”Ü·ü HE Check whether there is enough "balance" in the budget to issue a newÁ retry.Áüúü„.+ If there is not enough, false is returned.ÁDº® ®ŽžK ÃK
MŽžtQ
Future typesÁ4Yè
ô
¦ ³ ½ Ü4rNPzÖk,&Þ NQõ‚\DNRþ4b‚ØNSôx„¾NTŒN,¥‚NVk<”ÌNW·$œØNXNY,®°ž ì2’œU…lnvLikY[IK´¨=üç¡[¤\Â][\]Íì«¿ ìÍ챿 ïÍì·¿r«¿·¿±¿·¿ ±¿·¿
ü¦&±¿·¿„Õè¾^oqkmgiüíûÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ·¿ú±¿·¿ è¾ZZ
^«¿±¿·¿Óc<ˆ Ž÷üƒ Š¡`¤aÂbba`èð ˆ ùð Šñ ›ñüÍ &Ëñ„ü è¾cdƒØ„Ød:<?ADF\” 4™ __Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
©ñ·ñüÆ I ¯°±„¾„¾ô†¾ ˜X$]È=„kt• ¯è¾ °ÌÌkÎwakerÁ¸Ï local_wakerÁ¸ÐextÁ¸Ñ_markerÁ¸Ò_marker2Á¸f'EwÚ]¾å±œØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤Ã较Ø_ Ø _
d«¿±¿·¿ ¡’ä La,eÕ Ök, Þ efÿ½,#Úegd%”¬•¡iiè𠚨Âj
 üë#ü±52 Creates a new [`RetryLayer`] from a retry policy.Áø«¿¨Âhh
j«¿Ëyü¸9¡l¤mmlèð ½ùð ÀØ«¿¨ÂnoÜÝo/146kkúÂü™,² ²¨Â±¿¨Â±¿Ük ¢k
o«¿±¿ë]<©Tl4prþ4‚Øpìæ ü@= A "retry policy" to classify if a request should be retried.Á[úl_
# ExampleÁmú<qŸóìy use tower::retry::Policy;Á¤— use std::future;Á¬ú´°€Ã´ÇŸÃÞúÜâ struct Attempts(usize);Áþúü‚.+ impl<E> Policy<Req, Res, E> for Attempts {Áü±(ŽÅÚúüÞaÌÅÔÀ¶ÆÔÛÙÆüö8ýÆü¯(% // so don't retry...ÁÄØ·È”ñ },ÁÜ„òÈü 6—Éü×=: // But we limit the number of attempts...Áü•# if self.0 > 0 {Áü¹%" // Try again!Áüß$! self.0 -= 1;Áü„/, Some(future::ready(()))Áä´ } else {ÁüÑ=: // Used all our attempts, no retry...Áä NoneÁ¬¬ÅËŒÂØÈÜÌòÌìúüð?‘Íì° ÙÍò̸ğórésótutrsu†žüæ ÒÍì¥ì÷ Íìóü Íì¸Ì
r†žN†žTvwxvwxÍ쎞¥ì—†¸ÌvüÅ
!‚Ø݆œÒ
݆ƒØ
Õ†-ù†!Їxw­¯§©£¥üÅ
üŠ
63 The [`Future`] type returned by [`Policy::retry`].Á4Ê
rrüÀXüì
<9 Check the policy if a certain request should be retried.Á­ úüµ IF This method is passed a reference to the original request, and eitherÁüƒ KH the [`Service::Response`] or [`Service::Error`] from the inner service.ÁÓ úüÛ <9 If the request should **not** be retried, return `None`.Áœ
úü¤
LI If the request *should* be retried, return `Some` future that will delayÁüõ
JG the next retry of the request. This can be used to sleep for a certainÁüÄLI duration, to wait for some external condition to be met before retrying,Áü•HE or resolve right away, if the request should be retried immediately.ÁâúÄê ## Mutating RequestsÁúüLI The policy MAY chose to mutate the `req`: if the request is mutated, theÁüàHE mutated request will be sent to the inner service in the next retry.Áü­HE This can be helpful for use cases like tracking the retry count in aÁ header.ÁŠú¼’ ## Mutating ResultsÁ®úü¶EB The policy MAY chose to mutate the result. This enables the retryÁü€KH policy to convert a failure into a success and vice versa. For example,ÁüÐGD if the policy is used to poll while waiting for a state change, theÁüœJG policy can switch the result to emit a specific error when retries areÁ exhausted.Áþúü†A> The policy can also record metadata on the request to includeÁüÌHE information about the number of retries required or to record that aÁü™0- failure failed after exhausting all retries.ÁÎúüÖ30 [`Service::Response`]: crate::Service::ResponseÁüŽ-* [`Service::Error`]: crate::Service::ErrorÁ,ó´µ ³Žž ´¥ì µÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
—†¸ÌÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ݆r Ér
wŽž¥ì—†¸Ìò›Ô ü€6üžFC Tries to clone a request before being passed to the inner service.ÁéúüñIF If the request cannot be cloned, return [`None`]. Moreover, the retryÁü¿<9 function will not be called if the [`None`] is returned.Álƒ· Žž ·¥ì™¦r r
xŽž¥ì—†¸Ì$–ò›œ¼ŠB¤¢€Bä½wBìßjBL_BbBQBTB´¢GB´æ ¡¤ƒƒèð ë ùð î úÂ!#üÁ
/üƒ
96 Retry the inner service depending on this [`Policy`].ÁÎ
«¿±¿úÂ
«¿±¿Ëw„ë]„ÜÍü (% Get a reference to the inner serviceÁ<Ô¸ ¸ú ¸±¿ Ü
«¿±¿üÁ#üŒ0- Get a mutable reference to the inner serviceÁ<ȹ ¹ú ¹±¿ Ð
«¿±¿äÀüŒ/, Consume `self`, returning the inner serviceÁTÇú±¿
«¿±¿üý¡¤ŠÂŠèð ùð Šñ›ñü¿&†ûËñ„öر¿,‰úÂŒŽ 
  
gilnqsl–D›ˆˆ©ñˆˆ·ñˆˆè¾ü„OT‡º»¼ ºú »ÌÌkÎÔõ¸Ïçõ¸Ð€ö¸Ñ‘ö¸Ò¦ö¸f'EwÚ]¾å¼œØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
ú·¿
ˆ ˆ
«¿±¿·¿$—¡’üØ4½ ½ú·¿ú·¿ ˆ àˆ
«¿±¿·¿Óc<ë|¤>ü2
/ Middleware that applies a timeout to requests.Á3
úü7P
M If the response does not complete within the specified timeout, the responseÁ¤ˆ
 will be aborted.Á»íœŽ>܈><¬>®È ßqdÞ
 ¸¥ctÿ
š ¹k<Ÿ
Ì»·
œØ¼
­Ö½
¾
| Error typesÁ
ü,×"¤,(*d€¸ÄÔ¹ü“! Construct a new elapsed errorÁƸÄ
ìó¸ÄÅcü—8š¾¿À ¾¸Ä ¿ c cˆ¢cµ
 `£c¢° `àB¤GS
Àɱ˜ ž˜
± ¥ìþ¸Ä
´í
š ¡ ín<$ œín œõ‚\Cþ4g‚ØŸôx„¾ k<ˆÌ¢·$‘œØ£½­îZ¤¬ªì1Tt_yDshüT1Z\HJ”Ÿ9̦¥¦¦Íì¡À «’ŧ 
üÆ4Ô¡À³®’Å¥¥
§¡À²oDØÂo,åü±t©¥ª««©ªÁƒØÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
’ÆÔάðÍì’Æ ¹ÍìÔÎ ¼‚ØÁìéÍìÁ æÔΞæö¡ˆˆ¢ˆl }.xϾ Ììø¬¶Æ¬­ƒØ„Ø­ÄÆÀ¨¨Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
’Æô²üÛIÁÂľ„¾ô†¾ ˜X$]È=„kt• Á¶Æ ÂÌÌkÎÔõ¸Ïçõ¸Ð€ö¸Ñ‘ö¸Ò¦ö¸f'EwÚ]¾åÜ؞؟ØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤Ã¶ÆƒØ¨ í¨
­Á’ÆÔΡ’ù

 •r< È ®¯D# ­Ö®°ÿ½,> Ú®±t  /”1 ŒÔ ûƳü•+ üì$ ! Create a timeout from a durationÁ¢ ‘ŒûƲ²
³íà…üí! ¤µµÍì¿Ç ò ûÆ·ÜÝ·d• ´´›Èüµ, ,¸ Ä ÄûÆ¿ÇûÆ¿ÇÜ´ ¾ ´
·¿Ç$¿ ë]<Å ÌÑ
æäñ
ÛL“
ÎѾÁœ³
±´Ì
¢”ý
¥ÀÀа 
ÌÇÁÂÃÄü¸5
ì–
 Creates a new [`Timeout`]ÁÅ
¡À‘ŒÌÇ¿¿
Á¡ÀÞ*‡†í‘†ÜË
üž(

Å ÅÌÇ Å¡À¿ Ú
¿
¡ü½#
üˆ0
¦ž
Æ ÆÌÇ Æ¡À¿ Ì
¿
áäº
ü†/
ÈŸ
ÌÇ¡À¿¿
ġüõt
¤ÆÂÇÆÇô¹ ú
ÍìÙÈ
¿ÇÙÈ„³
æ¿ÇÙÈ
ô²¬Ó
›ÈÈÉÊËÌ 
  
ËÌprln

ÅÅ¿ÇÙÈ T‘
,
ÅÅô²
4¸
ÅÅš š ¥cœ ²o Âoˆy‰8÷‚?è¿ÇÙÈ üá O
ÇÈÉ Ç›È ÈÌÌkÎÔõ¸Ïçõ¸Ð€ö¸Ñ‘ö¸Ò¦ö¸f'EwÚ]¾åɜ؞؟ØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
›ÈÙÈ
Å ï
Å
Ë¿ÇÙÈ
¡’ú
üà 4
Ê Ê›ÈÙÈ›ÈÙÈ Å è
Å
Ì¿ÇÙÈ
Óc<ó
dÎ>üKH Various utility types and functions that are generally used with Tower.Á»û„»>ĵ>$Ö>ÎêŸÔµÓ÷œ¾ãµÒ¹ÐùÀ Â Ê ï ær<ûÒ ºvd„Œ
%¤¨ºæÚ'ľäçÏ"Dؘ å´*Tâèý,„ é¨0|˜öÎ3œ¿«œ ˜ ¨=tý ÜŸ ¼‡l  刮¢ °‰·£ ×—˜¥ ¥˜¡¦ £T€ö¨ òÿ© ÃŽˆ« „¾¬ Ю Þ“Ù¯ à˜<‹§° â ª± È¡³ ÐNd¿Œ´ ­QTß À—¡°· Ú¡$‚¸¹ £¢Áº Àw<±Ü
¼ ³°~„º½ ´þ‚ØÍ¾ ¿ùDÿäÍ¿ ¼
dMDQÍÒ Œ
Û à TryFutureÁL !ÎÏ÷40 ÎÑ TryFutureExtÁd8 ÈÎÒ×P ¤,ÎÓþ4f ‚ØÎÔô| „¾ÎÕk<‘ ÌÎ×· œØÎØÿ½ ÚÎÙ ÎÚ¼ Úd! Ìα³DK ¤œY •lr „L… vxdf”¥ U´½ FüŠ@ ¤ÜÝÜÝô¹  ÍìóÁ  ¿c¿ÇT¿ æÈÞÀcÞ4602üÑ8 Ô ËÌÍ ËæÈ Ì c cˆ¢cµ
 `£c¢° `àB¤GS
ÍɱÛ Ø Û
Þ¿ÇóÁ ± ß üÙ3 íà÷áŸâáâàÍì»ÊÞ ÍìÁÊâ ÍìÇÊ ñ !ÁÊ Êã<>8:46ü“X ¡ ù<ù<ærý<Þ*ÔF6殓ξŒ>Œ>ErrIntoÁ>Þ*ÔJý÷ÅN¶+»ÊÁÊ#ÁÊÇÊÊßß
ã»ÊÁÊÇÊÞ*,¥ üŽ G íå÷æŸçåæçŽÒ ŸÒ °Ò ¦ ÁÒL› ÊèÀcè+-0257üÜ B ß ÎÏÐ ÎÊ Ï c cˆ¢cµ
 `£c¢° `àB¤GS
Ðɱä ã ä
è»ÊÁÊÇÊ ± ê ü ˆ íê÷ëŸìêìëŽÒ ŸÒ °Ò ¨ ÁÒL ‚Ø Ó4‘ ÊíîƒØ„ØîEGJLOQ éé ÓƒØüŒ
I $
ÑÒÓ„¾„¾ô†¾ ˜X$]È=„kt• ÑÊ ÒÌÌkÎÔõ¸Ïçõ¸Ð€ö¸Ñ‘ö¸Ò¦ö¸f'EwÚ]¾åӜ؞؟ØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃʃØé ž
é
î»ÊÁÊÇÊ$”
¡’ª
Ĥ ¤ðññðô¹ © ÊÏ ¬ æÈòóüì( üÃ$ ! Creates a new `AndThen` service.Áù ¿ÇóÁæÈïï
ò¿ÇóÁÞ*[‡±e‡ü‰% ü¿? < Returns a new [`Layer`] that produces [`AndThen`] services.Áƒ úü‹K H This is a convenience function that simply calls [`AndThenLayer::new`].ÁÛ úüã!  [`Layer`]: tower_layer::LayerÁ, óÁ½Ëïï
ó¿ÇóÁ±  üÕ¹ ¤õöÂ÷¥!øõøö÷
óÁ¿Ç·¿ ˜"¥!î ÊÏ Ý Šñ ÍìÛàé ¿Ç·¿„ž æ¿Ç·¿
Ûà#„¾ –"óÁÈàÔ× ô¹ Ú ØóÁ !ÛàL„ æÈùúûüý 
  
ýüMOÆÈËÍÇÉl•  ôôÛà"T²  ôô®á  ôôÛ Û ²sß Þ*ÎL59bÚšEš¿Ç·¿ ÛàóÁü„O T‡ ÔÕÖ ÔæÈ ÕÌÌkÎÔõ¸Ïçõ¸Ð€ö¸Ñ‘ö¸Ò¦ö¸f'EwÚ]¾å֜؞؟ØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
æÈ·¿
ô  ô
ü¿ÇóÁ·¿Ûà$— ¡’ ü—4  × ×æÈ·¿æÈ·¿ ô Ÿ ô
ý¿ÇóÁ·¿Ûà Óc<ª ¼° ÿÿز µ ëÊ 
ôü üÎ) & Creates a new [`AndThenLayer`] layer.Á ÁëÊþþ
Á±ˆüÁ; ¤ƒƒô¹ Æ ÊÏ É Ùá ½ËÜÝ*,/1 <ˆ æÈü¦*  Ø Ø½Ë¿Ç½Ë¿ÇÜ ¯ 
¿ÇóÁ Þ*,¶ L[,_ͱ۲Ï"D° å%¤Ç ºæÚ'Äï äç´*T“ èý,„§ ¾éL , ´*T!ˆè×'!¤,ŠK2!†J³\DJ! ÿ½,T!ÚŽ<o!¼!~!!giL,![\<!LN<>´`!/ü¯
!üy#! A boxed [`Layer`] trait object.Á!úü¡V!S [`BoxLayer`] turns a layer into a trait object, allowing both the [`Layer`] itselfÁüøL!I and the output [`Service`] to be dynamic, while having consistent types.ÁÅ!úüÉL!I This [`Layer`] produces [`BoxService`] instances erasing the type of theÁü–2!/ [`Service`] produced by the wrapped [`Layer`].ÁÉ!ú!ÐüÛ!úüßd!a `BoxLayer` can, for example, be useful to create layers dynamically that otherwise wouldn't haveÁüÄC!@ the same types. In this example, we include a [`Timeout`] layerÁüˆA!> only if an environment variable is set. We can use `BoxLayer`ÁüÊD!A to return a consistent type regardless of runtime configuration:Á!ú<“!Ÿóä›! use std::time::Duration;Áü¸C!@ use tower::{Service, ServiceBuilder, BoxError, util::BoxLayer};Áü!úü€D!A fn common_layer<S, T>() -> BoxLayer<S, T, S::Response, BoxError>Á! whereÁüÏ'!$ S: Service<T> + Send + 'static,Áü÷"! S::Future: Send + 'static,Áüš+!( S::Error: Into<BoxError> + 'static,Á!üÌ+!( let builder = ServiceBuilder::new()Áüø$!! .concurrency_limit(100);Á !úü¡ 1!. if std::env::var("SET_TIMEOUT").is_ok() {ÁüÓ ! let layer = builderÁüó 1!. .timeout(Duration::from_secs(30))Áô¥
! .into_inner();ÁÄ
!úüÈ
! BoxLayer::new(layer)Á„é
!
} else {Áüú
!¬÷üš $!! .map_err(Into::into)Áô¿ !øÞ !úüâ !Ãø !òÌ, !¸Ä<“ !Ÿó !úüŸ !!‹ÞüÁ '!$ [`Service`]: tower_service::ServiceÁüé %!" [`BoxService`]: super::BoxServiceÁü
! [`Timeout`]: crate::timeoutÁ
!ß"¥¦Íì¨ÌÃ
!¥² Ç
!Íì²Ì Ê
!¢† Í
!ú˺.TÓ¼H…¯?ADF@BEGüÖ
P!,Ö
!†J†JK‰Jµ 7ŠJphantomÁ7J¤7·0ØQdèÚ¨Ìܨ̴*Þ*¹~–Fp¾’Æ²Ì¸Ì Ììøü«'!ß"¥˜¦š˜šøü°!¥² ´!‘ý ·!¢† º!úË#%(*-/24üüã!ôÙ! Create a new [`BoxLayer`].Áƒ!úËœœ Íì¯ !Ú¯¨Ì!Ìì¯! ¯!¯!¯¨ÌÜ’Æüî#!¯‚’Æ ²Ì!¯‚’Æ
¸ÌL‡!Ì쯂$”!¯‚<›!Ì쯂’Æ !˜ƒ<×!
¨Ì’Ʋ̸̯ inner_layerÁ\Š!ýÿ„ƒ!Èâàâýâ¨Ì’Ʋ̸̯¨Ìôþ¯üº5!ß"Ÿ¥ ¦¡¢¡Ÿ ¢øü¿!¥² Ã!‘ý Æ!¢† É!úË£¤Üݤ2479<>AC!<û!žžôþüŸ+!,¢!Ù Ùú˨Ìú˨ÌÜž ¨!ž
¤¨Ì’Ʋ̸Ì!Þ*,¯!üö1!ß"¦¥§¦¨©¦¨©§øüû!¥² ÿ!‘ý !¢† !ú˪٪+-0257:<¼®!,±!Ú ÚúËúË¥ ·!¥
ª¨Ì’Ʋ̸Ì!ü–6!ß"¬¥­¦®¯¬®¯­øü!¥² Ÿ!‘ý ¢!¢† ¥!ú˰Àc°+-0257:<üÓ6!Ö!ÛÜÝ ÛúË Ü c cˆ¢cµ
 `£c¢° `àB¤GS
Ýɱ« Ú!«
°¨Ì’Ʋ̸Ì!×á!| \ º¨0|"ö±² ×,"¤,±´K7"†J±µ³\DO" ±·ÿ½,Y"Ú±¸<t"±¹ä"z&"giL1"[\A"LN<>´e"/ü­,"ü~+"( A [`Clone`] + [`Send`] boxed [`Layer`].Áª"úü®b"_ [`BoxCloneServiceLayer`] turns a layer into a trait object, allowing both the [`Layer`] itselfÁü‘L"þíÞ"úüâQ"N This [`Layer`] produces [`BoxCloneService`] instances erasing the type of theÁü´2"¶ïç"úüëS"P This is similar to [`BoxLayer`](super::BoxLayer) except the layer and resultingÁü¿!" service implements [`Clone`].Áá"ú"Ðüó"úü÷p"m `BoxCloneServiceLayer` can, for example, be useful to create layers dynamically that otherwise wouldn't haveÁüèh"e the same types, when the underlying service must be clone (for example, when building a MakeService)ÁüÑf"c In this example, we include a [`Timeout`] layer only if an environment variable is set. We can useÁü¸V"S `BoxCloneService` to return a consistent type regardless of runtime configuration:Á"ú<“"Ÿóä›"ƒóü¸3"0 use tower::{Service, ServiceBuilder, BoxError};Áüì=": use tower::util::{BoxCloneServiceLayer, BoxCloneService};Áª "ú,® "¬´ " # struct Request;Á´Ê " # struct Response;Á¬á " # impl Response {Áü÷ #" # fn new() -> Self { Self }Á<
" # }Á£
"úü§
P"M fn common_layer<S, T>() -> BoxCloneServiceLayer<S, T, S::Response, BoxError>Á
"Ïôü‚ /", S: Service<T> + Clone + Send + 'static,Áü² ""“õüÕ +"¿õ, "óõü‡ +"‚öü³ $"·öØ "úüÜ 1"ñöüŽ
"¬÷ü®
1"Õ÷ôà
"øÿ
"úüƒ,") BoxCloneServiceLayer::new(layer)Á„°"ìøüÁ"¬÷üá$"”ùô†"ø¥"úü©,"¾™"òÌ"¸Äæ"úüê@"= // We can clone the layer (this is true of BoxLayer as well)Áü«+"( let boxed_clone_layer = common_layer();Á×"úüÛ1". let cloned_layer = boxed_clone_layer.clone();Á"úü‘I"F // Using the `BoxCloneServiceLayer` we can create a `BoxCloneService`ÁüÛn"k let service: BoxCloneService<Request, Response, BoxError> = ServiceBuilder::new().layer(boxed_clone_layer)ÁüÊ+"( .service_fn(|req: Request| async {Áüö."+ Ok::<_, BoxError>(Response::new())Á" });Á±"úüµ,") # let service = assert_service(service);Áâ"úüæ)"& // And we can still clone the serviceÁü)"& let cloned_service = service.clone();Á"וüÀ*"' # fn assert_service<S, R>(svc: S) -> SÁüë!" # where S: Service<R> { svc }Á"ú<"Ÿó"úü!"‹Þü¿'"ªúüç%"Ûúü"Šû¤¸"ß"»¥¼¦½¾»¾¼½øüÍ"¥² Ñ"‘ý Ô"¢† ×"ßÌD–µÙPç¿68;=@BEGüàU",à"±ºº†J†JK‰Jµ 7ŠJ¯ý7‹J¤7·0ØQdèÚ¨ÌܨÌöö÷¨0ûˆê bßd”?S’Æ²Ì¸Ì Ììøüº3"ß"Á¥Â¦ÃÄÄÂÃÁøü¿"¥² Ã"‘ý Æ"¢† É"ßÌÅ#%(*-/24ü£ë"üô*"' Create a new [`BoxCloneServiceLayer`].Áª"¯ßÌÀÆÆÀ
Ø ®"é"ý"Ž‚"ž‚"©‚ü•#"È‚d "Þ‚"ô‚"د‚"…ƒ"ƒ$ÿ"«ƒ<†"
Ũ̒Ʋ̸̯Ђ"„²"ÅÈâÇàâÇýâÇÇÅǨ̒Ʋ̸̯ۄ®¥ç„üîA"ß"ɥʦËÌÉËÌÊøüó"¥² ÷"‘ý ú"¢† ý"ßÌÍÎÜÝÎ2479<>AC"<»"ÈÈ®¥üä+",ç"Þ Þß̨Ìß̨ÌÜÈ í"È
Ψ̒Ʋ̸Ì"Þ*,ô"ü»="ß"ХѦÒÓÓÑÒÐøüÀ"¥² Ä"‘ý Ç"¢† Ê"ßÌÔÙÔ+-0257:<¼ÿ","ß ßßÌßÌÏ ˆ"Ï
Ԩ̒Ʋ̸Ì$‰"üçB"ß"֥צØÙØÖÙ×øüì"¥² ð"‘ý ó"¢† ö"ßÌÚÀcÚ+-0257:<ü°6"³"àáâ àßÌ á c cˆ¢cµ
 `£c¢° `àB¤GS
âɱÕ ·"Õ
ڨ̒Ʋ̸Ì"×¾ ä×
#¤,ÛÝK#†JÛÞ³\D-# Ûàÿ½,7#ÚÛá<R#ÛâÎ3œm#«Û㜠#z|L#n\#_aOQ´C#Bü` #5ü­0#üƒ6#3 A [`Clone`] + [`Send`] + [`Sync`] boxed [`Layer`].Áº#úü¾f#c [`BoxCloneSyncServiceLayer`] turns a layer into a trait object, allowing both the [`Layer`] itselfÁü¥L#þíò#úüöU#R This [`Layer`] produces [`BoxCloneSyncService`] instances erasing the type of theÁüÌ2#¶ïÿ#úüƒk#h This is similar to [`BoxCloneServiceLayer`](super::BoxCloneServiceLayer) except the layer and resultingÁüï # service implements [`Sync`].Á#úl”#Ðü¢#úü¦t#q `BoxCloneSyncServiceLayer` can, for example, be useful to create layers dynamically that otherwise wouldn't haveÁü›v#s the same types, when the underlying service must be clone and sync (for example, when building a Hyper connector).Áü’f#Ò’üù_#\ `BoxCloneSyncServiceLayer` to return a consistent type regardless of runtime configuration:ÁÙ#ú#Ÿóäå#ƒóü‚ 3#È”ü¶ E#B use tower::util::{BoxCloneSyncServiceLayer, BoxCloneSyncService};Áü #ú,€
#ו¬†
#å•´œ
#ƒ–¬³
#¢–üÉ
##Á–
#í–õ
#úüù
T#Q fn common_layer<S, T>() -> BoxCloneSyncServiceLayer<S, T, S::Response, BoxError>Á #ÏôüØ 6#3 S: Service<T> + Clone + Send + Sync + 'static,Áü "#“õü² +#¿õ #óõüä +#‚öü
$#·öµ
#úü¹
1#ñöüë
#¬÷ü‹1#Õ÷ô½#øÜ#úüà0#- BoxCloneSyncServiceLayer::new(layer)Á„‘#ìøü¢#¬÷üÂ$#”ùôç#ø#úüŠ0#þ½#òÌ#¸ÄË#úüÏ@#êšü0#- let boxed_clone_sync_layer = common_layer();ÁÁ#úüÅ;#8 let cloned_sync_layer = boxed_clone_sync_layer.clone();Á#úü…Q#N // Using the `BoxCloneSyncServiceLayer` we can create a `BoxCloneSyncService`Áü×r#o let service: BoxCloneSyncService<Request, Response, BoxError> = ServiceBuilder::new().layer(cloned_sync_layer)ÁüÊ+#‡žüö.#¼ž#óž±#úüµ,#”Ÿâ#úüæ)#ÖŸü)#‰ #וüÀ*#É üë!#ý #ú<#Ÿó#úü!#‹Þü¿'#ªúüç%#Ûúü#Šûĸ#ß"奿¦çèçåæèøüÑ#¥² Õ#‘ý Ø#¢† Û#¾Í§=ýý*'é68;=@BEGüäY#,ä#Ûää†J†JK‰Jµ 7ŠJ¯ý7‹J¤7·0ØQdèÚ¨Ìܨ̫«¬Î3°ˆŸ ÜyKךL€’Æ²Ì¸Ì ÌìøüÂ7#ß"ë¥ì¦íîëìîíøüÇ#¥² Ë#‘ý Î#¢† Ñ#¾Íï#%(*-/24ü³ò#ü€.#+ Create a new [`BoxCloneSyncServiceLayer`].Áº#¯¾ÍêððêØ ¾#é#ý#Ž‚$#ž‚#©‚ü¥##È‚#Þ‚#ô‚# ¯‚#ê¨#…ƒ#ƒ$#«ƒ<#
ï¨Ì’Ʋ̸̯Ђ#„É#ïÈâñàâñýâññïñ¨Ì’Ʋ̸̯ۄÄÇç„ü‰E#ß"ó¥ô¦õööôõóøüŽ#¥² #‘ý #¢† ˜#¾Í÷øÜÝø2479<>AC#<Ú#òòÄÇü‡+#,Š#ã ã¾Í¨Ì¾Í¨ÌÜò #ò
ø¨Ì’Ʋ̸Ì$‘#Þ*,—#üÞA#ß"ú¥û¦üýûýüúøüã#¥² ç#‘ý ê#¢† í#¾ÍþÙþ+-0257:<¼¦#,©#ä ä¾Í¾Íù ¯#ù
þ¨Ì’Ʋ̸Ì#üŽ F#ß"¥¦ƒƒøü“ #¥² — #‘ý š #¢† #¾ÍÀc+-0257:<üÛ 6#Þ #åæç å¾Í æ c cˆ¢cµ
 `£c¢° `àB¤GS
çɱÿ â #ÿ
¨Ì’Ʋ̸Ì$ã #×é #D2 $6 ˜ßXT $Ê À
³\D)$ ˆLayerFnÁ<3$ê<P$Š SyncWrapperÁ\l$#
׃$¤,Œþ$‚ØŽô°$„¾k<À$Ì·$œØŒ$ä\$ÑÓ»½´A$®Ì^$•D~$Œ$t—$|D«$küŒ1$]_KMôá
$üÔ*$' A boxed `Service + Send` trait object.Áÿ$úüƒM$J [`BoxService`] turns a service into a trait object, allowing the responseÁüÑJ$G future type to be dynamic. This type requires both the service and theÁüœ#$ response future to be [`Send`].ÁÀ$úüÄL$I If you need a boxed [`Service`] that implements [`Clone`] consider usingÁü‘6$3 [`BoxCloneService`](crate::util::BoxCloneService).ÁÈ$úüÌO$L Dynamically dispatched [`Service`] objects allow for erasing the underlyingÁüœR$O [`Service`] type and using the `Service` instances as opaque handles. This canÁüïO$L be useful when the service instance cannot be explicitly named for whateverÁ\¿$ reason.ÁË$ú$ÀÁÞ$ú$ŸóÜê$ use std::future::ready;Áü†!$ # use tower_service::Service;Áü¨0$- # use tower::util::{BoxService, service_fn};ÁüÙK$H // Respond to requests using a closure, but closures cannot be named...Á¬¥$ # pub fn main() {Áü»0$- let svc = service_fn(|mut request: String| {Áüì&$# request.push_str(" response");ÁÔ“ $ ready(Ok(request))Á<® $ });Á¶ $úüº G$D let service: BoxService<String, String, ()> = BoxService::new(svc);Á¤‚
$ # drop(service);Á,—
$¸Ä<
$Ÿó¥
$úü©
$ù¼É
$ [`Rc`]: std::rc::RcÁ
$¥¦а ÷
$ÍìÎÎ ú
$¶² ý
$œÎ¹~–Fp¾79358:ü† i$,† $#
#
#ŸÔ#ˆ# ¤%.ŒÇÚyUžæö¡ˆˆ¢ˆl }.xÏ¡À ¡À„¾„¾ô†¾ ˜X$]È=„kt•žæö¡ˆˆ¢ˆl }.xς؃ػ¶Ììø
¡ÀÔÎ ¡ÀÎÎÌìø¤†
$L
$¥ššа
$Íì ˜
$„¾„¾ô†¾ ˜X$]È=„kt•žæö¡ˆˆ¢ˆl }.xς؃ØÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
¡ÀžæÌìøùûóõüÒ
!$¥œ¦žžœа ×
$²â Ú
$¶² Ý
$œÎŸ¢ #%(*ü•$œ$¤œÎ¤  ÍìÍé  $Íé¡ÀüÊ#$Íé¡À ÎÎ$Íé¡À
ÔÎ$ÌìÍé$Íé$ÌìÍé¡À $“$ëê$
Ÿ¡ÀÎÎÔÎÍéÞ*,£$£¥$ŸÈâ¡àâ¡ýâ¡¡Ÿ¡¡ÀÎÎÔÎÍéëê·µüÖ$üÏF$C Returns a [`Layer`] for wrapping a [`Service`] in a [`BoxService`]Á$ middleware.Á®$úܶ$µù$êêñÓì±äƒ5ظ³ÍéœÎ¤££öé ã$‡êü—#$›ê$±ê$Çê$Øê$ãê$þê$
¢¡ÀÎÎÔÎÍéRTü›0$¥¥¦¦§¥¦§а  $²â £$¶² ¦$œÎ¨©ª«¬ 
  
«¬>@CEHJ$D×$¤¤ÎÎ$,î$¤¤ÔÎ$4‚$¤¤§äü¡E$T¤$èéê èœÎ éÌÌkÎÔõ¸Ïçõ¸Ð€ö¸Ñ‘ö¸Ò¦ö¸f'EwÚ]¾åêœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
ÔΤ ¯$¤
«¡ÀÎÎÔÎ$¡’º$ü 1$$£$ë ëœÎ¡À§ä¤ ¨$¤
¬¡ÀÎÎÔÎ$Óc<³$üˆ0$¥®¦¯°°®¯а $²â $¶² $œÎ±Àc±#%(*-/ü¿6$Â$ìíî ìœÎ í c cˆ¢cµ
 `£c¢° `àB¤GS
îɱ­ Æ$­
±¡ÀÎÎÔÎ$×Í$T< 4@ ¾Ã
³\D% ²´ñÓ<%ê²µ<9%²×L%¤,²·þ4h%‚ز¹ôy%„¾²ºk<‰%̲¼·$’%œØ²½\%¥§—´*%ˆDG%zU%t`%nDt%]üU1%OQ=?üÃ$%ü%%" A boxed [`Service`] trait object.Á„Î%¥¿¦ÀÁÀÁ¿а ß%²â â%¶² å%¨Ïœ†Ôÿ Â.0358:üîS%,î%²¾¾žæö¡ˆˆ¢ˆl }.xÏ¡À ¡À„¾„¾ô†¾ ˜X$]È=„kt•žæö¡ˆˆ¢ˆl }.xς؃ػ¶ø
¡ÀÔÎ ¡ÀÎÎøÔß%|ä%²¥ÄÅÄÅа ô%–æ ÷%„¾„¾ô†¾ ˜X$]È=„kt•žæö¡ˆˆ¢ˆl }.xÏ‚ØƒØªçø˜üä'%¥Ç¦ÈÉÇÈÉа é%²â ì%¶² ï%¨ÏÊÌ #%(*ü­%´%Íé¨ÏƤËËÆöé ¸%‡êüâ#%›ê%±ê%Øê<ˆ%þê%
Ê¡ÀÎÎÔÎÍéÞ*,»%JLüœ%ü–Y%V Returns a [`Layer`] for wrapping a [`Service`] in an [`UnsyncBoxService`] middleware.Áô%úÜü%µù%êêñÓì±äƒ5ظ³Íé¨ÏƤÍÍÆöé ©%‡êüÝ#%›ê%±ê%Øê<ƒ %þê<Ÿ %
Ì¡ÀÎÎÔÎÍéBDüÓ 6%¥Ï¦ÐÑÐÏÑа Ø %²â Û %¶² Þ %¨ÏÒÓÔÕÖ 
  
ÕÖ>@CEHJl
%D•
%ÎÎÎÎ
%,¬
%ÎÎÔÎ
%4À
%ÎÎåûüå
E%Tè
%ïðñ ï¨Ï ðÌÌkÎÔõ¸Ïçõ¸Ð€ö¸Ñ‘ö¸Ò¦ö¸f'EwÚ]¾åñ¼òÎ ó
%Î
Õ¡ÀÎÎÔÎ
%¡’þ
%üÚ 7%$Ý %ò ò¨Ï¡ÀåûÎ â %Î
Ö¡ÀÎÎÔÎ %Óc<í %ü¾ 6%¥Ø¦ÙÚÚÙØа à %²â Æ %¶² É %¨ÏÛÀcÛ#%(*-/üû 6%þ %óôõ ó¨Ï ô c cˆ¢cµ
 `£c¢° `àB¤GS
õɱ×
%×
Û¡ÀÎÎÔÎ
%×
%üó
u%¤ÝÂÞÝÞô¹ ø
%…À
%–À„µ%¿Ç%™Â%ðÎßàáâã 
  
ãâTVY[%Dô%ÜÜ¡ÁT%,•%ÜܰÀ%4°%ÜÜ„¾„¾ô†¾ ˜X$]È=„kt•žæö¡ˆˆ¢ˆl }.xς؃ØÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
¡Á°ÀøüüO%Tÿ%ö÷ø öðÎ ÷ÌÌkÎÔõ¸Ïçõ¸Ð€ö¸Ñ‘ö¸Ò¦ö¸f'EwÚ]¾åøœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
ðÎÙÈ
Ü Š%Ü
â¿ÇÙÈ$%¡’%üû4%$þ%ù ùðÎÙÈðÎÙÈ Ü ƒ%Ü
ã¿ÇÙÈ$ˆ%Óc<Ž%$ Süº! †SüÝ* |S„ qSÄŸ fS|f\jÍö÷ßXT Ê êëë*L1 êì×K¤,êîk<[Ìêð·$dœØêñ³\D€ êóñÓêêôêõŒ¢ü@ˆÄ@z|ik\r[]JL´˜= ™ü±-* A [`Clone`] + [`Send`] boxed [`Service`].ÁßúüãIF [`BoxCloneService`] turns a service into a trait object, allowing theÁü­NK response future type to be dynamic, and allowing the service to be cloned.Áüúü€MJ This is similar to [`BoxService`](super::BoxService) except the resultingÁüÎ!ðúÐüú<†ŸóüŽJG use tower::{Service, ServiceBuilder, BoxError, util::BoxCloneService};ÁäÙƒóו¬üå•´’ƒ–¬©¢–ü¿#Á–í–ëúüï;8 // This service has a complex type that is hard to nameÁü«'$ let service = ServiceBuilder::new()ÁäÓ .map_request(|req| {Áüð)& println!("received request");Á reqÁ })Áìµ .map_response(|res| {ÁüÓ*' println!("response produced");Á resÁ¥š¤™ .load_shed()Áô® .concurrency_limit(64)ÁüÍ)& .timeout(Duration::from_secs(10))Áü÷*' .service_fn(|req: Request| async {Áü¢ .¼žóžüÝ ,”ŸŠ
úüŽ
=: // `BoxCloneService` will erase the type so it's nameableÁüÌ
^[ let service: BoxCloneService<Request, Response, BoxError> = BoxCloneService::new(service);Áü« ,”ŸØ úüÜ )ÖŸü† )‰  וü¶ *É üá !ý 
Ÿó|
¥ø¦ùúøúùа ¦
²â ©
¶² ¬
…Ðbßd”?S÷ûžæö¡ˆˆ¢ˆl }.xÏ¡À ¡À§ä
¡ÀÔÎ ¡ÀÎÎÌìø…Ð ™úêž¡…Ðöö
÷¡ÀÎÎÔÎ
ü´
~êööž¡ü¸&¥ý¦þÿÿýþа ½²â À¶² ÅЃ #%(*üüå# Create a new `BoxCloneService`.ÁÍé…Ðü¤ü öé ˜‡êüÂ#›ê±êØÍéÇêØêãê$“þê
¡ÀÎÎÔÎÍéÞ*,›jlÎÈâàâýâ¡ÀÎÎÔÎÍé˜ìü¥¡ü™KH Returns a [`Layer`] for wrapping a [`Service`] in a [`BoxCloneService`]Á‰ìýúÜ…µùêêñÓì±äƒ5ظ³Íé…Ðü¤ü öé ²‡êüæ#›ê±êLÿÑ¥Çê$”Øê<›ãêþê
ƒ¡ÀÎÎÔÎÍéZ\üò5¥¦ˆˆа ÷²â ú¶² ý…ЊŒ 
  
Œ>@CEHJÎÎÔΧäüœEúûü ú…Ð ûÌÌkÎÔõ¸Ïçõ¸Ð€ö¸Ñ‘ö¸Ò¦ö¸f'EwÚ]¾åü¼ò ª
Œ¡ÀÎÎÔΡ’µü›.ý ý…СÀ…СÀ  £
¡ÀÎÎÔÎÓc<®üò0¥¦а ÷²â ú¶² ý…ÐÙ#%(*-/¼©þ þ…Ð…ÐŽ ²Ž
¡ÀÎÎÔÎüí!꣆žüíÒŽž£T„Íì’± †ž@ˆ±/†žLˆ±;•68ü•¨êÿ ÿŽžžæö¡ˆˆ¢ˆl }.xÏ’± ’±Žž’± 
’±Žž’±
 ’±Žž’± Ììø «
Žž’±üÁR£¥˜˜ü¥ Æ¥² É’Æã¹Ìì’ÆØ’Æ’Æ<‹’ÆZ\_aüšƒLê ’Æžæö¡ˆˆ¢ˆl }.xÏã¹ ã¹’Æã¹ 
ã¹’Æã¹
 ã¹’Æã¹ Ììø °
ã¹’ÆüÌ5¥¦œœа Ѳâ Ô¶² ׅОÀcž#%(*-/üˆ6ƒ …Ð  c cˆ¢cµ
 `£c¢° `àB¤GS
ƒɱš š
ž¡ÀÎÎÔÎ$פw„{Í«¬ÈßXT Ê Ÿ ë*L1 Ÿ¡×K¤,Ÿ£k<[ÌŸ¥·$dœØŸ¦³\D€ Ÿ¨ñÓ꟩ŸªŒ¢ü@ˆÄ@z|ik\r[]JL´˜=Xü±85 A [`Clone`] + [`Send`] + [`Sync`] boxed [`Service`].ÁêúüîMJ [`BoxCloneSyncService`] turns a service into a trait object, allowing theÁü¼YV response future type to be dynamic, and allowing the service to be cloned and shared.ÁúüšWT This is similar to [`BoxCloneService`](super::BoxCloneService) except the resultingÁüò ‘¶œž¥­¦®¯®­¯а ²²â µ¶² ¸òÐÜyKךL€¬°žæö¡ˆˆ¢ˆl }.xÏÈ¡À ¡À§ä
¡ÀÔÎ ¡ÀÎÎ ÌìøòÐX›ÿŸ¯¿òЫ«
¬¡ÀÎÎÔÎ üÀŸ««¯¿ü×*¥²¦³´²³´а ܲâ ß¶² âòе¸ #%(*ü´œüˆ'$ Create a new `BoxCloneSyncService`.Á»Íéòᤱ
öé ¿‡êüé#›ê±êL‚Ñ¥,Çê$— ÍéØêãêþê
µ¡ÀÎÎÔÎÍéÞ*,ÂrtüµÈâ·àâ·ýâ··µ·¡ÀÎÎÔÎÍé˜ìüÛ ¨üËOL Returns a [`Layer`] for wrapping a [`Service`] in a [`BoxCloneSyncService`]Á‰ì³ úÜ» µùêêñÓì±äƒ5ظ³Íéòб¤¹¹±
öé è ‡êüœ
#ݐ
±ê
Ñ¥
Çê
üÃ
Øê
ãê
þê

¸¡ÀÎÎÔÎÍébdü¯ 9¥»¦¼½¼»½а ´ ²â · ¶² º òо¿ÀÁ 
  
ÂÁ>@CEHJ  ººÎÎT† ,‹ ººÔÎ  ºº§äüÝ E  òÐ ÌÌkÎÔõ¸Ïçõ¸Ð€ö¸Ñ‘ö¸Ò¦ö¸f'EwÚ]¾å¼òº ë º
Á¡ÀÎÎÔÎ ¡’ö üÜ
.
 òСÀòСÀ º ä
º
¡ÀÎÎÔÎ
Óc<ï
ü³4¥Ä¦ÅÆÅÄÆа ¸²â »¶² ¾òÐÇÙÇ#%(*-/¼îˆ ˆòÐòÐà ÷Ã
Ç¡ÀÎÎÔÎü²!ŸÈ£ÉÈɆžü²åˆ±± ÅȆž*ˆ±&†ž6ˆ±ÊÊ68üÚ»Ÿ Žžžæö¡ˆˆ¢ˆl }.xÏÈ’± ’±÷²
’±޳ ’±¥³ ÌìøÈ ðÈ
ÊŽž’±ü™Y£Ì¥ÍÍÌü¥ ž¥² ¡¤´·´ ’ÆÈ´Ø´’ÆÎÊÎKMPRüù±ŸŠ Š’Æžæö¡ˆˆ¢ˆl }.xÏÈã¹ ã¹–¶
ã¹­¶ ã¹Ķ ÌìøË Ë
Îã¹’Æ$üÕ9¥Ð¦ÑÒÑÐÒа Ú²â ݶ² àòÐÓÀcÓ#%(*-/ü•6˜Œ òÐ Œ c cˆ¢cµ
 `£c¢° `àB¤GS
ɱÏ œÏ
Ó¡ÀÎÎÔÎ$×£dD‘ÍÕùÀw<ï&Ü
³°~„ƒ&´&&Ôæ
¤
StreamÁ4 EÕÖõ‚\0 Õ××L ¤,ÕÙþ4] ‚ØÕÚôn „¾ÕÛŒN,~ ¥‚ÕÝk<… ÌÕÞ· œØÕß Õठ¼ì ­A ž tU Di €üA: qs`bNP´œ @üìh è6â¤ã¢äâäãÍì¿Óñ ùð ö ÍìÉÓ ù ¿c¿Ó E±¿ ¿c±¿ áÒåÀcå[]`b\^üÛ8 Þ Ž ŽáÒ  c cˆ¢cµ
 `£c¢° `àB¤GS
ɱá â á
å¿Ó±¿ÉÓ ± é üÔ!  æçæç†žüÔ³ ÊÏ ë ‚ØóÁ 憞3†žéêèéêèéêMOÜü Dÿ  Žžæ ˆ æ
莞óÁ$‰ ô   ŽžóÁæ ¥ æ
鎞óÁ ÷ üÁD   Žž ÌÌkÎÔõ¸Ïçõ¸Ð€ö¸Ñ‘ö¸Ò¦ö¸f'EwÚ]¾åœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙóÁƒØæ É æ
ꎞóÁ ¡’Ô ü‰m è6ì¤í¢îìíî¤ÚŽ ùð  ½Ú  ¿Ó³’„» ÞÚ æÉÓ¿Ó³’ ”ã áÒïðñò]_bdgiüýP  ¿Ó±¿ÉÓáÒëë
ï¿Ó±¿ÉÓë]?‰ïwI‰ýwS‰üŸ ) áÒ¿Óëë
ð¿Ó±¿ÉÓ ü» 7 „¾„¾ô†¾ ˜X$]È=„kt• áÒ¿Óë à ë
ñ¿Ó±¿ÉÓ üí
D
áÒºÖëë
ò¿Ó±¿ÉÓ$‰ üÃx è6ô¤õ¢öôõö¤ÚÈ ùð Í ½Ú Ð ¯ã„€ ÞÚ4™ Ê㔨 áÒ÷øFGø@BEGJL  óóÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
¿Ó³’ ¿Ó³’
üöT  ˜„¾„¾ô†¾ ˜X$]È=„kt• áÒ ˜ÌÌkÎÔõ¸Ïçõ¸Ð€ö¸Ñ‘ö¸Ò¦ö¸f'EwÚ]¾åœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙáÒFó  ó
ø¿Ó±¿ÉÓ ¡’ &&ÔÜ
ä
ž'ÕùúõÖ4‡'EùûÔ'å ùüõ‚'ùýþ'‚Øùÿô'„¾ùk<”'Ìù·$'œØùƒ'ù'äù'³ü“$'¥ì½'à'të'ŠDÿ'yüà1'kmY[´«'Kü²L'è6¤¤Ú·'ùð ¼'¯ã„Þ'ÞÚ'ëÓˆŠ,.13üÈ6'ü…&'# Create new [`CallAll`] combinator.Á°'úü¸X'U Each request yielded by `stream` is passed to `svc`, and the resulting responses areÁü•R'O yielded in the same order by the implementation of [`Stream`] for [`CallAll`].Áì'úüôO'L [`Stream`]: https://docs.rs/futures/latest/futures/stream/trait.Stream.htmlÁÏ'¿Ó±¿ëÓ
ˆ¿Ó±¿ë]<Ó'ïw4á'ô¿!'üù$'! Extract the wrapped [`Service`].Á¢ 'údª ' # PanicsÁ» 'úüà 2'/ Panics if [`take_service`] was already called.Áú 'úü‚!8'5 [`take_service`]: crate::util::CallAll::take_serviceÁTÆ!'ëÓ¿Ó
¿Ó±¿$Ñ!'ü­$0'ü‹"$'íò´"'úü¼"O'L This [`CallAll`] can no longer be used after this function has been called.Á#'úd˜#'¦ó©#'úü±#2'Èóè#'úüð#8'ôd´$'š„¾„¾ô†¾ ˜X$]È=„kt• šëÓ¿Ó Ë$'
Š¿Ó±¿$Á$'üª'9'ü—%H'E Return responses as they are ready, regardless of the initial order.Áä%'úüì%=': This function must be called before the stream is polled.Á®&'úd¶&'¦óÇ&'úüÏ&"' Panics if [`poll`] was called.Áö&'úüþ&''$ [`poll`]: std::future::Future::pollÁL±''ëÓºÖ
¿Ó±¿$»''üŽ(W'è6¤ŽŽ¤Ú“('ùð ˜('¯ã„Å('ÞÚ4Þ('ëÓFG0257Lì('$ñ('ŒŒÿèü )T'L£)'œ„¾„¾ô†¾ ˜X$]È=„kt• ëÓ œÌÌkÎÔõ¸Ïçõ¸Ð€ö¸Ñ‘ö¸Ò¦ö¸f'EwÚ]¾åœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙëÓFŒ ·)'Œ
¿Ó±¿$­)'¡’Ã)'ü«*6'ز °*'Dz4³*'†Õèéê13Ôè*'Dë*'ž ž†Õ ô*'
Á$õ*'ì·+'$º+'Ÿ Ÿ†ÕÁ ¿+'
Á$Ä+'÷4Ê+'ü’,C'$•,' ¡¢  †Õ ¡ÌÌkÎÔõ¸Ïçõ¸Ð€ö¸Ñ‘ö¸Ò¦ö¸f'EwÚ]¾å¢œØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙÁƒØ š,'
Á$Ÿ,'¡’¥,'lû&Lÿ&Ôž(ÕõÖ4‡(E˜ßÖ„©(é"õ‚(šþ(‚Øœô(„¾k<–(ÌŸ·(œØ (¡(äù(³ü“&(¥ì¿(â(tí(ŠD(yüâ1(kmY[´­(KüËU(è6£¤¤£¤¤ÚÐ(ùð Õ(¯ã„€(ÞÚ4™(ºÖ¥¦§)+.0ü· ?(ü§/(, Create new [`CallAllUnordered`] combinator.ÁÛ(úüãO(½ñ¾ (¿Ó±¿ºÖ¢¢
¥¿Ó±¿ë]<Â
$(íò¥ (ú (¦ó¾ (úüÆ 2(Èóý (úü… A(> [`take_service`]: crate::util::CallAllUnordered::take_serviceÁTÒ (ºÖ¿Ó¢¢
¦¿Ó±¿ (üÉ0(ü—
"( Extract the wrapped `Service`.Á¾
(úüÆ
X(U This [`CallAllUnordered`] can no longer be used after this function has been called.Á£(ú(¦ó¼(úüÄ2(Èóû(úüƒA(͉(£„¾„¾ô†¾ ˜X$]È=„kt• £ºÖ¿Ó¢ ç(¢
§¿Ó±¿(ü±`(è6©¤ªª©¤Ú(ùð »(¯ã„ñ(ÞÚ(ºÖ«¬FG¬0257L˜($(¨¨ÿèüÌT(LÏ(¤¥¦„¾„¾ô†¾ ˜X$]È=„kt• ¤ºÖ ¥ÌÌkÎÔõ¸Ïçõ¸Ð€ö¸Ñ‘ö¸Ò¦ö¸f'EwÚ]¾å¦œØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙºÖF¨ ã(¨
¬¿Ó±¿(¡’ï(ü×8(®®ز Ü(Dz(Õׯ°±èé꯰±13Ô–(D™(§ §Õ×­ ¢(­
¯Á(ìç($ê(¨ ¨Õ×Á­ ï(­
°Á(÷(ü¿C($Â(©ª« ©Õ× ªÌÌkÎÔõ¸Ïçõ¸Ð€ö¸Ñ‘ö¸Ò¦ö¸f'EwÚ]¾å«€„­ Ç(­
±Á(¡’Ò($ß&„æ&çÜø&ÜTÍÊÎóúõ‚\‡µþ‚ص¸ô¼„¾µ¹k<Ì̵»·œØµ¼ÿ½Úµ½µ¾ìu˜ŒD·{ü˜1mo[]”ãL´û=ü ÀÁÂÂÁÂÀ±Ù·¿ «Ù·¿ ´±Ù·¿
«Ù·¿
„¥Šñ«Ù·¿„ã±Ù·¿üü:Íì«Ù ¥Íì±Ù ¨áØÃÄÅÆÇ 
  
ÆÇ?A;=¿¿Ü™¿¿ü™4ÿ¿¿Êʸ‚͵݅6{eJøÉ«Ù·¿ ±Ù·¿ ü¹O¬­® ¬áØ ­ÌÌkÎÔõ¸Ïçõ¸Ð€ö¸Ñ‘ö¸Ò¦ö¸f'EwÚ]¾å®œØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
áØ·¿
¿ Ç¿
ƫٱٷ¿¡’Òü° 4¯ ¯áØ·¿áØ·¿ ¿ ¸ ¿
ǫٱٷ¿Óc<à ü˜hÉÊÉʱكثكؔìΚ  ‚ثقرÙÔ彚 °ÚË̃؄ØÌSU\‡ÈÈŽ¡ü¥I°±²„¾„¾ô†¾ ˜X$]È=„kt• °°Ú ±ÌÌkÎÔõ¸Ïçõ¸Ð€ö¸Ñ‘ö¸Ò¦ö¸f'EwÚ]¾å²œØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤Ã°ÚƒØÈ ·È
̫ٱ١’Ãü£O¤ÎÏÐÐÏÎô¹ ¨Íì’Ú «Íì˜Ú ®Ú’Ú¿ÇÚ˜Ú¿Ç´ÜÑÒÜÝÒdf`b\^Í͹º»ˆ¼½Ï¾ˆ ÊöÞ‚‚œ’Ú¿ÇܘڿÇÜü­*³ ³´Ü¿Ç´Ü¿ÇÜÍ Í
Ò¿Ç’Ú˜ÚÞ*,½”¨ÍÜ¡× ¤,ÓÔþ4%‚ØÓÖô6„¾Ó×k<FÌÓÙ·$OœØÓÚ<lÓÛD{toD11PR?A´]
üv96 Returns a new [`FutureService`] for the given future.Á°úü´b_ A [`FutureService`] allows you to treat a future that resolves to a service as a service. ThisÁü—?< can be useful for services that are created asynchronously.Á×úÐüŸóüñ1. use tower::{service_fn, Service, ServiceExt};Áü£$! use tower::util::future_service;ÁüÈ! use std::convert::Infallible;ÁêúŒî # fn main() {Ál€
# async {ÁüŽ<9 // A future which outputs a type implementing `Service`.ÁüË%" let future_of_a_service = async {ÁüñMJ let svc = service_fn(|_req: ()| async { Ok::<_, Infallible>("ok") });Áü¿  Ok::<_, Infallible>(svc)Á };ÁçúüëEB // Wrap the future with a `FutureService`, allowing it to be usedÁü±=: // as a service without awaiting the future's completion:Áüï@= let mut svc = future_service(Box::pin(future_of_a_service));Á°úü´A> // Now, when we wait for the service to become ready, it willÁüö1. // drive the future to completion internally.Áü¨)& let svc = svc.ready().await.unwrap();ÁüÒ*' let res = svc.call(()).await.unwrap();Á # };Á<† í–Ÿó úüš # # Regarding the [`Unpin`] boundÁ¾ úü PM The [`Unpin`] bound on `F` is necessary because the future will be polled inÁü“
eb [`Service::poll_ready`] which doesn't have a pinned receiver (it takes `&mut self` and not `self:Áüù
YV Pin<&mut Self>`). So we cannot put the future into a `Pin` without requiring `Unpin`.ÁÓ úü× a^ This will most likely come up if you're calling `future_service` with an async block. In thatÁü¹ GD case you can use `Box::pin(async { ... })` as shown in the example.Átˆ
Á‘ÝݤޣßàßÝÞà ز
ùð š
ÍìÅÞ
¢†  
DzìÒ
ÁƒØÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
±¿¸Ì¬Ù
“íÁ
±¿ÅÞ¬€±¿ÅÞ
¸ÌL
ÜÁ±¿ÅÞ¸Ì÷
êìïñëíðòôŽâ¤ãâãز ùð ‘ÝäüÝ#ü³9©ñúüùbß©üà?˪¤úÐüŸóüÊ1º«ü€# use tower::util::FutureService;Áü¨!£¬ÎúŒÖÙ¬ó¬üþ<Š­ü¿%ЭüéMÿ­ü» Ö®ÿ®ëúüóE›¯ü½=ê¯üÿDA let mut svc = FutureService::new(Box::pin(future_of_a_service));ÁÈúüÐA‡±ü–1Ò±üÌ)²üú*À²ó²í–ŸóÎúüÖ#«³þúü†Pä³üÛe¾´üÅY­µ£úü«aœ¶ü‘G‡·êÁ‘Ýáá
äÁ±¿÷‹üÏFæ¤ççæز Ôùð ×íÚ‘ÝèÀcè#%(*üœ8Ÿ´µ ´‘Ý µ c cˆ¢cµ
 `£c¢° `àB¤GS
ɱå £å
èÁ±¿± ªü£!>ê¤ëêëز ¨!ùð «!íÚTÖ!ÚÝìÀcì#%(*üè!8ë!·¸¹ ·ÚÝ ¸ c cˆ¢cµ
 `£c¢° `àB¤GS
¹ɱé ï!é
ìÁ±¿$ð!± ö!üØ$…î¤ï£ðñîïñð 깬 %ôºLÒ%ɹ ã$¢† æ$Dzì™%ز Ý$к,¹%ẬÇ%ùð à$‘Ýòóôõö 
  
õöFH;=xz}lä%Dé%íí±¿ÅÞ T…&,Š&íí¸Ì\™&4ž&íí±¿ÅÞ ü·&OTº&º»¼ º‘Ý »ÌÌkÎÔõ¸Ïçõ¸Ð€ö¸Ñ‘ö¸Ò¦ö¸f'EwÚ]¾å¼œØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
‘ÝÅÞ
í Å&í
õÁ±¿ÅÞ¸Ì$Ê&¡’Ð&üþ)*$*½ ½‘ÝÅÞ‘ÝÅÞ í †*í
öÁ±¿ÅÞ¸Ì$‹*ò›‘*Í®·ÍÑ÷4
÷ùªÌd
È÷ú×3
¤,÷ûk<H
Ì÷ý·$Q
œØ÷þÿ½,i
Ú÷ÿ
÷d
Ž~€D.
qL<
ceRT”\
C´t
4ü½?
¤ƒƒô¹ Â
ÊÏ Å
ÛÏ
ÒÞÀc#%(*üƒ8

¾¿À ¾ÒÞ ¿ c cˆ¢cµ
 `£c¢° `àB¤GS
Àɱ Š

¿ÇóÁ$
± 
¼¸
¤ô¹ ½
ÊÏ À
ÒÞˆü€(
üÖ%
" Creates a new [`MapErr`] service.Á
¿ÇóÁÒÞ
ˆ¿ÇóÁÞ*¿‹±É‹üš
$
üÒ>
; Returns a new [`Layer`] that produces [`MapErr`] services.Á
úü J
G This is a convenience function that simply calls [`MapErrLayer::new`].Áì
úüô !
‹Þ
óÁ›á
¿ÇóÁ± §
üä

¤ŒÂ¿ŽŽŒóÁ á˜"¿
ÊÏ ì
Šñ
ÍìýÕ
†á„®
–"óÁôÕÌÇ
ô¹ é
Ùá
ÒÞ 
  
68ƒ
ŠŠÊàT‘
,
ŠŠýÕ
ŠŠÍÍÜŠÐÞ*÷{äh¬;~7©ÔãóÁüæ O
ÁÂà ÁÒÞ ÂÌÌkÎÔõ¸Ïçõ¸Ð€ö¸Ñ‘ö¸Ò¦ö¸f'EwÚ]¾åÜ؞؟ØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
ÒÞ·¿
Š ô
Š
¿ÇóÁ·¿ýÕ
¡’ÿ
ü‹4

Ä ÄÒÞ·¿ÒÞ·¿ Š 
Š
¿ÇóÁ·¿ýÕ
Óc<ž
´—
ز œ
§ß 
ôÛ
ü´"
 Creates a new [`MapErrLayer`].Áè
礧
Á±iŒüŸ:
¤˜˜ô¹ ¤
ÊÏ §
Ùá
›ášÜÝ*,/1

ÒÞü‚*
,…
Å Å›á¿Ç›á¿ÇÜ 

¿ÇóÁ
Þ*,
Íöÿ× ¤,œk<ÌœŸ·$'œØœ ÿ½,?Úœ¡<Yœ¢DeLWYFH”27´J(ü¡C¤¤¥¤¥ô¹ ¦ÊÏ ©ÛÏÙá¦Àc¦#%(*üë8îÆÇÈ ÆÙá Ç c cˆ¢cµ
 `£c¢° `àB¤GS
Èɱ£ ò£
¦¿ÇóÁ± ùÜܤ¨©¨©ô¹ áÊÏ äÙ᪫ü¬(üþ)& Creates a new [`MapRequest`] service.Á¹¿ÇóÁÙá§§
ª¿ÇóÁÞ*±üÒ(ü‚B? Returns a new [`Layer`] that produces [`MapRequest`] services.ÁÉúüÑNK This is a convenience function that simply calls [`MapRequestLayer::new`].Á¤úü¬!‹ÞóÁƒã§§
«¿ÇóÁ± ßü¤e¤­®¸B¯ÂB°°®­¯óÁ±â˜"ÂBÊÏ ¬Íì±â¯Íì˜è³¿Ç˜è“"óÁèô¹ ©Ùá±²³´µ 
  
´µ.0ŒŽˆŠl D• ¬¬¿Ç˜è¬¬¿Ç˜è
¬¬¿Ç˜è üø LÉÊË ÉÙá ÊÌÌkÎÔõ¸Ïçõ¸Ð€ö¸Ñ‘ö¸Ò¦ö¸f'EwÚ]¾å˜؞؟ØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
“ê¬
¬
´¿ÇóÁ±â˜è$‹
¡’
ü‚ ,$… Ì ÌÙá±â·ê¬ Š ¬
µ¿ÇóÁ±â˜è$ Óc<• Ô‡
··ز Œ
¾â¸ 
ôÓ
ü¨
&# Creates a new [`MapRequestLayer`].Áà
Á¾â
¸Á±¾ü›>¤º»º»ô¹  ÊÏ £Ùáƒã¼½Üݽ*,/1¹¹Ùáü†*,‰Í ̓ã¿Çƒã¿Çܹ ¹
½¿ÇóÁ$Þ*,–„Ú͈§«MapOkÁ,€@¾ÀªÌd"ȾÁ×:¤,¾Âk<O̾ķ$XœØ¾Åÿ½,pھƾÇdlD5rLCdfSU”cD´{5üØD¤ÉÊÊÉô¹ ÝÊÏ àÛÏT‘ÁãËÀcË#%(*ü£8¦ÎÏÐ ÎÁã Ï c cˆ¢cµ
 `£c¢° `àB¤GS
ÐɱÈ ªÈ
Ë¿ÇóÁ± ±äó¤ÍÎÎÍô¹ øÊÏ ûÁãÏÐüÃ(ü–(% Creates a new `MapResponse` service.ÁпÇóÁÁãÌÌ
Ï¿ÇóÁÞ*±}Žüì
)üš C@ Returns a new [`Layer`] that produces [`MapResponse`] services.Áâ úüê OL This is a convenience function that simply calls [`MapResponseLayer::new`].Á¾
úüÆ
!‹Þ
óÁˆæÌÌ
пÇóÁ± ù
üÀ ¤ÒÓÂÔ¯ÕÓÕÔÒóÁÈà˜"¯ ÊÏ È Šñ ÍìÙú †á„’ ½áü« ô¹ Å Ùá ÁãÖרÙÚ 
  
ÚÙ68uwz|vx  ÑÑÙú  ÑÑ á\“
4˜
Ñѧ§ÄªÞ*¾OK›FPÔãóÁüÕ
O
ÑÒÓ ÑÁã ÒÌÌkÎÔõ¸Ïçõ¸Ð€ö¸Ñ‘ö¸Ò¦ö¸f'EwÚ]¾åӜ؞؟ØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
Áã·¿
Ñ ã
Ñ
Ù¿ÇóÁ·¿Ùú
¡’î
üâ4Ô ÔÁã·¿Áã·¿ Ñ êÑ
Ú¿ÇóÁ·¿ÙúÓc<õÜòÜÜز ÷–äÝ 
ôÆü”-* Creates a new [`MapResponseLayer`] layer.ÁÓÁ–äÛÛ
ÝÁ±ü?¤ßàßàô¹ ÊÏ ÙáˆæáâÜÝâ*,/1ÞÞÁãüü*,ÿÕ Õˆæ¿Çˆæ¿ÇÜÞ Þ
â¿ÇóÁ$†Þ*,ŒÍÐÙïóMapÁÆ6ãå FutureExtÁL §ãæ×5¤,ãçk<JÌãé·$SœØãêÿ½,kÚãë<…ãìd\šD0rL>dfSU”^D´v5üËB¤îïîïô¹ ÐÊÏ ÓÛÏT‚ÆæðÀcð#%(*ü”8Öר ÖÆæ × c cˆ¢cµ
 `£c¢° `àB¤GS
Øɱí í
ð¿ÇóÁ± ¢ÔÔ¤òóóòô¹ ÙÊÏ ÜÆæôõü¢(üõ(% Creates a new [`MapResult`] service.Á¯¿ÇóÁÆæññ
ô¿ÇóÁÞ*Ò±ÜüÅ
'ü÷A> Returns a new [`Layer`] that produces [`MapResult`] services.Á½ úüÅ MJ This is a convenience function that simply calls [`MapResultLayer::new`].Á
úüŸ
!‹Þ
óÁéññ
õ¿ÇóÁ± Ò
ü• Ô¤÷øÂù¯ú¿ûúøù÷û
óÁÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
Êà á˜"Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
Ùú¿¼É ÊÏ Šñ óú ÍìêŽ †á„ì éꎠát‰ –"óÁ½ü  @ô¹ š Ùá Ææüýþÿ 
  
ÿ68Ÿ¢¤§©£¥  ööÙú
,“
ööêŽ

ööïïòÞ*ãÐvKΨ}ùÔãóÁüæ
O
ÙÚÛ ÙÆæ ÚÌÌkÎÔõ¸Ïçõ¸Ð€ö¸Ñ‘ö¸Ò¦ö¸f'EwÚ]¾åۜ؞؟ØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
Ææ·¿
ö ô
ö
ÿ¿ÇóÁ·¿ÙúêŽ
¡’ÿ
ü‡4Ü ÜÆæ·¿Ææ·¿ ö ö
¿ÇóÁ·¿ÙúêŽ$”Óc<šÌ’ز ›çƒ 
ôâü²+( Creates a new [`MapResultLayer`] layer.ÁïÁ›ç
ƒÁ±|ü©=¤ô¹ ®ÊÏ ±ÙáéˆÜ݈*,/1Ææü’*,•Ý Ýé¿Çé¿ÇÜ 
ˆ¿ÇóÁÞ*,¢T͘¡×¤,þ4 ‚ØŒk<3ÌŽ·$<œØÿ½,WÚ<qz|t,_aNP”J?´b0Ô»¤ô¹ ÀÊÏ ÃËé˜!$&ü‰(üÜ(% Creates a new [`MapFuture`] service.Á¿ÇóÁËé
¿ÇóÁÞ*(‘±2‘ü§'üÙA> Returns a new [`Layer`] that produces [`MapFuture`] services.ÁŸúü§MJ This is a convenience function that simply calls [`MapFutureLayer::new`].Áùúü!‹ÞóÁ©ë
¿ÇóÁ± ´ܨüû(Þ ÞËé Þ¿Ç ·
¿ÇóÁüš#üå0¦žß ßËé ᨀ ©
˜¿ÇóÁä—üã/ÈŸËé¿Ç
¿ÇóÁüÒ¯£¤œ¥žŸ¥!  œžŸ Ó걿㹠˜"¥!¾ ¨¢ƒØÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
¥¬ê ÍìÓê ÝÍ쌣 àÍì’£ ãÍ쨢汿ã¹T— “"Óê•¢¼ª ü¥ ×é’£±¿ã¹
‚ب¢ìã ùð ڔꡢ£¤¥ 
  
¥¤eg;=áãÝßÙÛÕ×
D
ššŒ£

šš’£
4¸
šš¨¢üË
O
àáâ à”ê áÌÌkÎÔõ¸Ïçõ¸Ð€ö¸Ñ‘ö¸Ò¦ö¸f'EwÚ]¾åâœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
”êã¹
š Ù
š
¤ã¹±¿Óꌣ’£¨¢
¡’ä
üÞ * ã ã”êã¹”êã¹ š æ š
¥ã¹±¿Óꌣ’£¨¢ ò›ñ ü» B¤§¨¨§ô¹ À ÊÏ à ÛÏ Ëé©Àc©#%(*ü„
8
äåæ äËé å c cˆ¢cµ
 `£c¢° `àB¤GS
æɱ¦
¦
©¿ÇóÁ
±
ÌŽ««ز ïê¬ 
ôÞü®+( Creates a new [`MapFutureLayer`] layer.ÁëÁïꪪ
¬Á±Ó‘ü›=¤®¯®¯ô¹  ÊÏ £Ùá©ë°±Üݱ*,/1­­Ëéü„*,‡ç ç©ë¿Ç©ë¿ÇÜ­ ­
±¿ÇóÁÞ*,”üè(³³ز íïê´Àc´ü—8šèéê èïê é c cˆ¢cµ
 `£c¢° `àB¤GS
êɱ² ž²
´Á± ¥\<‘ͧ¯ÔÞéõ‚\µ×2¤,µ¸þ4C‚ص¹ôT„¾µºŒN,d¥‚µ¼k<k̵½·$tœØµ¾<‘µ¿ì¦'™t;ŠDOyü':jlY[HJ´‚;üï(¤ÁéÂÁÂô¹ ôþ…¿Ç¥ì‹îÃÄ)+.0üž4µ¿Ç™¦‹îÀÀ«©ç›“’ò›â’ü„'4µ…¨‹îÀÀ
Ŀǥ셜““üÔf¤ÆéÇÆÇô¹ Ùþ…Üôd‹ÛÏ¿c¥ì‹îÈÀcÈ;=@BüÁ8Äëìí ë‹î ì c cˆ¢cµ
 `£c¢° `àB¤GS
íɱÅ ÈÅ
È¿Ç¥ì± Ïüñ 7¤ÊéËËÊô¹ ö þ…ù ôd›
òëÌ "üÊ
*×
¿Ç¥ìòëÉÉ
̿ǥìç›·”ò›Á”üÑB¤ÎéÏÏÎô¹ Öþ…Ùôd†òëÐу؄ØÑ,.13ÍÍÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
¿Ç¥ì ¿Ç¥ì
üÌIîïð„¾„¾ô†¾ ˜X$]È=„kt• îòë ïÌÌkÎÔõ¸Ïçõ¸Ð€ö¸Ñ‘ö¸Ò¦ö¸f'EwÚ]¾åðœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃòëƒØÍ ÞÍ
ѿǥ졒êÍÓܪ¥ctìÒîk<ŒÌÒð·$•œØÒñÒòl—üu! Error types for [`Optional`].Áü,
ÓÕפ,ÓÖ(*˜ïØܱ¿˜ï××
ØÔé˜ïÚÅcÚüŠ6ñòó ñ˜ï ò c cˆ¢cµ
 `£c¢° `àB¤GS
óɱÙ Ù
Ú$’טÔè˜ïü¦" Future types for [`Optional`].ÁŒü, )ÓÜÝõ‚\()ÜÞþ4L)‚ØÜàô])„¾Üák<m)ÌÜã·$v)œØÜäd))m9)tD)aDX)Pü91)BD13Ìà)¥ææа å)çïç 
ü€8)Ž)þ«çïåå
ç¡ÀÞ*,’)üåt)é¥êëëé꿱¬¤)¥² í)¶² ð)Dzì)ز ê)鲬Ã)ñðìíƒØ„Øí$&IKNP)4å)è覴üI)$’)ôõö„¾„¾ô†¾ ˜X$]È=„kt• ôñð õÌÌkÎÔõ¸Ïçõ¸Ð€ö¸Ñ‘ö¸Ò¦ö¸f'EwÚ]¾åöœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃñðƒØè ¡)è
íÁ’ÆÔÎ$—)¡’­)äÞL€|lo´ `œË¥ôôа Ъñõ 
üˆŠôå Create a new [`Optional`].Áþ«ªñóÂööó…À<™¡ÀÙÈ„Øæ¡ÀÙÈ
ô²¬ü
õ¡ÀÙÈÞ*Ç•KMü½u¥øÂùøùа Â…ÀòË„ü…̬œªñúûüýþ 
  
þýFHKM÷÷¡ÀÙÈ÷÷ô²4÷÷¥cˆÞ*Üçk;ôï|¡ÀÙÈ üªO÷øù ÷ªñ øÌÌkÎÔõ¸Ïçõ¸Ð€ö¸Ñ‘ö¸Ò¦ö¸f'EwÚ]¾åùœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
ªñÙÈ
÷ ¸÷
ý¡ÀÙÈ¡’ÃüÈ 4 ú úªñÙȪñÙÈ ÷ Ð ÷
þ¡ÀÙÈ Óc<Û « þÈâÿàâÿýâÿÿþÿ¡ÀÙÈ ¡ÀÙÎÙÈÍŒ¡¢×
¤,Ò­\ƒÒ­ƒþ4=‚ØôN„¾ŒN,^¥‚ˆk<eÌ·$nœØŠ<‹½¿œ¯*t5DI|ü*1mo\^KM´|#ü•NK A [`Future`] that yields the service when it is ready to accept a request.ÁäúüèJG [`ReadyOneshot`] values are produced by [`ServiceExt::ready_oneshot`].Á³úü·IF [`ServiceExt::ready_oneshot`]: crate::util::ServiceExt::ready_oneshotÁ¥ÂŽŽа …Àóñ 4#WR.(*-/„«ŒŒþ«üÁ ÁŒŒÄ®ü§3¥Âа ¬…ÀóñüßH¥Âа ä…ÀòË„–óñ "üÉ$Ö¡Àóñ
¡ÀÙÈë]®–üÑS¥Âššа Ö…ÀòË„“óñœƒØ„Øœ,.13˜˜Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
¡ÀŒÌüÓMûüý„¾„¾ô†¾ ˜X$]È=„kt• ûóñ üÌÌkÎÔõ¸Ïçõ¸Ð€ö¸Ñ‘ö¸Ò¦ö¸f'EwÚ]¾åýœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃóñƒØ˜ é˜
œ¡ÀÙÈ¡’õüƒ
Q¥žÂŸžŸа ˆ
…À<
¿c¡À
óñ Àc +-02üÛ
4Þ
þÿ þóñ ÿ c cˆ¢cµ
 `£c¢° `àB¤GS
ɱ â

 ¡ÀÙÈ
± é
×ü a^ A future that yields a mutable reference to the service when it is ready to accept a request.Áã úüç ;8 [`Ready`] values are produced by [`ServiceExt::ready`].Á£
úü§
96 [`ServiceExt::ready`]: crate::util::ServiceExt::readyÁ
‡P£¥¤Â¥¥£¤¥² ö
Šñ
’ƇPü‚ ›ó›Mëó´“*¢¦ŒŒÐNÞ*üN 4#WR. ‡P’Æ·¿›ó×ËÊå›ó¡¡
¢‡P’Æ·¿ò
ÛÝàâÞà¡¡Êåüú08¥¨Â©©¨¥² ÿŠñ<‚Ôòü¯I‡P«¥¬Â­«­¬¥² ¸Šñ’Æ·¿„ç›ó®´,.13üš&¡„æ›óªª
®‡P’Æ·¿ë]<¥üõT‡P°¥±Â²²°±¥² þŠñ<Î脸›ó³´ƒØ„Ø´ú2479¯¯Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
„æ’Æ·¿
ü€Mƒ„¾„¾ô†¾ ˜X$]È=„kt• ›ó ƒÌÌkÎÔõ¸Ïçõ¸Ð€ö¸Ñ‘ö¸Ò¦ö¸f'EwÚ]¾åœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤Ã›óƒØ¯ ¯
´‡P’Æ·¿¡’¢ü€N8¥Â··¥² Šñ¿c’ÆÔò¸Àc¸+-02üÕ4؈ Ôò  c cˆ¢cµ
 `£c¢° `àB¤GS
ˆɱµ ܵ
¸8’Æ·¿± ãÍÀ°× *¤,¹ºþ4*‚ع»k<7*̹½·$@*œØ¹¾<Z*¹¿D**VL+*GI68´K*(üÔ**üd7*4 Returns a new [`ServiceFn`] with the given closure.Áœ*úü W*T This lets you build a [`Service`] from an async function that returns a [`Result`].Áø*ú*ÐüŠ*ú*Ÿóü–;*8 use tower::{service_fn, Service, ServiceExt, BoxError};Á¬Ò*啤è* # impl Request {Áüý#*Á–*í–ü©$*! # struct Response(&'static str);Á¬Î*¢–üä.*+ # fn new(body: &'static str) -> Self {ÁÄ“* # Self(body)Á* # }Áü¸7*4 # fn into_body(self) -> &'static str { self.0 }Á*í–ø*ú¤ü* # #[tokio::main]Áü‘/*, # async fn main() -> Result<(), BoxError> {ÁüÁE*B async fn handle(request: Request) -> Result<Response, BoxError> {Áü‡6*3 let response = Response::new("Hello, World!");Á¤¾* Ok(response)Á*¸ÄÙ*úüÝ)*& let mut service = service_fn(handle);Á*úÔ‹* let response = serviceÁ„¦*
.ready()Á* .await?ÁìÇ* .call(Request::new())Á„å*
.await?;Áö*úüú6*3 assert_eq!("Hello, World!", response.into_body());Á*ו* # Ok(())Á*í–*Ÿó*¡Àíó¥ÁÁа æ*
À¡À± é*ü¯
#*¥ÃÃа ´
*íóÄÀcÄüÙ
8*Ü
*Š íó Š c cˆ¢cµ
 `£c¢° `àB¤GS
ɱÂ à
*Â
ġ*± ç
*ü  ƒ*¥ÆÇÂÈ£ÉÊÊÈÆÇÉ ¡À·¿˜"óÁ û *óÁƒØÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
£’£¬Œ
*Šñ *Íì¹€ ´ *¾£ · *“"¡ÀÎÿœé *а ¥ *ºÝì…
*ÊÏ ¨ *íóËÌÍÎÏ 
  
ÎÏ>@;=Ž
*D¯
*ÅŹ€ TÁ
*,Æ
*ÅÅ’£
*4Ú
*ÅÅóÁüë
D*Tî
*ŒŽ Œíó ÌÌkÎÔõ¸Ïçõ¸Ð€ö¸Ñ‘ö¸Ò¦ö¸f'EwÚ]¾åŽœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
’£Å ù
*Å
ΡÀóÁ·¿¹€ ’£
* *üÓ0*$Ö* íó·¿íó·¿ Å Û*Å
Ï¡ÀóÁ·¿¹€ ’£*ò›æ*DÃ͸ÁÚß÷4ÐÒ†„L§ÐÓ×6¤,ÐÕþ4G‚ØÐÖk<ZÌÐØ·$cœØÐÙÿ½,~ÚÐÚÐÛd£¥+ˆt?yü+,kmZ\”qK´‰=üË=¤ÝÞÞÝô¹ ÐÊÏ ÓÛÏËôßÀcß#%(*ü8 Ëô  c cˆ¢cµ
 `£c¢° `àB¤GS
ɱÜ Ü
ß¿ÇóÁ$—± ¬‘¤áâáâô¹ ÊÏ ËôãäüÓ(ü­! Creates a new `Then` service.Áà¿ÇóÁËôàà
ã¿ÇóÁÞ*𗱤—üç"ü£<9 Returns a new [`Layer`] that produces [`Then`] services.ÁäúüìHE This is a convenience function that simply calls [`ThenLayer::new`].Á¹úüÁ!‹ÞóÁš÷àà
ä¿ÇóÁ± ôüÛ
ó¤æçÂè¯é¿ê¥!ëæëçéêè
óÁ½˜"¨¢ ¨¢ƒØ˜Žü¬ Šñ
óú
Œ
Ï£ †á„² æ áêŽ ¹üæ ,ô¹ à
Ùá,• ­¤ü¥ (ÊÏ ã
Ëôìíîïð 
  
ðïGI;=¦¨«­°²µ·  ååÙú  ååêŽ\‹
4
ååÚÚå£ÞÞ*ÐÐ!Ëô/ÞR¢Ô㨢óÁüË
O
 Ëô ÌÌkÎÔõ¸Ïçõ¸Ð€ö¸Ñ‘ö¸Ò¦ö¸f'EwÚ]¾åœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
Ëô·¿
å Ù
å
ï¿ÇóÁ·¿Ùúꎨ¢
¡’ä
üì4 Ëô·¿Ëô·¿ å ôå
ð¿ÇóÁ·¿Ùúꎨ¢Óc<ÿ¤óòòز ø õó 
ô¹üŽ&# Creates a new [`ThenLayer`] layer.ÁÆÁ õññ
óÁ±N˜üû8¤õööõô¹ ÊÏ ƒÙáš÷÷øÜÝø*,/1<¿ôôËôüÚ* š÷¿Çš÷¿ÇÜô ãô
ø¿ÇóÁÞ*,êü*' [PRNG] utilities for tower middleware.Á+úü/IF This module provides a generic [`Rng`] trait and a [`HasherRng`] thatÁüyJG implements the trait based on [`RandomState`] or any other [`Hasher`].ÁÄúüÈPM These utilities replace tower's internal usage of `rand` with these smaller,Áü™LI more lightweight methods. Most of the implementations are extracted fromÁüæ/, their corresponding `rand` implementations.ÁúüšGD [PRNG]: https://en.wikipedia.org/wiki/Pseudorandom_number_generatorÁÖ“»\‰ÖJùû\\¡Åeùý¢eùþ¹£ùÿçüò"Züç7MO<>T»/lÒüË:7 A simple [PRNG] trait for use within tower middleware.ÁúüŠG´ ܆žüÒ®†ž†ž ‚ ƒ ‚ ƒ ƒ ô‰ôæ Generate a random [`u64`].ÁDŒ˜ ˜Žž 
Žžìáü­/, Generate a random [`f64`] between `[0, 1)`.ÁDä Žž í
Žžü£ 2üŒ
+( Randomly pick a value within the range.Á¼
ú
 # PanicÁÔ
úüÜ
B? - If `range.start >= range.end` this will panic in debug mode.ÁT¦ š šŽž££¹ƒ£¹„£þ-'ºˆÉ¬g ± 
ƒ Žž rangeÁ,¼ ü‚$£Îìã¹ ¦ŠØ÷ ì­ Ø÷ ¹
ã¹Ì»ˆ ¤èü¼'$ Create a new default [`HasherRng`].ÁïÌ»
ˆ Ô¥Ì»Š ´Š ¤ÆÌ»
Š ¤Œ Œ Íìù ¢Ðø  
üõ%ü¸85 Create a new [`HasherRng`] with the provided hasher.Á\üùÐø
ùƒ§üÏ6  °© ÔÅeùÐø   #%ìŒDœ œÐøŽ  ˜Ž
ù$¤äM#M#_#_#üä8q#q#‡#‡###³#³#É#É#ä‹ß#ü­%ñ#$üä$$)$)$üäÄ<$<$O$O$üäëb$b$u$u$üäˆ$ˆ$›$›$üäÊ®$®$Á$Á$üäûÔ$Ô$ç$ç$„‚ú$”˜
%üäÑ%%1%1%üäøC%C%V%V%üäi%i%|%|%t Ž%Ž%¤%¤%œÑº%äëÑ%Ö©, ÜKDÕ ÓÁ ´» „÷ ´í²sl¦
Û à ¸‚¤Ð
ÊÄ ÜŠd‚ ÍÅ ÄŒ± §Æ  ïÇ ÜKD› ÜÈ å£ ÚÉ ô•
„üÁ
#xäò
küœ &_üÐ "S¼€ G¼± :ü¦
>üÍ KH An extension trait for `Service`s that provides a variety of convenientÁd™
 adaptersÁ
Ê ÂË Ë Ê †žü¦
°þŽžÙÈüÅ
…À
Ê †ž7€² '†žC€² 3Ì Í Î Ï Ñ Ó Ö Ù Ý à å ê ë Ì Í Î Ï Ñ Ó Ö Ù Ý à å ê ë
Ï Ö å Ý Î Ù à Ñ ë Í ê Ì Ó ¢¤üÃNüë
SP Yields a mutable reference to the service when it is ready to accept a request.Á,Æ Žž¡¡¢È¦ˆ ›Mëó´“*ŽžÙÈÊ  ÌÊ Í쎞,‹
Ì ŽžÙÈüýTü¼<9 Yields the service when it is ready to accept a request.Ál€ŽžŒŒÐNÞ*üN 4#WR.ŽžÙÈÊ Ê ®µ ,Ë
Í ŽžÙÈüÚWüƒRO Consume this `Service`, calling it with the provided request once it is ready.Á<ÝŽžÙȧ§à˜ªºµ2 ! 19¾ŽžÙÈÊ Ê ®µ ,«
Î ŽžÙÈò›ëü±üã`] Process all requests from the given [`Stream`], and produce a [`Stream`] of their responses.ÁÈúüÐVS This is essentially [`Stream<Item = Request>`][stream] + `Self` => [`Stream<Item =Áü«B? Response>`][stream]. See the documentation for [`CallAll`] forÁ details.Áƒúü‹O½ñüßMJ [stream]: https://docs.rs/futures/latest/futures/stream/trait.Stream.htmlÁD´ŽžŽÀÜ
Ü
Àwß
Þ*ùy¿ ãü‰j3ŽžŽÀÊ ¤Ð Ð Ê ÍìŽÀ ½®µ ,ûEŽÀü$ŽÀFÙÈ
Ï ŽžÙÈŽÀreqsÁ$ÆRTüÜ'_üåIF Executes a new future after this service's future resolves. This doesÁü³96 not alter the behaviour of the [`poll_ready`] method.ÁñúüùJG This method can be used to change the [`Response`] type of the serviceÁüÈXU into a different type. You can use this method to chain along a computation once theÁü¥)& service's response has been resolved.ÁÓúüÛ*' [`Response`]: crate::Service::ResponseÁüŠ.+ [`poll_ready`]: crate::Service::poll_readyÁ½úÐüŸóüã%" # use std::task::{Poll, Context};Áü'$ # use tower::{Service, ServiceExt};Áוìà # struct DatabaseService;Áäå # impl DatabaseService {Áü†'$ # fn new(address: &str) -> Self {Áܲ # DatabaseServiceÁ # }Áí–ו¬ö # struct Record {ÁÌ # pub name: String,Á¤® # pub age: u16Áí–וüÝ-* # impl Service<u32> for DatabaseService {Áü # type Response = Record;Áij # type Error = u8;ÁüÐ=: # type Future = std::future::Ready<Result<Record, u8>>;Á, וüœ YV # fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {Áüú  # Poll::Ready(Ok(()))ÁLž!ðà ,¬!וü¶!:7 # fn call(&mut self, request: u32) -> Self::Future {Áüõ!KH # std::future::ready(Ok(Record { name: "Jack".into(), age: 32 }))ÁLÅ"ðà <Ó"í–,ß"וüé"PM # async fn avatar_lookup(name: String) -> Result<Vec<u8>, u8> { Ok(vec![]) }Á,¾#וŒÈ#Ù¬„Þ#
# async {Áüó#,) // A service returning Result<Record, _>Áü¤$96 let service = DatabaseService::new("127.0.0.1:8080");Áâ$úüê$+( // Map the response into a new responseÁüš%HE let mut new_service = service.and_then(|record: Record| async move {Áüç% let name = record.name;Áü‹&! avatar_lookup(name).awaitÁ<±&–ß½&úÜÅ& // Call the new serviceÁ„å&
let id = 13;Áüú&52 let avatar = new_service.call(id).await.unwrap();Á\´' # };Á<Ä'í–<Ð'ŸóDß'ŽžÓêÒ Ò ærÕ Þ*ÎÖ ±Î
ä”IÓêúé ˜"ýÕ,«I‰Ñ ,³I
Ö ŽžÙÈÓêýÕ$ËH± ÑHwy|~üé†ßüèIKH Maps this service's result type (`Result<Self::Response, Self::Error>`)Áü¸JFC to a different value, regardless of whether the future succeeds orÁTƒK fails.ÁKúüšKHE This is similar to the [`map_response`] and [`map_err`] combinators,ÁüçKHE except that the *same* function is invoked when the service's futureÁü´LHE completes, whether it completes successfully or fails. This functionÁüMHE takes the [`Result`] returned by the service's future, and returns aÁ|ÎM [`Result`].ÁâMúüêMHE Like the standard library's [`Result::and_then`], this method can beÁü·NLI used to implement control flow based on `Result` values. For example, itÁüˆODA may be used to implement error recovery, by turning some [`Err`]ÁüÑOEB responses from the service into [`Ok`] responses. Similarly, someÁü›PLI successful responses from the service could be rejected, by returning anÁüìPMJ [`Err`] conditionally, depending on the value inside the [`Ok`]. Finally,Áü¾QLI this method can also be used to implement behaviors that must run when aÁüRMJ service's future completes, regardless of whether it succeeded or failed.ÁáRúüéRJݾ ü¸SKH into a different type. It can also be used to change the [`Error`] typeÁüˆTOL of the service. However, because the [`map_result`] function is not appliedÁüÜTJG to the errors returned by the service's [`poll_ready`] method, it mustÁü«UKH be possible to convert the service's [`Error`] type into the error typeÁüûUNK returned by the [`map_result`] function. This is trivial when the functionÁüÎVJG returns the same error type as the service, but in other cases, it canÁüWA> be useful to use [`BoxError`] to erase differing error types.ÁãWútëWÀÁþWúü†X# Recovering from certain errors:Á®Xú<¶XŸóüÂX%äÁ üìX'“ ,˜Yוì¢YРäÄYö üåY'œÃ Ü‘ZÌà L±Zðà <¿Zí–,ËZו¬ÕZœÄ ÌïZºÄ ¤[ÜÄ <¦[í–´²[ # #[derive(Debug)]Á¤Í[ # enum DbError {Áüæ['$ # Parse(std::num::ParseIntError),Á¼’\ # NoRecordsFound,Á<®\í–,º\וüÄ\-”Å üö\$! # type Response = Vec<Record>;ÁìŸ] # type Error = DbError;ÁüÁ]GD # type Future = std::future::Ready<Result<Vec<Record>, DbError>>;Á,^וü—^YéÆ üõ^ÌÇ L™_ðà ,§_וü±_:È üð_QN # std::future::ready(Ok(vec![Record { name: "Jack".into(), age: 32 }]))ÁLÆ`ðà <Ô`í–,à`וŒê`Ù¬„€aÂÊ ü•a74 // A service returning Result<Vec<Record>, DbError>ÁüÑa9’Ë búü—bUR // If the database returns no records for the query, we just want an empty `Vec`.ÁüñbDA let mut new_service = service.map_result(|result| match result {ÁüºcTQ // If the error indicates that no records matched the query, return an emptyÁÌ“d // `Vec` instead.Áü±d74 Err(DbError::NoRecordsFound) => Ok(Vec::new()),ÁüídC@ // Propagate all other responses (`Ok` and `Err`) unchangedÁ|µe x => x,Á<Ée–ßÕeúÜÝeÔÍ „ýeøÍ Ô’fÂØ „±f ù|Æf¹ùŒÚfÿØ „ðf÷ùÜ…g # Ok::<(), DbError>(())Á\¥gÐÎ <µgí–<ÁgŸóÍgúüÕg" Rejecting some `Ok` responses:Áügú<„hŸóüh%äÁ üºh'“ ,æhוìðhРä’iö ü³i'œÃ ÜßiÌà Lÿiðà <jí–,™jו¬£jœÄ ̽jºÄ ¤ÛjÜÄ <ôjí–ä€k # type DbError = String;Áì¡k # type AppError = String;Á,ÃkוüÍk-”Å üÿkËÅ ì£lºü üÅlB? # type Future = std::future::Ready<Result<Record, DbError>>;Á,Œmוü–mYéÆ üômÌÇ 
üš€9’Ë Ø€úüà€2/ // Print a message whenever a query completes.Áü—7Æ‹
üÓ@= println!("query completed; success={}", result.is_ok());Át˜‚ resultÁ<«‚–ß·‚úÜ¿‚ÔÍ „ß‚øÍ ôô‚ let response = new_serviceÁ„—ƒ ù|¬ƒ¹ùŒÀƒÿØ |Öƒ .await;Átêƒ # responseÁ\ýƒÐÎ <í–<™„Ÿó¥„úü­„.+ [`map_response`]: ServiceExt::map_responseÁüà„$! [`map_err`]: ServiceExt::map_errÁü‰…*' [`map_result`]: ServiceExt::map_resultÁü¸…$»Þ üá…*ÒÀ ü.†Á üÆ! [`BoxError`]: crate::BoxErrorÁT솎žÓêÐÐÓÞ*ãÔ±ãÈ›Ñ>†HŽžÓêÊ Ú ¯Û ¿Ü Ú Û Ü Ê œ£ ÷†óúDú†Œ,„‡®µ ,ŇéêŽüé ŒÛ‡–"ÓêÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
Ü üé üù‡FÓêâž
˜"˜Ž¼¨ˆ‰Ñ ,ˆ
Ù ŽžÙÈÓêÙúêŽ$‹‡± ‘‡êìîðòôüŸ•ˆüúˆ2/ Composes a function *in front of* the service.Á±‰úü¹‰JG This adapter produces a new service that passes each value through theÁüˆŠ30 given function `f` before sending it to `self`.ÁÀŠúlÈŠÐü<ÚŠŸóüæŠ ƒ“
ü‹‹%äÁ üµ‹'“ ,á‹וìë‹РäŒö ü®Œ'œÃ ÜÚŒÌà LúŒðà í–,”וüž0- # impl Service<String> for DatabaseService {ÁüÓªá Ä÷óÅ ü”Ž=Û”
,ÖŽוüàŽYéÆ ü¾ÌÇ ðà וüú=: # fn call(&mut self, request: String) -> Self::Future {Áü¼1’ã ðà <€‘í–,Œ‘וŒ–‘Ù¬|¬‘€ä üÀ‘-* // A service taking a String as a requestÁüò‘9’Ë °’úü¸’'$ // Map the request to a new requestÁüä’HE let mut new_service = service.map_request(|id: u32| id.to_string());Á±“úܹ“ÔÍ „Ù“øÍ ôî“Ò˜
„‘” ù|¦”¹ùŒº”ÿØ |Д¤™
t䔽™
\÷”ÐÎ <‡•í–<“•Ÿó\¢•ŽžÓêöö£ùÞ*œú±œÚëó‰Vh0…ŽžÓêÊ Þ žZß ß Þ Ê œ£ ®•ÍìžZT±•®µ ,ø•“"ÓêѪ
䊖Óêñª
˜"ÙÈ<Ÿ–
Ý ŽžÙÈÓêѪ
$½•± Õwyprü¯ßüü²¿;8 Composes an asynchronous function *after* this service.Áò¿úüú¿JG This takes a function or closure returning a future, and returns a newÁüÉÀLI `Service` that chains that function after this service's [`Future`]. TheÁüšÁJG new `Service`'s future will consist of this service's future, followedÁüéÁLI by the future returned by calling the chained function with the future'sÁüºÂIF [`Output`] type. The chained function is called regardless of whetherÁüˆÃIF this service's future completes with a successful response or with anÁTÖà error.ÁåÃúüíÃDA This method can be thought of as an equivalent to the [`futures`Áü¶ÄJG crate]'s [`FutureExt::then`] combinator, but acting on `Service`s thatÁü…ÅLI _return_ futures, rather than on an individual future. Similarly to thatÁüÖÅJG combinator, [`ServiceExt::then`] can be used to implement asynchronousÁü¥ÆEB error recovery, by calling some asynchronous function with errorsÁüïÆJG returned by this service. Alternatively, it may also be used to call aÁü¾ÇIF fallible async function with the successful response of this service.ÁŒÈúü”ÈJݾ üãÈKæó ü³ÉGD of the service. However, because the `then` function is not appliedÁüÿÉJ”õ üÎÊKèõ üžËDA returned by the `then` future. This is trivial when the functionÁüçËJ•÷ ü¶ÌAé÷ üÌút„ÍÀÁ—Íú<ŸÍŸóü«Í%äÁ üÕÍ'“ ,Îוì‹ÎРä­Îö üÎÎ'œÃ ÜúÎÌà LšÏðà <¨Ïí–,´Ïו¼¾Ï # type Record = ();ÁÄÚÏ # type DbError = ();Á,÷ÏוüÐ-”Å ü³ÐËÅ ì×кü üùÐB—ˆ
,ÀÑוüÊÑYéÆ ü¨ÒÌÇ LÌÒðà ,ÚÒוüäÒ:È ü£Ó&# # std::future::ready(Ok(()))ÁLÎÓðà <ÜÓí–,èÓוŒòÓÙ¬üˆÔ2°Š
ü¿Ô9’Ë ýÔúü…ÕMJ // An async function that attempts to recover from errors returned by theÁ„×Õ
// database.ÁüìÕLI async fn recover_from_error(error: DbError) -> Result<Record, DbError> {Át½Ö // ...Á„ÐÖ
# Ok(())Á,åָĄïÖÂÊ „×úüŒ×FC // If the database service returns an error, attempt to recover byÁü××OL // calling `recover_from_error`. Otherwise, return the successful response.Áü«Ø<9 let mut new_service = service.then(|result| async move {Á´ìØ match result {Áü‡Ù%" Ok(record) => Ok(record),Áü±Ù2/ Err(e) => recover_from_error(e).await,ÁLèÙòÌ<öÙ–ß‚ÚúÜŠÚÔÍ „ªÚøÍ ä¿Úä
„àÚ ù|õÚ¹ùŒ‰ÛÿØ „ŸÛ÷ùÜ´ÛÀ„
\ÔÛÐÎ <äÛí–<ðÛŸóüÛúü„Ü&# [`Future`]: crate::Service::FutureÁü¯Ü+( [`Output`]: std::future::Future::OutputÁüßÜ.+ [`futures` crate]: https://docs.rs/futuresÁü’Ýgd [`FutureExt::then`]: https://docs.rs/futures/latest/futures/future/trait.FutureExt.html#method.thenÁüþÝ$»Þ ü§Þ*ÒÀ üÖÞ.†Á ü‰ß!×›
$²ßŽžÓ길ڡ»Þ*м±ÐwnA!+Z”5ŽžÓêÊ á ¯â ¿ã ¥!ä ã á â ä Ê œ£ ·ßóúDºßŒ,ÄßÏ£Ëß®µ ,…àž
Œ›àמ
ü¹à2Óêâž
˜"¨¢èà‰Ñ ,îà­¤ü‚á(ç ü‰á 
à ŽžÙÈÓêÙúꎨ¢$Ðß± Öߟ¡£¥§©«­üæñçüØáHE Composes a function that transforms futures produced by the service.Á¥âúü­â\Y This takes a function or closure returning a future computed from the future returned byÁüŽãVS the service's [`call`] method, as opposed to the responses produced by the future.ÁéãútñãÀÁ„äú<ŒäŸóü˜ä%äÁ üÂä1. # use tower::{Service, ServiceExt, BoxError};Á,øäוì‚åРä¤åö üÅå'œÃ ÜñåÌà L‘æðà <Ÿæí–,«æו¼µæð·
üÑæ%" # type DbError = crate::BoxError;Á,ûæוü…ç-”Å ü·çËÅ ìÛçºü üýçB—ˆ
,ÄèוüÎèYéÆ ü¬éÌÇ LÐéðà ,Þéוüèé:È ü§ê&Ô¹
LÒêðà <àêí–,ìêוŒöêÙ¬äŒëƒóì­ë use tokio::time::timeout;ÁÏëúü×ë2°Š
üŽì9’Ë „ÌìÂÊ áìúüéìB? let mut new_service = service.map_future(|future| async move {Áü°íA> let res = timeout(Duration::from_secs(1), future).await?;Áôöí Ok::<_, BoxError>(res)Á<™î–ߥîúÜ­îÔÍ „ÍîøÍ äâîä
„ƒï ù|˜ï¹ùŒ¬ïÿØ „Âï÷ùä×q
\øïÐÎ <ˆðí–<”ðŸó ðúü¨ð]Z Note that normally you wouldn't implement timeouts like this and instead use [`Timeout`].ÁŠñúü’ñ" [`call`]: crate::Service::callÁü¹ñ(% [`Timeout`]: crate::timeout::TimeoutÁTéñŽžÓꘘחÞ*œ±šdMo
ËÊ'ŽžÓêÊ æ ¥!ç ¯è ¿é ç è æ é Ê
œ£ ôñõà÷ñÍì¯DüñÍì¿,†ò®µ ,Çò“"ÓꎞÙÈ ÔÙòÓêÈÖ
˜"Ûàðòé¨Ö
üé Œ„ó‚ØÛàü¤ó(ÛàƒØÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
”Ö
¨Ö
ü«ó 
å ŽžÙÈÓêÛà”Ö
¨Ö
$ò± “ò69<?7:25üòý˜üÿóC@ Convert the service into a [`Service`] + [`Send`] trait object.ÁÇôúüÏô(% See [`BoxService`] for more details.Áüôúü„õHE If `Self` implements the [`Clone`] trait, the [`boxed_clone`] methodÁüÑõC@ can be used instead, to produce a boxed service which will alsoÁÄ™ö implement [`Clone`].Á¶öúl¾öÐüÐöú<ØöŸóüäöMJ use tower::{Service, ServiceExt, BoxError, service_fn, util::BoxService};Á,¶÷ו¬À÷å•´Ú÷ƒ–¬õ÷¢–üø#Á–<·øí–ÃøúüËø30 let service = service_fn(|req: Request| async {Áüƒù*' Ok::<_, BoxError>(Response::new())Á<²ù–ß¾ùúüÆùB? let service: BoxService<Request, Response, BoxError> = serviceÁäúµ™ü®ú)Û™|ÜúšTðú¥šìÿú¸šü¡û*ßš|Ðû’›Täû¥šŒóû .boxed();Áü‰ü,”Ÿüºü*É üéü!ý <ýŸó›ýúü£ýùüÇý&# [`boxed_clone`]: Self::boxed_cloneÁ,õýŽž´*Þ*¹~–Fp¾ÙÈÜ üé Ê Ê ®µ ,ÍþÌ쎞$ÕþŽž<ÜþÌìÊÖ
$ûþÊÖ
<‚ÿ
ê ŽžÙÈ$ûýüú‰«üºÿOL Convert the service into a [`Service`] + [`Clone`] + [`Send`] trait object.ÁŽ€úü–€RO This is similar to the [`boxed`] method, but it requires that `Self` implementÁüí€C@ [`Clone`], and the returned boxed service implements [`Clone`].Áüµ-* See [`BoxCloneService`] for more details.ÁçúÐüú<‰‚Ÿóü•‚RO use tower::{Service, ServiceExt, BoxError, service_fn, util::BoxCloneService};Á,ì‚ו¬ö‚å•´ƒƒ–¬«ƒ¢–üŃ#Á–<íƒí–ùƒúü3ÐÜ
ü¹„*ŽÝ
<è„–ßô„úüü„GD let service: BoxCloneService<Request, Response, BoxError> = serviceÁäÈ…µ™üé…)Û™|—†šT«†¥š캆¸šü܆*ßš|‹‡’›TŸ‡¥š¼®‡ .boxed_clone();ÁʇúüÒ‡-* // The boxed service can still be cloned.Á¤„ˆ service.clone();Áüˆ,”ŸüΈ*É üýˆ!ý <£‰Ÿó¯‰úü·‰ùÔÛ‰ [`boxed`]: Self::boxedÁ\ý‰Žžöö÷¨0ûˆê bßd”?SÙÈÜ üé Ê Ê ®µ ,èŠØŽž,àŠ¨â
$ðŠºâ
<÷ŠÆâ
$–‹Øâ
<
ë ŽžÙÈ$‰ŠüØ‹[¥í Âî î í Îì¡À Ý‹…À<è‹òËü”Œ¡À "ü¿‘?ü¸Œ0- Convert an `Option<Layer>` into a [`Layer`].ÁéŒú<팟óôõŒ # use std::time::Duration;ÁÌ” # use tower::Service;Áü®)& # use tower::builder::ServiceBuilder;ÁüØ" use tower::util::option_layer;Áüû'$ # use tower::timeout::TimeoutLayer;Áü£Žmj # async fn wrap<S>(svc: S) where S: Service<(), Error = &'static str> + 'static + Send, S::Future: Send {Áü‘/, # let timeout = Some(Duration::new(10, 0));ÁüÁ-* // Layer to apply a timeout if configuredÁüïEB let maybe_timeout = option_layer(timeout.map(TimeoutLayer::new));Áµú̹ ServiceBuilder::new()ÁìÓ .layer(maybe_timeout)Á´ñ .service(svc);Á<ˆ‘í–<Ÿó˜‘úüœ‘" [`Layer`]: crate::layer::LayerÁdƑۼݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙùù¹º»ˆ¼½Ï¾ˆ ÊöÞ‚‚œùùµúð ð Íìùù Ó‘
ï ùùþ,Ö‘|Ý>ü0- Builder types to compose layers and servicesÁ<å>¿ùDDäñ ó ÿ½,NÚñ ô StackÁ,Uòñ õ <pñ ö ׃¤,ñ ÷ \6jlY[DF´a7D~)üñ)†úù ´ù ¤¡†úø ø
ù ìÕ†úû Ô¢üù$! Create a new [`ServiceBuilder`].Á¯†úú ú
û Ìý ý ýõ
Êùþ €
˜
š
œ
Ÿ
¤
§
ª
GIü³ >ü¯41 Add a new layer `T` into the [`ServiceBuilder`].ÁèúüðLI This wraps the inner service with the service provided by a user-definedÁüÁEB [`Layer`]. The provided layer must implement the [`Layer`] trait.Á úÜ“ µùÊù’Æʧþñ ‚éX¹;9éèòòžö
õÞ*öouterÁÈ­ù—’Æùùü ¥ÿ ÿ ü ¥² À 
þ ùù’Æþ "üÉ&ƒüÔ!?< Optionally add a new layer `T` into the [`ServiceBuilder`].Á˜"ú< "Ÿóô¬"Óí
ÌÏ"ûí
üí")Ÿî
ü›#'€ï
üÇ#m²ï
ü¹$/ªð
üí$$! // Apply a timeout if configuredÁÌ–%øñ
ü´%52 .option_layer(timeout.map(TimeoutLayer::new))Á¬î% .service(svc)Á<ˆ& # ;Á<”&í–< &Ÿó»û„²&Ĭ&dÐ&ÊùÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ’Æʧþñ ‚éX¹;9éèòòžö
õÞ*öºü
È­ù—¹º»ˆ¼½Ï¾ˆ ÊöÞ‚‚œ’Ƶúùùü ¥

ü ¥² Ý&
ùù’Æ$é&þ,÷& "üï)Tü(]Z Add a [`Layer`] built from a function that accepts a service and returns another service.Áñ(úüù(<9 See the documentation for [`layer_fn`] for more details.Áº)úüÂ)(% [`layer_fn`]: crate::layer::layer_fnÁDö)ÊùóÁʧþñ ‚éX¹;9éèòòžö
õÞ*öºü
È­ù—êêñÓì±äƒ5ظ³óÁùùü ƒ
ƒ
ü ÊÏ ÿ)
ùùóÁ$*± ˆ* "ü÷@YüÐ=HE Retry failed requests according to the given [retry policy][policy].Á>úü¥>FC `policy` determines which failed requests will be retried. It mustÁüð>2/ implement the [`retry::Policy`][policy] trait.Á§?úü¯?B? This wraps the inner service with an instance of the [`Retry`]Á|ö?‰ìŠ@úÜ’@ [`Retry`]: crate::retryÁü²@" [policy]: crate::retry::PolicyÁ»ŽŒß@ÌÙ@,þ@ÊùˆÀʧþñ ‚éX¹;9éèòòžö
õÞ*öºü
È­ù—Õ Õ k× Ëe†ÂûE#ãˆÀùùü ¡

ü ÍìˆÀ „A
ùùˆÀ$‡AË4A "üü˜B2/ Fail requests that take longer than `timeout`.ÁÏBúü×BHE If the next layer takes more than `timeout` to respond to a request,Áü¤C63 processing is terminated and an error is returned.ÁßCúüçCDA This wraps the inner service with an instance of the [`timeout`]Á|°D‰ìÄDúüÌD [`timeout`]: crate::timeoutÁ»íœöDÜðD<—EÊù‘Œʧþñ ‚éX¹;9éèòòžö
õÞ*öºü
È­ù—ûÆùùü ü
ùù$¨Eí<¶Eüç^«üæO$! Map one request type to another.ÁPúü—PGD This wraps the inner service with an instance of the [`MapRequest`]Á|ãP‰ì÷PútÿPÀÁ’QúüšQ# Changing the type of a request:ÁÂQú\ÊQãÁôÚQ use tower::ServiceBuilder;ÁÔýQ use tower::ServiceExt;ÁœRú¤¤R£öü½R)& # async fn main() -> Result<(), ()> {ÁüëREB // Suppose we have some `Service` whose request type is `String`:ÁüµSEB let string_svc = tower::service_fn(|request: String| async move {ÁüÿS)& println!("request: {}", request);Át­T Ok(())Á<ÀT–ßÌTúüÔTIF // ...but we want to call that service with a `usize`. What do we do?Á¢UúüªU)& let usize_svc = ServiceBuilder::new()ÁüØUJG // Add a middleware that converts the request type to a `String`:Áü§V=: .map_request(|request: usize| format!("{}", request))ÁüéV?< // ...and wrap the string service with that middleware:Áì­W .service(string_svc);ÁÏWúü×W41 // Now, we can call that service with a `usize`:ÁüX! usize_svc.oneshot(42).await?;Ád¶Xéú<ÇXí–<ÓXŸóßXúüçX  Modifying the request value:ÁŒYú\”YãÁô¤Yû“ ÔÇY¢” æYú¤îY£öü‡Z)ß” üµZ41 // A service that takes a number and returns it:ÁüîZ=: let svc = tower::service_fn(|request: usize| async move {Á”°[ Ok(request)Á<Ç[–ßÓ[úüÛ[# let svc = ServiceBuilder::new()Áüƒ\85 // Add a middleware that adds 1 to each requestÁüÀ\2/ .map_request(|request: usize| request + 1)Á´÷\Âò
]úüš])& let response = svc.oneshot(1).await?;ÁäÈ] assert_eq!(response, 2);Ádé]éú<ú]í–<†^Ÿó^úüš^+( [`MapRequest`]: crate::util::MapRequestÁ»û„Ð^ÄÊ^\î^ÊùóÁʧþñ ‚éX¹;9éèòòžö
õÞ*öºü
È­ù—ƒãùùü ˆ
¸B
ÂBŠ
ˆ

Š
ü ÊÏ ú^ªèý^»è_ßè|ú_‡è‡`Ùá,Œ`
ùùóÁ±â˜è$Ž_± œ_PRUWZ\üécwüÝ`%" Map one response type to another.Á‡aúüaHE This wraps the inner service with an instance of the [`MapResponse`]Á|Üa‰ìðaúüøaJG See the documentation for the [`map_response` combinator] for details.ÁÇbúüÏb-* [`MapResponse`]: crate::util::MapResponseÁücFC [`map_response` combinator]: crate::util::ServiceExt::map_responseÁ»û„ÒcÄÌcdðcÊùóÁʧþñ ‚éX¹;9éèòòžö
õÞ*öºü
È­ù—ˆæùùü Œ
Œ
ü ÊÏ ýc
ùùóÁ$‰d± —d "ü“hVü¨e" Map one error type to another.ÁÏeúü×eC@ This wraps the inner service with an instance of the [`MapErr`]Á|Ÿf‰ì³fúü»fEB See the documentation for the [`map_err` combinator] for details.Á…gúüg# [`MapErr`]: crate::util::MapErrÁüµg<9 [`map_err` combinator]: crate::util::ServiceExt::map_errÁ»û„ügÄög<šhÊùóÁʧþñ ‚éX¹;9éèòòžö
õÞ*öºü
È­ù—›áùùü Ž
Ž
ü ÊÏ ¢h
ùùóÁ$¥h± «h "üËl\ü¬iH½Ç
ùiúüjWT This wraps the inner service with an instance of the [`MapFutureLayer`] middleware.ÁÝjúüåjHE See the documentation for the [`map_future`] combinator for details.Á²kúüºk30 [`MapFutureLayer`]: crate::util::MapFutureLayerÁüòk74 [`map_future`]: crate::util::ServiceExt::map_futureÁ»û„´lÄ®lTÒlÊùóÁʧþñ ‚éX¹;9éèòòžö
õÞ*öºü
È­ù—©ëùùü 

ü ÊÏ Ýl
ùùóÁ$àl± æl "üÊtQüímVS Apply an asynchronous function after the service, regardless of whether the futureÁ´Èn succeeds or fails.ÁãnúüënA> This wraps the inner service with an instance of the [`Then`]Á|±o‰ìÅoúüÍoFC This is similar to the [`map_response`] and [`map_err`] functions,Áü˜pH“ì üåpHåì ü²qH·í |ÿqˆî “rúü›rB? See the documentation for the [`then` combinator] for details.Áârúüêr [`Then`]: crate::util::ThenÁüŽs63 [`then` combinator]: crate::util::ServiceExt::thenÁüÉs2/ [`map_response`]: ServiceBuilder::map_responseÁü€t(% [`map_err`]: ServiceBuilder::map_errÁ»û„³tÄ­t$ÑtÊùóÁʧþñ ‚éX¹;9éèòòžö
õÞ*öºü
È­ù—š÷ùùü 

ü ÊÏ Öt
ùùóÁ$Ùt± ßt "üö{XüÜuI»½ üªv9޾ èvúüðvJݾ ü¿wX±¿ üœx)“À ÊxúüÒxDA This wraps the inner service with an instance of the [`AndThen`]Á|y‰ì¯yúü·yFC See the documentation for the [`and_then` combinator] for details.ÁzúüŠz*ÒÀ ü¹z.†Á üìz>; [`and_then` combinator]: crate::util::ServiceExt::and_thenÁü¯{%" [`AndThen`]: crate::util::AndThenÁ»û„ß{ÄÙ{Dý{ÊùóÁʧþñ ‚éX¹;9éèòòžö
õÞ*öºü
È­ù—½Ëùùü 

ü ÊÏ †|
ùùóÁ$‰|± | "ü’\ü’}Kýé üâ}FÒê T­~¡ë ¼~úüÄ~FC This wraps the inner service with an instance of the [`MapResult`]Á|‰ì£úü«HE See the documentation for the [`map_result` combinator] for details.Áøúü€€B? [`map_result` combinator]: crate::util::ServiceExt::map_resultÁüÇ€)& [`MapResult`]: crate::util::MapResultÁ»û„û€Äõ€T™ÊùóÁʧþñ ‚éX¹;9éèòòžö
õÞ*öºü
È­ù—éùùü 

ü ÊÏ ¤
ùùóÁ± ­#%äë‚ü´‚2/ Returns the underlying `Layer` implementation.ÁTò‚Êùùùü ü
ùù$ý‚üý„Qü¨ƒ=: Wrap the service `S` with the middleware provided by thisÁüêƒB? [`ServiceBuilder`]'s [`Layer`]'s, returning a new [`Service`].Á±„úܹ„µùüÙ„ù<„…ž žÊù±¿ùù±¿Üü ¤

 ü ù𠌅Úùù±¿DÅ…
˜
ùù±¿$ë]<–…8:üÚeü‚†YV Wrap the async function `F` with the middleware provided by this [`ServiceBuilder`]'sÁüà†,) [`Layer`]s, returning a new [`Service`].Á‘‡úü™‡?< This is a convenience method which is equivalent to callingÁü݇A> [`ServiceBuilder::service`] with a [`service_fn`], like this:Á£ˆú\«ˆãÁü»ˆ.+ # use tower::{ServiceBuilder, service_fn};Áüîˆ=: # async fn handler_fn(_: ()) -> Result<(), ()> { Ok(()) }Á|°‰ # let _ = {ÁÌĉøñ
t≰¼
üõ‰(% .service(service_fn(handler_fn))ÁD¢Šó²<¯ŠŸó»ŠúlÊÐüÕŠú\ÝŠãÁä튃óüŽ‹B? use tower::{ServiceBuilder, ServiceExt, BoxError, service_fn};ÁÕ‹ú¤Ý‹£öüö‹/ÁöüªŒNK async fn handle(request: &'static str) -> Result<&'static str, BoxError> {Á”ýŒß ,”¸Äžúü¦#”ž ¬Î .buffer(1024)Áüè)ü›ä–Ž .service_fn(handle);Á·Žúü¿Ž-* let response = svc.oneshot("foo").await?;ÁñŽúüùŽ  assert_eq!(response, "foo");Áéúí–ŸóÇúÜϵùüïùü“%" [`service_fn`]: crate::service_fnÁ»û„ÃĽÊùóÁùù°°—¡²±¹×èÐóÁÜü 

ü ÊÏ ìÚùùÑÓ üž‘ 
š
ùùóÁ± õ9;üؘ?ü‚’.+ Check that the builder implements `Clone`.Áµ’úü½’[X This can be useful when debugging type errors in `ServiceBuilder`s with lots of layers.Áúü¥“C@ Doesn't actually change the builder but serves as a type check.Áí“úlõ“Ðü‡”ú\ãÁôŸ”û“ ”úüÊ”'$ let builder = ServiceBuilder::new()Áüö”52 // Do something before processing the requestÁü°•(% .map_request(|request: String| {ÁüÝ•%" println!("got request!");Áœ‡– requestÁTŸ–¥šü®–41 // Ensure our `ServiceBuilder` can be clonedÁ´ç– .check_clone()Áü‚—41 // Do something after processing the requestÁü»—*' .map_response(|response: String| {Áüê—&# println!("got response!");Á¤•˜ responseÁ\®˜óž<¾˜Ÿó\ߘÊùÊùü ü ØÊù,‘™
œ
ùù$ë˜ü¾¡eü¶™^[ Check that the builder when given a service of type `S` produces a service that implementsÁd™š `Clone`.Áªšúü²š[ÉÔ ’›úüš›C¼Õ â›úlê›Ðüü›ú\„œãÁô”œû“ ·œú´¿œ # #[derive(Clone)]Á¼Úœ # struct MyService;Á,öœוü€'ÛÖ ü¬5× üæ(Í× ü“ž%€Ø œ½ž¯Ø TÕž¥šüäžOL // Ensure that the service produced when given a `MyService` implementsÁü¸Ÿ+( .check_service_clone::<MyService>()ÁüèŸ4ºÙ ü¡ *ùÙ üР&®Ú ¤û ÞÚ \”¡óž<¤¡ŸóœÅ¡ÊùÊùü ¤ž
ž
ü ùð Ù¡ÎÈ Dÿ¡Ø‘È ,¢
ùù±¿$Ü¡46ü•°ü¢]Z Check that the builder when given a service of type `S` produces a service with the givenÁü¤£'$ request, response, and error types.ÁУúüØ£[ÉÔ ¸¤úüÀ¤C¼Õ ˆ¥úl¥Ðü¢¥ú\ª¥ãÁôº¥û“ üÝ¥# use std::task::{Poll, Context};Áü…¦%" use tower::{Service, ServiceExt};Á¯¦úÌ·¦ // An example serviceÁ¬Õ¦ struct MyService;Áï¦úü÷¦)& impl Service<Request> for MyService {Áü¥§ type Response = Response;ÁÌɧ type Error = Error;Áüç§@= type Future = std::future::Ready<Result<Response, Error>>;Á¬¨úü´¨WT fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {Á©
// ...Áœ¥© # todo!()Á<½©É©úüÑ©<9 fn call(&mut self, request: Request) -> Self::Future {Á„’ª£è œ§ª½è <¿ªÚè ,˪¸ÄÕªúœÝª struct Request;Á¤õª struct Response;ÁŒŽ« struct Error;Á¤«úü¬«%" struct WrappedResponse(Response);ÁÖ«úüÞ«'ÛÖ üЬYV // At this point in the builder if given a `MyService` it produces a service thatÁüè¬LI // accepts `Request`s, produces `Response`s, and fails with `Error`sÁü¹­?< .check_service::<MyService, Request, Response, Error>()Áüý­.+ // Wrap responses in `WrappedResponse`Áü°®EB .map_response(|response: Response| WrappedResponse(response))Áüú®:7 // Now the response type will be `WrappedResponse`Áü¹¯=: .check_service::<MyService, _, WrappedResponse, _>();Á<û¯Ÿólœ°ÊùÊùü ¤ 
¥¡
¦¢
£
 
¢
£
¡
ü ùð ª°Íì¥ ­°Íì¦ °°¾£ ³°ÎÈ DÙ°‘È Öñ ü÷°#‘È Öñ  êñ d‚±‘È Öñ 
’£L±
Ÿ
ùù±¿Öñ êñ ’£$¶°£¥œžü¶¹£üº±XU This wraps the inner service with the [`Layer`] returned by [`BoxService::layer()`].Á—²úüŸ²%" See that method for more details.ÁɲúlѲÐüã²ú<벟óü÷²EB use tower::{Service, ServiceBuilder, BoxError, util::BoxService};ÁäÁ³ƒó,â³ו¬ì³å•´†´ƒ–¬¡´¢–ü»´#Á–<ã´í–ï´úü÷´PM let service: BoxService<Request, Response, BoxError> = ServiceBuilder::new()Á„̵
.boxed()Á¤áµ·›ôúµÔ›ü)ü›ü˶*¯œüú¶.¼ž\­·óžü½·,”Ÿüî·*É ü¸!ý <øŸóϸúü׸=: [`BoxService::layer()`]: crate::util::BoxService::layer()Á»û„Ÿ¹Ä™¹,½¹Êùʧþñ ‚éX¹;9éèòòžö
õÞ*öºü
È­ù—êêñÓì±äƒ5ظ³‘È ´*Þ*¹~–Fp¾ÅÞ‘È ÅÞ ‘È ÅÞ
ùùü ¤¥
£¦
¦
¥
ü ùð ùɹ ƹÎÈ Dã¼‘È ÅÞT½Ìì‘È $޽‘È <•½Ìì‘È ÅÞ $ʽÄü <ѽ
¤
ùù±¿ÅÞ$Ò¹ŠŒŽü–Éü ¾]Z This wraps the inner service with the [`Layer`] returned by [`BoxCloneService::layer()`].Á‚¿úüŠ¿Ròâ
üá¿CÏã
©Àúü±À-ä
ãÀúlëÀÐüýÀú<…ÁŸóü‘ÁJ„—äàÁƒó,Âו¬‹Âå•´¥Âƒ–¬À¢–üÚÂ#Á–<‚Ãí–ŽÃúü–ÃUR let service: BoxCloneService<Request, Response, BoxError> = ServiceBuilder::new()Á´ðà .boxed_clone()Á¤‹Ä·›ô¤ÄÔ›üÇÄ)ü›üõÄ*¯œü¤Å.¼ž\×ÅóžüçÅ,”Ÿ˜Æúü Æ-õè
¤ÒƬé
üëÆ*É üšÇ!ý <ÀÇŸóÌÇúüÔÇGD [`BoxCloneService::layer()`]: crate::util::BoxCloneService::layer()Áü È52 [`BoxCloneService`]: crate::util::BoxCloneServiceÁÔÚÈ¡ê
»û„ÿÈÄùÈ\ÉÊùʧþñ ‚éX¹;9éèòòžö
õÞ*öºü
È­ù—êêñÓì±äƒ5ظ³‘È öö÷¨0ûˆê bßd”?SÅÞû «û ùùü ¤¨
£©
¨
©
ü ùð ©Éɹ ¬ÉÎÈ DÎÌŠü TìÌÔâ ,ùÌžü $Ͱü <ˆÍ¼ü $½ÍØü <ÄÍ
§
ùù±¿ÅÞ$¸Éfhjlü·Ùü˜Î]Z This wraps the inner service with the [`Layer`] returned by [`BoxCloneSyncServiceLayer`].ÁúÎúü‚ÏXU This is similar to the [`boxed_clone`] method, but it requires that `Self` implementÁüßÏA> [`Sync`], and the returned boxed service implements [`Sync`].Á¥Ðúü­Ð1. See [`BoxCloneSyncService`] for more details.ÁãÐúlëÐÐüýÐú<…ÑŸóü‘ÑNK use tower::{Service, ServiceBuilder, BoxError, util::BoxCloneSyncService};Áääуó,…Òו¬Òå•´©Òƒ–¬ÄÒ¢–üÞÒ#Á–<†Óí–’ÓúüšÓYV let service: BoxCloneSyncService<Request, Response, BoxError> = ServiceBuilder::new()Á¤øÓ·›ô‘ÔÔ›ü´Ô)ü›ÜâÔ .boxed_clone_sync()Áü‚Õ*¯œü±Õ.¼ž\äÕóžüôÕ,”Ÿ¥Öúü­Ö-õè
¤ßÖ¬é
üøÖ*É ü§×!ý <ÍןóÙ×úüá×GD [`BoxCloneSyncServiceLayer`]: crate::util::BoxCloneSyncServiceLayerÁü­Ø=: [`BoxCloneSyncService`]: crate::util::BoxCloneSyncServiceÁüïØ&à
»û„ ÙÄšÙ„¾ÙÊùʧþñ ‚éX¹;9éèòòžö
õÞ*öºü
È­ù—ääÚ'é"Û§=ýý*'±¿ÅÞû «û µúü ¤«
£¬
«
¬
ü ùð ÏÙɹ ÒÙÎÈ D™ÜÌìùù$¤Ü ùù$«Üùù<²ÜŠü TÏÜÔâ ,ÜÜžü $äÜ ‘È $ëܰü <òܼü $§Ý Äü $®ÝØü <µÝ
ª
ùù±¿ÅÞ$ÞÙ·¹»½üÌÞ4®
®
ýõ
ÑÞ¿cùùTÔÞÊù¯
Àc¯
%'ü‡ß8ŠßŸ ¡ ŸÊù   c cˆ¢cµ
 `£c¢° `àB¤GS
¡ɱ­
 Žß­
¯
ùù$ß± •ßüà@¤±
²
±
²
ô¹ ”àÍì«û —àÚ«û¿ÇDÆàüú³
´
ÜÝ´
BD=?dÖà<Ûà°
°
«û¿ÇÜüöà*,ùࢠ¢üú¿Çüú¿Çܰ
 ÿà°
´
¿Ç«û$€áÞ*,†álî>ü2+/ A collection of [`Layer`] based tower servicesÁ3+úÜ7+µù,ö>º
³\Dj+ ·
ÿ½,t+Ú¸
ñÓ<{+ê¹
\\+46')+ü†"+ Utilities for combining layersÁ©+úü­.++ [`Identity`]: crate::layer::util::IdentityÁÜÜ+µùüø(+% [`Stack`]: crate::layer::util::StackÁ+¿ù+ä¼
žö
+ò½
+&(TÞ?ƞƞܞܞôœ@ïž”ÏAŸ´ûAŸŒÊCü¢C'$ Alias for a type-erased error type.ÁDÓCô²üý
1ü¸
,) A maker type for [`ExponentialBackoff`].Á¼ˆ £Æ
Æ
ü¥ •¹Ç<žÕÉPxÇ
È
É
Ê
$   Ì»œþ þ Å
Å
‘Œœà à Å
Å
‘Œ

Å
Å
4Å
Å
ã¹(î
X£Ì
Ì
ü¥¡¿cã¹  •¹Í
ÀcÍ
ÃÅUW£¤¥ £•¹ ¤ c cˆ¢cµ
 `£c¢° `àB¤GS
¥ɱË
î
Ë
Í
ã¹þ±(õ
Y£Ï
Ï
ü¥¨¶ª  •¹Ð
ÙÐ
ÃÆPR¦ ¦•¹•¹Î
õ
Î
Ð
ã¹¢üï,üš.+ A jittered [exponential backoff] strategy.ÁÉúüÍIF The backoff duration will increase exponentially for every subsequentÁü—KH backoff, up to a maximum duration. A small amount of [random jitter] isÁüãC@ added to each backoff duration, in order to avoid retry spikes.Á§úü«LI [exponential backoff]: https://en.wikipedia.org/wiki/Exponential_backoffÁüø^[ [random jitter]: https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/Á”ú£Ò
Ò
ü¥lû¹,\»DÓ
Ô
Õ
Ö
×
& Ì»œ¢¢Ñ
Ñ
‘Œœ»»Ñ
Ñ
‘ŒÑ
Ñ
åÑ
Ñ
ã¹Ñ
Ñ
(àZ£Ù
Ù
ü¥»èž û¹Ú
ÀcÚ
Õ×MO§¨© §û¹ ¨ c cˆ¢cµ
 `£c¢° `àB¤GS
©ɱØ
àØ
Ú
ã¹ö±ü(ç[£Ü
Ü
ü¥¹¶ªû¹Ý
ÙÝ
Ô×PRª ªû¹û¹Û
çÛ
Ý
ã¹¢ìÜ- Backoff validation error.Át.Ù¼l.E9›ž°wß
à
 Ù¼8Ê« Ù¼Þ
Þ
ß
d¥.Þ
Þ
Ê« (/ƒ.hÙ¼â
Àcâ
"$«¬­ «Ù¼ ¬ c cˆ¢cµ
 `£c¢° `àB¤GS
­ɱá
/ƒ.á
â
Ʊ̌º

)§½§Êž¬b¹'ä
å

)ã
ã
  )ã
ã
óVóVïÏôVÀ¢U<9¥²Ö<‹½(2²
j§½ç
Àcç
"$®¯° ®§½ ¯ c cˆ¢cµ
 `£c¢° `àB¤GS
°ɱæ

æ
ç
ƱÌùG•º´üÔ3IGº0 The [`Future`] returned by a [`Retry`] service.Áwt¬¡é
¤ê
Âë
ê
ë
é
èð »ù𠾊ñ›ñ™Eó§Ëñ è¾Á<ƒ¢…"8‡ì
í
î
CEHJMOáG“»Nè
è
®òNè
è
úÂ7,ŽNè
è
¦ © ¢hª ÷N« ¸h¬ ÇhN­ ® Öh߇ŒVJRù_ùò«¿·¿©ñ·ñv(H•x¡ð
¤ñ
Âò
ò
ð
ñ

èðhùðgŠñf¿c«¿íÚ¿c·¿8HÁ›ñËñ¿cùòš¿cð³ ¨è¾ó
Àcó
Ýàäçëîæè±²³ ±è¾ ² c cˆ¢cµ
 `£c¢° `àB¤GS
³ɱï
H•ï
ó
«¿±¿·¿± YIös IüsNùI¸{Fv¡ö
¤÷
Âø
÷
ø
ö
èð!ùð Šñ›ñËñ%è¾ JMQTX[IÚ•ÁIÝ•N´ ´è¾¡ú
¤û
Âü
û
ú
ü
 I’–èðöùðõŠñô›ñóËñú
ù
«¿±¿·¿thisÁ!IŒ–58<?CFùK¨ÝÕ1K¨ÕQIÝtƒeþ
¡ÿ
¤ Â þ
ÿ
 æ ÞÀ½ ÝÍì”ÀåÅ¿ƒe1K¤ÞrˆÀ”ÀŽÀ”À ŽÀ”À
ŽÀ”À/”ÀƒeùJÿȈÀƒeŽÀƒe ŽÀ”À ƒe7ˆÀ”Àú» ˆ¼ vƒeVý
ý
ñd ÓcNƒ ŽN ºNÌ$v
úrZƒeˆÀŽÀ”ÀÌ$v
úrZ ƒ 1KÓÝ%(,/36ýãNý
ý
ƒeÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ”Àa/Ný
ý
„¾„¾ô†¾ ˜X$]È=„kt• ƒeÍóhNý
ý
„¾„¾ô†¾ ˜X$]È=„kt• ƒe¦ © ¢hª ÷N« ¸h¬ ÇhN­ ® Öh߇ŒVJRù_Û¼ ò¼ ùP¨ÝÕ1P¨ÕiI®xƒe ¡ ¤ˆ     ˆ æ .À½ -Ê» ,Ú» 1P¤Þì» 6š¼ =¬¼ ùOÿÈ¿¼  ̼ Ù¼ ð¼   ÁeŠ ÓcN ŽNŒ ºNÓ'ÉPÕù°ƒeˆÀŽÀ”ÀÓ'ÉPÕù°Š Œ 1PÓÝô÷ûþ  ŲN  ƒeξ ä¸N  „¾„¾ô†¾ ˜X$]È=„kt• ƒeÍÃ5ñN  „¾„¾ô†¾ ˜X$]È=„kt• ƒe·À ùT•‡1Tù…9IÜ}Ž „¾„¾ô†¾ ˜X$]È=„kt• Ž è¾ý
ý
ñd ÓcNƒ ŽN ºNÌ$v
úrZŽ «¿±¿·¿õ
1T°‡õ
«¿±¿·¿!TŇ')ùX•‡1Xù…YI „¾„¾ô†¾ ˜X$]È=„kt•  è¾  ÁeŠ ÓcN ŽNŒ ºNÓ'ÉPÕù° «¿±¿·¿õ
1X°‡õ
«¿±¿·¿!XŇ')ù\å½0~A\ñ½ƒe ¡ ¤     æ r À½ q Ê» p ì» o š¼ v   Àf ðfN ÓcN˜ ŽN ºNg´Ç*ÙÞ{ƒeˆÀŽÀ”Àg´Ç*ÙÞ{ ˜ 1\ú½



$
'
ù\ܾ<\ܾN  Ò­Fu\»Ÿ ƒeùI݈t)
N  001 AlwaysUnpinÁ3ˆ ‰4ä\’ÎMξ V`
N  ÍÃn_
N  ·À ù\ÿe~ƒe ¡œ ¤ ž  ž œ æ hÀ½ gÊ» f“í))*PinnedFieldsOfHelperStructÁ,ˆ Úˆ3ClœòÊ (Á\ŒÁì» Æš¼ ÍÅ¿1\È¿õøüÿ©`ûéy`êNŸ Ÿ †žÁ`ûéŸ †ž†ž!ù`Ïê6¥¡ ¡ а `ÔêŒ"¡À¹`×ê¡À ù`‘ëV¡£ ¤¤ Â¥ £ ¥ ¤ èðùðŠñ›ñËñ è¾(+/269ùgÛ¿µN§ ¡¨ § ¨ ز æ Œ¹À߇ŒVJRù_© « ­ ® ª ¬ ® =?BDùgýÀwN¦ ¦ ¹À‰g¹ÁN¦ ¦ Á@N¦ ¦ ¹À:<ñN¦ ¦ ˆÀAgýÀN¦ ¦ ¹À!N¦ ¦ ¹À(hòœ° ¡± ± ° زOæ N¿cÁh‰¿cˆÀ¹À² Àc² е· µ¹À  c cˆ¢cµ
 `£c¢° `àB¤GS
·ɱ¯ ¯
² ÁˆÀ=±Dùj¨ÝÕ1j¨ÕNƒe´ µ ¡ µ ´ ÊÏÊÍìùÁÒŸÁƒe1j¤ÞóÁƒeùiþÐùÁƒe³ · ¢h¸ ÷N¹ ¸hº ÇhN» ¼ Öh=öJ.I÷̶ƒeóÁùÁ=öJ.I÷̶· ¹ » ¼ ¸ º ¼ 1jÓݨ«¯²ùiºÐúpN³ ³ „Ù îjN³ ³ „¾„¾ô†¾ ˜X$]È=„kt• ƒeóÁs¢N³ ³ „Ù Z¢N³ ³ „¾„¾ô†¾ ˜X$]È=„kt• ƒeùÁAiºÐÚN³ ³ „Ù  òN³ ³ „Ù Ym¡ m–¡Nùm¬¡2š¿ ¡À ¿ À زCæ B¹ÀÁ TW[^ùn’œ1nöš9mãN „¾„¾ô†¾ ˜X$]È=„kt•  ¹À³ · ¢h¸ ÷N¹ ¸hº ÇhN» ¼ Öh=öJ.I÷̶ ÁˆÀ¾ 1n­œ¾
Á ÁˆÀ!nœ#%ùqå½0£Aqñ½NƒeÄ Å ¡Æ Ä Å Æ ÊÏâÂØ áà à ÀfÇ ðfNÈ ¢hNÉ ¸hNÊ ÖhNÜ?è‰lzQƒeóÁùÁÜ?è‰lzQÇ È É Ê 1qú½mptwùqܾ<qܾNà à ÃÌ ùmɱõTNà à óÁ2Nà à ùÁ7Nà à ùqÿᣃeÌ Í ¡Î Í Ì Î ÊÏ>ÂØ =“í))*ñÍ ,ˆ Úˆ3Clœàà (ÁqŒÁŸÁ1qÈ¿ ¤§©tûé¤ytêNÏ Ï †žÁtûéÏ †ž†ž!ùtÏê6¤¥Ñ Ñ а tÔê€Ñ ¹t×ê¡Àùt‘ëF¤Ó ¡Ô Ô Ó زŠ æ ‰ ¹À˜ Ÿ ¢ Ähü+$! Retry requests based on a policyÁTs¡Ö Ö èð ~¨Â†ÂûE#ã× L‡4‡eÕ Õ «¿(xY©¡Ù Ù èðkÛ´ x~¨ÂÚ ÀcÚ LN¸¹º ¸¨Â ¹ c cˆ¢cµ
 `£c¢° `àB¤GS
ºɱØ xYØ
Ú «¿ô±ú(y`ª¡Ü Ü èðg†ûy~¨ÂÝ ÙÝ OQ» »¨Â¨ÂÛ y`Û
Ý «¿ ù–•º´üÎ6Iº3 Configure retrying requests of "failed" responses.ÁFúü‘8T5 A [`Policy`] classifies what is a "failed" response.ÁÎú£ # CloneÁæ¸úüîKÆH This middleware requires that the inner `Service` implements [`Clone`],Áü¾FC because the `Service` must be stored in each [`ResponseFuture`] inÁü‰FnC order to retry the request in the event of a failure. If the innerÁüÔHÀE `Service` type does not implement `Clone`, the [`Buffer`] middlewareÁü¡1. can be added to make any `Service` cloneable.Á×Púüß%_" [`Buffer`]: crate::buffer::BufferÁúü‘Bž? The `Policy` must also implement `Clone`. This middleware willÁüØGìD clone the policy for each _request session_. This means a new cloneÁü¤M?J of the policy will be created for each initial request and any subsequentÁüöQ˜N retries of that request. Therefore, any state stored in the `Policy` instanceÁüÌ KõH is for that request session only. In order to share data across requestÁüœ
OLL sessions, that shared state may be stored in an [`Arc`], so that all clonesÁüð