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

2201 lines
715 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ÁJ;Ì3<þÝñŠ7_ú-081d57d1ceb823d6Ápin_project_liteÁ·x¼+Ä`·á¨›t—¸Íœ-2dc344ecc91b59efÁ parking_lotÁâ°r4¨6ª(ü²Hd©n¼-21962aa896c8619bÁlock_apiÁEcÓŽ/ÅS}sw‡A$P-0e8055cd433fa267Á
scopeguardÁ’‰‘p ÒÞa¢ßöéqÓB-29f0bdb2ea82739eÁparking_lot_coreÁ’Ý%Ž=Eq^U4FOV)àŸ-e1ee0517e8b9a4bfÁsmallvecÁ[“S‰«2ûÓàÁ3™ËºS-fa382cf08413422fÁserdeÁFVæ¸Û•IÄÀzÍ-9c8ce3cf08540cc3Á serde_deriveÁ,w|êñ]ù¿¥­C£ð-975c43f96d83014eÁ
serde_coreÁ²€Ãb˜cÐòžÇÇ
-7a42419d8e43b208Á®f©¾/ô)c§{õa“â‘-a3906971a93fd1b8Áæ\‹±ÔcdùÀTƒ-f86f80b348d33b13ÁmioÁGùj0ðÔ·â"FÆ#0Q-3545320490828222ÁbytesÁ`²['3_²µÆ=üå¥-d4f44708ed5da7b6Á tokio_macrosÁóÁm¹^E¼>ŽCê
z3-074a4ab5bbda1a72Ásocket2ÁsT›¸n>~RÊ1G/R-c161f09f0083d1e0Ásignal_hook_registryÁœ¥¿’g›´·DV<{Y<<-b3ea108dcb9d0adeÁerrnoÁÍ\Ý|#{°zŽ¡p&a”-464950f23d45b34dÁ
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ÁKKfutureÁ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Á꣥7êš¥š¦šš×Íboxed_clone_syncÁŸŸŸŸŸŸŸŸŸŸ Ÿ
ŸBoxCloneSyncServiceÁ«
«¥«¦««ˆŸ±¥±¦±±æ µ¤µ ±ß¸¤Ÿº¥º¦ºº º  ºßºµ ºÑŸÃ¥Ã¦Ãßñ6È£È7ŸË£Ë¥Ë7ŸÏ¥Ï¦ÏÏ×Ícall_allÁÔžÕÕÕÕÕÕÕÕÕÕ Õ
ÕáSvcÁá¤á¢á×ÕDriveÁææis_emptyÁæpushÁæŠ ÕëÉ;ë¤ë¢ëæ ëâë take_serviceÁë unorderedÁÕóÉ;ó¤ó¢óó poll_nextÁÔorderedÁùùùùùùùùùù ù
ùÉ;¤æ âÒ<æ<ùŒÉ;Œ¤ŒŒœ=ù<‘<Š Ôæ< 
¢É;¢¤¢æ ¢â¢Ò<¨É;¨¤¨¨œ=­­<­<­Š ÔÔÔÍeitherÁµµµµµµµµµµ¿¿¿£¿ ¿  ¿ß¿µ ¿ÑµÈÈȰȊ µÍ¤ÍÍÍÍßÍfuture_serviceÁÓÓÓÓÓÓÓÓÓ‰BÜܤܣÜÓáá¤áæ Óåå¤å×Óéé¤é×Óíí¤í£íí í  íßíµ íÑÍÙ÷÷÷÷÷÷÷÷÷÷¤×÷¤æ ß÷Š¤ŠŠ£Š  Š Š  Šßе ŠÑ÷æ ÷¤ßÍ map_requestÁœœœœœœœ£¤££×œ§¤§§æ §ßœ¬¤¬¬R1Á¬R2Á¬ ¬  ¬ß¬µ ¬Ñœæ œ¹¤¹¹¹ßÍ map_responseÁ¾¾¾¾¾¾¾¾¾¾È¤ÈÈ׾̤ÌÌæ Ì߾ѤÑÑ£Ñ Ñ Ñ  Ñßѵ ÑѾÛÛæ ¾Þ¤ÞÞÞßÍ
map_resultÁããããããããããí¤íí×ãñ¤ññæ ñßãö¤öö£ö ö  ö ö  ößöµ öÑãæ ã¤ßÍ
map_futureÁ¤æ ßÄÓâš£š¤šš¥šš†&š š  šßšµ šÑ¦¤¦¦×ªªæ ­¤­­­ß²²×ÍoneshotÁµµµµµµµµµµ µÀ¤ÀÊÀ not_readyÁÀcalledÁµÅ¤ÅÊÅ׵ɤÉÊÉæ µÍ¤ÍÊͰ͊ ÍoptionalÁÒÝ ÓÓÓÓ׿ ÓÙ×ÓÒØÜÜÜÜÜÜÜÜÜå¥åæ Üèè¥èè°èŠ ÒÒÒÒÒÒó¥óæ õ£Ò÷¥÷£÷ ÷  ÷ß÷µ ÷Ñþ ÍreadyÁ 
 ReadyOneshotÁŒ¥Œ£Œ¿/Œ_pÁ¥£¥£æ ˜¥˜£˜°˜Š ¥£×È¡
¡'aÁ¡¥¡£¡ˆ§¥§£ªèTª¥ª£ªæ ¯èT¯¥¯£¯°¯Š µ¥µ£µ×Í
service_fnÁ¹¹¹¹¹¹¹ŽVÀ¥¹Â¥Â׹ťÅţţÅÅ Å  Åßŵ ÅÑÍthenÁÐÐÐÐÐÐÐÐÐÐ Ð
ÐܤÜÜ×Ðà¤ààæ àßÐå¤åå£å å  å†&å å  åßåµ åÑÐññæ Ðô¤ôôôßÍrngÁùùùùùùùRngÁnext_u64Ánext_f64Á
next_rangeÁù£ˆZùæ ù>ù   with_hasherÁùŽ Ž ˆZÍÍÍÍÍÍÍÍÍÍ Í
Í Í Í
ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ Í!Í"Í#Í$Í%Í&Í'Í(Í)Í*Í+Í,Í-Í.ÍÝ À ÍØÂ Â Â Â Â Â Â Í
ServiceExtÁÊ £Ê íRÊ 
ready_oneshotÁÊ éNÊ õ:Ï ¤Ê Ñ Ê HÓ Ó  Ê ÙÖ Ö   Ê ™JÙ Ù  Ù   Ê ‘FÝ Ý 
NewRequestÁÊ ¸Wà à  à   à †&Ê ©Lå å †&å  å   Ê ó&Ê ¿4Íì ¥ì £Í option_layerÁï builderÁñ ñ ñ ñ ñ ñ ñ ø >ñ ú æ ñ ü ü ßþ ¥ü †`
¥ü layer_fnÁ
ü ï
¡ü Î ü ‘F

™G
£Gü H
ü Ù
ü ©L
ü ¸W
ü 
ü ™J
ü âü serviceÁ˜
¤ü ŽVš
ü  check_cloneÁü check_service_cloneÁ
¤ü 
check_serviceÁŸ
¤Ÿ
¥Ÿ
¦Ÿ
ü ó&¤
¤¤
£ü ¿4§
¤§
£ü à7ª
¤ª
£ñ ­
­
×ñ °
¤°
°
°
ßßµ
µ
µ
µ
µ
Ü#º
º
º
BoxErrorÁExponentialBackoffMakerÁÅ
£Å
minÁÅ
maxÁÅ
ÀÅ
ÔYË
£Ë
×Î
£Î
ƒExponentialBackoffÁÑ
£Ñ
ßeÑ
êeÑ
ÀÑ
ÔYÑ

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

ProjectionÁý
'__pinÁý
¡ý
¤ý
£ý
´hý
ïý
ºô

ProjectionRefÁ äi ¡ ¤ £ ´h ï ºõ
projectÁ äiõ
 project_refÁ äiô
__OriginÁ äi ¡ ¤ £ __dummy_lifetimeÁ ´h ï ºô
š äiš ¡š ¤š £ô
MustNotImplDropÁô
  ¥ô
¢ ¡¢ ¤¢ £NStateÁ¦ ¦ ¡¦ CalledÁ© ئ WaitingÁ« waitingÁ¦ RetryingÁ­
N¯ ¯ ¡¯ ×N StateProjÁ³ äi³ ³ ¡³ ƒm· س ™m¹ ¨m³ ·m»
N½ ¾ ¾ ¡¾ ïjÁ äi½ ¡kà äià à ¡Ã Ñkà ƒmà ™mà ·m½ Ë äiË Ë ¡½ ¦l½ Ð ¥½ Ò Ò ¡e
RetryLayerÁÕ ¡Õ ¬eØ ¡Ø ×eÛ ¡Û ƒRetryÁÞ ¡Þ ¤Þ ¬Þ Ìbã ¡ã ¤ã ƒç ¡ç ¤ç ×ë ì ¡ì ¤ë šiï ¡ï ¤ë Òiò äiò ¡ò ¤ò ¬ò Ìbë ¢jø äiø ¡ø ¤ø ¬ø Ìbì ïjþ äiì †k äië ¡k äi ¡ ¤ Ñk ¬ Ìbë  äi ¡ ¤ë ¦lë Ž ¥ë  ¡ ¤ElapsedÁ
 ˆ ט >†hš ¥š responseÁš sleepÁž ¥ž ס ¢ ¥¡ ši¤ ¥¡ Òi¦ äi¦ ¥¦ “t¦ £t¡ ¢j« äi« ¥« “t« £t¢ ïj° äi¢ †k² äi¡ ¡k´ äi´ ¥´ Ñk´ “t´ £t¡ º äiº ¥¡ ¦l¡ ¾ ¥¡ À ¥® TimeoutLayerÁ Π®Ä ×®Æ ƒTimeoutÁÈ ¥È ¿/È Î Ì ¥Ì ×Ï ¥Ï ƒÎAndThenÁÒ ¤Ò Ò ¿/Ò ±Î× ¤× × ƒÎ
AndThenFutureÁÛ Î$Û Ø$Û ŸÛ ¿/Îà á Î$á Ø$á Ÿà šiå Î$å Ø$å Ÿà Òié äié Î$é Ø$é Ÿé ¿/à ¢jï äiï Î$ï Ø$ï Ÿï ¿/á ïjõ äiá †k÷ äià ¡kù äiù Î$ù Ø$ù Ÿù Ñkù ¿/à 
äi
Î$
Ø$
Ÿà ¦là 
¥à ˆ
Î$ˆ
Ø$ˆ
ŸÎ AndThenLayerÁŒ
Œ
±Î 

ƒÎ


ײ UnsyncBoxedÁ
¤
¿/²˜
¤˜
×ÕCallAllÁ
É;
¤
¢
Ìb
streamÁ
queueÁ
eofÁ
curr_reqÁÕ¤
¥
É;¥
¤¥
¢¤
ši©
É;©
¤©
¢¤
Òi­
äi­
É;­
¤­
¢­
Ìb­
Ð|­
Þ|­
ë|­
ö|¤
¢j·
äi·
É;·
¤·
¢·
Ìb·
Ð|·
Þ|·
ë|·
ö|¥
ïjÁ
äi¥
†kÃ
äi¤
¡kÅ
äiÅ
É;Å
¤Å
¢Å
ÑkÅ
ÌbÅ
Ð|Å
Þ|Å
ë|Å
ö|¤
Ð
äiÐ
É;Ð
¤Ð
¢¤
¦l¤
Ö
¥¤
Ø
É;Ø
¤Ø
¢ù¡|Ü
É;Ü
¤Ü
¿/ùà
É;à
¤à
×ùä
å
É;å
¤ä
šiè
É;è
¤ä
Òië
äië
É;ë
¤ë
¿/ä
¢jð
äið
É;ð
¤ð
¿/å
ïjõ
äiå
†k÷
äiä
¡kù
äiù
É;ù
¤ù
Ñkù
¿/ä
ÿ
äiÿ
É;ÿ
¤ä
¦lä
¥ä
É;¤CallAllUnorderedÁÉ;¤¿/É;¤×É;¤šiÉ;¤Òi˜äi˜É;˜¤˜¿/¢jäiÉ;¤¿/ïj¢äi†k¤äi¡k¦äi¦É;¦¤¦Ñk¦¿/¬äi¬É;¬¤¦l±¥³É;³¤µEitherÁLeftÁ¹
¹ˆRightÁ¼
¼ˆµ¿¿¿ƒµÃÃµÆÆÆ×µEitherResponseFutureÁÊÊʵÎÏÏΚiÒÒÎÒiÕäiÕÕÕ΢jÚäiÚÚÚÏïjßäiφkáäiΡkãäiãããÑkãÎéäiééΦlÎî¥ÎððµKindÁóóó—†ö¿/ó°†ø¿/µKindProjÁúäiúúú—†þ¿/ú°†¿/µƒƒƒïjäi¡kˆäiˆˆˆÑkˆ—†ˆ°†äi¦l¥Ó
FutureServiceÁ¤ºÓ¤ƒÓæl¡¡¤¡ß¤
¤ˆ¡§
§ˆÓªª¤ªƒ÷MapErrÁ®¤®®¿/®±÷³¤³³ƒ÷ MapErrLayerÁ··±÷ººƒ÷½½×÷ÀÀŸÀæ ÷ ÄÄŸÄ×÷
ÈȟȰȊ ÷ MapErrFutureÁÍÍŸÍ¿/÷ÑÒÒŸÑšiÕÕŸÑÒiØäiØØŸØ¿/Ñ¢jÝäiÝÝŸÝ¿/ÒïjâäiÒ†kääiÑ¡kæäiææŸæÑkæ¿/ÑìäiììŸÑ¦lÑñ¥ÑóóŸœ
MapRequestÁö¤öö¿/ö±œû¤ûûƒœMapRequestLayerÁÿÿ±œƒœ×¾ MapResponseÁˆ¤ˆˆ¿/ˆ±¾¤ƒ¾MapResponseLayerÁ±¾×¾ƒ¾ššŸšæ ¾ žžŸž×¾
¢¢Ÿ¢°¢Š ¾MapResponseFutureÁ§§Ÿ§¿/¾«¬¬Ÿ«ši¯¯Ÿ«Òi²äi²²Ÿ²¿/«¢j·äi··Ÿ·¿/¬ïj¼äi¬†k¾äi«¡kÀäiÀÀŸÀÑkÀ¿/«ÆäiÆÆŸ«¦l«Ë¥«ÍÍŸã MapResultÁФÐп/бãÕ¤ÕÕƒãMapResultLayerÁÙÙ±ãÜÜ×ãß߃ãââŸâæ ã ææŸæ×ã
êêŸê°êŠ ãMapResultFutureÁïïŸï¿/ãóôôŸóši÷÷ŸóÒiúäiúúŸú¿/ó¢jÿäiÿÿŸÿ¿/ôïjäiô†käió¡kˆäiˆˆŸˆÑkˆ¿/óŽäiŽŽŸó¦ló¥óŸ MapFutureÁ˜¤˜˜¿/˜±¤ƒMapFutureLayerÁ¡¡±¤¤ƒµOneshotÁ§¤§Ê§ºµ«¤«Ê«×µ¯°¤°Ê¯ši³¤³Ê¯Òiäi¤Êº¯¢j»äi»¤»Ê»º°ïjÀäi°†kÂäi¯¡kÄäiĤÄÊÄÑkĺ¯ÊäiʤÊʯ¦l¯Ï¥¯Ñ¤ÑʵælÔ¤ÔÊÔNotReadyÁ×svcÁ×reqÁÔƒmÚfutÁÔDoneÁÜ
µçmÞäiÞ¤ÞÊÞ¸ âÈ âÓ Þƒmåæ Þñ ç
µéê¤êÊêïjíäié¡kïäiï¤ïÊïÑk︠ïƒmïñ é÷äi÷¤÷Êé¦léü¥éþ¤þÊÓ©
ˆÓ×܆h¥¿/Ü¥×ÜŒ¥Œši¥ŒÒiäi¥¿/Œ¢jäi¥¿/ïjäi†käiŒ¡käi¥Ñk¿/Œ¢äi¢¥Œ¦lŒ¦¥Œ¨¥ÒOptionalÁª¥ª¿/Ò­¥­×¹ ServiceFnÁ°¥°±¹³¥¹µ¥µƒÐThenÁ¸¤¸¸¿/¸±Ð½¤½½ƒÐ ThenLayerÁÁÁ±ÐÄÄ×ÐÇǃÐÊÎ$ÊØ$ÊŸÊæ Ð ÏÎ$ÏØ$ÏŸÏ×Ð
ÔÎ$ÔØ$ÔŸÔ°ÔŠ Ð
ThenFutureÁÚÎ$ÚØ$ÚŸÚ¿/ÐßàÎ$àØ$àŸßšiäÎ$äØ$äŸßÒièäièÎ$èØ$èŸè¿/ߢjîäiîÎ$îØ$îŸî¿/àïjôäià†köäiß¡køäiøÎ$øØ$øŸøÑkø¿/ßÿäiÿÎ$ÿØ$ÿŸß¦lߥßÎ$Ø$Ÿù HasherRngÁhasherÁcounterÁùƒù×ñ ServiceBuilderÁßñ ˜˜ƒ




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









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

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



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




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








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








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

ˆ

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


ƒ


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



 
 
 
¤
Å
Å
Å
Ç
Î
Î
Î
Ñ
Ú
å




š
š
š
©
ã
ã
ã
è




Â
É
É
É
Ò
 
­

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









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







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




š
 Ï r ½
ÈÕ
惰íðÊÎû¥€ Ê ¿cÅ
Å
¸eÇ
ßeÈ
êeÉ
ÀÊ
ÔYŽž°W"ʼn£Øö½¿cÑ
Ñ
¬fÓ
ßeÔ
êeÕ
ÀÖ
ÔY×
îfb$TU56&ľØܾö½ܾ³Å
Å
¸eÇ
ßeÈ
êeÉ
ÀÊ
ÔYŽž°W"ʼnË«ä«ùŽò«ùf#ÎààdX\ÖJÖJ RandomStateÁ×Jk0ÁˆØJk1Áˆ‰ÌkqÇËŸ¿cÞ
Þ
ß
§gà
ˆ ³ÒÇVÏZÄcºÁ¾ºÁ¿cã
ã
Õgä
Ö)å
ïg))T]lTEòK44Å5Õ)6æ)7ô)8)9):š);¯)!¥oïgŒ³ÆÂ¿cÆÂ¿cè
è
†hì
´hNí
ïNî
ºN¤ÜŒÌ¨ý¡¤£“íè
è
†hì
´hNí
ïNî
ºN¤ÜŒÌ¨ý¡¤£Ÿ ¥Ÿ Éÿc¦ © ƒmª ØN« ™m¬ ¨mN­ ® ·mrÉœÆøÙ‚ÊéÄ“í¦ © ƒmª ØN« ™m¬ ¨mN­ ® ·mrÉœÆøÙ‚Ê¡Ï ‚ÅÏ šÅ‚ØÉÿcÕ Õ îo× ¬eXbiýúiÊŒÄØ‰Ç‰Ç’ÄØÞ Þ ·pá ¬â Ìb;¨Q4r­ë-ŒÄ’Ä¿cÛÇ“íÞ Þ ·pá ¬â Ìb;¨Q4r­ë-éÄïÄ ‚Å ÛÇ&ÛǘĿc   Îs ˆ àÐîÐQ”or³™ÉÄc™É¾™É¿cš š †hœ “t £ta“*8)Ä}‚Å“íš š †hœ “t £ta“*8)Ä}¥½ ‚Ž óɂؚ š †hœ “t £ta“*8)Ä}îÅ¿c  Àvà Î ®²`K>+BlØÜËÜˤ¿cÈ È övÊ ¿/Ë Î ÷[l·AXf¼‚ÅØ­Ì&È È övÊ ¿/Ë Î ÷[l·AXf¼ Ì£ØÒ Ò ÇwÕ ¿/ÎÖ ±ÎþÔÊü=à ÌÔÆ¿cÇÍ“íÛ Û “xß ¿/Îó<ÐÑêÎ$Ø$Ÿ
‚Å
Û Û “xß ¿/Îó<ÐÑêÎ$Ø$Ÿ¿cî΂ØîÎØŒ
Œ
{Ž
±Î¢ÂÓVpÏÔ îÅ¿cÌÏ&Ç͘Č
Œ
{Ž
±Î¢ÂÓVpÏÔ ÔÆ Ì°'ó&ÞSýƒølqpÀ'óʦ‰ÑØÛпcÛкºî)¿ó&±ìêök±ÇV‰ÑóÊ“Ñ™Ñ‰ÑØÀÑ¿cÀÑää»,éó&ÛRì<>4ãN‰ÑóÊ“Ñ™Ñ‰ÑØŸÒ¿cŸÒ&•/¿/‰ j<a6‚Ŧ‚Å¿cýÒ¿c

é{
¿/²¶.ˆ
í Y; Ì&¾¾Þ1¿/²(YÚi¤”ŠÁ‚ůӵӂſc‰Ô&ÑÓºÍ&öö÷‰5ûˆê ý„æ(_¶‚ŝӵӂŨæÔóÊľ¿cæÔ&««¬¯8°ˆŸ gíÁtú¡5‚ŝӵӂŨÓÕÈóÊľ¿cÓÕ“í

¡|Ÿ
ÌbÕ 
Ð|Õ¡
Þ|Õ¢
ë|Õ£
ö|Õ1tòšs?É;ïÄ¢Õ
‚ÅÕ


¡|Ÿ
ÌbÕ 
Ð|Õ¡
Þ|Õ¢
ë|Õ£
ö|Õ1tòšs?É;’Ä¢¿cÂ×(EÂ׿cÜ
Ü
¡|ß
¿/ù–EÊêÍx} Ø’Ä“íÜ
Ü
¡|ß
¿/ù–EÊêÍx} ×ïă‚ÅƒÌØ(EÌØæFuturesOrderedÁin_progress_queueÁ)¿ queued_outputsÁ)¿ next_incoming_indexÁ)¿ next_outgoing_indexÁ)¿ ž
¹ýy[mîÅîÅ¿c‘ƒŒ¿/6~q‰ÏÎ'Ÿ Ø’ē푃Œ¿/6~q‰ÏÎ'Ÿ ×ïİ‚Ű›Û(E›Ûæ)é")é"FuturesUnorderedÁ)ë"ready_to_run_queueÁ)Ž!)ì"head_allÁ)Ž!)í"
is_terminatedÁ)Ž!/9¸Ö‰îÅîÅØ¹º—†»ˆ¼½°†¾ˆoà‹!j[ëŠ ÄÝ¿cÄÝ&ÄݘēíÊÊ™‡Íµø—­ë}[ í‚ÅíÊÊ™‡Íµø—­ë}[ ŽÞ”Þ“íóö—†÷¿/µø°†ù¿/µPA ½ÑÈòõÞûÞ‚Åóö—†÷¿/µø°†ù¿/µPA ½ÑÈòŽÞ”ނؓ߹º—†»ˆ¼½°†¾ˆoà‹!j[ëõÞûÞ ÌØŒœºÓhÐåvªÖ[îÅ’Ä¿côáØ¡¤¥ß¦ˆÓ§¨©ˆÓÊäHödéîÅ’Ä¿c½â&ôá£Ø®®Æ±¿/÷²±÷ú@ÑѳŸ‚ü ÌÔÆ¿cµãØ··‘޹±÷<b¹$¼æ?îÅ¿cŠä“íÍͽп/÷¼‹q–vuÔÆ¨Ïð‚ÅðÍͽп/÷¼‹q–vuîÅŸ¿c™å‚Ø™å&µã˜Ä··‘޹±÷<b¹$¼æ?ÔÆ ÌØöö„’ù¿/œú±œE ú ÌÔÆ¿c¼æ&¼æ™GØÿÿÓ’±œ¸ÃÁðözîÅ¿c¡çÿÿÓ’±œ¸ÃÁðözÔÆ Ì؈ˆ¤“¿/¾Œ±¾yVVCÜâ%ΠÌÔÆ¿c¤è¿cô“±¾O
S½„\<îÅØùè“í§§¥•ª¿/¾
ëÐx–‡ÔƨÏÊ‚Åʧ§¥•ª¿/¾
ëÐx–‡îÅÌå¿cˆê‚؈ê&¤è˜Äô“±¾O
S½„\<ÔÆ ÌØÐÐñ—Ó¿/ãÔ±ã€`Ë÷­ ÌÔÆ¿c©ë¿cÙÙ¿˜Û±ã“¡êlš®PîÅØþë“íïïî™ò¿/ãªG#µìùu+ÔÆ¨Ï‚Åïïî™ò¿/ãªG#µìùu+îÅÌå¿cí‚Øí&©ë˜ÄÙÙ¿˜Û±ã“¡êlš®PÔÆ Ìؘ˜¸œ¿/œ±q•}j5‰ ÌÔÆ&˜˜¸œ¿/œ±q•}j5‰’Äľ¿c®îØ¡¡£±#ñ]ÃgÖîÅ¡¡£±#ñ]ÃgÖÔÆ Ì¿cÒï¿c§§ÁªºµA°:ÿi@, ÌÊ“í§§ÁªºµA°:ÿi@,’ÄÊ΂ÅÎÕð“íÔ׸ ØÈ µÙÓ µÚƒmÛæ µÜÝñ ï
Tÿ’ÄÉñû‚ÅûÔ׸ ØÈ µÙÓ µÚƒmÛæ µÜÝñ ï
Tÿ Ìˆñ¿cîò‚ØÕð¿c©ƒˆÓ ’$:³JŒqÄcûó¾ûó¿c†hˆ¿/Ü„ûáJþ‚Å“í†hˆ¿/Ü„ûáJþóÊ¥‚Å¥Êô‚؆hˆ¿/Ü„ûáJþîÅ¿cªªÃ¥¬¿/Òcm®ÎÝZÊ‚Å&öºÍ“파±S¿/ÝSïdjì=tü‚ź͂ØÖö¿cÖö“í¡¡¢È¦ˆ ¾ÿ!WɵY8óʘĂء¡¢È¦ˆ ¾ÿ!WɵYèTóʘĿc·÷Š °°ø¥²±¹h¯å½•S×Z‚ÅØÐø¿cÐø&Ðø˜Äظ¸»¦»¿/м±Ð»\@Àð ÌÔÆ¿c®ù¿cÁÁ„§Ã±ÐqN0£ò®;
îÅØƒú“íÚÚƨÞ¿/Ð0ÿõ)F;ÊÎÐÎÖ΂ÅÚÚƨÞ¿/Ð0ÿõ)F;œÏ¢Ï¨Ï¿c–û‚Ø–û&®ù˜ÄÁÁ„§Ã±ÐqN0£ò®;
ÔÆ ÌžBoxÁ¡ˆˆ¢ˆl }.xÏľçEçEèEGlobalÁ ¿±‡§í#ØË«ä«ùŽò«ùf#ÎààdX\¿c³ý³­À³ýÊ ‚ÅºÍØ«¬ßñ n£3'ÖØ©q³«¬ßñ n£3'ÖØ©qIdentityÁÝS'ÅÝüdõ«Ò¿c­þ«¬ßñ n£3'ÖØ©q ÌË
Å
Ø
Ñ
á
Þ
æ
ã
H
è
¯ ¦ Ø Õ ç Þ  ž š Ä Â Ì È ÛÒ äÛ
Œ
«Õºÿä­˜

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

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

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


ÈÕ
(E
ľ
°Š 
í
ð
Ê

Î
û
¥


Ê ¬™ Õ ŒÄ ­´jüëI‰ÇŒÄŒÄi¬7<Ìû
 Þ ŒÄ’Ä šüÁ
YÛÇ
΀
’Ä
ŒÄ’Ĭ&Ìb)Væ    èïü¹6™ÉZ ÄË   â é ³ü•T ÜË ­Ö­ÖDurationÁ®ÖsecsÁâ}¯ÖnanosÁâ}Zµ–²ª ô±Î ,‚
<‰
Ôø
È ‚Å 
˜
Áü¸`
­Ì
‚Å
ô
‚Åô¿/&Î )V ©  ¤Ÿ Ò  ÌÔÆ ² ¹ òüìM ÇÍ$  Ì ÔÆ  ÔÆ Ì¿/&±)V ´ ”¥ Œ
îÅ  ½ üüA ÌÏ$– îÅ  îÅj±7   Û¼ Ø ƒ
4


 Û¼’Ä(FüØ ’ 
 Ø’ĪØ
 é
ð
ïüýó Â×”»  Ø<• ’Ä ªØ Û¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ Øh Øi’Ä>ªØ4Û¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ–—oÌb×Ð|ÚÞ|ݬ¥ ¡îÅ’Ä ¹ü‹: îÅ’Ä ÄËäüÝ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\»Ÿ§²ËÌbUy ,Œ† ¸ ÌÔÆ ãüÓ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¡¡¢È¦ˆ ¾ÿ!WɵYóʘÄtŒŒ±S¿/ÝSïdjì=tü óʘĽÄÍñ µ
Ä
ÀŽVTë? À¿
À]T÷?Ê À
«¬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
Ä
À¥ ŽV¦ À¿
À]¥ Ê À
«¬¤ Á
⟠Â
ž &Ã

!!!¬€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ïj Ñ  Ò  Ó 8¿/ Ù 8Š  Þ  á 8„—ß l=ü.+ Middleware for retrying "failed" requests.Á»ïŒ‡=Ì=,£=(NepÞ ë îoTŽÕ y½rz†htËè
{؇|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ß‚Ø­Ö ïg$¯Ãc
Ë« ýYØ
Œß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|Â
ö½ºÁ
ľßeÌêeéÀ4†ÔYüˆL£ߪ ðªÈØľö½-/ܾü†+d‰ ö½ö½ 
ľ$›üù"£ߪ þðªܾü¢ ž žܾô ª
ľü×#<4Ú#Ÿ Ÿܾôô á#
ľ$æ#µ$ì#üñ(;£  ߪ ö(ðª¨)ܾ!""\³)4¸)ÓiÓiSleepÁÔi¿/«dÕientryÁ«dé|2V@Ñæ3üÚ)*dÝ)   ܾܾ ê)
"ľ$ï)üž+(ß¿$´$¤Í+<Ð+ß¿##
$üµ.ºÁ&Åc&üÛ.BÞ.¡¢£ ¡ºÁ ¢ c cˆ¢cµ
 `£cbufÁ `àB¤GS
£Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
ŸÈŸÈ È   O˜é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Á<Á­e)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†ÆÂ!¥oïgŒ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·p,&Þ NQ؇\DNRß4b‚ØNS¦¹x„¾NTíR,¥‚NVk<”ÌNW·$œØNX&NY,®°ž ì2’œU…lnvLikY[IK´¨=üç¡[¤\£][\]ÍìŒÄ ìÍì’Ä ïÍì˜ÄrŒÄ˜Ä’ĘÄ& ’ĘÄ&
ü¦&&’ĘĄÕÉÃ^oqkmgiüíûÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ˜ÄÛǒĘÄ& ÉÃZZ
^ŒÄ’ĘĴh<ˆ ïØüƒ Š¡`¤a£bba`Ëõ ˆ Üõ íõ þõüÍ &®ö„ü ÉÃcdƒØ„Ød:<?ADF\” 4™ __Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
ŒöšöüÆ I ¯°±„¾„¾¦¹†¾ ˜X$]È=„kt• ¯Éà °ÌÌkÎwakerÁ¸Ï local_wakerÁ¸ÐextÁ¸Ñ_markerÁ¸Ò_marker2Á¸f'EwÚ]¾å±œØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÉÃØ_ Ø _
dŒÄ’Ä˜Ä „—ä La,eÕ ·p, Þ efâÂ,#egd%”¬•¡iiËõ š‰Çj
 üë#ü±52 Creates a new [`RetryLayer`] from a retry policy.ÁøŒÄ‰Çhh
jŒÄ¬yü¸9¡l¤mmlËõ ½Üõ À،ĉÇnoo/146kkÛÇü™,² ²‰Ç’ĉǒÄk ¢k
oŒÄ’ÄÌb<©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`].ÁÎ
ŒÄ’ÄÛÇ
ŒÄ’ĬچÌbä†ÜÍü (% 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½ ½ÛǘÄÛǘÄ& ˆ àˆ
ŒÄ’ĘĴh<ë|¤>ü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.Á»Î œŽ>܈><¬>®È ÀvdÞ
 ¸†htÿ
š ¹k<Ÿ
Ì»·
œØ¼
­Ö½
&¾
| Error typesÁ
Ý ,×"¤,(*d€™ÉÔ¹ü“! Construct a new elapsed errorÁÆ™É
ìó™ÉÅcü—8š¾¿À ¾™É ¿ c cˆ¢cµ
 `£c…µ `àB¤GS
À¬¶˜ ž˜
± ¥ìþ™É
—ò
š ¡ Îs<$ œÎs œ؇\Cß4g‚ØŸ¦¹x„¾ k<ˆÌ¢·$‘œØ£ ²Ói¤¬ªì1Tt_yDshüT1Z\HJ”Ÿ9̦¥¦¦Íì‚Å «óɧ 
üÆ4Ô‚Å–³óÉ¥¥
§‚Å“tDØ£t,åü±t©¥ª««©ªîŃØÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
óʵӬðÍìóÊ ¹ÍìµÓ ¼‚ØîÅìéÍìîÅ æµÓžÉû¡ˆˆ¢ˆl }.xϾ Ìì€ý¬—ˬ­ƒØ„Ø­ÄÆÀ¨¨Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
óÊ×·üÛIÁÂľ„¾¦¹†¾ ˜X$]È=„kt• Á—Ë ÂÌÌkηú¸ÏÊú¸Ðãú¸Ñôú¸Ò‰û¸f'EwÚ]¾åÜ؞؟ØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤Ã—˃ب í¨
­îÅóʵӄ—ù

 öv< È ®¯D# ­Ö®°âÂ,> ®±t  /”1 ŒÔ Ü˳ü•+ üì$ ! Create a timeout from a durationÁ¢ ôÜ˲²
³Î Cˆüí! ¤µµÍì Ì ò ÜË··d• ´´üÌüµ, ,¸ Ä ÄÜË ÌÜË Ì´ ¾ ´
· Ì$¿ Ìb<Å ÌÑ
æäñ
ÛL“
ÎѾÁœ³
±´Ì
¢”ý
¥ÀÀí´ 
­ÌÁÂÃÄü¸5
ì–
 Creates a new [`Timeout`]ÁÅ
‚Åô­Ì¿¿
Á‚Å¿/êˆÎ ôˆÜË
üž(
î¡
Å Å­Ì Å‚Å¿ Ú
¿
‚Å
ü½#
üˆ0
‰£
Æ Æ­Ì Æ‚Å¿ Ì
¿
ÂÅ
äº
ü†/
«¤
­Ì‚Å¿¿
Ä‚Å
üõt
¤Æ£ÇÆÇ×¾ ú
ÍìºÍ
& ÌºÍ„³
æ ÌºÍ&
×·¬Ó
üÌÈÉÊËÌ& &
& & &
ËÌprln

ÅŠ̺Í& T
,
ÅÅ×·
4¸
ÅÅš š †hœ “t £ta“*8)Ä} ÌºÍ& üá O
ÇÈÉ ÇüÌ ÈÌÌkηú¸ÏÊú¸Ðãú¸Ñôú¸Ò‰û¸f'EwÚ]¾åɜ؞؟ØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
ü̺Í&
Å ï
Å
ˠ̺Í
„—ú
üà 4
Ê Êü̺Íü̺Í& Å è
Å
̠̺Í
´h<ó
dÎ>üKH Various utility types and functions that are generally used with Tower.Á»Ü#„»>ĵ>$Ö>ÎêŸÔµÓ÷œ¾ãµÒ¹ÐùÀ Â Ê ï Çw<ûÒ {d„Œ
î)¤¨ºæ»,ľäç°'Dؘ å•/TâèÞ1„ é‰5|˜ö¯8œ¿«œ ù… ‰Btý ÜŸ Œl  Æ®¢ ‘Ž·£ ¸œ˜¥ ¡¦ „’T€ö¨ Ó’ÿ© ¤“ˆ« ô“„¾¬ ñ—Ю ¿˜Ù¯ Á<‹§° Ã¥ª± È¡³ ±Sd¿Œ´ ŽVTß Àø¥°· »¦$‚¸¹ „§Áº ¡|<±Ü
¼ ³‘ƒ„º½ ´ß‚ØÍ¾ ¢þ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 ¡ )ù<)ù<Çw)ý<¿/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.Áù  ÌÔÆÇÍïï
ò ÌÔÆ¿/¾‰±ȉü‰% ü¿? < 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²  ôô’æ  ôôÛ Û “xß ¿/Îó<ÐÑê Ì˜Ä& ¿åÔÆü„O T‡ ÔÕÖ ÔÇÍ ÕÌÌkηú¸ÏÊú¸Ðãú¸Ñôú¸Ò‰û¸f'EwÚ]¾å֜؞؟ØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
Ç͘Ä&
ô  ô
ü ÌÔÆ˜Ä¿å$— „— ü—4  × ×Ç͘ÄÇ͘Ä& ô Ÿ ô
ý ÌÔÆ˜Ä¿å ´h<ª ¼° ÿÿ»· µ ÌÏ 
ôü üÎ) & Creates a new [`AndThenLayer`] layer.Á îÅÌÏþþ
îűhŠüÁ; ¤ƒƒ×¾ Æ ®Ô É ½æ žÐ*,/1 <ˆ ÇÍü¦*  Ø ØžÐ ÌžÐ Ì ¯ 
 ÌÔÆ ¿/,¶ L[,_ͱ۲°'D° åî)¤Ç ºæ»,Äï äç•/T“ èÞ1„§ ¾éL , •/T!ˆè×'!¤,ŠK2!†J”aDJ! 'âÂ,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Á
!À'¥¦Íì‰ÑÃ
!ˆ· Ç
!Íì“Ñ Ê
!…‹ Í
!ÛÐÞSýƒølqp?ADF@BEGüÖ
P!,Ö
!†J†JK‰Jµ 7ŠJphantomÁ7J¤7·0ØQdè‰Ñ‰Ñ•/¿/‰ j<a6óÊ“Ñ™Ñ Ìì€ýü«'!À'¥˜¦š˜šÜ°!ˆ· ´!õ ·!…‹ º!ÛÐ#%(*-/24üüã!ôÙ! Create a new [`BoxLayer`].Áƒ!ÛМœ Í쓆 !“†‰Ñ!Ì쓆! “†!“†!&“†‰ÑóÊüî#!“‡óÊ& “Ñ!“‡óÊ&
™ÑL‡!Ì쓇$”!“‡<›!Ì쓇óÊ& !ü‡<×!
‰Ñóʓљѓ† inner_layerÁ\Š!ýÿ„ƒ!«çÃçàç‰Ñóʓљѓ†‰Ñ؃“†üº5!À'Ÿ¥ ¦¡¢¡Ÿ ¢Ü¿!ˆ· Ã!õ Æ!…‹ É!ÛУ¤¤2479<>AC!<û!žž؃üŸ+!,¢!Ù ÙÛЉÑÛЉў ¨!ž
¤‰ÑóʓљÑ!¿/,¯!üö1!À'¦¥§¦¨©¦¨©§Üû!ˆ· ÿ!õ !…‹ !ÛЪ٪+-0257:<¼®!,±!Ú ÚÛÐÛÐ¥ ·!¥
ª‰ÑóʓљÑ!ü–6!À'¬¥­¦®¯¬®¯­Ü!ˆ· Ÿ!õ ¢!…‹ ¥!ÛаÀc°+-0257:<üÓ6!Ö!ÛÜÝ ÛÛÐ Ü c cˆ¢cµ
 `£c…µ `àB¤GS
ݬ¶« Ú!«
°‰ÑóʓљÑ!×á!| \ º‰5|"ö±² ×,"¤,±´K7"†J±µ”aDO" '±·âÂ,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 }Á"ú<"‚ø"úü!"ïâü¿'"Žÿüç%"¿ÿü"îÿ¤¸"À'»¥¼¦½¾»¾¼½ÜÍ"ˆ· Ñ"õ Ô"…‹ ×"ÀÑìêök±ÇV¿68;=@BEGüàU",à"±ºº†J†JK‰Jµ 7ŠJ“‚7‹J¤7·0ØQdè‰Ñ‰Ñöö÷‰5ûˆê ý„æ(_¶óÊ“Ñ™Ñ Ìì€ýüº3"À'Á¥Â¦ÃÄÄÂÃÁÜ¿"ˆ· Ã"õ Æ"…‹ É"ÀÑÅ#%(*-/24ü£ë"üô*"' Create a new [`BoxCloneServiceLayer`].Áª"“†ÀÑÀÆÆÀ
¼† ®"͆"á†"ò†"‚‡"ü•#"¬‡d "‡"؇"Ø“‡"é‡"ô‡$ÿ"ˆ<†"
ʼnÑóʓљѓ†´‡"„²"Å«çÇÃçÇàçÇÇÅljÑóʓљѓ†¿‰’ªˉüîA"À'ɥʦËÌÉËÌÊÜó"ˆ· ÷"õ ú"…‹ ý"ÀÑÍÎÎ2479<>AC"<»"ÈÈ’ªüä+",ç"Þ ÞÀщÑÀщÑÈ í"È
ΉÑóʓљÑ"¿/,ô"ü»="À'ХѦÒÓÓÑÒÐÜÀ"ˆ· Ä"õ Ç"…‹ Ê"ÀÑÔÙÔ+-0257:<¼ÿ","ß ßÀÑÀÑÏ ˆ"Ï
Ô‰ÑóʓљÑ$‰"üçB"À'֥צØÙØÖÙ×Üì"ˆ· ð"õ ó"…‹ ö"ÀÑÚÀcÚ+-0257:<ü°6"³"àáâ àÀÑ á c cˆ¢cµ
 `£c…µ `àB¤GS
â¬¶Õ ·"Õ
Ú‰ÑóʓљÑ"×¾ ä×
#¤,ÛÝK#†JÛÞ”aD-# 'ÛàâÂ,7#Ûá<R#&Ûâ¯8œ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)ÁüÊ+#ë¢üö.# £#×£±#úüµ,#ø£â#úüæ)#º¤ü)#í¤#»šüÀ*#­¥üë!#á¥#ú<#‚ø#úü!#ïâü¿'#Žÿüç%#¿ÿü#îÿĸ#À'奿¦çèçåæèÜÑ#ˆ· Õ#õ Ø#…‹ Û#ŸÒRì<>4ãNé68;=@BEGüäY#,ä#Ûää†J†JK‰Jµ 7ŠJ“‚7‹J¤7·0ØQdè‰Ñ‰Ñ««¬¯8°ˆŸ gíÁtú¡5óÊ“Ñ™Ñ Ìì€ýüÂ7#À'ë¥ì¦íîëìîíÜÇ#ˆ· Ë#õ Î#…‹ Ñ#ŸÒï#%(*-/24ü³ò#ü€.#+ Create a new [`BoxCloneSyncServiceLayer`].Áº#“†ŸÒêðð꼆 ¾#͆#á†#ò†$#‚‡<ˆ#ü¥##¬‡#‡#؇# “‡#έ#é‡#ô‡$#ˆ<#
ï‰Ñóʓљѓ†´‡#„É#ï«çñÃçñàçññïñ‰Ñóʓљѓ†¿‰¨Ìˉü‰E#À'ó¥ô¦õööôõóÜŽ#ˆ· #õ #…‹ ˜#ŸÒ÷øø2479<>AC#<Ú#òò¨Ìü‡+#,Š#ã ãŸÒ‰ÑŸÒ‰Ñò #ò
ø‰ÑóʓљÑ$‘#¿/,—#üÞA#À'ú¥û¦üýûýüúÜã#ˆ· ç#õ ê#…‹ í#ŸÒþÙþ+-0257:<¼¦#,©#ä äŸÒŸÒù ¯#ù
þ‰ÑóʓљÑ#üŽ F#À'¥¦ƒƒÜ“ #ˆ· — #õ š #…‹ #ŸÒÀc+-0257:<üÛ 6#Þ #åæç åŸÒ æ c cˆ¢cµ
 `£c…µ `àB¤GS
笶ÿ â #ÿ
‰ÑóʓљÑ$ã #×é #D2 $6 ˜À]T $Ê À
”aD)$ 'ˆ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Á
$¥¦í´ ÷
$Íì¯Ó ú
$™· ý
$ýÒ‰ j<a679358:ü† 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$$£$ë ëýÒ‚Å‹é¤ ¨$¤
¬‚ůӵÓ$´h<³$üˆ0$¥®¦¯°°®¯í´ $–ç $™· $ýÒ±Àc±#%(*-/ü¿6$Â$ìíî ìýÒ í c cˆ¢cµ
 `£c…µ `àB¤GS
­ Æ$­
±‚ůӵÓ$×Í$T< 4@ ¾Ã
”aD% '²´ÕØ<%²µ<9%&²×L%¤,²·ß4h%‚ز¹¦¹y%„¾²ºk<‰%̲¼·$’%œØ²½\%¥§—´*%ˆDG%zU%t`%nDt%]üU1%OQ=?üÃ$%ü%%" A boxed [`Service`] trait object.Á„Î%¥¿¦ÀÁÀÁ¿í´ ß%–ç â%™· å%‰Ô(YÚi¤”ŠÁÂ.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%$Ý %ò ò‰Ô‚ÅɀΠâ %Î
Ö‚Å¯ÓµÓ %´h<í %ü¾ 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%$þ%ù ùÑÓºÍÑÓºÍ& Ü ƒ%Ü
ã ÌºÍ$ˆ%´h<Ž%$ Süº! †SüÝ* |S„ qSÄŸ fS|f\jÍö÷À]T Ê êëÌ/L1( êì×K¤,êîk<[Ìêð·$dœØêñ”aD€ 'êóÕØêô&êõŒ¢ü@ˆÄ@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);Áü« ,ø£Ø úüÜ )º¤ü† )í¤ »šü¶ *­¥üá !á¥
‚ø|
¥ø¦ùúøúùí´ ¦
–ç ©
™· ¬
æÔý„æ(_¶÷ûžÉû¡ˆˆ¢ˆ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Ú]¾åü ÷ ª
Œ‚ůӵӄ—µü›.ý ýæÔ‚ÅæÔ‚Å&  £
‚ůӵӴh<®üò0¥¦í´ ÷–ç ú™· ýæÔÙ#%(*-/¼©þ þæÔæÔŽ ²Ž
‚ůӵÓüí!ê£é¢üíÒ&ñ¢£T„Íìöµ é¢@ìµ/é¢Lìµ;•68ü•¨êÿ ÿñ¢žÉû¡ˆˆ¢ˆl }.xÏöµ& öµñ¢öµ& &
öµñ¢öµ&
& öµñ¢öµ& Ìì€ý «
ñ¢öµüÁR£¥˜˜ߪ ƈ· É&óÊľÌìóÊØóÊóÊ<‹óÊZ\_aüšƒLê óÊžÉû¡ˆˆ¢ˆl }.xÏľ& ľóÊľ& &
ľóÊľ&
& ľóÊľ& Ìì€ý °
ľóÊüÌ5¥¦œœí´ Ñ–ç Ô™· ×æÔžÀcž#%(*-/üˆ6ƒ æÔ  c cˆ¢cµ
 `£c…µ `àB¤GS
ƒ¬¶š š
ž‚ůӵÓ$פw„{Í«¬ÈÀ]T Ê Ÿ Ì/L1( Ÿ¡×K¤,Ÿ£k<[ÌŸ¥·$dœØŸ¦”aD€ 'Ÿ¨ÕØŸ©&ŸªŒ¢ü@ˆÄ@z|ik\r[]JL´˜=»ü±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Áüò õºœž¥­¦®¯®­¯í´ ²–ç µ™· ¸ÓÕgíÁtú¡5¬°žÉû¡ˆˆ¢ˆl }.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Ú]¾å ÷º ë º
Á‚Å¯ÓµÓ „—ö üÜ
.
 ÓÕ‚ÅÓÕ‚Å& º ä
º
‚ůӵÓ
´h<ï
ü³4¥Ä¦ÅÆÅÄÆí´ ¸–ç »™· ¾ÓÕÇÙÇ#%(*-/¼îˆ ˆÓÕÓÕà ÷Ã
ǂůӵÓü²!ŸÈ£ÉÈÉé¢ü²åìµ ÅÈé¢*ìµ&é¢6ìµÊÊ68üÚ»Ÿ ñ¢žÉû¡ˆˆ¢ˆl }.xÏÈöµ& öµÛ·&
öµò·& öµ‰¸ Ìì€ýÈ ðÈ
Êñ¢öµü™Y£Ì¥ÍÍÌߪ žˆ· ¡ˆ¹›¹ óʬ¹¼¹óÊÎÊÎKMPRüù±ŸŠ ŠóÊžÉû¡ˆˆ¢ˆl }.xÏÈľ& ľúº&
ľ‘»& ľ¨» Ìì€ýË Ë
ÎľóÊ$üÕ9¥Ð¦ÑÒÑÐÒí´ Ú–ç Ý™· àÓÕÓÀcÓ#%(*-/ü•6˜Œ ÓÕ Œ c cˆ¢cµ
 `£c…µ `àB¤GS
¬¶Ï œÏ
ӂůӵÓ$×£dD‘ÍÕù¡|<ï&Ü
³‘ƒ„ƒ&´&&Ôæ
¤
StreamÁ4 (EÕÖ؇\0 Õ××L ¤,ÕÙß4] ‚ØÕÚ¦¹n „¾ÕÛíR,~ ¥‚ÕÝk<… ÌÕÞ· œØÕß &Õठ¼ì ­A ž tU Di €üA: qs`bNP´œ @üìh É;â¤ã¢äâäãÍì Øñ Üõ ö ÍìªØ ù ¿c Ø (E’Ä ¿c’Ä Â×åÀcå[]`b\^üÛ8 Þ Ž ŽÂ×  c cˆ¢cµ
 `£c…µ `àB¤GS
¬¶á â á
å Ø’ÄªØ ± é üÔ!  æçæçé¢üÔ³ ®Ô ë ‚ØÔÆ æé¢3é¢éêèéêèéêMOÜü Dÿ  ñ¢æ ˆ æ
èñ¢ÔÆ$‰ ô   ñ¢ÔÆæ ¥ æ
éñ¢ÔÆ Ø üÁD   ñ¢ ÌÌkηú¸ÏÊú¸Ðãú¸Ñôú¸Ò‰û¸f'EwÚ]¾åœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙÔÆƒØæ É æ
êñ¢ÔÆ „—Ô ü‰m É;ì¤í¢îìíî‰ßŽ Üõ  ¢ß  & Ø–—„» Ãß æªØ Ø–—& ”ã Â×ïðñò]_bdgiüýP   Ø’ĪØÂ×ëë
ï Ø’ĪØÌb¢‹Ð|¬‹Þ|¶‹üŸ ) Â× Øëë
ð Ø’ÄªØ ü» 7 „¾„¾¦¹†¾ ˜X$]È=„kt• Â× Øë à ë
ñ Ø’ÄªØ üí
D
Â×›Ûëë
ò Ø’ĪØ$‰ üÃx É;ô¤õ¢öôõö‰ßÈ Üõ Í ¢ß Ð ”è„€ Ãß4™ ¯è”¨ Â×÷ø(F(Gø@BEGJL  óóÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
 Ø–—&  Ø–—&
üöT  ˜„¾„¾¦¹†¾ ˜X$]È=„kt• Â× ˜ÌÌkηú¸ÏÊú¸Ðãú¸Ñôú¸Ò‰û¸f'EwÚ]¾åœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙÂ×(Fó  ó
ø Ø’ÄªØ „— &&ÔÜ
ä
ž'ÕùúÚÛ4‡'(EùûñØ'ùü؇'ùýß'‚Øùÿ¦¹'„¾ùk<”'Ìù·$'œØùƒ'&ù'äù'³ü“$'¥ì½'à'të'ŠDÿ'yüà1'kmY[´«'Kü²L'É;¤‰ß·'Üõ ¼'”è„Þ'Ãß'ÌØˆŠ,.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ÁÏ' Ø’ÄÌØ
ˆ Ø’ÄÌb<Ó'Ð|4á'ô¿!'üù$'! 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'É;¤ŽŽ‰ß“('Üõ ˜('”è„Å('Ãß4Þ('ÌØ(F(G0257Lì('$ñ('ŒŒäíü )T'L£)'œ„¾„¾¦¹†¾ ˜X$]È=„kt• ÌØ œÌÌkηú¸ÏÊú¸Ðãú¸Ñôú¸Ò‰û¸f'EwÚ]¾åœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙÌØ(FŒ ·)'Œ
 Ø’Ä$­)'„—Ã)'ü«*6'»· °*'ª·4³*'çÙèéê13Ôè*'Dë*'ž žçÙ ô*'
îÅ$õ*'ì·+'$º+'Ÿ ŸçÙîÅ ¿+'
îÅ$Ä+'Ø4Ê+'ü’,C'$•,' ¡¢  çÙ ¡ÌÌkηú¸ÏÊú¸Ðãú¸Ñôú¸Ò‰û¸f'EwÚ]¾å¢œØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙîÅƒØ š,'
îÅ$Ÿ,'„—¥,'lû&Lÿ&Ôž(ÕÚÛ4‡((E˜ÂÛ„©()é"؇(šß(‚Øœ¦¹(„¾k<–(ÌŸ·(œØ (&¡(äù(³ü“&(¥ì¿(â(tí(ŠD(yüâ1(kmY[´­(KüËU(É;£¤¤£¤‰ßÐ(Üõ Õ(”è„€(Ãß4™(›Û¥¦§)+.0ü· ?(ü§/(, Create new [`CallAllUnordered`] combinator.ÁÛ(úüãO(¢ö¾ ( Ø’ěۢ¢
¥ Ø’ÄÌb<Â
$(Ò÷¥ (ú (‹ø¾ (úüÆ 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• £›Û Ø¢ ç(¢
§ Ø’Ä(ü±`(É;©¤ªª©‰ß(Üõ »(”è„ñ(Ãß(›Û«¬(F(G¬0257L˜($(¨¨äíüÌT(LÏ(¤¥¦„¾„¾¦¹†¾ ˜X$]È=„kt• ¤›Û ¥ÌÌkηú¸ÏÊú¸Ðãú¸Ñôú¸Ò‰û¸f'EwÚ]¾å¦œØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ›Û(F¨ ã(¨
¬ Ø’Ä(„—ï(ü×8(®®»· Ü(ª·(¸Ü¯°±èé꯰±13Ô–(D™(§ §¸Ü­ ¢(­
¯îÅ(ìç($ê(¨ ¨¸ÜîÅ­ ï(­
°îÅ(Ø(ü¿C($Â(©ª« ©¸Ü ªÌÌkηú¸ÏÊú¸Ðãú¸Ñôú¸Ò‰û¸f'EwÚ]¾å«åˆ­ Ç(­
±îÅ(„—Ò($ß&„æ&èÜø&ÜTÍÊÎóú؇\‡µß‚ص¸¦¹¼„¾µ¹k<Ì̵»·œØµ¼âµ½&µ¾ìu˜ŒD·{ü˜1mo[]”ãL´û=ü ÀÁ£ÂÁÂÀ”Þ˜Ä& ŽÞ˜Ä& ´”Þ˜Ä&
ŽÞ˜Ä&
„¥íõ&ŽÞ˜Ä„ã&”Þ˜Äüü:ÍìŽÞ ¥Íì”Þ ¨ÄÝÃÄÅÆÇ& &
& & &
ÆÇ?A;=¿¿Áž¿¿áž4ÿ¿¿ÊÊ™‡Íµø—­ë}[ ŽÞ˜Ä& ”Þ˜Ä& ü¹O¬­® ¬ÄÝ ­ÌÌkηú¸ÏÊú¸Ðãú¸Ñôú¸Ò‰û¸f'EwÚ]¾å®œØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
ÄݘÄ&
¿ Ç¿
ƎޔޘĄ—Òü° 4¯ ¯ÄݘÄÄݘÄ& ¿ ¸ ¿
ǎޔޘĴh<à ü˜hÉÊÉʔރ؎ރؔ쳟  ‚ØŽÞ‚Ø”ÞÔ墟 “ßË̃؄ØÌSU\‡ÈÈó¥ü¥I°±²„¾„¾¦¹†¾ ˜X$]È=„kt• °“ß ±ÌÌkηú¸ÏÊú¸Ðãú¸Ñôú¸Ò‰û¸f'EwÚ]¾å²œØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤Ã“߃ØÈ ·È
ÌŽÞ”Þ„—Ãü£O¤ÎÏÐÐÏÎ×¾ ¨ÍìõÞ «ÍìûÞ ®õÞ ÌûÞ Ì—áÑÒÒdf`b\^Í͹º—†»ˆ¼½°†¾ˆoà‹!j[ëõÞ ÌûÞ Ìü­*³ ³—á Ì—á ÌÍ Í
Ò ÌõÞûÞ¿/,½”¨ÍÜ¡× ¤,ÓÔß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ˆ
îÅôáݤޣßàßÝÞà »·
Üõ š
Íì¨ã
…‹  
ª·ìÒ
îŃØÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†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ì»êîÅôááá
äîÅ’ÄØeüÏFæ¤ççæ»· ÔÜõ ×ÒßôáèÀcè#%(*üœ8Ÿ´µ ´ôá µ c cˆ¢cµ
 `£c…µ `àB¤GS
¬¶å £å
èîŒı ªü£!>ê¤ëêë»· ¨!Üõ «!ÒßTÖ!½âìÀcì#%(*üè!8ë!·¸¹ ·½â ¸ c cˆ¢cµ
 `£c…µ `àB¤GS
¹¬¶é ï!é
ìîÅ’Ä$ð!± ö!üØ$…î¤ï£ðñîïñð Ͼ¬ %Ù¿LÒ%®¾ ã$…‹ æ$ª·ì™%»· Ý$µ¿,¹%Æ¿¬Ç%Üõ à$ôáòóôõö& &
& & &
õö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‘
,
ŠŠâÚ
ŠŠÍͽп/÷¼‹q–vu¸èÔÆüæ O
ÁÂà Áµã ÂÌÌkηú¸ÏÊú¸Ðãú¸Ñôú¸Ò‰û¸f'EwÚ]¾åÜ؞؟ØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
µã˜Ä&
Š ô
Š
 ÌÔÆ˜ÄâÚ
„—ÿ
ü‹4

Ä Äµã˜Äµã˜Ä& Š 
Š
 ÌÔÆ˜ÄâÚ
´h<ž
´—
»· œ
Šä 
ôÛ
ü´"
 Creates a new [`MapErrLayer`].Áè
îÅŠä
îű̎üŸ:
¤˜˜×¾ ¤
®Ô §
½æ
þåš*,/1

µãü‚*
,…
Å Åþå Ìþå Ì 

 ÌÔÆ
¿/,
Íöÿ× ¤,œk<ÌœŸ·$'œØœ âÂ,?œ¡<Y&œ¢DeLWYFH”27´J(ü¡C¤¤¥¤¥×¾ ¦®Ô ©¿Ô¼æ¦Àc¦#%(*üë8îÆÇÈ Æ¼æ Ç c cˆ¢cµ
 `£c…µ `àB¤GS
Ȭ¶£ ò£
¦ ÌÔÆ± ùÜܤ¨©¨©×¾ á®Ô 伿ª«ü¬(üþ)& Creates a new [`MapRequest`] service.Á¹ ÌÔÆ¼æ§§
ª ÌÔÆ¿/w±üÒ(ü‚B? Returns a new [`Layer`] that produces [`MapRequest`] services.ÁÉúüÑNK This is a convenience function that simply calls [`MapRequestLayer::new`].Á¤úü¬!ïâÔÆæç§§
« ÌÔÆ± ßü¤e¤­®™G¯£G°°®­¯ÔÆ”ç˜"£G®Ô ¬Íì”ç¯Íìýì³& Ìýì“"ÔÆôì×¾ ©¼æ±²³´µ& &
& & &
´µ.0ŒŽˆŠl D• ¬¬ Ìýì& T± ¬¬ Ìýì&
¬¬ Ìýì& üø LÉÊË É¼æ ÊÌÌkηú¸ÏÊú¸Ðãú¸Ñôú¸Ò‰û¸f'EwÚ]¾å˜؞؟ØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
øî¬
¬
´ ÌÔÆ”çýì$‹
„—
ü‚ ,$… Ì Ì¼æ”çœï¬ Š ¬
µ ÌÔÆ”çýì$ ´h<• Ô‡
··»· Œ
¡ç¸ 
ôÓ
ü¨
&# 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˜
Ñѧ§¥•ª¿/¾
ëÐx–‡¸èÔÆüÕ
O
ÑÒÓ Ñ¤è ÒÌÌkηú¸ÏÊú¸Ðãú¸Ñôú¸Ò‰û¸f'EwÚ]¾åӜ؞؟ØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
¤è˜Ä&
Ñ ã
Ñ
Ù ÌÔÆ˜Ä¾ÿ
„—î
üâ4Ô Ô¤è˜Ä¤è˜Ä& Ñ êÑ
Ú ÌÔÆ˜Ä¾ÿ´h<õÜòÜÜ»· ÷ùèÝ 
ôÆü”-* 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.Á¯ ÌÔÆ©ëññ
ô ÌÔÆ¿/5’±?’üÅ
'ü÷A> Returns a new [`Layer`] that produces [`MapResult`] services.Á½ úüÅ MJ This is a convenience function that simply calls [`MapResultLayer::new`].Á
úüŸ
!ïâ
ÔÆðíññ
õ ÌÔÆ± Ò
ü• Ô¤÷ø£ù ú  ûúøù÷û
ÔÆÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
®å„æ˜"Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
¾ÿ  ¼É ®Ô íõ Øÿ ÍìÏ“ êå„ì éÏ“„æt‰ –"ÔÆ¢’ü  @×¾ 𠽿 ©ëüýþÿ& &
& & &
ÿ68Ÿ¢¤§©£¥  öö¾ÿ
,“
ööÏ“

ööïïî™ò¿/ãªG#µìùu+¸èÔÆüæ
O
ÙÚÛ Ù©ë ÚÌÌkηú¸ÏÊú¸Ðãú¸Ñôú¸Ò‰û¸f'EwÚ]¾åۜ؞؟ØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
©ë˜Ä&
ö ô
ö
ÿ ÌÔÆ˜Ä¾ÿÏ“
„—ÿ
ü‡4Ü Ü©ë˜Ä©ë˜Ä& ö ö
 ÌÔÆ˜Ä¾ÿÏ“$”´h<šÌ’»· þëƒ 
ôâü²+( Creates a new [`MapResultLayer`] layer.ÁïîÅþë
ƒîűߒü©=¤×¾ ®®Ô ±½æð툈*,/1©ëü’*,•Ý Ýðí Ìðí Ì 
ˆ ÌÔÆ¿/,¢T͘¡×¤,ß4 ‚ØŒk<3ÌŽ·$<œØâÂ,W<q&z|t,_aNP”J?´b0Ô»¤×¾ À®Ô îî˜!$&ü‰(üÜ(% Creates a new [`MapFuture`] service.Á ÌÔÆ®î
 ÌÔÆ¿/‹“±•“ü§'üÙ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.ÁëîÅÒ着
¬îű6”ü›=¤®¯®¯×¾  ®Ô £½æŒð°±±*,/1­­®îü„*,‡ç çŒð ÌŒð Ì­ ­
± ÌÔÆ¿/,”üè(³³»· íÒï´Àc´ü—8šèéê èÒï é c cˆ¢cµ
 `£c…µ `àB¤GS
ꬶ² ž²
´îű ¥\<‘ͧ¯ÔÞé؇\µ×2¤,µ¸ß4C‚ص¹¦¹T„¾µºíR,d¥‚µ¼k<k̵½·$tœØµ¾<&µ¿ì¦'™t;ŠDOyü':jlY[HJ´‚;üï(¤ÁÊÂÁÂ×¾ ôáŠ& ÌˆñîòÃÄ)+.0üž4µ ÌüªîòÀÀŽ®È ö”Ó E•ü„'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µý¤ÃÕðƒØÍ ÞÍ
Ѡ̈ñ„—êÍÓܪ†htìÒî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)é¥êëëéꢶ¬¤)ˆ· í)™· ð)ª·ì)»· ê)Ì·¬Ã)ÔõìíƒØ„Øí$&IKNP)4å)è艹üI)$’)ôõö„¾„¾¦¹†¾ ˜X$]È=„kt• ôÔõ õÌÌkηú¸ÏÊú¸Ðãú¸Ñôú¸Ò‰û¸f'EwÚ]¾åöœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÔõƒØè ¡)è
íîÅóʵÓ$—)„—­)äÞL€|lo´ `œË¥ôôí´ Ðöõ 
üˆŠôå Create a new [`Optional`].Áá°öó£ööóèÄ<™&‚ÅºÍ„Øæ‚źÍ&
×·¬ü
õ‚źͿ/KMü½u¥ø£ùøùí´ ÂèÄ×ЄüêЬœöúûüýþ& &
& & &
þýFHKM÷÷‚źÍ& TÚ÷÷×·4÷÷†hˆ¿/Ü„ûáJþ‚źÍ& üªOT­÷øù ÷ö øÌÌkηú¸ÏÊú¸Ðãú¸Ñôú¸Ò‰û¸f'EwÚ]¾åùœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
öºÍ&
÷ ¸÷
ý‚ź̈́—ÃüÈ 4 ú úöºÍöºÍ& ÷ Ð ÷
þ‚ÅºÍ ´h<Û « þ«çÿÃçÿàçÿÿþÿ‚ÅºÍ ‚žӺÍÍŒ¡¢×
¤,µ²\ƒµ²ƒß4=‚ئ¹N„¾íR,^¥‚ˆ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Á¥£ŽŽí´ èÄÖöïdjì=tü(*-/„«ŒŒá°üÁ ÁŒŒ§³ü§3¥£í´ ¬èÄÖöüßH¥£í´ äèÄ×Є–Öö "üÉ$Ö‚ÅÖö
‚źÍÌb™üÑ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Á
èT£¥¤£¥¥£¤ˆ· ö
íõ
óÊèTü‚ þ÷¾ÿ!WɵY¢¦ŒŒ±S¿/ÝSïdjì=tü èTóʘÄþ÷˯êþ÷¡¡
¢èTóʘÄò
ÛÝàâÞà¡¡¯êüú08¥¨£©©¨ˆ· ÿíõ<‚·÷ü¯IèT«¥¬£­«­¬ˆ· ¸íõ&óʘĄçþ÷®´,.13üš&¡éêþ÷ªª
®èTóʘÄÌb<¥üõTèT°¥±£²²°±ˆ· þíõ<³í„¸þ÷³´ƒØ„Ø´ú2479¯¯Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
éêóʘÄ&
ü€Mƒ„¾„¾¦¹†¾ ˜X$]È=„kt• þ÷ ƒÌÌkηú¸ÏÊú¸Ðãú¸Ñôú¸Ò‰û¸f'EwÚ]¾åœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤Ãþ÷ƒØ¯ ¯
´èTóʘĄ—¢ü€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
ååÚÚƨÞ¿/Ð0ÿõ)F;¸è§ÔÆüË
O
 ®ù ÌÌkηú¸ÏÊú¸Ðãú¸Ñôú¸Ò‰û¸f'EwÚ]¾åœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
®ù˜Ä&
å Ù
å
ï ÌÔÆ˜Ä¾ÿÏ“§
„—ä
üì4 ®ù˜Ä®ù˜Ä& å ôå
ð ÌÔÆ˜Ä¾ÿÏ“§´h<ÿ¤óòò»· øƒúó 
ô¹üŽ&# Creates a new [`ThenLayer`] layer.ÁÆîŃúññ
óîű±šüû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œ œ³ýŽ  ˜Ž
ðý$¤ä°%°%Â%Â%üä8Ô%Ô%ê%ê%&&&&,&,&ä‹B&ü­%T&g&üäy&y&Œ&Œ&üäÄŸ&Ÿ&²&²&üäëÅ&Å&Ø&Ø&üäë&ë&þ&þ&üäÊ''$'$'üäû7'7'J'J'„‚]'”˜p'üäÑ''”'”'üäø¦'¦'¹'¹'üäÌ'Ì'ß'ß't ñ'ñ'((œÑ(äë5(¹®, ½PDÕ ÓÁ ´» „÷ —ò“xl¦
Û à ™‡¤Ð
ÊÄ ½d‚ ÍÅ ¥•Œ± §Æ î™ ïÇ ½PD› ÜÈ ƨ ÚÉ ô•
„üÁ
#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.Á,Æ ñ¢¡¡¢È¦ˆ ¾ÿ!WɵYñ¢ºÍÊ  ÌÊ Íìñ¢,‹
Ì ñ¢ºÍüýTü¼<9 Yields the service when it is ready to accept a request.Ál€ñ¢ŒŒ±S¿/ÝSïdjì=tüñ¢ºÍÊ Ê “º ,Ë
Í ñ¢ºÍüÚWüƒRO Consume this `Service`, calling it with the provided request once it is ready.Á<Ýñ¢ºÍ§§ÁªºµA°:ÿi@,ñ¢ºÍÊ Ê “º ,«
Î ñ¢ºÍÓ ëü±üã`] 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´ñ¢ïÄÜ
Ü
¡|ß
¿/ù–EÊêÍx}ñ¢ïÄÊ ¤Ð Ð Ê ÍìïÄ ½“º ,û(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ß'ñ¢¶ïÒ Ò ÇwÕ ¿/ÎÖ ±Î
ä”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±Ì L˜nÕÈ ,¦n»šü°n:ôÌ üïnK¸Í L¿oÕÈ <ÍoÑ›,Ùo»šŒão¾±„ùo§Ï ÄŽp use tower::BoxError;Á«púü³p2/ // A service returning Result<Record, DbError>Áüêp9÷Ï ¨qúü°q63 // If the user is zero years old, return an error.Áüëq74 let mut new_service = service.map_result(|result| {Áä§r let record = result?;ÁÈrúÜÐr if record.age == 0 {Áüðr85 // Users must have been born to use our app!Áü­sKH let app_error = AppError::from("users cannot be 0 years old!");Áýsúü…tJG // Box the error to erase its type (as it can be an `AppError`ÁüÔt30 // *or* the inner service's `DbError`).ÁüŒu2/ return Err(BoxError::from(app_error));ÁLÃuÕÑÑuúüÙu(% // Otherwise, return the record.Á”†v Ok(record)Á<vúã©vúܱv¹Ò „ÑvÝÒ äæv let record = new_serviceÁ„‡w…þ|œwžþŒ°wäÝ „ÆwÜþäÛw # Ok::<(), BoxError>(())Á\üwµÓ <ŒxÑ›<˜x‚ø¤xúü¬xJG Performing an action that must be run for both successes and failures:Áûxú<ƒy‚øüy  # use std::convert::TryFrom;Áü´y%ÉÆ üÞy'øÆ ,Šz»šì”zµÇ ä¶zÛÇ ü×z'È ܃{±È L£{ÕÈ <±{Ñ›,½{»šüÇ{-ùÉ üù{æ Ä|ØÊ üº|=: # type Future = std::future::Ready<Result<String, u8>>;Á,ü|»šü†}YÎË üä}±Ì Lˆ~ÕÈ ,–~»šü ~:ôÌ üß~1÷ç L•ÕÈ Ñ›»šŒ¹¾±åè üã2
üš€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ì†ñ¢¶ïÐÐñ—Ó¿/ãÔ±ã€`Ë÷­ñ¢¶ïÊ Ú  Û   Ü Ú Û Ü Ê ¨ ÷†Øÿ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䔢ž
\÷”µÓ <‡•Ñ›<“•‚ø\¢•ñ¢¶ïöö„’ù¿/œú±œE úñ¢¶ïÊ Þ ÿ^ß ß Þ Ê ¨ ®•Íìÿ^T±•“º ,ø•“"¶ï¶¯
䊖¶ïÖ¯
˜"ºÍ<Ÿ–
Ý ñ¢ºÍ¶ï¶¯
$½•± Õ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ÁüþÝ$ ã ü§Þ*·Å üÖÞ.ëÅ ü‰ß!¼ 
$²ßñ¢¶ï¸¸»¦»¿/м±Ð»\@Àðñ¢¶ïÊ á  â   ã †&ä ã á â ä Ê ¨ ·ßØÿ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)Á<™îúã¥îúÜ­î¹Ò „ÍîÝÒ äâîÉ•
„ƒï…þ|˜ïžþŒ¬ïäÝ „ÂïÜþä×
\øïµÓ <ˆðÑ›<”ð‚ø ðúü¨ð]Z Note that normally you wouldn't implement timeouts like this and instead use [`Timeout`].ÁŠñúü’ñ" [`call`]: crate::Service::callÁü¹ñ(% [`Timeout`]: crate::timeout::TimeoutÁTéññ¢¶ï˜˜¸œ¿/œ±q•}j5‰ñ¢¶ïÊ æ †&ç  è   é ç è æ é Ê
¨ ôñÙå÷ñÍì 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Á,õýñ¢•/¿/‰ j<a6ºÍ‚á áî Ê Ê “º ,ÍþÌìñ¢$Õþñ¢<ÜþÌì¯Û
$ûþ¯Û
<‚ÿ
ê ñ¢ºÍ$ûýüú‰«üºÿ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Á\ý‰ñ¢öö÷‰5ûˆê ý„æ(_¶ºÍ‚á áî Ê Ê “º ,èŠØñ¢,àŠç
$ðŠŸç
<÷Š«ç
$–‹½ç
<
ë ñ¢ºÍ$‰ŠüØ‹[¥í £î î í Îì‚Å Ý‹èÄ<è‹×Ðü”Œ‚Å "ü¿‘?ü¸Œ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ÙÜþ¹º—†»ˆ¼½°†¾ˆoà‹!j[ëÜþ˜ÿð ð ÍìÜþ Ó‘
ï Üþß,Ö‘|Ý>ü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.Á úÜ“ ˜þ­þóÊ«¬ßñ n£3'ÖØ©qƒû
¿/'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ÙóÊ«¬ßñ n£3'ÖØ©qƒû
¿/'Ÿ 'È­ù—¹º—†»ˆ¼½°†¾ˆoà‹!j[ëóʘÿÜþü ¥

ü ˆ· Ý&
ÜþóÊ$é&ß,÷& "üï)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ö)­þÔÆ«¬ßñ n£3'ÖØ©qƒû
¿/'Ÿ 'È­ù—ÕØ±'äƒ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Á»ïŒß@ÌÙ@,þ@­þéÄ«¬ßñ n£3'ÖØ©qƒû
¿/'Ÿ 'È­ù—Õ Õ îo× ¬eXbiýúiÊéÄÜþü ¡

ü ÍìéÄ „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­þô«¬ßñ n£3'ÖØ©qƒû
¿/'Ÿ 'È­ù—ÜËÜþü ü
Üþ$¨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Á»Ü#„Ð^ÄÊ^\î^­þÔÆ«¬ßñ n£3'ÖØ©qƒû
¿/'Ÿ 'È­ù—æçÜþü ˆ
™G
£GŠ
ˆ

Š
ü ®Ô ú^íý^ í_Äí|ú_ìì‡`½æ,Œ`
ÜþÔÆ”çýì$Ž_± œ_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­þÔÆ«¬ßñ n£3'ÖØ©qƒû
¿/'Ÿ 'È­ù—ëêÜþü Œ
Œ
ü ®Ô ý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­þÔÆ«¬ßñ n£3'ÖØ©qƒû
¿/'Ÿ 'È­ù—þåÜþü Ž
Ž
ü ®Ô ¢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­þÔÆ«¬ßñ n£3'ÖØ©qƒû
¿/'Ÿ 'È­ù—ŒðÜþü 

ü ®Ô Ý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­þÔÆ«¬ßñ n£3'ÖØ©qƒû
¿/'Ÿ 'È­ù—ýûÜþü 

ü ®Ô Ö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ý{­þÔÆ«¬ßñ n£3'ÖØ©qƒû
¿/'Ÿ 'È­ù—žÐÜþü 

ü ®Ô †|
ÜþÔÆ$‰|± | "ü’\ü’}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™­þÔÆ«¬ßñ n£3'ÖØ©qƒû
¿/'Ÿ 'È­ù—ðíÜþü 

ü ®Ô ¤
ÜþÔÆ± ­#%äë‚ü´‚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Å…
˜
Üþ’Ä$Ìb<–…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Á»Ü#„ÃĽ­þÔÆÜþ°°ø¥²±¹h¯å½•S×ZÔÆü 

ü ®Ô ìÜþ¶Ø üž‘ 
š
ÜþÔÆ± õ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()Á»Ü#„Ÿ¹Ä™¹,½¹­þ«¬ßñ n£3'ÖØ©qƒû
¿/'Ÿ 'È­ù—ÕØ±'äƒ5ظ³öÌ •/¿/‰ j<a6¨ãöÌ ¨ã& öÌ ¨ã&
Üþü ¤¥
£¦
¦
¥
ü Üõ ù®¾ ƹ³Í 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ÁÔÚȆï
»Ü#„ÿÈÄùÈ\É­þ«¬ßñ n£3'ÖØ©qƒû
¿/'Ÿ 'È­ù—ÕØ±'äƒ5ظ³öÌ öö÷‰5ûˆê ý„æ(_¶¨ã‚€  Üþü ¤¨
£©
¨
©
ü Üõ ©É®¾ ¬É³Í 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ÁüïØ&ôä
»Ü#„ ÙÄšÙ„¾Ù­þ«¬ßñ n£3'ÖØ©qƒû
¿/'Ÿ 'È­ù—ää»,éó&ÛRì<>4ãN’Ĩむ  ˜ÿü ¤«
£¬
«
¬
ü Üõ ÏÙ®¾ ÒÙ³Í 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+˜þ,ö>º
”aDj+ '·
âÂ,t+¸
ÕØ<{+¹
\\+46')+ü†"+ Utilities for combining layersÁ©+úü­.++ [`Identity`]: crate::layer::util::IdentityÁÜÜ+˜þüø(+% [`Stack`]: crate::layer::util::StackÁ+¢þ+¼
ƒû
+½
+&(TÞ??¡ôœ@R¡”ÏAi¡´ûA{¡ŒÊCü¢C'$ Alias for a type-erased error type.ÁDÓC×·üý
1ü¸
,) A maker type for [`ExponentialBackoff`].Á¼ˆ £Æ
Æ
ߪ ö½Žž°W"ʼnÇ
È
É
Ê
$   ­Àœþ þ Å
Å
ôœà à Å
Å
ô

Å
Å
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ܾb$TU56&Ó
Ô
Õ
Ö
×
& ­Àœ¢¢Ñ
Ñ
ôœ»»Ñ
Ñ
ôÑ
Ñ
åÑ
Ñ
ľÑ
Ñ
(àZ£Ù
Ù
ߪ»Í£ ܾÚ
ÀcÚ
Õ×MO§¨© §ܾ ¨ c cˆ¢cµ
 `£c…µ `àB¤GS
©¬¶Ø
àØ
Ú
ľö±ü(ç[£Ü
Ü
ߪ¹™¯ܾÝ
ÙÝ
Ô×PRª ªܾܾÛ
çÛ
Ý
ľ¢hìÜ- Backoff validation error.Át.ºÁ³ÒÇVÏZß
à
 ºÁh›8¯° ºÁÞ
Þ
ß
d¥.Þ
Þ
¯° (/ƒ.hºÁâ
Àcâ
"$«¬­ «ºÁ ¬ c cˆ¢cµ
 `£c…µ `àB¤GS
­¬¶á
/ƒ.á
â
Ʊ̌º

)ˆÂ)T]lTEòä
å

)ã
ã
  )ã
ã
­e­eÒÔ®eÀÜctüõ¿Þpº8(2²
jˆÂç
Àcç
"$®¯° ®ˆÂ ¯ c cˆ¢cµ
 `£c…µ `àB¤GS
°¬¶æ

æ
ç
ƱÌùG•º´üÔ3IGº0 The [`Future`] returned by a [`Retry`] service.Áwt¬¡é
¤ê
£ë
ê
ë
é
Ëõ »Üõ ¾íõþõ™Eó§®ö Éä܌̨ýì
í
î
CEHJMOáG“»Nè
è
‘÷Nè
è
ÛÇ7,ŽNè
è
¦ © ƒmª ØN« ™m¬ ¨mN­ ® ·mrÉœÆøÙ‚ÊÜ÷ŒÄ˜ÄŒöšö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¡ö
¤÷
£ø