From c4ec00dc97a001640fa12df5b89dd7924ab17378 Mon Sep 17 00:00:00 2001 From: Daniel Vigovszky Date: Thu, 26 Sep 2024 11:59:03 +0200 Subject: [PATCH] Support calling ephemeral workers via RPC (#976) --- .../src/durable_host/wasm_rpc/mod.rs | 31 +- .../src/services/rpc.rs | 39 +- .../tests/common/mod.rs | 5 +- golem-worker-executor-base/tests/rust_rpc.rs | 67 +- golem-worker-executor/src/lib.rs | 5 +- test-components/caller_composed.wasm | Bin 213818 -> 300583 bytes test-components/counters.wasm | Bin 89735 -> 89386 bytes test-components/ephemeral.wasm | Bin 0 -> 66908 bytes test-components/rpc/Cargo.lock | 142 +- test-components/rpc/Cargo.toml | 6 +- test-components/rpc/build-debug.sh | 10 +- test-components/rpc/build.sh | 10 +- test-components/rpc/caller/Cargo.toml | 2 + test-components/rpc/caller/src/bindings.rs | 632 ++- test-components/rpc/caller/src/lib.rs | 20 + test-components/rpc/caller/wit/caller.wit | 4 + .../caller/wit/deps/ephemeral-stub/stub.wit | 27 + .../wit/deps/rpc_ephemeral/ephemeral.wit | 10 + test-components/rpc/ephemeral-stub/Cargo.toml | 39 + .../rpc/ephemeral-stub/src/bindings.rs | 3662 +++++++++++++++++ test-components/rpc/ephemeral-stub/src/lib.rs | 143 + .../rpc/ephemeral-stub/wit/_stub.wit | 27 + .../rpc/ephemeral-stub/wit/deps/io/poll.wit | 41 + .../wit/deps/rpc_ephemeral/ephemeral.wit | 10 + .../wit/deps/wasm-rpc/wasm-rpc.wit | 65 + test-components/rpc/ephemeral/Cargo.toml | 21 + test-components/rpc/ephemeral/src/bindings.rs | 158 + test-components/rpc/ephemeral/src/lib.rs | 17 + .../rpc/ephemeral/wit/ephemeral.wit | 10 + test-components/rpc/stubgen.sh | 6 + 30 files changed, 5107 insertions(+), 102 deletions(-) create mode 100644 test-components/ephemeral.wasm create mode 100644 test-components/rpc/caller/wit/deps/ephemeral-stub/stub.wit create mode 100644 test-components/rpc/caller/wit/deps/rpc_ephemeral/ephemeral.wit create mode 100644 test-components/rpc/ephemeral-stub/Cargo.toml create mode 100644 test-components/rpc/ephemeral-stub/src/bindings.rs create mode 100644 test-components/rpc/ephemeral-stub/src/lib.rs create mode 100644 test-components/rpc/ephemeral-stub/wit/_stub.wit create mode 100644 test-components/rpc/ephemeral-stub/wit/deps/io/poll.wit create mode 100644 test-components/rpc/ephemeral-stub/wit/deps/rpc_ephemeral/ephemeral.wit create mode 100644 test-components/rpc/ephemeral-stub/wit/deps/wasm-rpc/wasm-rpc.wit create mode 100644 test-components/rpc/ephemeral/Cargo.toml create mode 100644 test-components/rpc/ephemeral/src/bindings.rs create mode 100644 test-components/rpc/ephemeral/src/lib.rs create mode 100644 test-components/rpc/ephemeral/wit/ephemeral.wit diff --git a/golem-worker-executor-base/src/durable_host/wasm_rpc/mod.rs b/golem-worker-executor-base/src/durable_host/wasm_rpc/mod.rs index d7e27faa9..d0b4eff5e 100644 --- a/golem-worker-executor-base/src/durable_host/wasm_rpc/mod.rs +++ b/golem-worker-executor-base/src/durable_host/wasm_rpc/mod.rs @@ -50,9 +50,9 @@ impl HostWasmRpc for DurableWorkerCtx { match location.parse_as_golem_urn() { Some((remote_worker_id, None)) => { - let remote_worker_id = remote_worker_id - .try_into_worker_id() - .ok_or(anyhow!("Must specify a worker name"))?; // TODO: this should not be a requirement here + let remote_worker_id = + generate_unique_local_worker_id(self, remote_worker_id).await?; + let remote_worker_id = OwnedWorkerId::new(&self.owned_worker_id.account_id, &remote_worker_id); let demand = self.rpc().create_demand(&remote_worker_id).await; @@ -563,6 +563,31 @@ impl HostFutureInvokeResult for DurableWorkerCtx { #[async_trait] impl golem_wasm_rpc::Host for DurableWorkerCtx {} +async fn generate_unique_local_worker_id( + ctx: &mut DurableWorkerCtx, + remote_worker_id: TargetWorkerId, +) -> Result { + match remote_worker_id.clone().try_into_worker_id() { + Some(worker_id) => Ok(worker_id), + None => { + let worker_id = Durability::::wrap( + ctx, + WrappedFunctionType::ReadLocal, + "golem::rpc::wasm-rpc::generate_unique_local_worker_id", + |ctx| { + Box::pin(async move { + ctx.rpc() + .generate_unique_local_worker_id(remote_worker_id) + .await + }) + }, + ) + .await?; + Ok(worker_id) + } + } +} + pub struct WasmRpcEntryPayload { #[allow(dead_code)] demand: Box, diff --git a/golem-worker-executor-base/src/services/rpc.rs b/golem-worker-executor-base/src/services/rpc.rs index eca3c535a..0fceabfc8 100644 --- a/golem-worker-executor-base/src/services/rpc.rs +++ b/golem-worker-executor-base/src/services/rpc.rs @@ -22,10 +22,11 @@ use golem_wasm_rpc::WitValue; use tokio::runtime::Handle; use tracing::debug; -use golem_common::model::{IdempotencyKey, OwnedWorkerId, WorkerId}; +use golem_common::model::{IdempotencyKey, OwnedWorkerId, TargetWorkerId, WorkerId}; use crate::error::GolemError; use crate::services::events::Events; +use crate::services::shard::ShardService; use crate::services::worker_proxy::{WorkerProxy, WorkerProxyError}; use crate::services::{ active_workers, blob_store, component, golem_config, key_value, oplog, promise, scheduler, @@ -64,6 +65,11 @@ pub trait Rpc { self_args: &[String], self_env: &[(String, String)], ) -> Result<(), RpcError>; + + async fn generate_unique_local_worker_id( + &self, + target_worker_id: TargetWorkerId, + ) -> Result; } #[derive(Debug, Clone, PartialEq, Eq, Encode, Decode)] @@ -143,11 +149,18 @@ pub trait RpcDemand: Send + Sync {} pub struct RemoteInvocationRpc { worker_proxy: Arc, + shard_service: Arc, } impl RemoteInvocationRpc { - pub fn new(worker_proxy: Arc) -> Self { - Self { worker_proxy } + pub fn new( + worker_proxy: Arc, + shard_service: Arc, + ) -> Self { + Self { + worker_proxy, + shard_service, + } } } @@ -225,6 +238,17 @@ impl Rpc for RemoteInvocationRpc { ) .await?) } + + async fn generate_unique_local_worker_id( + &self, + target_worker_id: TargetWorkerId, + ) -> Result { + let current_assignment = self.shard_service.current_assignment()?; + Ok(target_worker_id.into_worker_id( + ¤t_assignment.shard_ids, + current_assignment.number_of_shards, + )) + } } pub struct DirectWorkerInvocationRpc { @@ -571,6 +595,15 @@ impl Rpc for DirectWorkerInvocationRpc { .await } } + + async fn generate_unique_local_worker_id( + &self, + target_worker_id: TargetWorkerId, + ) -> Result { + self.remote_rpc + .generate_unique_local_worker_id(target_worker_id) + .await + } } impl RpcDemand for () {} diff --git a/golem-worker-executor-base/tests/common/mod.rs b/golem-worker-executor-base/tests/common/mod.rs index e7f9b58a1..02ea34bda 100644 --- a/golem-worker-executor-base/tests/common/mod.rs +++ b/golem-worker-executor-base/tests/common/mod.rs @@ -764,7 +764,10 @@ impl Bootstrap for ServerBootstrap { events: Arc, ) -> anyhow::Result> { let rpc = Arc::new(DirectWorkerInvocationRpc::new( - Arc::new(RemoteInvocationRpc::new(worker_proxy.clone())), + Arc::new(RemoteInvocationRpc::new( + worker_proxy.clone(), + shard_service.clone(), + )), active_workers.clone(), engine.clone(), linker.clone(), diff --git a/golem-worker-executor-base/tests/rust_rpc.rs b/golem-worker-executor-base/tests/rust_rpc.rs index 996a1f306..702b631c0 100644 --- a/golem-worker-executor-base/tests/rust_rpc.rs +++ b/golem-worker-executor-base/tests/rust_rpc.rs @@ -13,12 +13,13 @@ // limitations under the License. use crate::common; +use crate::common::{start, TestContext}; use assert2::check; use golem_test_framework::dsl::{worker_error_message, TestDslUnsafe}; use golem_wasm_rpc::Value; use std::collections::HashMap; use std::time::SystemTime; -use tracing::debug; +use tracing::{debug, info}; #[tokio::test] #[tracing::instrument] @@ -625,3 +626,67 @@ async fn error_message_non_existing_target_component() { check!(worker_error_message(&create_auction_result.err().unwrap()) .contains("Could not find any component with the given id")); } + +#[tokio::test] +#[tracing::instrument] +async fn ephemeral_worker_invocation_via_rpc1() { + let context = TestContext::new(); + let executor = start(&context).await.unwrap(); + + let ephemeral_component_id = executor.store_ephemeral_component("ephemeral").await; + let caller_component_id = executor.store_component("caller_composed").await; + + let mut env = HashMap::new(); + env.insert( + "EPHEMERAL_COMPONENT_ID".to_string(), + ephemeral_component_id.to_string(), + ); + let caller_worker_id = executor + .start_worker_with(&caller_component_id, "rpc-ephemeral-1", vec![], env) + .await; + + let result = executor + .invoke_and_await(&caller_worker_id, "ephemeral-test1", vec![]) + .await + .unwrap(); + + drop(executor); + + info!("result is: {result:?}"); + + match result.into_iter().next() { + Some(Value::List(items)) => { + let pairs = items + .into_iter() + .filter_map(|item| match item { + Value::Tuple(values) if values.len() == 2 => { + let mut iter = values.into_iter(); + let key = iter.next(); + let value = iter.next(); + match (key, value) { + (Some(Value::String(key)), Some(Value::String(value))) => { + Some((key, value)) + } + _ => None, + } + } + _ => None, + }) + .collect::>(); + + check!(pairs.len() == 3); + let name1 = &pairs[0].0; + let value1 = &pairs[0].1; + let name2 = &pairs[1].0; + let value2 = &pairs[1].1; + let name3 = &pairs[2].0; + let value3 = &pairs[2].1; + + check!(name1 == name2); + check!(name2 != name3); + check!(value1 != value2); + check!(value2 != value3); + } + _ => panic!("Unexpected result value"), + } +} diff --git a/golem-worker-executor/src/lib.rs b/golem-worker-executor/src/lib.rs index f8ef1db91..9ac1e0892 100644 --- a/golem-worker-executor/src/lib.rs +++ b/golem-worker-executor/src/lib.rs @@ -83,7 +83,10 @@ impl Bootstrap for ServerBootstrap { let additional_deps = AdditionalDeps {}; let rpc = Arc::new(DirectWorkerInvocationRpc::new( - Arc::new(RemoteInvocationRpc::new(worker_proxy.clone())), + Arc::new(RemoteInvocationRpc::new( + worker_proxy.clone(), + shard_service.clone(), + )), active_workers.clone(), engine.clone(), linker.clone(), diff --git a/test-components/caller_composed.wasm b/test-components/caller_composed.wasm index 92069a780636e322d833f198eaf32eed3a7630c3..ed5f61f9f1e7b2b781ea6333c49ede6316059d08 100644 GIT binary patch delta 71159 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 Lc=gpCmIWU%tIg@|s6Xp){X{1ztG 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 z zOeeO*@e^g9#7|WwMi<}!f@uT;Sm4s9S|DCs%zKe3ksyF17ELx`R(V`aAVX3l$!Gup z=!lLy1t0~!P5=ThU#z&FPf2rl9@BhQq>>@1IHvJv>+6jaQ~=Pg!|{R z&}|ms{(*&r`**q)4O-4CLUH1!x(48XSs{`cd_bgL$B!&m_LZRj>gA0nMt>0WA1(y_ zw_QR1?UK-chjvKlKlnfd{r8rF{(DP7|E;e@6=8L(MIH_c{fXqQ9{NviQdkOllB;bY zEIY?T|HV>ZVB(>J1pSw$;^LtH-Vr^Y;AiH&ONG~?_*GNw3dQeziQ<>Bj}pl95NK19 zgtI#=_C3K1u2xeYS~EnK8ljz%Oa$w0|ox>q26GC^z~)&hv1lMtgE z*j-&KLHzbp2Hx8w5Whbv5I;O25Wi0d#IKi!eXQ{NI(O9wy6qeLG2>X$) zhpA~)D*bDZXI$OJu&jaz6S`80Sde41%_Ph-Z8Xy5;W`#S7xe5%&Q(Db8%41M@Z^T) zi#@rxAzO-a2{+@J0mO^%1(15Wd{7 z4yj4=e{C6W9pZ^8*JQ}MY2mKYF0N*!nK){+t&);wKyc|4^ z&p#63_y)Yz==s<3xehrNB|G_R<8B8sSZ_3VHhv^tZuoZG6BHbE*_1J3CQL*3PXops z0Cu!5kq5>6W_UKjd?WmuIdAg9Qs6O3@d87nd=UOw27a0NQAfM+B(K@{w&5QX^7h`X|HU<+euAFcqP!0%dE2YxbL9&5Daof;GFbNWz-&>LO9q&M3?K5=jV# zEsP(o7S_HU1h5tg0j%cSRQ-x`#LM>^e@$q?5&))CcM*V!PH>p56nS6sFWb=h{{?G_ Be`f#y diff --git a/test-components/counters.wasm b/test-components/counters.wasm index 53edced62d86600d01f63776cb7014eeacea9613..d58151ac5cd926f87eb0e9e27db3fb1dfb3ec7dc 100755 GIT binary patch delta 18126 zcmb_^349bq+ILs=%w#4rlXM_J$k{UqApv4I6K?1zm*8@Ep?C!ng$V?5sNf>iY_X$?r%}|UB3TQ)t!VOtA5{$znZSDuH(6% zr=F^K-(L6Tm)+YR^Cm1kscWS*Q<$b{?CzFgz4xxVY~K*3Z)Tgsl=#aB_|FaVRP9$Rx@!Mi=XqbzDc|t>>dB`>{v|mo7@VB#R-}0 zVNsCK55E-&Y52V_p*?=LB^2WKvxFsmAEnMgX1eltAj}7$#!by+rcPy8nz4?)htOuo zX-yt-2bdpSbYqFwnmCwm^oxHat_WJLNXY9qy{4|ia#tjN;^f39z zpk`?y7bcF2bka2Iwdj>W7T|u_i0?z{rX|(8TCF-*4~R5lVGJu_^9>N%is05Sd`7uQL@n+-RrfAFw2p3lUbf39>8PIHjFFcUX0WVv{P^6 z&C&-4fu>b29%|DjdYZ;ca0z7Umai|S#lpNq8$Vty3@l#ZO((`pM=!u>~0D*3N7>ixousE28rRxd8(L}8R?H#Iz z&^x3nTF3?y4C}3>m@Z-%E76L1cRawVSUu{UfY|;WOHxv=FW(Z9KDTpW;Nc2x6oDLAs)~A}a z|7lblRM8Pq(Gw3=Bx!bTJH8h2Jdn~=%sb;lUc`#+pdrsI>VWQG=+=_+Z0@{b-9Qhn zhOXQu*0vqSw`>!q+jeZXi3m>oBjMdnFRCirfiy98yXc#m+j{$2xuh3(U`Yd5c_Y?g zF+H{D5_<6a)c@iq){5VyJ#mQ+{nI~X+eAi2<|V$5%D9QIJSd*aD4@qD8QCxdEOQvW zjL7^=o2{hpVNG(3gjgq7@oh(D8e1n0Wlll&K3N&~y&-ENeqYZTF8tB^L6`w?GARHAoK!3Y;Cdsb z3lK6ZIbxh7Ah|eN(2lw5Tsf)CyL$tWvbJm#x$T~1N5s_5Lq%$CSCHhY+;(22SpGfY zp4@QGPnu5*hRrq}qj^(}rJ_E!Q2af&6Wc1x_GuNS*YXYrknu2Az){l&nm$vD6lj{& zZ!j!aJebEKVGZO6=ziNynm$X9STn1_n(0%V^HrdZzGnQev@lE`DA#;0mzdQ)MJK-Q zYhRZUCj|fo)nXwR*#elT5y3cH;vUIMYo)votOrGUyWf@=|l{UO+4r6laa1 zZ%H&80 zHTXyP0Km`7VB+CW4Mb)vcE-NL1@t|ZR49fcb zZ_%5Yl*>aDbRYCY`UwD%D1$w@%1j8|+>f_mg^e z<|4fVZJqg!BS4CZ0oiH4Ub#|~a=pL#Xorh+E9F<})STvW*+L6*nYye$rO9UP1i z1R-1eh1u=ipqGTkYsOgDnqMTW`w|q zY1U5R>Cv8s7WN=#F}%kFMWGyFpgFSKxDVQWVdB#l!7m?+e|7i?Di32M|#f!MPd*Pc7EC0;<}zWw?06A zM)P0CSkw+x!9T7DhjokyrZOV=oT3@LV^*5F;hpti=?FbQ^%M%wopz&+h@<&$7PD)U zFDK8Eg3yUIn@&2HCetx;ljMmIyukG|OvjAxMVnqj*fMczujknc(V}-4zdd^2hTo;V zJFpdX`+9HJJDpx92@!xzz&u{q8oMPKEr8HK3uaEoW0P3bKb3tfcK090&WYp!gV|y+ zZa@_~S9fT@zc@Q4zAnoY%WGPR^Cbyn8c$hhJh+h5mu&|Dt(*?dfAeJs`txr#r&O?)$?FZ+|| zG_;u2i?X5R)O2uYJAQJ$I6HI(ya7lbR}qf45aobLW*ppr$wP4gw_n^nY@@jB$_{$K zj2Gjs+{}&(&+v!wyL5OjOm=wqW&FT~B_lG~c9At=4%;b8yId(wj|k`y#)LUA`C1}e z6N=&u)U-}-l%xhlOIWd_=v-p>))I38zIr2D5ryV~>N+A-;-yZU=T5Y`ukNyuqZszD z(NSaiZd!q?n@8m8XKVndHDd*uvQ#u^E#t3yvD@$XYMV(IeQFx+$Xv zvE+p`kMV+%JA6Fm1`FOCGurdb+@8aOTqIvTZ5W~i@aE+2(9`N+)7%2sZ?Q}@x;%b6=+`i6<=*Iv{12+e35u-6Vi zG*rt5@z-m|v;AV|b$z^lP+wmY4_@~Gq^(OkOvx!$->@> zkO%D=*c1u-)V_CwBzF|XmI#dT7=k`N>9j@S*w)d8mRWG)O$Xg;4}#h`g8;+@U1na; z1$_N28W0Bnnh^IBjEEcPq0ni9GC1NPcv$X`pj%e3Ept4GDbb;o!py?f9r%m)$7V%o zF9|v^+JF`D9K>>xubSnlHT43GTLY@9L$n^VrV;r_(gL;BYWL^#(y13dw5Ua>bw;bI z4(q7w*9H?Dk_mERkUU1lz~UhUDOSuF7VLz*Jghl&cMVGm$w&&;Cyzh^#u^Jy&-oyVocffR_84v8`2ma&84 zZ{yxh+kZbqP=>~{A_=<2c#t;#?ud12oj80`F302CO`YhGd-FPa9KNZQ`0VC@Q{}g` zcB+N9?9KdH)7DmG-#Us%M~FLb4U=nqcVe1k&7g*z*}hvJY_n(spdwq`bQ}5T1~K8b zUMwb7-FCaGG*LhT* z)zpP)InXy~Yr|$wiHk)kn%M1G(HQLjLtKZrl|)C={sI*?6YNDSBtM3+e=_;#usf|- zHJC2=FvQ^G^i3Uc5={X{pz4*80lg2xz67h1(ZlwEY^P?$*5Sj2ROk`0j#H~+5-l$v z69lp5H;$?&R>1@^yMsw6nh{INIw5p6B>k`k5pOMjQK2nTg7-!lG!4(dk5Ej3k@Ex4z zw6eB|F`0H@D(&L`-0_>Od(Z%|>P12&MB6h80>qkIO!A{%@}qV`53%j?q-;R?zwJ+T z|JO`>Q6lX8ITGUSJDmG0jX77m;le*t1t(eL4cyc&i zx;6?8VG`r9;lkc5V8+2CYM~$>s1GCwHeKNavUD2lNHsG7CO?E-8QHi{A`ML_&=_o1 z$R#Qxt)s5$P$D|Pz{-8Bi)#R&*VxtL^QzEU39W94g zV(9ESF5@7PL4wE&G!y0!Zb0}d+C&4xq(=)V;Hy*1>;z)-R2WTjlaUsr}cY>D&FaRAs1Q7Pt3Q_YG>qCJAtjHDW(H)O-4~i?M z+?1gcLb~$pKDi;6(LM*^jQ7OeDSiA{)jIj01Y6uzo8p+9Po}j;{OGRgn)9cp@X>-I zTMrRl#_#FZIxSm$SjiQ!ekaCNjpU!t7h9^b_^2Z)$REAPl=(`J==dF zLtSQi90rmTWX1`a%MQg{)|d0e#_DbeSU;*BewqA4+{xpet&?&%f}K3xy@?cnaL9Qi zTYH`p*VN>StjeoetOv`GlmWM;Pw^UC#H`9xq?(pj_Rh4EAK`Z zM?m!eL^6MkX?09XYm$L;cGQV}Yv=P~z@7OWcM}@q+GJ{)63@sJucrjQOP!< zu&8+C&g`g6oC9)1YHC9UPl_dF#?IswVRwZUSA`}wQgxn+P#mfrWj{O+Z@`UU)q_Wz z3}AhHARmaJ2sx#A2)zZ%fUF;0)nSm=jE5G>9tc;dN7U&u>*6j5SDQ|PfL5L;HJN1Q zg*_0@Ht+G<3wt2Iy|72rW8HIMmwTFb@mMo}ViRm;H1t3O&w$=^G)VhLA8@vXFq9|; z(}j~HSb(^&+w@+Au5RiIdx$U)`+}K}wkWdP)&q}jI;_=L=l|!&yCX!cnktZRI>{n> zUGNcCl+E5g1aP9ayk=@$K_hoeY8f|*EMd#&^5^{Q~d@)G{Y z-;*E*thB*Fm;H@&FchS?2B$jdAuMP2@*v%Rg7&J^qlC{31qn8a;jj!6vc^-&D1fX` z3z%>^K`C*Kf%%OR2G|IJz#b6LCi%#qn-H|VBV%AZ4&6b(2Jm%j(L!o@+HL`vtd+85 zgWaN;K}1mjI87i6kp}LdiBw0MUdhPIqm%t&~CP2 zwxKftfE`6TQ2>6?IzT4auvZ4ckPg}#CXnYvI6<0++_WUOwPh3f%CkX=xN%Nu?W7hX z`n&>Ms+i=a8>175=SVG>2{z}jgCVBHVFv0+{~_?h>?r9GV;)UHJ6u3PyrF7iC@NXz zHa!%Ig2)$yqEXOYGM*SsJ0B7P#pnh;jfMn(W#Hkoxg}T$mW-NgQbS4NOb=-QmZ*>n zgu6!MNkEzjM9^f&oy_5Y6O!Huir)BM<{~L|kwuY`Aj4*mFJH$=W+Ow~#E=Aa9Gz-X z#w`KLCWT2_EaF-yzCqA|<)s8Y?$--CJd`cyasO|EJ{rf8(F-Kg7IYY0I(R0o5Pg)K zQaA!qUMOCKK4^@-I^rLg0!daPS(r=O(rC~YT(D(X`DXZ0)mYeEn8{vA0z%nw%nHd> z0&9C8F?yycYG!U_Cq(GpboP|!fA6ix>OOhzSlaK%`vTskLY7EcAx~%!5J4?3*zW{p zjT4o#uI2}x5=Unhv#&%jI@#Hix{QbG=E7s4b$zU%701LPb#`{9I&gM&J}wP*zz5AG z?b7^Th|#kzi_+%v4EfFk7t?&4&R3Cx@X81E?5!oxBVXIL0iBAOJOIkqo{?`lVv!(& zbp-v$U}9qpLPCof+_|(t$Tg5<#iBU4L+(Qvba+-6bTnz=-?Oiet|0@56BjJ5hdAXY zz(q$>VP4d^DrH{ahOwt0n+$F{N2H)AZ;XjRR)#d5jP_vmC_3WyO$=;gXo5(Bi{oAi z%$06ExuZVT1}bE%B^U-_WgPBfyG&!msW};~oQ)<$qIBKDLDf?SERlU z$kGu|dP~&J%ZsY9{KB!=w}7b9(!hKGWwI;N5sX8O?A${`6GR!Q7@LUTd_bBO@R6*z zM+We+MI#+jc?*k47Qj?^Qa}yOSVV{tS3xvPhG5Dsrq3ViNFj!a59g=zHFe_L{4n29 zC(;)TMiOAcf^K}vPO)r(#oiYmF1X(5Px9I4zPb@VDEhsIt3Xa>-)Ovp0%`>)cc}i8 z5|qF-1{66+#~>*@|>1l)kfw*GA!=&Zua2 zn(3yiEiRX)UCVB!8%PmfMQ4s6`)X(%e%vV`6;3x(a|(KMg=0pDfRg0Let$1#ppQVs*KR zhJ8f{#s`8kGRYnW?l|WnYXCAP&7mcwAJFom>bi`5VB4SyjR=|GFC-yJo&?Z%U=6jT z2gDm$%@JsWY?)LaN+2i#tf5WL1q6^Y*aW~CHf^lNno+m)zfJ+=iGCRcq9BdDFw~p^ zeuo6WRY|3k9w3+(Q8Yh+4I@T>&Eq@l5=yG?|tm+H{W#}FrMw|nO29;02MmVm#XL61R{(Nwbs!%|n5ipj?BXkG!~qf;GTZWsnvIjn zZ&|(&xAyEL_*_wvQV1q>ka0nR&NTQ`DRi{ugY85>Clg)3pIhrU$Z_y11=_cy&%hCj z^j0s5uq2W=3xzbA@W!J|m?B$8poF;=}2${2NSDwKVt ztil*jv_sb~NOYmuc!5PI;-tq|?ixIrDl0VDu@R3n;)8N*hnBlRYv=IN2j} zv_#pRsI*59GRN{z`0^mdyT8l=0jY~nk{+))MsyGuRul)zd z1D_*L2Lbk|rh@d7a`f|H+t*1DyeUC~E&)`jShi-G4VtWOltS6$?uo9FLh@*U?OCC& zMasvjS)?%H_c8G&tE32yU!C3Xevt?5SdUg1kZ=r ztdokBv|$CfI76^tQ=Lf#Te757o;I)->)Njve!C0RCO{Oj3I-Qket5`f!b zEP~qxjIb`QuQo$S#;h}H{jeUp(ZS??pf6TOf zJtRX8RZFL$ZpbmxN=l+55t@%c)vYecin~OvSS?Z~*xZ8y#5EVNEnufk9k!`WKl~m6 z0Aecs9l4NySPqUM2ck&lLEvS;;pGP~vSQSI$r9(lPvT68R~&UV#~DpOjWf2-xNFyd zb4sKUXAEeDFirsJ`i=x&EPXT)_s4z|saatN6S;QVv*Q>O?~UGHeEMiVY^>8C`!ioS zd&$zfQJ=mv)AfHCbBq4j=@;LW!(DJd#c;8Z9+VbD1S0P;QCi6>Ytb4j>n;j8VKlI} zklPFy1VA;KTtcO=01UG)pwdK5E}#x1A@hol3bJ~_o03K-y=o9Me+yC`B@fOHy`|I~ zFOxU@4+n)2giFn~!dG*MtGI97=|*h%ZvZsQNMW_hS>aAH(XYT_pjzYKp413hM*3 zV=Nu}siq=+LM`RIZkPKNB+iTYepRJpdc9q3vOq-5MwAM#*M*?}7TBcD|kvv1Q4(_o4!1g+LtXK%r_krCzcmFpCLW?oVLQG&;3@6Oi;r@xT>4ScODcgR)pxw-W7fG zciJlg%}rDd1mU*w_8qY6{r5ckW6EG)4&YG@mR?m)MG{X16$e|;9ujcrdn6jo{V&lvN`C;+Wnl!dr z99@%x-yhcW1TLcc+HAaxU7La5yVmx|x0kAR^atk^|8}nP`wY2Q2y`%3iz92h3_47p zBjrnfk0I-TO=gCU(1)vtVkB4c4MbM|5iCmi<=yZT;>vYhqEg2i!qAbFK9h`+?WmJ_ znn?3X{ZgMCEp4KUm|4=jQBlF`)4xC^FDHS60sa3~Np?z%d1^q`rBw?;wfmsh{!|~5 zt*@TSZr&9TI9dqM(Y0`WN`@o?&JvoE#3Z_h+>nB@_1%%0UA}%n^wP^VXta+!G_H-F zBBCI#4*udzk`jjzSilFJC{mvGlsd`#4x~KN9r{ckCDGi>OojsP$% z?m37^2a>TyN$=Iz62fz8{~$VM}+59qWja$9Hrge(Y=n#$^Lj{QSdBX^ddrw(E^FhQdRV6^%(e zr2rxB0TpfXB1=S}gruXY$`6UKWpEyi{fLWLp&1+EVZr1Q0CZ&C0ATZQ-A`fD&n*>P zjNZ{&wA{Jq5(pjIIkVUXiqIeJOQFUc>3OM2S7cjvWmJT2rBci^SF-LboELL-(W z&f@s)`y2EJL`F;HOG7S{-8kAdA=!D6?D}ny`SVLscC%k5+1>ndqqsr`Dq~)}v!I=`X+q zc^Zh>upP2@tmI9AlgoI7#)ol)*qE_-6E_yrswTCrpt?NIS1BFmgvxKdr5TBKPi09K zzAdJ`F=EUjnWa+sNm4a#Y?7;}QIBYGTE^9}7=SdHbd%P8@Lf7S>S5CGjUwSq ztD|a*Qk!MeCire+L`AXw&0O|e-N84{$Fr?<2j5%EqZD#BQ@c7fqZsa#dwD1@L!8Oiek!kA~LZ(@7?x7lORFjR(a@t$uv=Xvs71a#*w_;z2osf8~`jk5jMte-NL&pTWk7|9QU~e!CnSiQn1B zP_KL8SRxZAj(7K+WCl>vG?&Qupifc`}PJUo5$)qXP6 z>EGjR42`R*7QoYm(h?;ZrImQ^gRU*L(-@M5*GVX}KyKv`&+5|3JIc-S$})3OWm)-ja~j$S^8Vufk2?Am4jyye>e=M!9LarhSJt0@nE!MZKd)_@raoRvtr3pq_XV3hnWvsf)$6p9~3& z#hV{*6Y$K%^L{+Ncs_!sNA}wLNmi26s~)WcNU`|plkDIbyb<K_i?i5@@bo- z^f*Inht^b-B9!#H8$PXbxA-hzXnA-Yg+kBI0(F@um+EY;c;WM`q}_(0rJ(g%lme99 z;;)})6`w&XfnHdBXHD&d!t(O*y*f`QEA7&&s8_e1-EQwuRNA$uTk(YPW!*Y=D;{5V zdyif{dv@gvph9T;+IgQnmEoI-c}HOEa`E1&!YDD_ zkqv^sEeavtw4F$ljzTOWX>j^yp>CptQ0}ZLH>cii*3_2u?p-?(|0@bSC)`H~b$fEp<;uhKwv=##d=j#!%^^4RbDU}YSBxK^P zFFKY?o;1F?w0cG%;4G}E21hFIx~#eeUu#+_!FU?=tDC*|YVv-g81!XFwntQbIouaY zR(khc-5X!F)Pr51ZX}6)@nmB5m#xK*U-{Tr;r_aP(mb@0>NzSoR`mONc<3Xv5@Cth z^pE8K9NJz-Ax5kf&wPDru9;$J*Wt}+?Gy*~#rw3<%1IL{%FE2sTC;b&Fu%#chjr*| z3if47anm>H>>V-Vn~rV0ZPhX#U=Znk!@Jn~&DHS{d?m#RGm&~`$uM84A!pCTlSH@g zot2fPQ_9QwD@K{^+nY@njvs`6q;FT*{Z|42!eg8WeS3YcnP~kD-kOR{4&Lb>jUquN zU88@_I|0*Py!36>AX22uP)epw?^`yb(zGgP^e-JhwYqjv!LT zMmdL~w}RO~DM0CqawW>mD05L>K{EFAgi>MxO@sP3CTswZo zr1+?XwfSZfp(xMwgE+11NEF2 zCec(t&tyXB-Va|1iQ9y7u2VDjBA`Q1-GiQWnxK)+FH z?4q&490ppLSS34TWr>dnpu&)b6!BGRNb@QT#4wt)j#{Ezu&AjQRt+|@d6kiEbNPp? zuKYx^{3# zMs}1F>lFJyd<~c;vasS4+0g`tlEl2EF^28!uvD)D{-WKZTD5+JpchI}gePi}qHrZ6 z4;XK=VlzADt4ZFm48rg|9yP)CB5uV1547w_KkOZD^w(~O`0_3CxtxbCFyPkizZ@8+*(~%sc}r>jwaUUs8(geHAkKr4tRd#LO&iasoR}$~ zTEc^pPlRVh(I|Glv*R6Oq~HxvQ?U!$O%4bv$~Ox#JAlbVK{ikh#0ic(UD}WNT1pDL zvB0`*AVwV9Ca>Jd5s#*6Z=moFh#)+v9Ta9TjqLnGj8)G({&W_Ww2(U2^PX*lh903W3N_YP}mI(%+WUZC8)56Bx5zoH;Xz6zYQC$ zg;!(IAg`thxn{VYGeMxgU19wpP~rtGwg*sp6#te5CF@y+Q= zy;Q0GjpwL-A*ud<_wFHoTr!3jytf%z%;}>N^b&==h5~>`=^5{WCv=2sK}lb zkD>(SgrWQ7!ajv8AUF3}JS-5>yx+SQoU*nm+X`6^>$hN}MQvq|TZUi*;-H$bP4&v$ zl8W|F!qXl~c-lgVc_ldml)E5%qTMHOUK2famWlo+8Cv4sH?(YRXz%WLr}ug73>L=0 zl?vV+CE9B$c;-1~2m8y6TPKq8i_&74UqRno*Zf}JCP$QwcWiOrHrZ76iL%8J^7rLs zyzwq+_4}-yAx1kxXdlqA)scZcrfb6uRT#Ybg8mzFq0QSUHjmTpV;hSqbt%;QUr(b+ za@R$%UKccf*P1DAICV&VcG0j%E3FgtIs3qf{);1iF(V#@rHE`qX7a86eaZFm0e^(+ zeSbiHu_gmD^|s3tTd#JzhOiyKDVEE=1AFB;YRcOz3JwA$Z$c0p<}`ocRDcC{3LWkg zd=r_{t~hR=B7|d{Ncez?FdXYCQcN(eh_@b+c4c{~8U)Qn3--Ax~g07`&LzN zwzuVfs+!HrRgWo@!sO%#iYZn-CSSQUtNVfFsw10M)3%Jr3tfm>C*t+F{PfZZY@-}| z*)XC$&H)$o80RLq;h26hz#D8o;X1oCZH1t-(p@UNX*v(aFYfJkQ4?6!by&#j<2_= zV~t5T@Dv=FMu3YSxoE}wkYQLMHi%e;nntr6HLlT2sQsP7HGPm#fdL&W8x>y6ZpVh4 zpH^-LKY$Q`hHc$L=%)?S@B|SRGMU6I77fl2?4i>Vq>E+0iIEWK_fH<2!JT4 zfeAv1;WqGc_Q(#3;eb|b8a1CUec+|_AOHNd7ZT%06N=41%||cpe(qOyzWv!B4K!T{ zKRUaB*9QII6qWBXo6aM2qT=m`BijtU*V1&=SO)F+?CNo2UVjj@lJ7$Rbi^C=lOhV6 zA|S75Rekz^2Pqn&^ADnkd_45_D9({bz_C<2MBX3{%4K6lv(}c@F+*AAE}CvVtK^Q* z1K`CzS$xeka@jSrZvflYd^J3dpU}t%57V(vtXxfeFA>Mp`v4P7_fx~qOzT$!#9<;6 z@2{igBJtdMdN*?M?glFC=GL!T29JAyd4hI$lzjKv@m)W^4;|J)2ZbRNY z59GG-7YF`B_r5Ma9Dg@^S~gr)%HEJ$t}8&!0nC7dr!x$Pm!~rcv4=Jcc#<)Ap^%a< zFv)*I>=oR$p-D7W4THz#VlfWmfX3-OfGTzp->8U3t>7be8@4ZwA2S{c)JA=1A5Fkx zK}tvb6tO7!DfspiuK@s4Fea!D$f-l_aE1ihhuncPv|N3Cmqgnn;KEZUEjnWo7P=h` zl=?8^P#;A#qH9}A8q0zyntEXC0J;(yjw$FF9>F1vX6h|{7!j%d%K$&HYK)1*m4L=& zuNx59kzIHpe58UZcp)^LQ;R`KBVKAy{-{1mq%tv2uZc5ML%nl2b4KaRkFPzIgf(6mx@S?pn*~VUV)%y0ABm#=^O6v z(k^5SA|FOwU&)O(&Vh6Gf9LyN6Z~tIOTLrir{KV2y&)g_&PG_CQ5}Hp zh^Lzd;}K$+7d~~Bj85pu@ftaygkHBz*g~)9gwC>jV%RNSJF$yfOip|$FUhU~BWZ6- z-IZ{da<{pe+!!H${@oZwYxazsh!?(KXxjn5~waSlg zzSTWja>PV8PwL0E%QcfSd2_SeHfcsz9iZ9FId_MGhV{^rWD=+IWs`60aCYxLd2({D z^iQemVw)3D-j>JMv_^vw&!H;N!SDP4!p=KtT{hb!H`bM9w!VO=6vtKYO&9?IeEOpNZQZJ_jg+OS;2Y6MiD)$) zh=}bnS>G>k@Oku#ub!7L)Z6lo**)3ka_j7i3YU<_6eLDvz1FLQhFGOqgIM2#z)k*R z_87iwg&aL6pD$e@XU`eO*Eh*m=JenXG|3O<4C-~~3IcLQ7>ym#`YXY5VmXgku|f`? z+aFu!?Q=)%~@VrPMV$VdZN4JZ|Vzhu>5Czcl_qe&zb6EuOU^H z5~hqfu&Xh!Jpn4ziq0-td^TP<+tko9$s~?eVRV7%7zAw)W|h7LBB$u)MlwR;?Wg6# z^NWkukSNtzTHhSd0Ye<1vzvS9`bC7N;m{>d&o7{CZF+)O5{9WDw4$S)NjYXD*(uOe ziCLT1#{Aeg(PGlcGa&qRu^{41RFS}CWFSs-3zNjb6!$J(n2LajA(`72cya`(uyZeN z>3B7)0-+@hOSt3Q=rd&qV$D=Yi=9w2WyGR0N4UXg%81*~96`}3$+c}nB2E18%ppHK zdq|pCc;<+OXN*8*YeBt^d41I335h1UwX-%ren_z3;=vUAXh(BH4eUH#cr17oU#!31 z_Fe@p`o)4cc#2~w0(Y^9%n_`9P1?J*MXx8m_ExR9wfC1 zpydR$xH2y6;;~94YG}$2raU=K=1jilejfn)p#42q5FwAg( zfVzbH0XsaDd@-aHj`|gSeodMWE6B?hc1vInP^iX&so`llDO^xdOVn|vtf_0m?3#$5 zkOboMmTBW>)a2lzL=1EDgQr1K6hH1s6x!Gqy=wnsMG45%Uu%acvUfxS;-FJuOI^F; zu7DWgx5Lme;7n059bjn7!kE92zN&3bsQXovky#*4=mVYDrIdK9qt-4LAr{&r0ViK+ zLo|&vK=B8>g~K?n{C)qv{OSHs%is6Emj5;Kp4-zBpa&du#7?(RBxxW^(GihF=3$W3 zz-95lV`K_0)nF9ZPl|#3uNoW+k_m7GBz73ClHx&v0;XaO%~bdVv?%VtDD4DwI1<5C z3>-TaC(Cza0!+?4n-C1-5IR`(borHuBOQ)=g!>6+<2%!CrvIErEw&EpfNu>+$ zO|&Wos(k<+f;It9%GLrN_)>WwSNzbHO+S1p?_2{^*L@U51+7PA-R+YQn!I`Yja|qj z!m&WANg(ExH!Ygr!_6IZTJBjiKJ!dAQyzE!Q!;IFCHq*`ES}{aC2@_^vUjn~(E8pT zZLPRyl4BADnfe<9oYqK1LmmU(_kFo0(Ko@X=|ZBJ4j$a7=^lI)WWc_`M*3DkcrvX=Xv9z~i!WAi##0w2y_e*6cF)=%1X&D$ zh@{GBmJ^rcd0H8+b88E_$Mxj}!VmWzk%A%IV$jlf)I~LkETBq>`6B;3X+EHS#+8|1 zlr&MT&TTb7(QS1RQX^zU&UJtr=1_{@J?(ssdrV3l%O$frxmQh1OZsBl5lIhDz(`AAAEGz`5=KE_V>a;Try_A$CON%0U0=7n)ASW-)(g`ND$B?IW zGZg|TBo{=Le}MQM`N3m^IW~0LAXD^3fqgL#s9=LM$ENhP0|9ia?*kCtLJo$tifD=< zi41N4Acb#gt~|YToU8YkDz94Bo$r4})-H?jH=mKKmkmP{|L(H>{Ph+YS}xcTdDZe8 z-0@@)PcCms{6q8W4SZB~?&XZq%@~5@FzJo{k78y|IyV@Qfv%E_ppWWa-2@5fg|EX9 zoPw#W6Szu-VVHtq4GE8l6Li~?LrZvQ0nnNs&a6Z$jrxW`8vXY= za_-&~7-9{pjrnvKP8wOn_mZK+D7>lAWtSL-Bv_R570K%~5>(-AQDvZ#fMqBU2dP5= z&?P|Kqo8uiI3jkXP^kg0gF3>VXZt96Uj%{s#41{N0SZTPtFNl~#bva0gwVHrrN)hP zPM&BTrMj!bnCeYb88h*QKc0aX)P5RXQ2Sc|;B#UP-B+o#0f9a%A{6#Lr#c7)91nnk zxS!yvqn^Tn&U)nl-j$*FjDR4jn13FT~6PA040sa)i zXz;S3ab}cZVK0JB*ov}9Eg#@#eM-bev9~FP6$u1mfT&^^x+{-CbcO@fk-x9lw9dRB z!KXGzH$}~ajlS%Zo04nj<2?$)Q=o{?TlQl`FO4;7w#z;Lc;We_rx%SwAdQwl&8~aD z-1_VLci#6Tu3lgXDoY~*2=M{NOPm9ONLm7d3Og$JXsm$5@CaU=Alg(ujBZG+<3w6p z6M08BcGQB{?AqqY)%IE8S!Ub~!3%t1}ptGS$bHAl@(D zrj0F{a8VksQ5p+QZYO{h912I5YEa1bOSM=4wS$IACM3yytxZw9BGn8tz;`e{$^(%a zLP=49%4wa(?KA0fxvPx{rLV4?;IvMJfCA`aISg9qqo4E7wtHpxJkkm`}7%ag}y5}!7o+kYQTcB`Nx&p-gRWMvXV*WPk zcP>3sOiyJv9n-sqDVoVt5l`F$2B8F>pq)b-(J3Yf`O{FfI_bWm|6J;^kDs4bd(gAMI|_ zBhJ{SwS)iPZ_|0?7u|rweP53cdGz^1zIk8PNS(1{*ls)`;NIxiU^<=aagI>2y4bI6 z2;T@&1Z#vc5!Id5D63cZ$d94D=JZSVKl0wn-#`B|d<{X@hd;jSp10om`!gT58glaL zf-cU5&O@Bjhwuf^N$iT{QmiQ$S*UIoRQ?JUq4Fe_PIsecuez)=_3@7mPBPVQE7BAm(z zL;;k^B|vJYCqVdQ{!EqtpYpg4TSHGUA}#3BW)p3R%=6Ml-?^aY9NLiBJ(spjq77eC zDMS=Gz@Cox=fkG$T!pyHsM(d>7RG3yv;{hH(b^$6%D=ewzxZcKxmn(ZN|$wc(T+r< z#>+i&cR~}6IiHintp6u_ug|4hijnIp*gZ12zA|x2$J7+3kP~ZG2Q!>2gi({I-SN&2?|c%bno6#)f*;U>sJM=bA%P2g06Ik#WT?rebyGsO z)r$Afj=A`7#TkZM4hM>wg^%P^z=ZBSocempmAcQ zDrl{v?}C!5erXJ0AJS@Kl^*BRHo3Fb=vk^6X?Q)h$?e@Jn;*>_+^DNgryY+0ILH1F z(zJ;ME{z#=F%Q16Xk&(~-q5YrenPc^f9g<&cI=5~9DXnEg8o4T7fj!D@pnxSM@tie(x#`xJY8Ft-3SfZ+Kt%v|cF6o{6+8hd9xl|1iD6)? zVhGG0ac4cbINm-XMQagw(JFh1pX$Q*U#oC9-mb!DDR3H~Xk}ivc60xHm9S_-aSg2z zqmWjwzfz9d9E-SP$W^VAOE!1L_lz4hUzGJQxpcb39)^!;f^>i*Jom`sn}=kyL!!2o zvgDB*_OKlBNFjb_KQai^$j2WkK;@T@&GN8nrWeSn?lQZW9kp|A^Fb$&8h}Xz{%1eZk$_`R_X&}wx@{-v&v@1`oGDQv>5xi4C;JAM(s*Vh@ zAd|S7!fvc^7Q551VW=g5=+Bx)6%QzRD)y0a$iF;S zG}sX_DK!2SLc44oJ4v10&N;FTIqLbl+Kdr&q2&+H4~PC0?`_w=kfVRs?Nx^G;yz`{aZd$B>rqdXcpJKVHmfGdEZMU%c3p zzlP>b1nh)80@l)k-y6ry*o&4kep-jr+SLTqe zJ@85lP5WMXlie@x``OKxDhbk|ClC*HFsvVw{;35hB@_xl7p(`W%?NchH29;`BNEU_ zYlH0lYM;&zP(MXnlnD;g1)q5R4HviTtuw&A2MUQ_v<-wYf=@>e$v?h2dfYLUxzZoi(7h42wy8z*&4n^A!d4p;*B4Mo zuiNxVFGPC)Vph>1jj(C@R=MPW=%d>b)F!NkjF9uaZRi2q@+CBrh+HwmdQ5(F09*GV zne|#vwyWjR*S=0;J6kSoeUvAf2orp!7V3*E0S#|kKE|8_vSJM~=%79rAALc;-#;AcgxONoH2hkcYV}{tg zk4oyA+uE+c-mJhX%%0F(!{>7H*U?;s3x!fh2NILO2L`YvIA=Asy!q?7to$woA#`#i zydxbzLx)FRj{ggVhM9A|XHT8`{W%TO>urPnETaQ{d&qh3^k+R}(>r7E`ze)Mir&p& zUFS`nGjnR~^lA3w2AhV{AH$O=2OOyk8r%XkhGENwBNulVhMI-i^>}CDJzMTSQZUqQ zUE}mN;vJ-3=S|S)Z+Mnva9uRQczf`4#?u8)mMl7YQRngnC!;kArhR9E0Bz%vo3WcoD1ZeIfJeGGZaZ~JsdsRF&}cwd1x zkum~r0)L}y`t9)OBGf{t{Rr=#c<;tLfcLX_`_!oLvHTA1s1s-n8BbHHw>R3GVHX|*w|LezQ;&IEOuSX3>`18x=*H0~* z0@9%o^ZVA%KZgEn^k0Xk6pvdcstCjS>C@*lfM*S0*USb`-$Bz?R{#C^4O7d?2lg9K zIcV^}%Knx8rcW;~A2eWc<<#=Q{rV3c&~MsBlLrN+4yYVhIc3UVdH4I#F(sIM6@V5( z_%(RbA2Ep@LgHHjZG-vG_j7}r0CP0vu9t;>E*sGmC0C1xL!>e!780V{o`*72M`>{C z_$b;)LrBo_i$CYeULRC;xU-{WRH9)9-UQ@jIq!pR@}UpKk z+5CoSip|sK`~V!rxK3J*J23{+&ZrMgsn^TEhke*AIpD)l!8b976uPNp<%gZjv_Evw zigU7y+??EF`Oh!U~WLw+OR*#3MeL~LqXi|17 zYS*LYwhr)XtCOccD)e5F4Wp7{PiM*gA7=xf(I5Bex*crJN^YOK5XaLKfVb8InZ;iYo*-}3XS($Wkg(oGvi zXS@kQ0p3JO4|(u!H;56aU5(l?z$c{cK^I9iRm!Bi^hf4J`qhgn_)~Rxblvf5 zsHC+!y<5pos%ll$&q^`Z(L6~RX_MrS;|@KoX%j^`#kv+yj$^CLW)@NCD^g6ANf|HN|=&zE>2oh_q3 zo?1N1@jQg*aXig;B%=C!hV|!EF3fUn67@7l=nl!F=6453X_ehTLH+yCw1E&ME&N)_>iE diff --git a/test-components/ephemeral.wasm b/test-components/ephemeral.wasm new file mode 100644 index 0000000000000000000000000000000000000000..469169168e2e494854ec8d9727a4b50a196fed7d GIT binary patch literal 66908 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 X^MH=`F->D}g{Q6f5Ka>L#@YV`fLkSP literal 0 HcmV?d00001 diff --git a/test-components/rpc/Cargo.lock b/test-components/rpc/Cargo.lock index 1cf0b9f36..d862db634 100644 --- a/test-components/rpc/Cargo.lock +++ b/test-components/rpc/Cargo.lock @@ -39,6 +39,38 @@ dependencies = [ "wit-bindgen-rt", ] +[[package]] +name = "camino" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror", +] + [[package]] name = "cfg-if" version = "1.0.0" @@ -69,6 +101,25 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b" +[[package]] +name = "ephemeral" +version = "0.0.1" +dependencies = [ + "golem-rust", + "once_cell", + "rand", + "uuid", + "wit-bindgen-rt", +] + +[[package]] +name = "ephemeral-stub" +version = "0.0.1" +dependencies = [ + "golem-wasm-rpc", + "wit-bindgen-rt", +] + [[package]] name = "equivalent" version = "1.0.1" @@ -108,10 +159,36 @@ dependencies = [ "wasi", ] +[[package]] +name = "golem-rust" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64ef0670496530779ccc42076031e1ebce93aee07129b1c410e31bee577be85c" +dependencies = [ + "golem-rust-macro", + "serde", + "serde_json", + "uuid", + "wit-bindgen-rt", +] + +[[package]] +name = "golem-rust-macro" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4eb977d485e1d5d0d2fc7db022689b740615639867f932702f7d176f786a8e0" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "golem-wasm-rpc" version = "0.0.0" dependencies = [ + "cargo_metadata", "prost-build", "wit-bindgen-rt", ] @@ -147,6 +224,12 @@ dependencies = [ "either", ] +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + [[package]] name = "libc" version = "0.2.155" @@ -352,26 +435,53 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "semver" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +dependencies = [ + "serde", +] + [[package]] name = "serde" -version = "1.0.203" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.203" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", "syn", ] +[[package]] +name = "serde_json" +version = "1.0.128" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + [[package]] name = "syn" version = "2.0.67" @@ -395,6 +505,26 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "thiserror" +version = "1.0.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "unicode-ident" version = "1.0.12" @@ -403,9 +533,9 @@ checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "uuid" -version = "1.8.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" +checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" dependencies = [ "getrandom", "serde", diff --git a/test-components/rpc/Cargo.toml b/test-components/rpc/Cargo.toml index ef0d38bb8..45846c2e9 100644 --- a/test-components/rpc/Cargo.toml +++ b/test-components/rpc/Cargo.toml @@ -1,11 +1,7 @@ [workspace] resolver = "2" -members = [ - "counters", - "caller", - "counters-stub" -] +members = ["counters", "caller", "ephemeral", "ephemeral-stub", "counters-stub"] [profile.release] opt-level = "s" diff --git a/test-components/rpc/build-debug.sh b/test-components/rpc/build-debug.sh index 88208bc9a..a1d8feb59 100755 --- a/test-components/rpc/build-debug.sh +++ b/test-components/rpc/build-debug.sh @@ -1,10 +1,18 @@ #!/usr/bin/env sh set -uox pipefail +rm -rf target/wasm32-wasi/debug/rpc:counters-stub +rm -rf target/wasm32-wasi/debug/rpc:ephemeral-stub + cargo component build mkdir -pv target/wasm32-wasi/debug/rpc:counters-stub cp target/wasm32-wasi/debug/counters_stub.wasm target/wasm32-wasi/debug/rpc:counters-stub/stub-counters.wasm -wasm-tools compose -v target/wasm32-wasi/debug/caller.wasm -o target/wasm32-wasi/debug/caller_composed.wasm +wasm-tools compose -v target/wasm32-wasi/debug/caller.wasm -o target/wasm32-wasi/debug/caller_composed1.wasm + +mkdir -pv target/wasm32-wasi/debug/rpc:ephemeral-stub +cp target/wasm32-wasi/debug/ephemeral_stub.wasm target/wasm32-wasi/debug/rpc:ephemeral-stub/stub-ephemeral.wasm +wasm-tools compose -v target/wasm32-wasi/debug/caller_composed1.wasm -o target/wasm32-wasi/debug/caller_composed.wasm cp target/wasm32-wasi/debug/caller_composed.wasm .. cp target/wasm32-wasi/debug/counters.wasm .. +cp target/wasm32-wasi/debug/ephemeral.wasm .. diff --git a/test-components/rpc/build.sh b/test-components/rpc/build.sh index 7dee77900..5cb4ff2f5 100755 --- a/test-components/rpc/build.sh +++ b/test-components/rpc/build.sh @@ -1,10 +1,18 @@ #!/usr/bin/env sh set -uox pipefail +rm -rf target/wasm32-wasi/release/rpc:counters-stub +rm -rf target/wasm32-wasi/release/rpc:ephemeral-stub + cargo component build --release mkdir -pv target/wasm32-wasi/release/rpc:counters-stub cp target/wasm32-wasi/release/counters_stub.wasm target/wasm32-wasi/release/rpc:counters-stub/stub-counters.wasm -wasm-tools compose -v target/wasm32-wasi/release/caller.wasm -o target/wasm32-wasi/release/caller_composed.wasm +wasm-tools compose -v target/wasm32-wasi/release/caller.wasm -o target/wasm32-wasi/release/caller_composed1.wasm + +mkdir -pv target/wasm32-wasi/release/rpc:ephemeral-stub +cp target/wasm32-wasi/release/ephemeral_stub.wasm target/wasm32-wasi/release/rpc:ephemeral-stub/stub-ephemeral.wasm +wasm-tools compose -v target/wasm32-wasi/release/caller_composed1.wasm -o target/wasm32-wasi/release/caller_composed.wasm cp target/wasm32-wasi/release/caller_composed.wasm .. cp target/wasm32-wasi/release/counters.wasm .. +cp target/wasm32-wasi/release/ephemeral.wasm .. diff --git a/test-components/rpc/caller/Cargo.toml b/test-components/rpc/caller/Cargo.toml index ea785e62a..0f5942752 100644 --- a/test-components/rpc/caller/Cargo.toml +++ b/test-components/rpc/caller/Cargo.toml @@ -20,4 +20,6 @@ path = "wit" "golem:rpc" = { path = "wit/deps/wasm-rpc" } "rpc:counters" = { path = "wit/deps/rpc_counters" } "rpc:counters-stub" = { path = "wit/deps/counters-stub" } +"rpc:ephemeral" = { path = "wit/deps/rpc_ephemeral" } +"rpc:ephemeral-stub" = { path = "wit/deps/ephemeral-stub" } "wasi:io" = { path = "wit/deps/io" } diff --git a/test-components/rpc/caller/src/bindings.rs b/test-components/rpc/caller/src/bindings.rs index 15562b555..b06892f6e 100644 --- a/test-components/rpc/caller/src/bindings.rs +++ b/test-components/rpc/caller/src/bindings.rs @@ -219,6 +219,69 @@ pub unsafe fn _export_bug_wasm_rpc_i32_cabi(arg0: i32) -> i32 { }; result3 } +#[doc(hidden)] +#[allow(non_snake_case)] +pub unsafe fn _export_ephemeral_test1_cabi() -> *mut u8 { + #[cfg(target_arch = "wasm32")] + _rt::run_ctors_once(); + let result0 = T::ephemeral_test1(); + let ptr1 = _RET_AREA.0.as_mut_ptr().cast::(); + let vec5 = result0; + let len5 = vec5.len(); + let layout5 = _rt::alloc::Layout::from_size_align_unchecked(vec5.len() * 16, 4); + let result5 = if layout5.size() != 0 { + let ptr = _rt::alloc::alloc(layout5).cast::(); + if ptr.is_null() { + _rt::alloc::handle_alloc_error(layout5); + } + ptr + } else { + { + ::core::ptr::null_mut() + } + }; + for (i, e) in vec5.into_iter().enumerate() { + let base = result5.add(i * 16); + { + let (t2_0, t2_1) = e; + let vec3 = (t2_0.into_bytes()).into_boxed_slice(); + let ptr3 = vec3.as_ptr().cast::(); + let len3 = vec3.len(); + ::core::mem::forget(vec3); + *base.add(4).cast::() = len3; + *base.add(0).cast::<*mut u8>() = ptr3.cast_mut(); + let vec4 = (t2_1.into_bytes()).into_boxed_slice(); + let ptr4 = vec4.as_ptr().cast::(); + let len4 = vec4.len(); + ::core::mem::forget(vec4); + *base.add(12).cast::() = len4; + *base.add(8).cast::<*mut u8>() = ptr4.cast_mut(); + } + } + *ptr1.add(4).cast::() = len5; + *ptr1.add(0).cast::<*mut u8>() = result5; + ptr1 +} +#[doc(hidden)] +#[allow(non_snake_case)] +pub unsafe fn __post_return_ephemeral_test1(arg0: *mut u8) { + let l4 = *arg0.add(0).cast::<*mut u8>(); + let l5 = *arg0.add(4).cast::(); + let base6 = l4; + let len6 = l5; + for i in 0..len6 { + let base = base6.add(i * 16); + { + let l0 = *base.add(0).cast::<*mut u8>(); + let l1 = *base.add(4).cast::(); + _rt::cabi_dealloc(l0, l1, 1); + let l2 = *base.add(8).cast::<*mut u8>(); + let l3 = *base.add(12).cast::(); + _rt::cabi_dealloc(l2, l3, 1); + } + } + _rt::cabi_dealloc(base6, len6 * 16, 4); +} pub trait Guest { fn test1() -> _rt::Vec<(_rt::String, u64)>; fn test2() -> u64; @@ -226,6 +289,7 @@ pub trait Guest { fn test4() -> (_rt::Vec<_rt::String>, _rt::Vec<(_rt::String, _rt::String)>); fn test5() -> _rt::Vec; fn bug_wasm_rpc_i32(in_: TimelineNode) -> TimelineNode; + fn ephemeral_test1() -> _rt::Vec<(_rt::String, _rt::String)>; } #[doc(hidden)] @@ -268,6 +332,14 @@ macro_rules! __export_world_caller_cabi{ unsafe extern "C" fn export_bug_wasm_rpc_i32(arg0: i32,) -> i32 { $($path_to_types)*::_export_bug_wasm_rpc_i32_cabi::<$ty>(arg0) } + #[export_name = "ephemeral-test1"] + unsafe extern "C" fn export_ephemeral_test1() -> *mut u8 { + $($path_to_types)*::_export_ephemeral_test1_cabi::<$ty>() + } + #[export_name = "cabi_post_ephemeral-test1"] + unsafe extern "C" fn _post_return_ephemeral_test1(arg0: *mut u8,) { + $($path_to_types)*::__post_return_ephemeral_test1::<$ty>(arg0) + } };); } #[doc(hidden)] @@ -4019,6 +4091,393 @@ pub mod rpc { } } } + #[allow(dead_code)] + pub mod ephemeral_stub { + #[allow(dead_code, clippy::all)] + pub mod stub_ephemeral { + #[used] + #[doc(hidden)] + #[cfg(target_arch = "wasm32")] + static __FORCE_SECTION_REF: fn() = + super::super::super::__link_custom_section_describing_imports; + use super::super::super::_rt; + pub type Uri = super::super::super::golem::rpc::types::Uri; + pub type Pollable = super::super::super::wasi::io::poll::Pollable; + + #[derive(Debug)] + #[repr(transparent)] + pub struct FutureGetWorkerNameResult { + handle: _rt::Resource, + } + + impl FutureGetWorkerNameResult { + #[doc(hidden)] + pub unsafe fn from_handle(handle: u32) -> Self { + Self { + handle: _rt::Resource::from_handle(handle), + } + } + + #[doc(hidden)] + pub fn take_handle(&self) -> u32 { + _rt::Resource::take_handle(&self.handle) + } + + #[doc(hidden)] + pub fn handle(&self) -> u32 { + _rt::Resource::handle(&self.handle) + } + } + + unsafe impl _rt::WasmResource for FutureGetWorkerNameResult { + #[inline] + unsafe fn drop(_handle: u32) { + #[cfg(not(target_arch = "wasm32"))] + unreachable!(); + + #[cfg(target_arch = "wasm32")] + { + #[link(wasm_import_module = "rpc:ephemeral-stub/stub-ephemeral")] + extern "C" { + #[link_name = "[resource-drop]future-get-worker-name-result"] + fn drop(_: u32); + } + + drop(_handle); + } + } + } + + #[derive(Debug)] + #[repr(transparent)] + pub struct FutureGetIdempotencyKeyResult { + handle: _rt::Resource, + } + + impl FutureGetIdempotencyKeyResult { + #[doc(hidden)] + pub unsafe fn from_handle(handle: u32) -> Self { + Self { + handle: _rt::Resource::from_handle(handle), + } + } + + #[doc(hidden)] + pub fn take_handle(&self) -> u32 { + _rt::Resource::take_handle(&self.handle) + } + + #[doc(hidden)] + pub fn handle(&self) -> u32 { + _rt::Resource::handle(&self.handle) + } + } + + unsafe impl _rt::WasmResource for FutureGetIdempotencyKeyResult { + #[inline] + unsafe fn drop(_handle: u32) { + #[cfg(not(target_arch = "wasm32"))] + unreachable!(); + + #[cfg(target_arch = "wasm32")] + { + #[link(wasm_import_module = "rpc:ephemeral-stub/stub-ephemeral")] + extern "C" { + #[link_name = "[resource-drop]future-get-idempotency-key-result"] + fn drop(_: u32); + } + + drop(_handle); + } + } + } + + #[derive(Debug)] + #[repr(transparent)] + pub struct Api { + handle: _rt::Resource, + } + + impl Api { + #[doc(hidden)] + pub unsafe fn from_handle(handle: u32) -> Self { + Self { + handle: _rt::Resource::from_handle(handle), + } + } + + #[doc(hidden)] + pub fn take_handle(&self) -> u32 { + _rt::Resource::take_handle(&self.handle) + } + + #[doc(hidden)] + pub fn handle(&self) -> u32 { + _rt::Resource::handle(&self.handle) + } + } + + unsafe impl _rt::WasmResource for Api { + #[inline] + unsafe fn drop(_handle: u32) { + #[cfg(not(target_arch = "wasm32"))] + unreachable!(); + + #[cfg(target_arch = "wasm32")] + { + #[link(wasm_import_module = "rpc:ephemeral-stub/stub-ephemeral")] + extern "C" { + #[link_name = "[resource-drop]api"] + fn drop(_: u32); + } + + drop(_handle); + } + } + } + + impl FutureGetWorkerNameResult { + #[allow(unused_unsafe, clippy::all)] + pub fn subscribe(&self) -> Pollable { + unsafe { + #[cfg(target_arch = "wasm32")] + #[link(wasm_import_module = "rpc:ephemeral-stub/stub-ephemeral")] + extern "C" { + #[link_name = "[method]future-get-worker-name-result.subscribe"] + fn wit_import(_: i32) -> i32; + } + + #[cfg(not(target_arch = "wasm32"))] + fn wit_import(_: i32) -> i32 { + unreachable!() + } + let ret = wit_import((self).handle() as i32); + super::super::super::wasi::io::poll::Pollable::from_handle(ret as u32) + } + } + } + impl FutureGetWorkerNameResult { + #[allow(unused_unsafe, clippy::all)] + pub fn get(&self) -> Option<_rt::String> { + unsafe { + #[repr(align(4))] + struct RetArea([::core::mem::MaybeUninit; 12]); + let mut ret_area = RetArea([::core::mem::MaybeUninit::uninit(); 12]); + let ptr0 = ret_area.0.as_mut_ptr().cast::(); + #[cfg(target_arch = "wasm32")] + #[link(wasm_import_module = "rpc:ephemeral-stub/stub-ephemeral")] + extern "C" { + #[link_name = "[method]future-get-worker-name-result.get"] + fn wit_import(_: i32, _: *mut u8); + } + + #[cfg(not(target_arch = "wasm32"))] + fn wit_import(_: i32, _: *mut u8) { + unreachable!() + } + wit_import((self).handle() as i32, ptr0); + let l1 = i32::from(*ptr0.add(0).cast::()); + match l1 { + 0 => None, + 1 => { + let e = { + let l2 = *ptr0.add(4).cast::<*mut u8>(); + let l3 = *ptr0.add(8).cast::(); + let len4 = l3; + let bytes4 = _rt::Vec::from_raw_parts(l2.cast(), len4, len4); + + _rt::string_lift(bytes4) + }; + Some(e) + } + _ => _rt::invalid_enum_discriminant(), + } + } + } + } + impl FutureGetIdempotencyKeyResult { + #[allow(unused_unsafe, clippy::all)] + pub fn subscribe(&self) -> Pollable { + unsafe { + #[cfg(target_arch = "wasm32")] + #[link(wasm_import_module = "rpc:ephemeral-stub/stub-ephemeral")] + extern "C" { + #[link_name = "[method]future-get-idempotency-key-result.subscribe"] + fn wit_import(_: i32) -> i32; + } + + #[cfg(not(target_arch = "wasm32"))] + fn wit_import(_: i32) -> i32 { + unreachable!() + } + let ret = wit_import((self).handle() as i32); + super::super::super::wasi::io::poll::Pollable::from_handle(ret as u32) + } + } + } + impl FutureGetIdempotencyKeyResult { + #[allow(unused_unsafe, clippy::all)] + pub fn get(&self) -> Option<_rt::String> { + unsafe { + #[repr(align(4))] + struct RetArea([::core::mem::MaybeUninit; 12]); + let mut ret_area = RetArea([::core::mem::MaybeUninit::uninit(); 12]); + let ptr0 = ret_area.0.as_mut_ptr().cast::(); + #[cfg(target_arch = "wasm32")] + #[link(wasm_import_module = "rpc:ephemeral-stub/stub-ephemeral")] + extern "C" { + #[link_name = "[method]future-get-idempotency-key-result.get"] + fn wit_import(_: i32, _: *mut u8); + } + + #[cfg(not(target_arch = "wasm32"))] + fn wit_import(_: i32, _: *mut u8) { + unreachable!() + } + wit_import((self).handle() as i32, ptr0); + let l1 = i32::from(*ptr0.add(0).cast::()); + match l1 { + 0 => None, + 1 => { + let e = { + let l2 = *ptr0.add(4).cast::<*mut u8>(); + let l3 = *ptr0.add(8).cast::(); + let len4 = l3; + let bytes4 = _rt::Vec::from_raw_parts(l2.cast(), len4, len4); + + _rt::string_lift(bytes4) + }; + Some(e) + } + _ => _rt::invalid_enum_discriminant(), + } + } + } + } + impl Api { + #[allow(unused_unsafe, clippy::all)] + pub fn new(location: &Uri) -> Self { + unsafe { + let super::super::super::golem::rpc::types::Uri { value: value0 } = + location; + let vec1 = value0; + let ptr1 = vec1.as_ptr().cast::(); + let len1 = vec1.len(); + + #[cfg(target_arch = "wasm32")] + #[link(wasm_import_module = "rpc:ephemeral-stub/stub-ephemeral")] + extern "C" { + #[link_name = "[constructor]api"] + fn wit_import(_: *mut u8, _: usize) -> i32; + } + + #[cfg(not(target_arch = "wasm32"))] + fn wit_import(_: *mut u8, _: usize) -> i32 { + unreachable!() + } + let ret = wit_import(ptr1.cast_mut(), len1); + Api::from_handle(ret as u32) + } + } + } + impl Api { + #[allow(unused_unsafe, clippy::all)] + pub fn blocking_get_worker_name(&self) -> _rt::String { + unsafe { + #[repr(align(4))] + struct RetArea([::core::mem::MaybeUninit; 8]); + let mut ret_area = RetArea([::core::mem::MaybeUninit::uninit(); 8]); + let ptr0 = ret_area.0.as_mut_ptr().cast::(); + #[cfg(target_arch = "wasm32")] + #[link(wasm_import_module = "rpc:ephemeral-stub/stub-ephemeral")] + extern "C" { + #[link_name = "[method]api.blocking-get-worker-name"] + fn wit_import(_: i32, _: *mut u8); + } + + #[cfg(not(target_arch = "wasm32"))] + fn wit_import(_: i32, _: *mut u8) { + unreachable!() + } + wit_import((self).handle() as i32, ptr0); + let l1 = *ptr0.add(0).cast::<*mut u8>(); + let l2 = *ptr0.add(4).cast::(); + let len3 = l2; + let bytes3 = _rt::Vec::from_raw_parts(l1.cast(), len3, len3); + _rt::string_lift(bytes3) + } + } + } + impl Api { + #[allow(unused_unsafe, clippy::all)] + pub fn get_worker_name(&self) -> FutureGetWorkerNameResult { + unsafe { + #[cfg(target_arch = "wasm32")] + #[link(wasm_import_module = "rpc:ephemeral-stub/stub-ephemeral")] + extern "C" { + #[link_name = "[method]api.get-worker-name"] + fn wit_import(_: i32) -> i32; + } + + #[cfg(not(target_arch = "wasm32"))] + fn wit_import(_: i32) -> i32 { + unreachable!() + } + let ret = wit_import((self).handle() as i32); + FutureGetWorkerNameResult::from_handle(ret as u32) + } + } + } + impl Api { + #[allow(unused_unsafe, clippy::all)] + pub fn blocking_get_idempotency_key(&self) -> _rt::String { + unsafe { + #[repr(align(4))] + struct RetArea([::core::mem::MaybeUninit; 8]); + let mut ret_area = RetArea([::core::mem::MaybeUninit::uninit(); 8]); + let ptr0 = ret_area.0.as_mut_ptr().cast::(); + #[cfg(target_arch = "wasm32")] + #[link(wasm_import_module = "rpc:ephemeral-stub/stub-ephemeral")] + extern "C" { + #[link_name = "[method]api.blocking-get-idempotency-key"] + fn wit_import(_: i32, _: *mut u8); + } + + #[cfg(not(target_arch = "wasm32"))] + fn wit_import(_: i32, _: *mut u8) { + unreachable!() + } + wit_import((self).handle() as i32, ptr0); + let l1 = *ptr0.add(0).cast::<*mut u8>(); + let l2 = *ptr0.add(4).cast::(); + let len3 = l2; + let bytes3 = _rt::Vec::from_raw_parts(l1.cast(), len3, len3); + _rt::string_lift(bytes3) + } + } + } + impl Api { + #[allow(unused_unsafe, clippy::all)] + pub fn get_idempotency_key(&self) -> FutureGetIdempotencyKeyResult { + unsafe { + #[cfg(target_arch = "wasm32")] + #[link(wasm_import_module = "rpc:ephemeral-stub/stub-ephemeral")] + extern "C" { + #[link_name = "[method]api.get-idempotency-key"] + fn wit_import(_: i32) -> i32; + } + + #[cfg(not(target_arch = "wasm32"))] + fn wit_import(_: i32) -> i32 { + unreachable!() + } + let ret = wit_import((self).handle() as i32); + FutureGetIdempotencyKeyResult::from_handle(ret as u32) + } + } + } + } + } } #[allow(dead_code)] pub mod wasi { @@ -4511,86 +4970,99 @@ pub(crate) use __export_caller_impl as export; #[cfg(target_arch = "wasm32")] #[link_section = "component-type:wit-bindgen:0.25.0:caller:encoded world"] #[doc(hidden)] -pub static __WIT_BINDGEN_COMPONENT_TYPE: [u8; 3847] = *b"\ -\0asm\x0d\0\x01\0\0\x19\x16wit-component-encoding\x04\0\x07\x8a\x1d\x01A\x02\x01\ -A\x1f\x01B\x0a\x04\0\x08pollable\x03\x01\x01h\0\x01@\x01\x04self\x01\0\x7f\x04\0\ -\x16[method]pollable.ready\x01\x02\x01@\x01\x04self\x01\x01\0\x04\0\x16[method]p\ -ollable.block\x01\x03\x01p\x01\x01py\x01@\x01\x02in\x04\0\x05\x04\0\x04poll\x01\x06\ -\x03\x01\x12wasi:io/poll@0.2.0\x05\0\x02\x03\0\0\x08pollable\x01B*\x02\x03\x02\x01\ -\x01\x04\0\x08pollable\x03\0\0\x01z\x04\0\x0anode-index\x03\0\x02\x01r\x01\x05va\ -lues\x04\0\x03uri\x03\0\x04\x01p\x03\x01k\x03\x01o\x02y\x07\x01p\x7f\x01j\x01\x07\ -\x01\x07\x01o\x02\x05w\x01q\x16\x0crecord-value\x01\x06\0\x0dvariant-value\x01\x08\ -\0\x0aenum-value\x01y\0\x0bflags-value\x01\x09\0\x0btuple-value\x01\x06\0\x0alis\ -t-value\x01\x06\0\x0coption-value\x01\x07\0\x0cresult-value\x01\x0a\0\x07prim-u8\ -\x01}\0\x08prim-u16\x01{\0\x08prim-u32\x01y\0\x08prim-u64\x01w\0\x07prim-s8\x01~\ -\0\x08prim-s16\x01|\0\x08prim-s32\x01z\0\x08prim-s64\x01x\0\x0cprim-float32\x01v\ -\0\x0cprim-float64\x01u\0\x09prim-char\x01t\0\x09prim-bool\x01\x7f\0\x0bprim-str\ -ing\x01s\0\x06handle\x01\x0b\0\x04\0\x08wit-node\x03\0\x0c\x01p\x0d\x01r\x01\x05\ -nodes\x0e\x04\0\x09wit-value\x03\0\x0f\x01q\x04\x0eprotocol-error\x01s\0\x06deni\ -ed\x01s\0\x09not-found\x01s\0\x15remote-internal-error\x01s\0\x04\0\x09rpc-error\ -\x03\0\x11\x04\0\x08wasm-rpc\x03\x01\x04\0\x14future-invoke-result\x03\x01\x01i\x13\ -\x01@\x01\x08location\x05\0\x15\x04\0\x15[constructor]wasm-rpc\x01\x16\x01h\x13\x01\ -p\x10\x01j\x01\x10\x01\x12\x01@\x03\x04self\x17\x0dfunction-names\x0ffunction-pa\ -rams\x18\0\x19\x04\0![method]wasm-rpc.invoke-and-await\x01\x1a\x01j\0\x01\x12\x01\ -@\x03\x04self\x17\x0dfunction-names\x0ffunction-params\x18\0\x1b\x04\0\x17[metho\ -d]wasm-rpc.invoke\x01\x1c\x01i\x14\x01@\x03\x04self\x17\x0dfunction-names\x0ffun\ -ction-params\x18\0\x1d\x04\0'[method]wasm-rpc.async-invoke-and-await\x01\x1e\x01\ -h\x14\x01i\x01\x01@\x01\x04self\x1f\0\x20\x04\0&[method]future-invoke-result.sub\ -scribe\x01!\x01k\x19\x01@\x01\x04self\x1f\0\"\x04\0\x20[method]future-invoke-res\ -ult.get\x01#\x03\x01\x15golem:rpc/types@0.1.0\x05\x02\x01B\x1c\x04\0\x07counter\x03\ -\x01\x01q\x01\x04leaf\0\0\x04\0\x0dtimeline-node\x03\0\x01\x01i\0\x01@\x01\x04na\ -mes\0\x03\x04\0\x14[constructor]counter\x01\x04\x01h\0\x01@\x02\x04self\x05\x05v\ -aluew\x01\0\x04\0\x16[method]counter.inc-by\x01\x06\x01@\x01\x04self\x05\0w\x04\0\ -\x19[method]counter.get-value\x01\x07\x01ps\x01@\x01\x04self\x05\0\x08\x04\0\x18\ -[method]counter.get-args\x01\x09\x01o\x02ss\x01p\x0a\x01@\x01\x04self\x05\0\x0b\x04\ -\0\x17[method]counter.get-env\x01\x0c\x01@\x01\x05valuew\x01\0\x04\0\x0dinc-glob\ -al-by\x01\x0d\x01@\0\0w\x04\0\x10get-global-value\x01\x0e\x01o\x02sw\x01p\x0f\x01\ -@\0\0\x10\x04\0\x0fget-all-dropped\x01\x11\x01@\x01\x02in\x02\0\x02\x04\0\x10bug\ --wasm-rpc-i32\x01\x12\x03\x01\x10rpc:counters/api\x05\x03\x02\x03\0\x01\x03uri\x02\ -\x03\0\x02\x0dtimeline-node\x01Bc\x02\x03\x02\x01\x04\x04\0\x03uri\x03\0\0\x02\x03\ -\x02\x01\x01\x04\0\x08pollable\x03\0\x02\x02\x03\x02\x01\x05\x04\0\x0dtimeline-n\ -ode\x03\0\x04\x04\0\x1efuture-get-global-value-result\x03\x01\x04\0\x1dfuture-ge\ -t-all-dropped-result\x03\x01\x04\0\x1efuture-bug-wasm-rpc-i32-result\x03\x01\x04\ -\0\x1ffuture-counter-get-value-result\x03\x01\x04\0\x1efuture-counter-get-args-r\ -esult\x03\x01\x04\0\x1dfuture-counter-get-env-result\x03\x01\x04\0\x03api\x03\x01\ -\x04\0\x07counter\x03\x01\x01h\x06\x01i\x03\x01@\x01\x04self\x0e\0\x0f\x04\00[me\ -thod]future-get-global-value-result.subscribe\x01\x10\x01kw\x01@\x01\x04self\x0e\ -\0\x11\x04\0*[method]future-get-global-value-result.get\x01\x12\x01h\x07\x01@\x01\ -\x04self\x13\0\x0f\x04\0/[method]future-get-all-dropped-result.subscribe\x01\x14\ -\x01o\x02sw\x01p\x15\x01k\x16\x01@\x01\x04self\x13\0\x17\x04\0)[method]future-ge\ -t-all-dropped-result.get\x01\x18\x01h\x08\x01@\x01\x04self\x19\0\x0f\x04\00[meth\ -od]future-bug-wasm-rpc-i32-result.subscribe\x01\x1a\x01k\x05\x01@\x01\x04self\x19\ -\0\x1b\x04\0*[method]future-bug-wasm-rpc-i32-result.get\x01\x1c\x01h\x09\x01@\x01\ -\x04self\x1d\0\x0f\x04\01[method]future-counter-get-value-result.subscribe\x01\x1e\ -\x01@\x01\x04self\x1d\0\x11\x04\0+[method]future-counter-get-value-result.get\x01\ -\x1f\x01h\x0a\x01@\x01\x04self\x20\0\x0f\x04\00[method]future-counter-get-args-r\ -esult.subscribe\x01!\x01ps\x01k\"\x01@\x01\x04self\x20\0#\x04\0*[method]future-c\ -ounter-get-args-result.get\x01$\x01h\x0b\x01@\x01\x04self%\0\x0f\x04\0/[method]f\ -uture-counter-get-env-result.subscribe\x01&\x01o\x02ss\x01p'\x01k(\x01@\x01\x04s\ -elf%\0)\x04\0)[method]future-counter-get-env-result.get\x01*\x01i\x0c\x01@\x01\x08\ -location\x01\0+\x04\0\x10[constructor]api\x01,\x01h\x0c\x01@\x02\x04self-\x05val\ -uew\x01\0\x04\0\"[method]api.blocking-inc-global-by\x01.\x04\0\x19[method]api.in\ -c-global-by\x01.\x01@\x01\x04self-\0w\x04\0%[method]api.blocking-get-global-valu\ -e\x01/\x01i\x06\x01@\x01\x04self-\00\x04\0\x1c[method]api.get-global-value\x011\x01\ -@\x01\x04self-\0\x16\x04\0$[method]api.blocking-get-all-dropped\x012\x01i\x07\x01\ -@\x01\x04self-\03\x04\0\x1b[method]api.get-all-dropped\x014\x01@\x02\x04self-\x02\ -in\x05\0\x05\x04\0%[method]api.blocking-bug-wasm-rpc-i32\x015\x01i\x08\x01@\x02\x04\ -self-\x02in\x05\06\x04\0\x1c[method]api.bug-wasm-rpc-i32\x017\x01i\x0d\x01@\x02\x08\ -location\x01\x04names\08\x04\0\x14[constructor]counter\x019\x01h\x0d\x01@\x02\x04\ -self:\x05valuew\x01\0\x04\0\x1f[method]counter.blocking-inc-by\x01;\x04\0\x16[me\ -thod]counter.inc-by\x01;\x01@\x01\x04self:\0w\x04\0\"[method]counter.blocking-ge\ -t-value\x01<\x01i\x09\x01@\x01\x04self:\0=\x04\0\x19[method]counter.get-value\x01\ ->\x01@\x01\x04self:\0\"\x04\0![method]counter.blocking-get-args\x01?\x01i\x0a\x01\ -@\x01\x04self:\0\xc0\0\x04\0\x18[method]counter.get-args\x01A\x01@\x01\x04self:\0\ -(\x04\0\x20[method]counter.blocking-get-env\x01B\x01i\x0b\x01@\x01\x04self:\0\xc3\ -\0\x04\0\x17[method]counter.get-env\x01D\x03\x01\x1frpc:counters-stub/stub-count\ -ers\x05\x06\x02\x03\0\x03\x0dtimeline-node\x03\0\x0dtimeline-node\x03\0\x07\x01o\ -\x02sw\x01p\x09\x01@\0\0\x0a\x04\0\x05test1\x01\x0b\x01@\0\0w\x04\0\x05test2\x01\ -\x0c\x04\0\x05test3\x01\x0c\x01ps\x01o\x02ss\x01p\x0e\x01o\x02\x0d\x0f\x01@\0\0\x10\ -\x04\0\x05test4\x01\x11\x01pw\x01@\0\0\x12\x04\0\x05test5\x01\x13\x01@\x01\x02in\ -\x08\0\x08\x04\0\x10bug-wasm-rpc-i32\x01\x14\x04\x01\x11rpc:caller/caller\x04\0\x0b\ -\x0c\x01\0\x06caller\x03\0\0\0G\x09producers\x01\x0cprocessed-by\x02\x0dwit-comp\ -onent\x070.208.1\x10wit-bindgen-rust\x060.25.0"; +pub static __WIT_BINDGEN_COMPONENT_TYPE: [u8; 4521] = *b"\ +\0asm\x0d\0\x01\0\0\x19\x16wit-component-encoding\x04\0\x07\xac\"\x01A\x02\x01A#\ +\x01B\x0a\x04\0\x08pollable\x03\x01\x01h\0\x01@\x01\x04self\x01\0\x7f\x04\0\x16[\ +method]pollable.ready\x01\x02\x01@\x01\x04self\x01\x01\0\x04\0\x16[method]pollab\ +le.block\x01\x03\x01p\x01\x01py\x01@\x01\x02in\x04\0\x05\x04\0\x04poll\x01\x06\x03\ +\x01\x12wasi:io/poll@0.2.0\x05\0\x02\x03\0\0\x08pollable\x01B*\x02\x03\x02\x01\x01\ +\x04\0\x08pollable\x03\0\0\x01z\x04\0\x0anode-index\x03\0\x02\x01r\x01\x05values\ +\x04\0\x03uri\x03\0\x04\x01p\x03\x01k\x03\x01o\x02y\x07\x01p\x7f\x01j\x01\x07\x01\ +\x07\x01o\x02\x05w\x01q\x16\x0crecord-value\x01\x06\0\x0dvariant-value\x01\x08\0\ +\x0aenum-value\x01y\0\x0bflags-value\x01\x09\0\x0btuple-value\x01\x06\0\x0alist-\ +value\x01\x06\0\x0coption-value\x01\x07\0\x0cresult-value\x01\x0a\0\x07prim-u8\x01\ +}\0\x08prim-u16\x01{\0\x08prim-u32\x01y\0\x08prim-u64\x01w\0\x07prim-s8\x01~\0\x08\ +prim-s16\x01|\0\x08prim-s32\x01z\0\x08prim-s64\x01x\0\x0cprim-float32\x01v\0\x0c\ +prim-float64\x01u\0\x09prim-char\x01t\0\x09prim-bool\x01\x7f\0\x0bprim-string\x01\ +s\0\x06handle\x01\x0b\0\x04\0\x08wit-node\x03\0\x0c\x01p\x0d\x01r\x01\x05nodes\x0e\ +\x04\0\x09wit-value\x03\0\x0f\x01q\x04\x0eprotocol-error\x01s\0\x06denied\x01s\0\ +\x09not-found\x01s\0\x15remote-internal-error\x01s\0\x04\0\x09rpc-error\x03\0\x11\ +\x04\0\x08wasm-rpc\x03\x01\x04\0\x14future-invoke-result\x03\x01\x01i\x13\x01@\x01\ +\x08location\x05\0\x15\x04\0\x15[constructor]wasm-rpc\x01\x16\x01h\x13\x01p\x10\x01\ +j\x01\x10\x01\x12\x01@\x03\x04self\x17\x0dfunction-names\x0ffunction-params\x18\0\ +\x19\x04\0![method]wasm-rpc.invoke-and-await\x01\x1a\x01j\0\x01\x12\x01@\x03\x04\ +self\x17\x0dfunction-names\x0ffunction-params\x18\0\x1b\x04\0\x17[method]wasm-rp\ +c.invoke\x01\x1c\x01i\x14\x01@\x03\x04self\x17\x0dfunction-names\x0ffunction-par\ +ams\x18\0\x1d\x04\0'[method]wasm-rpc.async-invoke-and-await\x01\x1e\x01h\x14\x01\ +i\x01\x01@\x01\x04self\x1f\0\x20\x04\0&[method]future-invoke-result.subscribe\x01\ +!\x01k\x19\x01@\x01\x04self\x1f\0\"\x04\0\x20[method]future-invoke-result.get\x01\ +#\x03\x01\x15golem:rpc/types@0.1.0\x05\x02\x01B\x1c\x04\0\x07counter\x03\x01\x01\ +q\x01\x04leaf\0\0\x04\0\x0dtimeline-node\x03\0\x01\x01i\0\x01@\x01\x04names\0\x03\ +\x04\0\x14[constructor]counter\x01\x04\x01h\0\x01@\x02\x04self\x05\x05valuew\x01\ +\0\x04\0\x16[method]counter.inc-by\x01\x06\x01@\x01\x04self\x05\0w\x04\0\x19[met\ +hod]counter.get-value\x01\x07\x01ps\x01@\x01\x04self\x05\0\x08\x04\0\x18[method]\ +counter.get-args\x01\x09\x01o\x02ss\x01p\x0a\x01@\x01\x04self\x05\0\x0b\x04\0\x17\ +[method]counter.get-env\x01\x0c\x01@\x01\x05valuew\x01\0\x04\0\x0dinc-global-by\x01\ +\x0d\x01@\0\0w\x04\0\x10get-global-value\x01\x0e\x01o\x02sw\x01p\x0f\x01@\0\0\x10\ +\x04\0\x0fget-all-dropped\x01\x11\x01@\x01\x02in\x02\0\x02\x04\0\x10bug-wasm-rpc\ +-i32\x01\x12\x03\x01\x10rpc:counters/api\x05\x03\x02\x03\0\x01\x03uri\x02\x03\0\x02\ +\x0dtimeline-node\x01Bc\x02\x03\x02\x01\x04\x04\0\x03uri\x03\0\0\x02\x03\x02\x01\ +\x01\x04\0\x08pollable\x03\0\x02\x02\x03\x02\x01\x05\x04\0\x0dtimeline-node\x03\0\ +\x04\x04\0\x1efuture-get-global-value-result\x03\x01\x04\0\x1dfuture-get-all-dro\ +pped-result\x03\x01\x04\0\x1efuture-bug-wasm-rpc-i32-result\x03\x01\x04\0\x1ffut\ +ure-counter-get-value-result\x03\x01\x04\0\x1efuture-counter-get-args-result\x03\ +\x01\x04\0\x1dfuture-counter-get-env-result\x03\x01\x04\0\x03api\x03\x01\x04\0\x07\ +counter\x03\x01\x01h\x06\x01i\x03\x01@\x01\x04self\x0e\0\x0f\x04\00[method]futur\ +e-get-global-value-result.subscribe\x01\x10\x01kw\x01@\x01\x04self\x0e\0\x11\x04\ +\0*[method]future-get-global-value-result.get\x01\x12\x01h\x07\x01@\x01\x04self\x13\ +\0\x0f\x04\0/[method]future-get-all-dropped-result.subscribe\x01\x14\x01o\x02sw\x01\ +p\x15\x01k\x16\x01@\x01\x04self\x13\0\x17\x04\0)[method]future-get-all-dropped-r\ +esult.get\x01\x18\x01h\x08\x01@\x01\x04self\x19\0\x0f\x04\00[method]future-bug-w\ +asm-rpc-i32-result.subscribe\x01\x1a\x01k\x05\x01@\x01\x04self\x19\0\x1b\x04\0*[\ +method]future-bug-wasm-rpc-i32-result.get\x01\x1c\x01h\x09\x01@\x01\x04self\x1d\0\ +\x0f\x04\01[method]future-counter-get-value-result.subscribe\x01\x1e\x01@\x01\x04\ +self\x1d\0\x11\x04\0+[method]future-counter-get-value-result.get\x01\x1f\x01h\x0a\ +\x01@\x01\x04self\x20\0\x0f\x04\00[method]future-counter-get-args-result.subscri\ +be\x01!\x01ps\x01k\"\x01@\x01\x04self\x20\0#\x04\0*[method]future-counter-get-ar\ +gs-result.get\x01$\x01h\x0b\x01@\x01\x04self%\0\x0f\x04\0/[method]future-counter\ +-get-env-result.subscribe\x01&\x01o\x02ss\x01p'\x01k(\x01@\x01\x04self%\0)\x04\0\ +)[method]future-counter-get-env-result.get\x01*\x01i\x0c\x01@\x01\x08location\x01\ +\0+\x04\0\x10[constructor]api\x01,\x01h\x0c\x01@\x02\x04self-\x05valuew\x01\0\x04\ +\0\"[method]api.blocking-inc-global-by\x01.\x04\0\x19[method]api.inc-global-by\x01\ +.\x01@\x01\x04self-\0w\x04\0%[method]api.blocking-get-global-value\x01/\x01i\x06\ +\x01@\x01\x04self-\00\x04\0\x1c[method]api.get-global-value\x011\x01@\x01\x04sel\ +f-\0\x16\x04\0$[method]api.blocking-get-all-dropped\x012\x01i\x07\x01@\x01\x04se\ +lf-\03\x04\0\x1b[method]api.get-all-dropped\x014\x01@\x02\x04self-\x02in\x05\0\x05\ +\x04\0%[method]api.blocking-bug-wasm-rpc-i32\x015\x01i\x08\x01@\x02\x04self-\x02\ +in\x05\06\x04\0\x1c[method]api.bug-wasm-rpc-i32\x017\x01i\x0d\x01@\x02\x08locati\ +on\x01\x04names\08\x04\0\x14[constructor]counter\x019\x01h\x0d\x01@\x02\x04self:\ +\x05valuew\x01\0\x04\0\x1f[method]counter.blocking-inc-by\x01;\x04\0\x16[method]\ +counter.inc-by\x01;\x01@\x01\x04self:\0w\x04\0\"[method]counter.blocking-get-val\ +ue\x01<\x01i\x09\x01@\x01\x04self:\0=\x04\0\x19[method]counter.get-value\x01>\x01\ +@\x01\x04self:\0\"\x04\0![method]counter.blocking-get-args\x01?\x01i\x0a\x01@\x01\ +\x04self:\0\xc0\0\x04\0\x18[method]counter.get-args\x01A\x01@\x01\x04self:\0(\x04\ +\0\x20[method]counter.blocking-get-env\x01B\x01i\x0b\x01@\x01\x04self:\0\xc3\0\x04\ +\0\x17[method]counter.get-env\x01D\x03\x01\x1frpc:counters-stub/stub-counters\x05\ +\x06\x01B\x20\x02\x03\x02\x01\x04\x04\0\x03uri\x03\0\0\x02\x03\x02\x01\x01\x04\0\ +\x08pollable\x03\0\x02\x04\0\x1dfuture-get-worker-name-result\x03\x01\x04\0!futu\ +re-get-idempotency-key-result\x03\x01\x04\0\x03api\x03\x01\x01h\x04\x01i\x03\x01\ +@\x01\x04self\x07\0\x08\x04\0/[method]future-get-worker-name-result.subscribe\x01\ +\x09\x01ks\x01@\x01\x04self\x07\0\x0a\x04\0)[method]future-get-worker-name-resul\ +t.get\x01\x0b\x01h\x05\x01@\x01\x04self\x0c\0\x08\x04\03[method]future-get-idemp\ +otency-key-result.subscribe\x01\x0d\x01@\x01\x04self\x0c\0\x0a\x04\0-[method]fut\ +ure-get-idempotency-key-result.get\x01\x0e\x01i\x06\x01@\x01\x08location\x01\0\x0f\ +\x04\0\x10[constructor]api\x01\x10\x01h\x06\x01@\x01\x04self\x11\0s\x04\0$[metho\ +d]api.blocking-get-worker-name\x01\x12\x01i\x04\x01@\x01\x04self\x11\0\x13\x04\0\ +\x1b[method]api.get-worker-name\x01\x14\x04\0([method]api.blocking-get-idempoten\ +cy-key\x01\x12\x01i\x05\x01@\x01\x04self\x11\0\x15\x04\0\x1f[method]api.get-idem\ +potency-key\x01\x16\x03\x01!rpc:ephemeral-stub/stub-ephemeral\x05\x07\x02\x03\0\x03\ +\x0dtimeline-node\x03\0\x0dtimeline-node\x03\0\x08\x01o\x02sw\x01p\x0a\x01@\0\0\x0b\ +\x04\0\x05test1\x01\x0c\x01@\0\0w\x04\0\x05test2\x01\x0d\x04\0\x05test3\x01\x0d\x01\ +ps\x01o\x02ss\x01p\x0f\x01o\x02\x0e\x10\x01@\0\0\x11\x04\0\x05test4\x01\x12\x01p\ +w\x01@\0\0\x13\x04\0\x05test5\x01\x14\x01@\x01\x02in\x09\0\x09\x04\0\x10bug-wasm\ +-rpc-i32\x01\x15\x01@\0\0\x10\x04\0\x0fephemeral-test1\x01\x16\x04\x01\x11rpc:ca\ +ller/caller\x04\0\x0b\x0c\x01\0\x06caller\x03\0\0\0G\x09producers\x01\x0cprocess\ +ed-by\x02\x0dwit-component\x070.208.1\x10wit-bindgen-rust\x060.25.0"; #[inline(never)] #[doc(hidden)] diff --git a/test-components/rpc/caller/src/lib.rs b/test-components/rpc/caller/src/lib.rs index fcb671a07..8a623803a 100644 --- a/test-components/rpc/caller/src/lib.rs +++ b/test-components/rpc/caller/src/lib.rs @@ -2,6 +2,7 @@ mod bindings; use crate::bindings::golem::rpc::types::Uri; use crate::bindings::rpc::counters_stub::stub_counters::{Api, Counter}; +use crate::bindings::rpc::ephemeral_stub::stub_ephemeral::Api as EphemeralApi; use bindings::*; use std::env; @@ -96,6 +97,25 @@ impl Guest for Component { let api = Api::new(&counters_uri); api.blocking_bug_wasm_rpc_i32(in_) } + + fn ephemeral_test1() -> Vec<(String, String)> { + let component_id = + env::var("EPHEMERAL_COMPONENT_ID").expect("EPHEMERAL_COMPONENT_ID not set"); + let ephemeral_uri: Uri = Uri { + value: format!("urn:worker:{component_id}"), + }; + let api1 = EphemeralApi::new(&ephemeral_uri); + let name1: String = api1.blocking_get_worker_name(); + let key1 = api1.blocking_get_idempotency_key(); + let name2 = api1.blocking_get_worker_name(); + let key2 = api1.blocking_get_idempotency_key(); + + let api2 = EphemeralApi::new(&ephemeral_uri); + let name3: String = api2.blocking_get_worker_name(); + let key3: String = api2.blocking_get_idempotency_key(); + + vec![(name1, key1), (name2, key2), (name3, key3)] + } } fn create_use_and_drop_counters(counters_uri: &Uri) { diff --git a/test-components/rpc/caller/wit/caller.wit b/test-components/rpc/caller/wit/caller.wit index d94d92c97..9ebc339ac 100644 --- a/test-components/rpc/caller/wit/caller.wit +++ b/test-components/rpc/caller/wit/caller.wit @@ -2,6 +2,8 @@ package rpc:caller; world caller { import rpc:counters-stub/stub-counters; + import rpc:ephemeral-stub/stub-ephemeral; + use rpc:counters-stub/stub-counters.{timeline-node}; export test1: func() -> list>; @@ -11,4 +13,6 @@ world caller { export test5: func() -> list; export bug-wasm-rpc-i32: func(in: timeline-node) -> timeline-node; + + export ephemeral-test1: func() -> list>; } diff --git a/test-components/rpc/caller/wit/deps/ephemeral-stub/stub.wit b/test-components/rpc/caller/wit/deps/ephemeral-stub/stub.wit new file mode 100644 index 000000000..6d390e49a --- /dev/null +++ b/test-components/rpc/caller/wit/deps/ephemeral-stub/stub.wit @@ -0,0 +1,27 @@ +package rpc:ephemeral-stub; + +interface stub-ephemeral { + use golem:rpc/types@0.1.0.{uri}; + use wasi:io/poll@0.2.0.{pollable}; + + resource future-get-worker-name-result { + subscribe: func() -> pollable; + get: func() -> option; + } + resource future-get-idempotency-key-result { + subscribe: func() -> pollable; + get: func() -> option; + } + resource api { + constructor(location: uri); + blocking-get-worker-name: func() -> string; + get-worker-name: func() -> future-get-worker-name-result; + blocking-get-idempotency-key: func() -> string; + get-idempotency-key: func() -> future-get-idempotency-key-result; + } + +} + +world wasm-rpc-stub-ephemeral { + export stub-ephemeral; +} diff --git a/test-components/rpc/caller/wit/deps/rpc_ephemeral/ephemeral.wit b/test-components/rpc/caller/wit/deps/rpc_ephemeral/ephemeral.wit new file mode 100644 index 000000000..fc59adcf6 --- /dev/null +++ b/test-components/rpc/caller/wit/deps/rpc_ephemeral/ephemeral.wit @@ -0,0 +1,10 @@ +package rpc:ephemeral; + +interface api { + get-worker-name: func() -> string; + get-idempotency-key: func() -> string; +} + +world ephemeral { + export api; +} diff --git a/test-components/rpc/ephemeral-stub/Cargo.toml b/test-components/rpc/ephemeral-stub/Cargo.toml new file mode 100644 index 000000000..547b144b9 --- /dev/null +++ b/test-components/rpc/ephemeral-stub/Cargo.toml @@ -0,0 +1,39 @@ +[package] +name = "ephemeral-stub" +version = "0.0.1" +edition = "2021" + +[package.metadata.component] +package = "rpc:ephemeral" + +[package.metadata.component.target] +world = "wasm-rpc-stub-ephemeral" +path = "wit" + +[package.metadata.component.target.dependencies."golem:rpc"] +path = "wit/deps/wasm-rpc" + +[package.metadata.component.target.dependencies."rpc:ephemeral"] +path = "wit/deps/rpc_ephemeral" + +[package.metadata.component.target.dependencies."wasi:io"] +path = "wit/deps/io" + +[dependencies.golem-wasm-rpc] +path = "/Users/vigoo/projects/ziverge/wasm-rpc/wasm-rpc" +features = ["stub"] +default-features = false + +[dependencies.wit-bindgen-rt] +version = "0.26.0" +features = ["bitflags"] + +[lib] +path = "src/lib.rs" +crate-type = ["cdylib"] +required-features = [] + +[profile.release] +opt-level = "s" +lto = true +strip = true diff --git a/test-components/rpc/ephemeral-stub/src/bindings.rs b/test-components/rpc/ephemeral-stub/src/bindings.rs new file mode 100644 index 000000000..77ea974e6 --- /dev/null +++ b/test-components/rpc/ephemeral-stub/src/bindings.rs @@ -0,0 +1,3662 @@ +// Generated by `wit-bindgen` 0.25.0. DO NOT EDIT! +// Options used: +#[allow(dead_code)] +pub mod golem { + #[allow(dead_code)] + pub mod rpc { + #[allow(dead_code, clippy::all)] + pub mod types { + #[used] + #[doc(hidden)] + #[cfg(target_arch = "wasm32")] + static __FORCE_SECTION_REF: fn() = + super::super::super::__link_custom_section_describing_imports; + use super::super::super::_rt; + pub type Pollable = super::super::super::wasi::io::poll::Pollable; + pub type NodeIndex = i32; + #[derive(Clone)] + pub struct Uri { + pub value: _rt::String, + } + impl ::core::fmt::Debug for Uri { + fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { + f.debug_struct("Uri").field("value", &self.value).finish() + } + } + #[derive(Clone)] + pub enum WitNode { + RecordValue(_rt::Vec), + VariantValue((u32, Option)), + EnumValue(u32), + FlagsValue(_rt::Vec), + TupleValue(_rt::Vec), + ListValue(_rt::Vec), + OptionValue(Option), + ResultValue(Result, Option>), + PrimU8(u8), + PrimU16(u16), + PrimU32(u32), + PrimU64(u64), + PrimS8(i8), + PrimS16(i16), + PrimS32(i32), + PrimS64(i64), + PrimFloat32(f32), + PrimFloat64(f64), + PrimChar(char), + PrimBool(bool), + PrimString(_rt::String), + Handle((Uri, u64)), + } + impl ::core::fmt::Debug for WitNode { + fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { + match self { + WitNode::RecordValue(e) => { + f.debug_tuple("WitNode::RecordValue").field(e).finish() + } + WitNode::VariantValue(e) => { + f.debug_tuple("WitNode::VariantValue").field(e).finish() + } + WitNode::EnumValue(e) => { + f.debug_tuple("WitNode::EnumValue").field(e).finish() + } + WitNode::FlagsValue(e) => { + f.debug_tuple("WitNode::FlagsValue").field(e).finish() + } + WitNode::TupleValue(e) => { + f.debug_tuple("WitNode::TupleValue").field(e).finish() + } + WitNode::ListValue(e) => { + f.debug_tuple("WitNode::ListValue").field(e).finish() + } + WitNode::OptionValue(e) => { + f.debug_tuple("WitNode::OptionValue").field(e).finish() + } + WitNode::ResultValue(e) => { + f.debug_tuple("WitNode::ResultValue").field(e).finish() + } + WitNode::PrimU8(e) => f.debug_tuple("WitNode::PrimU8").field(e).finish(), + WitNode::PrimU16(e) => f.debug_tuple("WitNode::PrimU16").field(e).finish(), + WitNode::PrimU32(e) => f.debug_tuple("WitNode::PrimU32").field(e).finish(), + WitNode::PrimU64(e) => f.debug_tuple("WitNode::PrimU64").field(e).finish(), + WitNode::PrimS8(e) => f.debug_tuple("WitNode::PrimS8").field(e).finish(), + WitNode::PrimS16(e) => f.debug_tuple("WitNode::PrimS16").field(e).finish(), + WitNode::PrimS32(e) => f.debug_tuple("WitNode::PrimS32").field(e).finish(), + WitNode::PrimS64(e) => f.debug_tuple("WitNode::PrimS64").field(e).finish(), + WitNode::PrimFloat32(e) => { + f.debug_tuple("WitNode::PrimFloat32").field(e).finish() + } + WitNode::PrimFloat64(e) => { + f.debug_tuple("WitNode::PrimFloat64").field(e).finish() + } + WitNode::PrimChar(e) => { + f.debug_tuple("WitNode::PrimChar").field(e).finish() + } + WitNode::PrimBool(e) => { + f.debug_tuple("WitNode::PrimBool").field(e).finish() + } + WitNode::PrimString(e) => { + f.debug_tuple("WitNode::PrimString").field(e).finish() + } + WitNode::Handle(e) => f.debug_tuple("WitNode::Handle").field(e).finish(), + } + } + } + #[derive(Clone)] + pub struct WitValue { + pub nodes: _rt::Vec, + } + impl ::core::fmt::Debug for WitValue { + fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { + f.debug_struct("WitValue") + .field("nodes", &self.nodes) + .finish() + } + } + #[derive(Clone)] + pub enum RpcError { + ProtocolError(_rt::String), + Denied(_rt::String), + NotFound(_rt::String), + RemoteInternalError(_rt::String), + } + impl ::core::fmt::Debug for RpcError { + fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { + match self { + RpcError::ProtocolError(e) => { + f.debug_tuple("RpcError::ProtocolError").field(e).finish() + } + RpcError::Denied(e) => f.debug_tuple("RpcError::Denied").field(e).finish(), + RpcError::NotFound(e) => { + f.debug_tuple("RpcError::NotFound").field(e).finish() + } + RpcError::RemoteInternalError(e) => f + .debug_tuple("RpcError::RemoteInternalError") + .field(e) + .finish(), + } + } + } + impl ::core::fmt::Display for RpcError { + fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { + write!(f, "{:?}", self) + } + } + + impl std::error::Error for RpcError {} + + #[derive(Debug)] + #[repr(transparent)] + pub struct WasmRpc { + handle: _rt::Resource, + } + + impl WasmRpc { + #[doc(hidden)] + pub unsafe fn from_handle(handle: u32) -> Self { + Self { + handle: _rt::Resource::from_handle(handle), + } + } + + #[doc(hidden)] + pub fn take_handle(&self) -> u32 { + _rt::Resource::take_handle(&self.handle) + } + + #[doc(hidden)] + pub fn handle(&self) -> u32 { + _rt::Resource::handle(&self.handle) + } + } + + unsafe impl _rt::WasmResource for WasmRpc { + #[inline] + unsafe fn drop(_handle: u32) { + #[cfg(not(target_arch = "wasm32"))] + unreachable!(); + + #[cfg(target_arch = "wasm32")] + { + #[link(wasm_import_module = "golem:rpc/types@0.1.0")] + extern "C" { + #[link_name = "[resource-drop]wasm-rpc"] + fn drop(_: u32); + } + + drop(_handle); + } + } + } + + #[derive(Debug)] + #[repr(transparent)] + pub struct FutureInvokeResult { + handle: _rt::Resource, + } + + impl FutureInvokeResult { + #[doc(hidden)] + pub unsafe fn from_handle(handle: u32) -> Self { + Self { + handle: _rt::Resource::from_handle(handle), + } + } + + #[doc(hidden)] + pub fn take_handle(&self) -> u32 { + _rt::Resource::take_handle(&self.handle) + } + + #[doc(hidden)] + pub fn handle(&self) -> u32 { + _rt::Resource::handle(&self.handle) + } + } + + unsafe impl _rt::WasmResource for FutureInvokeResult { + #[inline] + unsafe fn drop(_handle: u32) { + #[cfg(not(target_arch = "wasm32"))] + unreachable!(); + + #[cfg(target_arch = "wasm32")] + { + #[link(wasm_import_module = "golem:rpc/types@0.1.0")] + extern "C" { + #[link_name = "[resource-drop]future-invoke-result"] + fn drop(_: u32); + } + + drop(_handle); + } + } + } + + impl WasmRpc { + #[allow(unused_unsafe, clippy::all)] + pub fn new(location: &Uri) -> Self { + unsafe { + let Uri { value: value0 } = location; + let vec1 = value0; + let ptr1 = vec1.as_ptr().cast::(); + let len1 = vec1.len(); + + #[cfg(target_arch = "wasm32")] + #[link(wasm_import_module = "golem:rpc/types@0.1.0")] + extern "C" { + #[link_name = "[constructor]wasm-rpc"] + fn wit_import(_: *mut u8, _: usize) -> i32; + } + + #[cfg(not(target_arch = "wasm32"))] + fn wit_import(_: *mut u8, _: usize) -> i32 { + unreachable!() + } + let ret = wit_import(ptr1.cast_mut(), len1); + WasmRpc::from_handle(ret as u32) + } + } + } + impl WasmRpc { + #[allow(unused_unsafe, clippy::all)] + pub fn invoke_and_await( + &self, + function_name: &str, + function_params: &[WitValue], + ) -> Result { + unsafe { + let mut cleanup_list = _rt::Vec::new(); + #[repr(align(4))] + struct RetArea([::core::mem::MaybeUninit; 16]); + let mut ret_area = RetArea([::core::mem::MaybeUninit::uninit(); 16]); + let vec0 = function_name; + let ptr0 = vec0.as_ptr().cast::(); + let len0 = vec0.len(); + let vec12 = function_params; + let len12 = vec12.len(); + let layout12 = + _rt::alloc::Layout::from_size_align_unchecked(vec12.len() * 8, 4); + let result12 = if layout12.size() != 0 { + let ptr = _rt::alloc::alloc(layout12).cast::(); + if ptr.is_null() { + _rt::alloc::handle_alloc_error(layout12); + } + ptr + } else { + { + ::core::ptr::null_mut() + } + }; + for (i, e) in vec12.into_iter().enumerate() { + let base = result12.add(i * 8); + { + let WitValue { nodes: nodes1 } = e; + let vec11 = nodes1; + let len11 = vec11.len(); + let layout11 = _rt::alloc::Layout::from_size_align_unchecked( + vec11.len() * 24, + 8, + ); + let result11 = if layout11.size() != 0 { + let ptr = _rt::alloc::alloc(layout11).cast::(); + if ptr.is_null() { + _rt::alloc::handle_alloc_error(layout11); + } + ptr + } else { + { + ::core::ptr::null_mut() + } + }; + for (i, e) in vec11.into_iter().enumerate() { + let base = result11.add(i * 24); + { + match e { + WitNode::RecordValue(e) => { + *base.add(0).cast::() = (0i32) as u8; + let vec2 = e; + let ptr2 = vec2.as_ptr().cast::(); + let len2 = vec2.len(); + *base.add(12).cast::() = len2; + *base.add(8).cast::<*mut u8>() = ptr2.cast_mut(); + } + WitNode::VariantValue(e) => { + *base.add(0).cast::() = (1i32) as u8; + let (t3_0, t3_1) = e; + *base.add(8).cast::() = _rt::as_i32(t3_0); + match t3_1 { + Some(e) => { + *base.add(12).cast::() = (1i32) as u8; + *base.add(16).cast::() = + _rt::as_i32(e); + } + None => { + *base.add(12).cast::() = (0i32) as u8; + } + }; + } + WitNode::EnumValue(e) => { + *base.add(0).cast::() = (2i32) as u8; + *base.add(8).cast::() = _rt::as_i32(e); + } + WitNode::FlagsValue(e) => { + *base.add(0).cast::() = (3i32) as u8; + let vec4 = e; + let len4 = vec4.len(); + let layout4 = + _rt::alloc::Layout::from_size_align_unchecked( + vec4.len() * 1, + 1, + ); + let result4 = if layout4.size() != 0 { + let ptr = + _rt::alloc::alloc(layout4).cast::(); + if ptr.is_null() { + _rt::alloc::handle_alloc_error(layout4); + } + ptr + } else { + { + ::core::ptr::null_mut() + } + }; + for (i, e) in vec4.into_iter().enumerate() { + let base = result4.add(i * 1); + { + *base.add(0).cast::() = (match e { + true => 1, + false => 0, + }) + as u8; + } + } + *base.add(12).cast::() = len4; + *base.add(8).cast::<*mut u8>() = result4; + cleanup_list + .extend_from_slice(&[(result4, layout4)]); + } + WitNode::TupleValue(e) => { + *base.add(0).cast::() = (4i32) as u8; + let vec5 = e; + let ptr5 = vec5.as_ptr().cast::(); + let len5 = vec5.len(); + *base.add(12).cast::() = len5; + *base.add(8).cast::<*mut u8>() = ptr5.cast_mut(); + } + WitNode::ListValue(e) => { + *base.add(0).cast::() = (5i32) as u8; + let vec6 = e; + let ptr6 = vec6.as_ptr().cast::(); + let len6 = vec6.len(); + *base.add(12).cast::() = len6; + *base.add(8).cast::<*mut u8>() = ptr6.cast_mut(); + } + WitNode::OptionValue(e) => { + *base.add(0).cast::() = (6i32) as u8; + match e { + Some(e) => { + *base.add(8).cast::() = (1i32) as u8; + *base.add(12).cast::() = + _rt::as_i32(e); + } + None => { + *base.add(8).cast::() = (0i32) as u8; + } + }; + } + WitNode::ResultValue(e) => { + *base.add(0).cast::() = (7i32) as u8; + match e { + Ok(e) => { + *base.add(8).cast::() = (0i32) as u8; + match e { + Some(e) => { + *base.add(12).cast::() = + (1i32) as u8; + *base.add(16).cast::() = + _rt::as_i32(e); + } + None => { + *base.add(12).cast::() = + (0i32) as u8; + } + }; + } + Err(e) => { + *base.add(8).cast::() = (1i32) as u8; + match e { + Some(e) => { + *base.add(12).cast::() = + (1i32) as u8; + *base.add(16).cast::() = + _rt::as_i32(e); + } + None => { + *base.add(12).cast::() = + (0i32) as u8; + } + }; + } + }; + } + WitNode::PrimU8(e) => { + *base.add(0).cast::() = (8i32) as u8; + *base.add(8).cast::() = (_rt::as_i32(e)) as u8; + } + WitNode::PrimU16(e) => { + *base.add(0).cast::() = (9i32) as u8; + *base.add(8).cast::() = + (_rt::as_i32(e)) as u16; + } + WitNode::PrimU32(e) => { + *base.add(0).cast::() = (10i32) as u8; + *base.add(8).cast::() = _rt::as_i32(e); + } + WitNode::PrimU64(e) => { + *base.add(0).cast::() = (11i32) as u8; + *base.add(8).cast::() = _rt::as_i64(e); + } + WitNode::PrimS8(e) => { + *base.add(0).cast::() = (12i32) as u8; + *base.add(8).cast::() = (_rt::as_i32(e)) as u8; + } + WitNode::PrimS16(e) => { + *base.add(0).cast::() = (13i32) as u8; + *base.add(8).cast::() = + (_rt::as_i32(e)) as u16; + } + WitNode::PrimS32(e) => { + *base.add(0).cast::() = (14i32) as u8; + *base.add(8).cast::() = _rt::as_i32(e); + } + WitNode::PrimS64(e) => { + *base.add(0).cast::() = (15i32) as u8; + *base.add(8).cast::() = _rt::as_i64(e); + } + WitNode::PrimFloat32(e) => { + *base.add(0).cast::() = (16i32) as u8; + *base.add(8).cast::() = _rt::as_f32(e); + } + WitNode::PrimFloat64(e) => { + *base.add(0).cast::() = (17i32) as u8; + *base.add(8).cast::() = _rt::as_f64(e); + } + WitNode::PrimChar(e) => { + *base.add(0).cast::() = (18i32) as u8; + *base.add(8).cast::() = _rt::as_i32(e); + } + WitNode::PrimBool(e) => { + *base.add(0).cast::() = (19i32) as u8; + *base.add(8).cast::() = (match e { + true => 1, + false => 0, + }) + as u8; + } + WitNode::PrimString(e) => { + *base.add(0).cast::() = (20i32) as u8; + let vec7 = e; + let ptr7 = vec7.as_ptr().cast::(); + let len7 = vec7.len(); + *base.add(12).cast::() = len7; + *base.add(8).cast::<*mut u8>() = ptr7.cast_mut(); + } + WitNode::Handle(e) => { + *base.add(0).cast::() = (21i32) as u8; + let (t8_0, t8_1) = e; + let Uri { value: value9 } = t8_0; + let vec10 = value9; + let ptr10 = vec10.as_ptr().cast::(); + let len10 = vec10.len(); + *base.add(12).cast::() = len10; + *base.add(8).cast::<*mut u8>() = ptr10.cast_mut(); + *base.add(16).cast::() = _rt::as_i64(t8_1); + } + } + } + } + *base.add(4).cast::() = len11; + *base.add(0).cast::<*mut u8>() = result11; + cleanup_list.extend_from_slice(&[(result11, layout11)]); + } + } + let ptr13 = ret_area.0.as_mut_ptr().cast::(); + #[cfg(target_arch = "wasm32")] + #[link(wasm_import_module = "golem:rpc/types@0.1.0")] + extern "C" { + #[link_name = "[method]wasm-rpc.invoke-and-await"] + fn wit_import( + _: i32, + _: *mut u8, + _: usize, + _: *mut u8, + _: usize, + _: *mut u8, + ); + } + + #[cfg(not(target_arch = "wasm32"))] + fn wit_import( + _: i32, + _: *mut u8, + _: usize, + _: *mut u8, + _: usize, + _: *mut u8, + ) { + unreachable!() + } + wit_import( + (self).handle() as i32, + ptr0.cast_mut(), + len0, + result12, + len12, + ptr13, + ); + let l14 = i32::from(*ptr13.add(0).cast::()); + if layout12.size() != 0 { + _rt::alloc::dealloc(result12.cast(), layout12); + } + for (ptr, layout) in cleanup_list { + if layout.size() != 0 { + _rt::alloc::dealloc(ptr.cast(), layout); + } + } + match l14 { + 0 => { + let e = { + let l15 = *ptr13.add(4).cast::<*mut u8>(); + let l16 = *ptr13.add(8).cast::(); + let base62 = l15; + let len62 = l16; + let mut result62 = _rt::Vec::with_capacity(len62); + for i in 0..len62 { + let base = base62.add(i * 24); + let e62 = { + let l17 = i32::from(*base.add(0).cast::()); + let v61 = match l17 { + 0 => { + let e61 = { + let l18 = *base.add(8).cast::<*mut u8>(); + let l19 = *base.add(12).cast::(); + let len20 = l19; + + _rt::Vec::from_raw_parts( + l18.cast(), + len20, + len20, + ) + }; + WitNode::RecordValue(e61) + } + 1 => { + let e61 = + { + let l21 = *base.add(8).cast::(); + let l22 = i32::from( + *base.add(12).cast::(), + ); + + (l21 as u32, match l22 { + 0 => None, + 1 => { + let e = { + let l23 = *base.add(16).cast::(); + + l23 + }; + Some(e) + } + _ => _rt::invalid_enum_discriminant(), + }) + }; + WitNode::VariantValue(e61) + } + 2 => { + let e61 = { + let l24 = *base.add(8).cast::(); + + l24 as u32 + }; + WitNode::EnumValue(e61) + } + 3 => { + let e61 = { + let l25 = *base.add(8).cast::<*mut u8>(); + let l26 = *base.add(12).cast::(); + let base28 = l25; + let len28 = l26; + let mut result28 = + _rt::Vec::with_capacity(len28); + for i in 0..len28 { + let base = base28.add(i * 1); + let e28 = { + let l27 = i32::from( + *base.add(0).cast::(), + ); + + _rt::bool_lift(l27 as u8) + }; + result28.push(e28); + } + _rt::cabi_dealloc(base28, len28 * 1, 1); + + result28 + }; + WitNode::FlagsValue(e61) + } + 4 => { + let e61 = { + let l29 = *base.add(8).cast::<*mut u8>(); + let l30 = *base.add(12).cast::(); + let len31 = l30; + + _rt::Vec::from_raw_parts( + l29.cast(), + len31, + len31, + ) + }; + WitNode::TupleValue(e61) + } + 5 => { + let e61 = { + let l32 = *base.add(8).cast::<*mut u8>(); + let l33 = *base.add(12).cast::(); + let len34 = l33; + + _rt::Vec::from_raw_parts( + l32.cast(), + len34, + len34, + ) + }; + WitNode::ListValue(e61) + } + 6 => { + let e61 = { + let l35 = + i32::from(*base.add(8).cast::()); + + match l35 { + 0 => None, + 1 => { + let e = { + let l36 = + *base.add(12).cast::(); + + l36 + }; + Some(e) + } + _ => _rt::invalid_enum_discriminant(), + } + }; + WitNode::OptionValue(e61) + } + 7 => { + let e61 = { + let l37 = + i32::from(*base.add(8).cast::()); + + match l37 { + 0 => { + let e = { + let l38 = i32::from( + *base.add(12).cast::(), + ); + + match l38 { + 0 => None, + 1 => { + let e = { + let l39 = *base.add(16).cast::(); + + l39 + }; + Some(e) + } + _ => _rt::invalid_enum_discriminant(), + } + }; + Ok(e) + } + 1 => { + let e = { + let l40 = i32::from( + *base.add(12).cast::(), + ); + + match l40 { + 0 => None, + 1 => { + let e = { + let l41 = *base.add(16).cast::(); + + l41 + }; + Some(e) + } + _ => _rt::invalid_enum_discriminant(), + } + }; + Err(e) + } + _ => _rt::invalid_enum_discriminant(), + } + }; + WitNode::ResultValue(e61) + } + 8 => { + let e61 = { + let l42 = + i32::from(*base.add(8).cast::()); + + l42 as u8 + }; + WitNode::PrimU8(e61) + } + 9 => { + let e61 = { + let l43 = + i32::from(*base.add(8).cast::()); + + l43 as u16 + }; + WitNode::PrimU16(e61) + } + 10 => { + let e61 = { + let l44 = *base.add(8).cast::(); + + l44 as u32 + }; + WitNode::PrimU32(e61) + } + 11 => { + let e61 = { + let l45 = *base.add(8).cast::(); + + l45 as u64 + }; + WitNode::PrimU64(e61) + } + 12 => { + let e61 = { + let l46 = + i32::from(*base.add(8).cast::()); + + l46 as i8 + }; + WitNode::PrimS8(e61) + } + 13 => { + let e61 = { + let l47 = + i32::from(*base.add(8).cast::()); + + l47 as i16 + }; + WitNode::PrimS16(e61) + } + 14 => { + let e61 = { + let l48 = *base.add(8).cast::(); + + l48 + }; + WitNode::PrimS32(e61) + } + 15 => { + let e61 = { + let l49 = *base.add(8).cast::(); + + l49 + }; + WitNode::PrimS64(e61) + } + 16 => { + let e61 = { + let l50 = *base.add(8).cast::(); + + l50 + }; + WitNode::PrimFloat32(e61) + } + 17 => { + let e61 = { + let l51 = *base.add(8).cast::(); + + l51 + }; + WitNode::PrimFloat64(e61) + } + 18 => { + let e61 = { + let l52 = *base.add(8).cast::(); + + _rt::char_lift(l52 as u32) + }; + WitNode::PrimChar(e61) + } + 19 => { + let e61 = { + let l53 = + i32::from(*base.add(8).cast::()); + + _rt::bool_lift(l53 as u8) + }; + WitNode::PrimBool(e61) + } + 20 => { + let e61 = { + let l54 = *base.add(8).cast::<*mut u8>(); + let l55 = *base.add(12).cast::(); + let len56 = l55; + let bytes56 = _rt::Vec::from_raw_parts( + l54.cast(), + len56, + len56, + ); + + _rt::string_lift(bytes56) + }; + WitNode::PrimString(e61) + } + n => { + debug_assert_eq!( + n, 21, + "invalid enum discriminant" + ); + let e61 = { + let l57 = *base.add(8).cast::<*mut u8>(); + let l58 = *base.add(12).cast::(); + let len59 = l58; + let bytes59 = _rt::Vec::from_raw_parts( + l57.cast(), + len59, + len59, + ); + let l60 = *base.add(16).cast::(); + + ( + Uri { + value: _rt::string_lift(bytes59), + }, + l60 as u64, + ) + }; + WitNode::Handle(e61) + } + }; + + v61 + }; + result62.push(e62); + } + _rt::cabi_dealloc(base62, len62 * 24, 8); + + WitValue { nodes: result62 } + }; + Ok(e) + } + 1 => { + let e = { + let l63 = i32::from(*ptr13.add(4).cast::()); + let v76 = match l63 { + 0 => { + let e76 = { + let l64 = *ptr13.add(8).cast::<*mut u8>(); + let l65 = *ptr13.add(12).cast::(); + let len66 = l65; + let bytes66 = _rt::Vec::from_raw_parts( + l64.cast(), + len66, + len66, + ); + + _rt::string_lift(bytes66) + }; + RpcError::ProtocolError(e76) + } + 1 => { + let e76 = { + let l67 = *ptr13.add(8).cast::<*mut u8>(); + let l68 = *ptr13.add(12).cast::(); + let len69 = l68; + let bytes69 = _rt::Vec::from_raw_parts( + l67.cast(), + len69, + len69, + ); + + _rt::string_lift(bytes69) + }; + RpcError::Denied(e76) + } + 2 => { + let e76 = { + let l70 = *ptr13.add(8).cast::<*mut u8>(); + let l71 = *ptr13.add(12).cast::(); + let len72 = l71; + let bytes72 = _rt::Vec::from_raw_parts( + l70.cast(), + len72, + len72, + ); + + _rt::string_lift(bytes72) + }; + RpcError::NotFound(e76) + } + n => { + debug_assert_eq!(n, 3, "invalid enum discriminant"); + let e76 = { + let l73 = *ptr13.add(8).cast::<*mut u8>(); + let l74 = *ptr13.add(12).cast::(); + let len75 = l74; + let bytes75 = _rt::Vec::from_raw_parts( + l73.cast(), + len75, + len75, + ); + + _rt::string_lift(bytes75) + }; + RpcError::RemoteInternalError(e76) + } + }; + + v76 + }; + Err(e) + } + _ => _rt::invalid_enum_discriminant(), + } + } + } + } + impl WasmRpc { + #[allow(unused_unsafe, clippy::all)] + pub fn invoke( + &self, + function_name: &str, + function_params: &[WitValue], + ) -> Result<(), RpcError> { + unsafe { + let mut cleanup_list = _rt::Vec::new(); + #[repr(align(4))] + struct RetArea([::core::mem::MaybeUninit; 16]); + let mut ret_area = RetArea([::core::mem::MaybeUninit::uninit(); 16]); + let vec0 = function_name; + let ptr0 = vec0.as_ptr().cast::(); + let len0 = vec0.len(); + let vec12 = function_params; + let len12 = vec12.len(); + let layout12 = + _rt::alloc::Layout::from_size_align_unchecked(vec12.len() * 8, 4); + let result12 = if layout12.size() != 0 { + let ptr = _rt::alloc::alloc(layout12).cast::(); + if ptr.is_null() { + _rt::alloc::handle_alloc_error(layout12); + } + ptr + } else { + { + ::core::ptr::null_mut() + } + }; + for (i, e) in vec12.into_iter().enumerate() { + let base = result12.add(i * 8); + { + let WitValue { nodes: nodes1 } = e; + let vec11 = nodes1; + let len11 = vec11.len(); + let layout11 = _rt::alloc::Layout::from_size_align_unchecked( + vec11.len() * 24, + 8, + ); + let result11 = if layout11.size() != 0 { + let ptr = _rt::alloc::alloc(layout11).cast::(); + if ptr.is_null() { + _rt::alloc::handle_alloc_error(layout11); + } + ptr + } else { + { + ::core::ptr::null_mut() + } + }; + for (i, e) in vec11.into_iter().enumerate() { + let base = result11.add(i * 24); + { + match e { + WitNode::RecordValue(e) => { + *base.add(0).cast::() = (0i32) as u8; + let vec2 = e; + let ptr2 = vec2.as_ptr().cast::(); + let len2 = vec2.len(); + *base.add(12).cast::() = len2; + *base.add(8).cast::<*mut u8>() = ptr2.cast_mut(); + } + WitNode::VariantValue(e) => { + *base.add(0).cast::() = (1i32) as u8; + let (t3_0, t3_1) = e; + *base.add(8).cast::() = _rt::as_i32(t3_0); + match t3_1 { + Some(e) => { + *base.add(12).cast::() = (1i32) as u8; + *base.add(16).cast::() = + _rt::as_i32(e); + } + None => { + *base.add(12).cast::() = (0i32) as u8; + } + }; + } + WitNode::EnumValue(e) => { + *base.add(0).cast::() = (2i32) as u8; + *base.add(8).cast::() = _rt::as_i32(e); + } + WitNode::FlagsValue(e) => { + *base.add(0).cast::() = (3i32) as u8; + let vec4 = e; + let len4 = vec4.len(); + let layout4 = + _rt::alloc::Layout::from_size_align_unchecked( + vec4.len() * 1, + 1, + ); + let result4 = if layout4.size() != 0 { + let ptr = + _rt::alloc::alloc(layout4).cast::(); + if ptr.is_null() { + _rt::alloc::handle_alloc_error(layout4); + } + ptr + } else { + { + ::core::ptr::null_mut() + } + }; + for (i, e) in vec4.into_iter().enumerate() { + let base = result4.add(i * 1); + { + *base.add(0).cast::() = (match e { + true => 1, + false => 0, + }) + as u8; + } + } + *base.add(12).cast::() = len4; + *base.add(8).cast::<*mut u8>() = result4; + cleanup_list + .extend_from_slice(&[(result4, layout4)]); + } + WitNode::TupleValue(e) => { + *base.add(0).cast::() = (4i32) as u8; + let vec5 = e; + let ptr5 = vec5.as_ptr().cast::(); + let len5 = vec5.len(); + *base.add(12).cast::() = len5; + *base.add(8).cast::<*mut u8>() = ptr5.cast_mut(); + } + WitNode::ListValue(e) => { + *base.add(0).cast::() = (5i32) as u8; + let vec6 = e; + let ptr6 = vec6.as_ptr().cast::(); + let len6 = vec6.len(); + *base.add(12).cast::() = len6; + *base.add(8).cast::<*mut u8>() = ptr6.cast_mut(); + } + WitNode::OptionValue(e) => { + *base.add(0).cast::() = (6i32) as u8; + match e { + Some(e) => { + *base.add(8).cast::() = (1i32) as u8; + *base.add(12).cast::() = + _rt::as_i32(e); + } + None => { + *base.add(8).cast::() = (0i32) as u8; + } + }; + } + WitNode::ResultValue(e) => { + *base.add(0).cast::() = (7i32) as u8; + match e { + Ok(e) => { + *base.add(8).cast::() = (0i32) as u8; + match e { + Some(e) => { + *base.add(12).cast::() = + (1i32) as u8; + *base.add(16).cast::() = + _rt::as_i32(e); + } + None => { + *base.add(12).cast::() = + (0i32) as u8; + } + }; + } + Err(e) => { + *base.add(8).cast::() = (1i32) as u8; + match e { + Some(e) => { + *base.add(12).cast::() = + (1i32) as u8; + *base.add(16).cast::() = + _rt::as_i32(e); + } + None => { + *base.add(12).cast::() = + (0i32) as u8; + } + }; + } + }; + } + WitNode::PrimU8(e) => { + *base.add(0).cast::() = (8i32) as u8; + *base.add(8).cast::() = (_rt::as_i32(e)) as u8; + } + WitNode::PrimU16(e) => { + *base.add(0).cast::() = (9i32) as u8; + *base.add(8).cast::() = + (_rt::as_i32(e)) as u16; + } + WitNode::PrimU32(e) => { + *base.add(0).cast::() = (10i32) as u8; + *base.add(8).cast::() = _rt::as_i32(e); + } + WitNode::PrimU64(e) => { + *base.add(0).cast::() = (11i32) as u8; + *base.add(8).cast::() = _rt::as_i64(e); + } + WitNode::PrimS8(e) => { + *base.add(0).cast::() = (12i32) as u8; + *base.add(8).cast::() = (_rt::as_i32(e)) as u8; + } + WitNode::PrimS16(e) => { + *base.add(0).cast::() = (13i32) as u8; + *base.add(8).cast::() = + (_rt::as_i32(e)) as u16; + } + WitNode::PrimS32(e) => { + *base.add(0).cast::() = (14i32) as u8; + *base.add(8).cast::() = _rt::as_i32(e); + } + WitNode::PrimS64(e) => { + *base.add(0).cast::() = (15i32) as u8; + *base.add(8).cast::() = _rt::as_i64(e); + } + WitNode::PrimFloat32(e) => { + *base.add(0).cast::() = (16i32) as u8; + *base.add(8).cast::() = _rt::as_f32(e); + } + WitNode::PrimFloat64(e) => { + *base.add(0).cast::() = (17i32) as u8; + *base.add(8).cast::() = _rt::as_f64(e); + } + WitNode::PrimChar(e) => { + *base.add(0).cast::() = (18i32) as u8; + *base.add(8).cast::() = _rt::as_i32(e); + } + WitNode::PrimBool(e) => { + *base.add(0).cast::() = (19i32) as u8; + *base.add(8).cast::() = (match e { + true => 1, + false => 0, + }) + as u8; + } + WitNode::PrimString(e) => { + *base.add(0).cast::() = (20i32) as u8; + let vec7 = e; + let ptr7 = vec7.as_ptr().cast::(); + let len7 = vec7.len(); + *base.add(12).cast::() = len7; + *base.add(8).cast::<*mut u8>() = ptr7.cast_mut(); + } + WitNode::Handle(e) => { + *base.add(0).cast::() = (21i32) as u8; + let (t8_0, t8_1) = e; + let Uri { value: value9 } = t8_0; + let vec10 = value9; + let ptr10 = vec10.as_ptr().cast::(); + let len10 = vec10.len(); + *base.add(12).cast::() = len10; + *base.add(8).cast::<*mut u8>() = ptr10.cast_mut(); + *base.add(16).cast::() = _rt::as_i64(t8_1); + } + } + } + } + *base.add(4).cast::() = len11; + *base.add(0).cast::<*mut u8>() = result11; + cleanup_list.extend_from_slice(&[(result11, layout11)]); + } + } + let ptr13 = ret_area.0.as_mut_ptr().cast::(); + #[cfg(target_arch = "wasm32")] + #[link(wasm_import_module = "golem:rpc/types@0.1.0")] + extern "C" { + #[link_name = "[method]wasm-rpc.invoke"] + fn wit_import( + _: i32, + _: *mut u8, + _: usize, + _: *mut u8, + _: usize, + _: *mut u8, + ); + } + + #[cfg(not(target_arch = "wasm32"))] + fn wit_import( + _: i32, + _: *mut u8, + _: usize, + _: *mut u8, + _: usize, + _: *mut u8, + ) { + unreachable!() + } + wit_import( + (self).handle() as i32, + ptr0.cast_mut(), + len0, + result12, + len12, + ptr13, + ); + let l14 = i32::from(*ptr13.add(0).cast::()); + if layout12.size() != 0 { + _rt::alloc::dealloc(result12.cast(), layout12); + } + for (ptr, layout) in cleanup_list { + if layout.size() != 0 { + _rt::alloc::dealloc(ptr.cast(), layout); + } + } + match l14 { + 0 => { + let e = (); + Ok(e) + } + 1 => { + let e = { + let l15 = i32::from(*ptr13.add(4).cast::()); + let v28 = match l15 { + 0 => { + let e28 = { + let l16 = *ptr13.add(8).cast::<*mut u8>(); + let l17 = *ptr13.add(12).cast::(); + let len18 = l17; + let bytes18 = _rt::Vec::from_raw_parts( + l16.cast(), + len18, + len18, + ); + + _rt::string_lift(bytes18) + }; + RpcError::ProtocolError(e28) + } + 1 => { + let e28 = { + let l19 = *ptr13.add(8).cast::<*mut u8>(); + let l20 = *ptr13.add(12).cast::(); + let len21 = l20; + let bytes21 = _rt::Vec::from_raw_parts( + l19.cast(), + len21, + len21, + ); + + _rt::string_lift(bytes21) + }; + RpcError::Denied(e28) + } + 2 => { + let e28 = { + let l22 = *ptr13.add(8).cast::<*mut u8>(); + let l23 = *ptr13.add(12).cast::(); + let len24 = l23; + let bytes24 = _rt::Vec::from_raw_parts( + l22.cast(), + len24, + len24, + ); + + _rt::string_lift(bytes24) + }; + RpcError::NotFound(e28) + } + n => { + debug_assert_eq!(n, 3, "invalid enum discriminant"); + let e28 = { + let l25 = *ptr13.add(8).cast::<*mut u8>(); + let l26 = *ptr13.add(12).cast::(); + let len27 = l26; + let bytes27 = _rt::Vec::from_raw_parts( + l25.cast(), + len27, + len27, + ); + + _rt::string_lift(bytes27) + }; + RpcError::RemoteInternalError(e28) + } + }; + + v28 + }; + Err(e) + } + _ => _rt::invalid_enum_discriminant(), + } + } + } + } + impl WasmRpc { + #[allow(unused_unsafe, clippy::all)] + pub fn async_invoke_and_await( + &self, + function_name: &str, + function_params: &[WitValue], + ) -> FutureInvokeResult { + unsafe { + let mut cleanup_list = _rt::Vec::new(); + let vec0 = function_name; + let ptr0 = vec0.as_ptr().cast::(); + let len0 = vec0.len(); + let vec12 = function_params; + let len12 = vec12.len(); + let layout12 = + _rt::alloc::Layout::from_size_align_unchecked(vec12.len() * 8, 4); + let result12 = if layout12.size() != 0 { + let ptr = _rt::alloc::alloc(layout12).cast::(); + if ptr.is_null() { + _rt::alloc::handle_alloc_error(layout12); + } + ptr + } else { + { + ::core::ptr::null_mut() + } + }; + for (i, e) in vec12.into_iter().enumerate() { + let base = result12.add(i * 8); + { + let WitValue { nodes: nodes1 } = e; + let vec11 = nodes1; + let len11 = vec11.len(); + let layout11 = _rt::alloc::Layout::from_size_align_unchecked( + vec11.len() * 24, + 8, + ); + let result11 = if layout11.size() != 0 { + let ptr = _rt::alloc::alloc(layout11).cast::(); + if ptr.is_null() { + _rt::alloc::handle_alloc_error(layout11); + } + ptr + } else { + { + ::core::ptr::null_mut() + } + }; + for (i, e) in vec11.into_iter().enumerate() { + let base = result11.add(i * 24); + { + match e { + WitNode::RecordValue(e) => { + *base.add(0).cast::() = (0i32) as u8; + let vec2 = e; + let ptr2 = vec2.as_ptr().cast::(); + let len2 = vec2.len(); + *base.add(12).cast::() = len2; + *base.add(8).cast::<*mut u8>() = ptr2.cast_mut(); + } + WitNode::VariantValue(e) => { + *base.add(0).cast::() = (1i32) as u8; + let (t3_0, t3_1) = e; + *base.add(8).cast::() = _rt::as_i32(t3_0); + match t3_1 { + Some(e) => { + *base.add(12).cast::() = (1i32) as u8; + *base.add(16).cast::() = + _rt::as_i32(e); + } + None => { + *base.add(12).cast::() = (0i32) as u8; + } + }; + } + WitNode::EnumValue(e) => { + *base.add(0).cast::() = (2i32) as u8; + *base.add(8).cast::() = _rt::as_i32(e); + } + WitNode::FlagsValue(e) => { + *base.add(0).cast::() = (3i32) as u8; + let vec4 = e; + let len4 = vec4.len(); + let layout4 = + _rt::alloc::Layout::from_size_align_unchecked( + vec4.len() * 1, + 1, + ); + let result4 = if layout4.size() != 0 { + let ptr = + _rt::alloc::alloc(layout4).cast::(); + if ptr.is_null() { + _rt::alloc::handle_alloc_error(layout4); + } + ptr + } else { + { + ::core::ptr::null_mut() + } + }; + for (i, e) in vec4.into_iter().enumerate() { + let base = result4.add(i * 1); + { + *base.add(0).cast::() = (match e { + true => 1, + false => 0, + }) + as u8; + } + } + *base.add(12).cast::() = len4; + *base.add(8).cast::<*mut u8>() = result4; + cleanup_list + .extend_from_slice(&[(result4, layout4)]); + } + WitNode::TupleValue(e) => { + *base.add(0).cast::() = (4i32) as u8; + let vec5 = e; + let ptr5 = vec5.as_ptr().cast::(); + let len5 = vec5.len(); + *base.add(12).cast::() = len5; + *base.add(8).cast::<*mut u8>() = ptr5.cast_mut(); + } + WitNode::ListValue(e) => { + *base.add(0).cast::() = (5i32) as u8; + let vec6 = e; + let ptr6 = vec6.as_ptr().cast::(); + let len6 = vec6.len(); + *base.add(12).cast::() = len6; + *base.add(8).cast::<*mut u8>() = ptr6.cast_mut(); + } + WitNode::OptionValue(e) => { + *base.add(0).cast::() = (6i32) as u8; + match e { + Some(e) => { + *base.add(8).cast::() = (1i32) as u8; + *base.add(12).cast::() = + _rt::as_i32(e); + } + None => { + *base.add(8).cast::() = (0i32) as u8; + } + }; + } + WitNode::ResultValue(e) => { + *base.add(0).cast::() = (7i32) as u8; + match e { + Ok(e) => { + *base.add(8).cast::() = (0i32) as u8; + match e { + Some(e) => { + *base.add(12).cast::() = + (1i32) as u8; + *base.add(16).cast::() = + _rt::as_i32(e); + } + None => { + *base.add(12).cast::() = + (0i32) as u8; + } + }; + } + Err(e) => { + *base.add(8).cast::() = (1i32) as u8; + match e { + Some(e) => { + *base.add(12).cast::() = + (1i32) as u8; + *base.add(16).cast::() = + _rt::as_i32(e); + } + None => { + *base.add(12).cast::() = + (0i32) as u8; + } + }; + } + }; + } + WitNode::PrimU8(e) => { + *base.add(0).cast::() = (8i32) as u8; + *base.add(8).cast::() = (_rt::as_i32(e)) as u8; + } + WitNode::PrimU16(e) => { + *base.add(0).cast::() = (9i32) as u8; + *base.add(8).cast::() = + (_rt::as_i32(e)) as u16; + } + WitNode::PrimU32(e) => { + *base.add(0).cast::() = (10i32) as u8; + *base.add(8).cast::() = _rt::as_i32(e); + } + WitNode::PrimU64(e) => { + *base.add(0).cast::() = (11i32) as u8; + *base.add(8).cast::() = _rt::as_i64(e); + } + WitNode::PrimS8(e) => { + *base.add(0).cast::() = (12i32) as u8; + *base.add(8).cast::() = (_rt::as_i32(e)) as u8; + } + WitNode::PrimS16(e) => { + *base.add(0).cast::() = (13i32) as u8; + *base.add(8).cast::() = + (_rt::as_i32(e)) as u16; + } + WitNode::PrimS32(e) => { + *base.add(0).cast::() = (14i32) as u8; + *base.add(8).cast::() = _rt::as_i32(e); + } + WitNode::PrimS64(e) => { + *base.add(0).cast::() = (15i32) as u8; + *base.add(8).cast::() = _rt::as_i64(e); + } + WitNode::PrimFloat32(e) => { + *base.add(0).cast::() = (16i32) as u8; + *base.add(8).cast::() = _rt::as_f32(e); + } + WitNode::PrimFloat64(e) => { + *base.add(0).cast::() = (17i32) as u8; + *base.add(8).cast::() = _rt::as_f64(e); + } + WitNode::PrimChar(e) => { + *base.add(0).cast::() = (18i32) as u8; + *base.add(8).cast::() = _rt::as_i32(e); + } + WitNode::PrimBool(e) => { + *base.add(0).cast::() = (19i32) as u8; + *base.add(8).cast::() = (match e { + true => 1, + false => 0, + }) + as u8; + } + WitNode::PrimString(e) => { + *base.add(0).cast::() = (20i32) as u8; + let vec7 = e; + let ptr7 = vec7.as_ptr().cast::(); + let len7 = vec7.len(); + *base.add(12).cast::() = len7; + *base.add(8).cast::<*mut u8>() = ptr7.cast_mut(); + } + WitNode::Handle(e) => { + *base.add(0).cast::() = (21i32) as u8; + let (t8_0, t8_1) = e; + let Uri { value: value9 } = t8_0; + let vec10 = value9; + let ptr10 = vec10.as_ptr().cast::(); + let len10 = vec10.len(); + *base.add(12).cast::() = len10; + *base.add(8).cast::<*mut u8>() = ptr10.cast_mut(); + *base.add(16).cast::() = _rt::as_i64(t8_1); + } + } + } + } + *base.add(4).cast::() = len11; + *base.add(0).cast::<*mut u8>() = result11; + cleanup_list.extend_from_slice(&[(result11, layout11)]); + } + } + + #[cfg(target_arch = "wasm32")] + #[link(wasm_import_module = "golem:rpc/types@0.1.0")] + extern "C" { + #[link_name = "[method]wasm-rpc.async-invoke-and-await"] + fn wit_import( + _: i32, + _: *mut u8, + _: usize, + _: *mut u8, + _: usize, + ) -> i32; + } + + #[cfg(not(target_arch = "wasm32"))] + fn wit_import(_: i32, _: *mut u8, _: usize, _: *mut u8, _: usize) -> i32 { + unreachable!() + } + let ret = wit_import( + (self).handle() as i32, + ptr0.cast_mut(), + len0, + result12, + len12, + ); + if layout12.size() != 0 { + _rt::alloc::dealloc(result12.cast(), layout12); + } + for (ptr, layout) in cleanup_list { + if layout.size() != 0 { + _rt::alloc::dealloc(ptr.cast(), layout); + } + } + FutureInvokeResult::from_handle(ret as u32) + } + } + } + impl FutureInvokeResult { + #[allow(unused_unsafe, clippy::all)] + pub fn subscribe(&self) -> Pollable { + unsafe { + #[cfg(target_arch = "wasm32")] + #[link(wasm_import_module = "golem:rpc/types@0.1.0")] + extern "C" { + #[link_name = "[method]future-invoke-result.subscribe"] + fn wit_import(_: i32) -> i32; + } + + #[cfg(not(target_arch = "wasm32"))] + fn wit_import(_: i32) -> i32 { + unreachable!() + } + let ret = wit_import((self).handle() as i32); + super::super::super::wasi::io::poll::Pollable::from_handle(ret as u32) + } + } + } + impl FutureInvokeResult { + #[allow(unused_unsafe, clippy::all)] + pub fn get(&self) -> Option> { + unsafe { + #[repr(align(4))] + struct RetArea([::core::mem::MaybeUninit; 20]); + let mut ret_area = RetArea([::core::mem::MaybeUninit::uninit(); 20]); + let ptr0 = ret_area.0.as_mut_ptr().cast::(); + #[cfg(target_arch = "wasm32")] + #[link(wasm_import_module = "golem:rpc/types@0.1.0")] + extern "C" { + #[link_name = "[method]future-invoke-result.get"] + fn wit_import(_: i32, _: *mut u8); + } + + #[cfg(not(target_arch = "wasm32"))] + fn wit_import(_: i32, _: *mut u8) { + unreachable!() + } + wit_import((self).handle() as i32, ptr0); + let l1 = i32::from(*ptr0.add(0).cast::()); + match l1 { + 0 => None, + 1 => { + let e = { + let l2 = i32::from(*ptr0.add(4).cast::()); + + match l2 { + 0 => { + let e = { + let l3 = *ptr0.add(8).cast::<*mut u8>(); + let l4 = *ptr0.add(12).cast::(); + let base50 = l3; + let len50 = l4; + let mut result50 = _rt::Vec::with_capacity(len50); + for i in 0..len50 { + let base = base50.add(i * 24); + let e50 = { + let l5 = + i32::from(*base.add(0).cast::()); + let v49 = match l5 { + 0 => { + let e49 = { + let l6 = *base + .add(8) + .cast::<*mut u8>(); + let l7 = *base + .add(12) + .cast::(); + let len8 = l7; + + _rt::Vec::from_raw_parts( + l6.cast(), + len8, + len8, + ) + }; + WitNode::RecordValue(e49) + } + 1 => { + let e49 = { + let l9 = + *base.add(8).cast::(); + let l10 = i32::from( + *base.add(12).cast::(), + ); + + (l9 as u32, match l10 { + 0 => None, + 1 => { + let e = { + let l11 = *base.add(16).cast::(); + + l11 + }; + Some(e) + } + _ => _rt::invalid_enum_discriminant(), + }) + }; + WitNode::VariantValue(e49) + } + 2 => { + let e49 = { + let l12 = + *base.add(8).cast::(); + + l12 as u32 + }; + WitNode::EnumValue(e49) + } + 3 => { + let e49 = { + let l13 = *base + .add(8) + .cast::<*mut u8>(); + let l14 = *base + .add(12) + .cast::(); + let base16 = l13; + let len16 = l14; + let mut result16 = + _rt::Vec::with_capacity( + len16, + ); + for i in 0..len16 { + let base = + base16.add(i * 1); + let e16 = { + let l15 = i32::from( + *base + .add(0) + .cast::(), + ); + + _rt::bool_lift( + l15 as u8, + ) + }; + result16.push(e16); + } + _rt::cabi_dealloc( + base16, + len16 * 1, + 1, + ); + + result16 + }; + WitNode::FlagsValue(e49) + } + 4 => { + let e49 = { + let l17 = *base + .add(8) + .cast::<*mut u8>(); + let l18 = *base + .add(12) + .cast::(); + let len19 = l18; + + _rt::Vec::from_raw_parts( + l17.cast(), + len19, + len19, + ) + }; + WitNode::TupleValue(e49) + } + 5 => { + let e49 = { + let l20 = *base + .add(8) + .cast::<*mut u8>(); + let l21 = *base + .add(12) + .cast::(); + let len22 = l21; + + _rt::Vec::from_raw_parts( + l20.cast(), + len22, + len22, + ) + }; + WitNode::ListValue(e49) + } + 6 => { + let e49 = { + let l23 = i32::from( + *base.add(8).cast::(), + ); + + match l23 { + 0 => None, + 1 => { + let e = { + let l24 = *base.add(12).cast::(); + + l24 + }; + Some(e) + } + _ => _rt::invalid_enum_discriminant(), + } + }; + WitNode::OptionValue(e49) + } + 7 => { + let e49 = { + let l25 = i32::from( + *base.add(8).cast::(), + ); + + match l25 { + 0 => { + let e = { + let l26 = i32::from(*base.add(12).cast::()); + + match l26 { + 0 => None, + 1 => { + let e = { + let l27 = *base.add(16).cast::(); + + l27 + }; + Some(e) + } + _ => _rt::invalid_enum_discriminant(), + } + }; + Ok(e) + } + 1 => { + let e = { + let l28 = i32::from(*base.add(12).cast::()); + + match l28 { + 0 => None, + 1 => { + let e = { + let l29 = *base.add(16).cast::(); + + l29 + }; + Some(e) + } + _ => _rt::invalid_enum_discriminant(), + } + }; + Err(e) + } + _ => _rt::invalid_enum_discriminant(), + } + }; + WitNode::ResultValue(e49) + } + 8 => { + let e49 = { + let l30 = i32::from( + *base.add(8).cast::(), + ); + + l30 as u8 + }; + WitNode::PrimU8(e49) + } + 9 => { + let e49 = { + let l31 = i32::from( + *base.add(8).cast::(), + ); + + l31 as u16 + }; + WitNode::PrimU16(e49) + } + 10 => { + let e49 = { + let l32 = + *base.add(8).cast::(); + + l32 as u32 + }; + WitNode::PrimU32(e49) + } + 11 => { + let e49 = { + let l33 = + *base.add(8).cast::(); + + l33 as u64 + }; + WitNode::PrimU64(e49) + } + 12 => { + let e49 = { + let l34 = i32::from( + *base.add(8).cast::(), + ); + + l34 as i8 + }; + WitNode::PrimS8(e49) + } + 13 => { + let e49 = { + let l35 = i32::from( + *base.add(8).cast::(), + ); + + l35 as i16 + }; + WitNode::PrimS16(e49) + } + 14 => { + let e49 = { + let l36 = + *base.add(8).cast::(); + + l36 + }; + WitNode::PrimS32(e49) + } + 15 => { + let e49 = { + let l37 = + *base.add(8).cast::(); + + l37 + }; + WitNode::PrimS64(e49) + } + 16 => { + let e49 = { + let l38 = + *base.add(8).cast::(); + + l38 + }; + WitNode::PrimFloat32(e49) + } + 17 => { + let e49 = { + let l39 = + *base.add(8).cast::(); + + l39 + }; + WitNode::PrimFloat64(e49) + } + 18 => { + let e49 = { + let l40 = + *base.add(8).cast::(); + + _rt::char_lift(l40 as u32) + }; + WitNode::PrimChar(e49) + } + 19 => { + let e49 = { + let l41 = i32::from( + *base.add(8).cast::(), + ); + + _rt::bool_lift(l41 as u8) + }; + WitNode::PrimBool(e49) + } + 20 => { + let e49 = { + let l42 = *base + .add(8) + .cast::<*mut u8>(); + let l43 = *base + .add(12) + .cast::(); + let len44 = l43; + let bytes44 = + _rt::Vec::from_raw_parts( + l42.cast(), + len44, + len44, + ); + + _rt::string_lift(bytes44) + }; + WitNode::PrimString(e49) + } + n => { + debug_assert_eq!( + n, 21, + "invalid enum discriminant" + ); + let e49 = { + let l45 = *base + .add(8) + .cast::<*mut u8>(); + let l46 = *base + .add(12) + .cast::(); + let len47 = l46; + let bytes47 = + _rt::Vec::from_raw_parts( + l45.cast(), + len47, + len47, + ); + let l48 = + *base.add(16).cast::(); + + ( + Uri { + value: _rt::string_lift( + bytes47, + ), + }, + l48 as u64, + ) + }; + WitNode::Handle(e49) + } + }; + + v49 + }; + result50.push(e50); + } + _rt::cabi_dealloc(base50, len50 * 24, 8); + + WitValue { nodes: result50 } + }; + Ok(e) + } + 1 => { + let e = { + let l51 = i32::from(*ptr0.add(8).cast::()); + let v64 = match l51 { + 0 => { + let e64 = { + let l52 = + *ptr0.add(12).cast::<*mut u8>(); + let l53 = *ptr0.add(16).cast::(); + let len54 = l53; + let bytes54 = _rt::Vec::from_raw_parts( + l52.cast(), + len54, + len54, + ); + + _rt::string_lift(bytes54) + }; + RpcError::ProtocolError(e64) + } + 1 => { + let e64 = { + let l55 = + *ptr0.add(12).cast::<*mut u8>(); + let l56 = *ptr0.add(16).cast::(); + let len57 = l56; + let bytes57 = _rt::Vec::from_raw_parts( + l55.cast(), + len57, + len57, + ); + + _rt::string_lift(bytes57) + }; + RpcError::Denied(e64) + } + 2 => { + let e64 = { + let l58 = + *ptr0.add(12).cast::<*mut u8>(); + let l59 = *ptr0.add(16).cast::(); + let len60 = l59; + let bytes60 = _rt::Vec::from_raw_parts( + l58.cast(), + len60, + len60, + ); + + _rt::string_lift(bytes60) + }; + RpcError::NotFound(e64) + } + n => { + debug_assert_eq!( + n, 3, + "invalid enum discriminant" + ); + let e64 = { + let l61 = + *ptr0.add(12).cast::<*mut u8>(); + let l62 = *ptr0.add(16).cast::(); + let len63 = l62; + let bytes63 = _rt::Vec::from_raw_parts( + l61.cast(), + len63, + len63, + ); + + _rt::string_lift(bytes63) + }; + RpcError::RemoteInternalError(e64) + } + }; + + v64 + }; + Err(e) + } + _ => _rt::invalid_enum_discriminant(), + } + }; + Some(e) + } + _ => _rt::invalid_enum_discriminant(), + } + } + } + } + } + } +} +#[allow(dead_code)] +pub mod wasi { + #[allow(dead_code)] + pub mod io { + #[allow(dead_code, clippy::all)] + pub mod poll { + #[used] + #[doc(hidden)] + #[cfg(target_arch = "wasm32")] + static __FORCE_SECTION_REF: fn() = + super::super::super::__link_custom_section_describing_imports; + use super::super::super::_rt; + /// `pollable` epresents a single I/O event which may be ready, or not. + + #[derive(Debug)] + #[repr(transparent)] + pub struct Pollable { + handle: _rt::Resource, + } + + impl Pollable { + #[doc(hidden)] + pub unsafe fn from_handle(handle: u32) -> Self { + Self { + handle: _rt::Resource::from_handle(handle), + } + } + + #[doc(hidden)] + pub fn take_handle(&self) -> u32 { + _rt::Resource::take_handle(&self.handle) + } + + #[doc(hidden)] + pub fn handle(&self) -> u32 { + _rt::Resource::handle(&self.handle) + } + } + + unsafe impl _rt::WasmResource for Pollable { + #[inline] + unsafe fn drop(_handle: u32) { + #[cfg(not(target_arch = "wasm32"))] + unreachable!(); + + #[cfg(target_arch = "wasm32")] + { + #[link(wasm_import_module = "wasi:io/poll@0.2.0")] + extern "C" { + #[link_name = "[resource-drop]pollable"] + fn drop(_: u32); + } + + drop(_handle); + } + } + } + + impl Pollable { + #[allow(unused_unsafe, clippy::all)] + /// Return the readiness of a pollable. This function never blocks. + /// + /// Returns `true` when the pollable is ready, and `false` otherwise. + pub fn ready(&self) -> bool { + unsafe { + #[cfg(target_arch = "wasm32")] + #[link(wasm_import_module = "wasi:io/poll@0.2.0")] + extern "C" { + #[link_name = "[method]pollable.ready"] + fn wit_import(_: i32) -> i32; + } + + #[cfg(not(target_arch = "wasm32"))] + fn wit_import(_: i32) -> i32 { + unreachable!() + } + let ret = wit_import((self).handle() as i32); + _rt::bool_lift(ret as u8) + } + } + } + impl Pollable { + #[allow(unused_unsafe, clippy::all)] + /// `block` returns immediately if the pollable is ready, and otherwise + /// blocks until ready. + /// + /// This function is equivalent to calling `poll.poll` on a list + /// containing only this pollable. + pub fn block(&self) { + unsafe { + #[cfg(target_arch = "wasm32")] + #[link(wasm_import_module = "wasi:io/poll@0.2.0")] + extern "C" { + #[link_name = "[method]pollable.block"] + fn wit_import(_: i32); + } + + #[cfg(not(target_arch = "wasm32"))] + fn wit_import(_: i32) { + unreachable!() + } + wit_import((self).handle() as i32); + } + } + } + #[allow(unused_unsafe, clippy::all)] + /// Poll for completion on a set of pollables. + /// + /// This function takes a list of pollables, which identify I/O sources of + /// interest, and waits until one or more of the events is ready for I/O. + /// + /// The result `list` contains one or more indices of handles in the + /// argument list that is ready for I/O. + /// + /// If the list contains more elements than can be indexed with a `u32` + /// value, this function traps. + /// + /// A timeout can be implemented by adding a pollable from the + /// wasi-clocks API to the list. + /// + /// This function does not return a `result`; polling in itself does not + /// do any I/O so it doesn't fail. If any of the I/O sources identified by + /// the pollables has an error, it is indicated by marking the source as + /// being reaedy for I/O. + pub fn poll(in_: &[&Pollable]) -> _rt::Vec { + unsafe { + #[repr(align(4))] + struct RetArea([::core::mem::MaybeUninit; 8]); + let mut ret_area = RetArea([::core::mem::MaybeUninit::uninit(); 8]); + let vec0 = in_; + let len0 = vec0.len(); + let layout0 = _rt::alloc::Layout::from_size_align_unchecked(vec0.len() * 4, 4); + let result0 = if layout0.size() != 0 { + let ptr = _rt::alloc::alloc(layout0).cast::(); + if ptr.is_null() { + _rt::alloc::handle_alloc_error(layout0); + } + ptr + } else { + { + ::core::ptr::null_mut() + } + }; + for (i, e) in vec0.into_iter().enumerate() { + let base = result0.add(i * 4); + { + *base.add(0).cast::() = (e).handle() as i32; + } + } + let ptr1 = ret_area.0.as_mut_ptr().cast::(); + #[cfg(target_arch = "wasm32")] + #[link(wasm_import_module = "wasi:io/poll@0.2.0")] + extern "C" { + #[link_name = "poll"] + fn wit_import(_: *mut u8, _: usize, _: *mut u8); + } + + #[cfg(not(target_arch = "wasm32"))] + fn wit_import(_: *mut u8, _: usize, _: *mut u8) { + unreachable!() + } + wit_import(result0, len0, ptr1); + let l2 = *ptr1.add(0).cast::<*mut u8>(); + let l3 = *ptr1.add(4).cast::(); + let len4 = l3; + if layout0.size() != 0 { + _rt::alloc::dealloc(result0.cast(), layout0); + } + _rt::Vec::from_raw_parts(l2.cast(), len4, len4) + } + } + } + } +} +#[allow(dead_code)] +pub mod exports { + #[allow(dead_code)] + pub mod rpc { + #[allow(dead_code)] + pub mod ephemeral_stub { + #[allow(dead_code, clippy::all)] + pub mod stub_ephemeral { + #[used] + #[doc(hidden)] + #[cfg(target_arch = "wasm32")] + static __FORCE_SECTION_REF: fn() = + super::super::super::super::__link_custom_section_describing_imports; + use super::super::super::super::_rt; + pub type Uri = super::super::super::super::golem::rpc::types::Uri; + pub type Pollable = super::super::super::super::wasi::io::poll::Pollable; + + #[derive(Debug)] + #[repr(transparent)] + pub struct FutureGetWorkerNameResult { + handle: _rt::Resource, + } + + type _FutureGetWorkerNameResultRep = Option; + + impl FutureGetWorkerNameResult { + /// Creates a new resource from the specified representation. + /// + /// This function will create a new resource handle by moving `val` onto + /// the heap and then passing that heap pointer to the component model to + /// create a handle. The owned handle is then returned as `FutureGetWorkerNameResult`. + pub fn new(val: T) -> Self { + Self::type_guard::(); + let val: _FutureGetWorkerNameResultRep = Some(val); + let ptr: *mut _FutureGetWorkerNameResultRep = + _rt::Box::into_raw(_rt::Box::new(val)); + unsafe { Self::from_handle(T::_resource_new(ptr.cast())) } + } + + /// Gets access to the underlying `T` which represents this resource. + pub fn get(&self) -> &T { + let ptr = unsafe { &*self.as_ptr::() }; + ptr.as_ref().unwrap() + } + + /// Gets mutable access to the underlying `T` which represents this + /// resource. + pub fn get_mut(&mut self) -> &mut T { + let ptr = unsafe { &mut *self.as_ptr::() }; + ptr.as_mut().unwrap() + } + + /// Consumes this resource and returns the underlying `T`. + pub fn into_inner(self) -> T { + let ptr = unsafe { &mut *self.as_ptr::() }; + ptr.take().unwrap() + } + + #[doc(hidden)] + pub unsafe fn from_handle(handle: u32) -> Self { + Self { + handle: _rt::Resource::from_handle(handle), + } + } + + #[doc(hidden)] + pub fn take_handle(&self) -> u32 { + _rt::Resource::take_handle(&self.handle) + } + + #[doc(hidden)] + pub fn handle(&self) -> u32 { + _rt::Resource::handle(&self.handle) + } + + // It's theoretically possible to implement the `GuestFutureGetWorkerNameResult` trait twice + // so guard against using it with two different types here. + #[doc(hidden)] + fn type_guard() { + use core::any::TypeId; + static mut LAST_TYPE: Option = None; + unsafe { + assert!(!cfg!(target_feature = "threads")); + let id = TypeId::of::(); + match LAST_TYPE { + Some(ty) => assert!( + ty == id, + "cannot use two types with this resource type" + ), + None => LAST_TYPE = Some(id), + } + } + } + + #[doc(hidden)] + pub unsafe fn dtor(handle: *mut u8) { + Self::type_guard::(); + let _ = _rt::Box::from_raw(handle as *mut _FutureGetWorkerNameResultRep); + } + + fn as_ptr( + &self, + ) -> *mut _FutureGetWorkerNameResultRep { + FutureGetWorkerNameResult::type_guard::(); + T::_resource_rep(self.handle()).cast() + } + } + + /// A borrowed version of [`FutureGetWorkerNameResult`] which represents a borrowed value + /// with the lifetime `'a`. + #[derive(Debug)] + #[repr(transparent)] + pub struct FutureGetWorkerNameResultBorrow<'a> { + rep: *mut u8, + _marker: core::marker::PhantomData<&'a FutureGetWorkerNameResult>, + } + + impl<'a> FutureGetWorkerNameResultBorrow<'a> { + #[doc(hidden)] + pub unsafe fn lift(rep: usize) -> Self { + Self { + rep: rep as *mut u8, + _marker: core::marker::PhantomData, + } + } + + /// Gets access to the underlying `T` in this resource. + pub fn get(&self) -> &T { + let ptr = unsafe { &mut *self.as_ptr::() }; + ptr.as_ref().unwrap() + } + + // NB: mutable access is not allowed due to the component model allowing + // multiple borrows of the same resource. + + fn as_ptr(&self) -> *mut _FutureGetWorkerNameResultRep { + FutureGetWorkerNameResult::type_guard::(); + self.rep.cast() + } + } + + unsafe impl _rt::WasmResource for FutureGetWorkerNameResult { + #[inline] + unsafe fn drop(_handle: u32) { + #[cfg(not(target_arch = "wasm32"))] + unreachable!(); + + #[cfg(target_arch = "wasm32")] + { + #[link( + wasm_import_module = "[export]rpc:ephemeral-stub/stub-ephemeral" + )] + extern "C" { + #[link_name = "[resource-drop]future-get-worker-name-result"] + fn drop(_: u32); + } + + drop(_handle); + } + } + } + + #[derive(Debug)] + #[repr(transparent)] + pub struct FutureGetIdempotencyKeyResult { + handle: _rt::Resource, + } + + type _FutureGetIdempotencyKeyResultRep = Option; + + impl FutureGetIdempotencyKeyResult { + /// Creates a new resource from the specified representation. + /// + /// This function will create a new resource handle by moving `val` onto + /// the heap and then passing that heap pointer to the component model to + /// create a handle. The owned handle is then returned as `FutureGetIdempotencyKeyResult`. + pub fn new(val: T) -> Self { + Self::type_guard::(); + let val: _FutureGetIdempotencyKeyResultRep = Some(val); + let ptr: *mut _FutureGetIdempotencyKeyResultRep = + _rt::Box::into_raw(_rt::Box::new(val)); + unsafe { Self::from_handle(T::_resource_new(ptr.cast())) } + } + + /// Gets access to the underlying `T` which represents this resource. + pub fn get(&self) -> &T { + let ptr = unsafe { &*self.as_ptr::() }; + ptr.as_ref().unwrap() + } + + /// Gets mutable access to the underlying `T` which represents this + /// resource. + pub fn get_mut(&mut self) -> &mut T { + let ptr = unsafe { &mut *self.as_ptr::() }; + ptr.as_mut().unwrap() + } + + /// Consumes this resource and returns the underlying `T`. + pub fn into_inner(self) -> T { + let ptr = unsafe { &mut *self.as_ptr::() }; + ptr.take().unwrap() + } + + #[doc(hidden)] + pub unsafe fn from_handle(handle: u32) -> Self { + Self { + handle: _rt::Resource::from_handle(handle), + } + } + + #[doc(hidden)] + pub fn take_handle(&self) -> u32 { + _rt::Resource::take_handle(&self.handle) + } + + #[doc(hidden)] + pub fn handle(&self) -> u32 { + _rt::Resource::handle(&self.handle) + } + + // It's theoretically possible to implement the `GuestFutureGetIdempotencyKeyResult` trait twice + // so guard against using it with two different types here. + #[doc(hidden)] + fn type_guard() { + use core::any::TypeId; + static mut LAST_TYPE: Option = None; + unsafe { + assert!(!cfg!(target_feature = "threads")); + let id = TypeId::of::(); + match LAST_TYPE { + Some(ty) => assert!( + ty == id, + "cannot use two types with this resource type" + ), + None => LAST_TYPE = Some(id), + } + } + } + + #[doc(hidden)] + pub unsafe fn dtor(handle: *mut u8) { + Self::type_guard::(); + let _ = + _rt::Box::from_raw(handle as *mut _FutureGetIdempotencyKeyResultRep); + } + + fn as_ptr( + &self, + ) -> *mut _FutureGetIdempotencyKeyResultRep { + FutureGetIdempotencyKeyResult::type_guard::(); + T::_resource_rep(self.handle()).cast() + } + } + + /// A borrowed version of [`FutureGetIdempotencyKeyResult`] which represents a borrowed value + /// with the lifetime `'a`. + #[derive(Debug)] + #[repr(transparent)] + pub struct FutureGetIdempotencyKeyResultBorrow<'a> { + rep: *mut u8, + _marker: core::marker::PhantomData<&'a FutureGetIdempotencyKeyResult>, + } + + impl<'a> FutureGetIdempotencyKeyResultBorrow<'a> { + #[doc(hidden)] + pub unsafe fn lift(rep: usize) -> Self { + Self { + rep: rep as *mut u8, + _marker: core::marker::PhantomData, + } + } + + /// Gets access to the underlying `T` in this resource. + pub fn get(&self) -> &T { + let ptr = unsafe { &mut *self.as_ptr::() }; + ptr.as_ref().unwrap() + } + + // NB: mutable access is not allowed due to the component model allowing + // multiple borrows of the same resource. + + fn as_ptr(&self) -> *mut _FutureGetIdempotencyKeyResultRep { + FutureGetIdempotencyKeyResult::type_guard::(); + self.rep.cast() + } + } + + unsafe impl _rt::WasmResource for FutureGetIdempotencyKeyResult { + #[inline] + unsafe fn drop(_handle: u32) { + #[cfg(not(target_arch = "wasm32"))] + unreachable!(); + + #[cfg(target_arch = "wasm32")] + { + #[link( + wasm_import_module = "[export]rpc:ephemeral-stub/stub-ephemeral" + )] + extern "C" { + #[link_name = "[resource-drop]future-get-idempotency-key-result"] + fn drop(_: u32); + } + + drop(_handle); + } + } + } + + #[derive(Debug)] + #[repr(transparent)] + pub struct Api { + handle: _rt::Resource, + } + + type _ApiRep = Option; + + impl Api { + /// Creates a new resource from the specified representation. + /// + /// This function will create a new resource handle by moving `val` onto + /// the heap and then passing that heap pointer to the component model to + /// create a handle. The owned handle is then returned as `Api`. + pub fn new(val: T) -> Self { + Self::type_guard::(); + let val: _ApiRep = Some(val); + let ptr: *mut _ApiRep = _rt::Box::into_raw(_rt::Box::new(val)); + unsafe { Self::from_handle(T::_resource_new(ptr.cast())) } + } + + /// Gets access to the underlying `T` which represents this resource. + pub fn get(&self) -> &T { + let ptr = unsafe { &*self.as_ptr::() }; + ptr.as_ref().unwrap() + } + + /// Gets mutable access to the underlying `T` which represents this + /// resource. + pub fn get_mut(&mut self) -> &mut T { + let ptr = unsafe { &mut *self.as_ptr::() }; + ptr.as_mut().unwrap() + } + + /// Consumes this resource and returns the underlying `T`. + pub fn into_inner(self) -> T { + let ptr = unsafe { &mut *self.as_ptr::() }; + ptr.take().unwrap() + } + + #[doc(hidden)] + pub unsafe fn from_handle(handle: u32) -> Self { + Self { + handle: _rt::Resource::from_handle(handle), + } + } + + #[doc(hidden)] + pub fn take_handle(&self) -> u32 { + _rt::Resource::take_handle(&self.handle) + } + + #[doc(hidden)] + pub fn handle(&self) -> u32 { + _rt::Resource::handle(&self.handle) + } + + // It's theoretically possible to implement the `GuestApi` trait twice + // so guard against using it with two different types here. + #[doc(hidden)] + fn type_guard() { + use core::any::TypeId; + static mut LAST_TYPE: Option = None; + unsafe { + assert!(!cfg!(target_feature = "threads")); + let id = TypeId::of::(); + match LAST_TYPE { + Some(ty) => assert!( + ty == id, + "cannot use two types with this resource type" + ), + None => LAST_TYPE = Some(id), + } + } + } + + #[doc(hidden)] + pub unsafe fn dtor(handle: *mut u8) { + Self::type_guard::(); + let _ = _rt::Box::from_raw(handle as *mut _ApiRep); + } + + fn as_ptr(&self) -> *mut _ApiRep { + Api::type_guard::(); + T::_resource_rep(self.handle()).cast() + } + } + + /// A borrowed version of [`Api`] which represents a borrowed value + /// with the lifetime `'a`. + #[derive(Debug)] + #[repr(transparent)] + pub struct ApiBorrow<'a> { + rep: *mut u8, + _marker: core::marker::PhantomData<&'a Api>, + } + + impl<'a> ApiBorrow<'a> { + #[doc(hidden)] + pub unsafe fn lift(rep: usize) -> Self { + Self { + rep: rep as *mut u8, + _marker: core::marker::PhantomData, + } + } + + /// Gets access to the underlying `T` in this resource. + pub fn get(&self) -> &T { + let ptr = unsafe { &mut *self.as_ptr::() }; + ptr.as_ref().unwrap() + } + + // NB: mutable access is not allowed due to the component model allowing + // multiple borrows of the same resource. + + fn as_ptr(&self) -> *mut _ApiRep { + Api::type_guard::(); + self.rep.cast() + } + } + + unsafe impl _rt::WasmResource for Api { + #[inline] + unsafe fn drop(_handle: u32) { + #[cfg(not(target_arch = "wasm32"))] + unreachable!(); + + #[cfg(target_arch = "wasm32")] + { + #[link( + wasm_import_module = "[export]rpc:ephemeral-stub/stub-ephemeral" + )] + extern "C" { + #[link_name = "[resource-drop]api"] + fn drop(_: u32); + } + + drop(_handle); + } + } + } + + #[doc(hidden)] + #[allow(non_snake_case)] + pub unsafe fn _export_method_future_get_worker_name_result_subscribe_cabi< + T: GuestFutureGetWorkerNameResult, + >( + arg0: *mut u8, + ) -> i32 { + #[cfg(target_arch = "wasm32")] + _rt::run_ctors_once(); + let result0 = T::subscribe( + FutureGetWorkerNameResultBorrow::lift(arg0 as u32 as usize).get(), + ); + (result0).take_handle() as i32 + } + #[doc(hidden)] + #[allow(non_snake_case)] + pub unsafe fn _export_method_future_get_worker_name_result_get_cabi< + T: GuestFutureGetWorkerNameResult, + >( + arg0: *mut u8, + ) -> *mut u8 { + #[cfg(target_arch = "wasm32")] + _rt::run_ctors_once(); + let result0 = + T::get(FutureGetWorkerNameResultBorrow::lift(arg0 as u32 as usize).get()); + let ptr1 = _RET_AREA.0.as_mut_ptr().cast::(); + match result0 { + Some(e) => { + *ptr1.add(0).cast::() = (1i32) as u8; + let vec2 = (e.into_bytes()).into_boxed_slice(); + let ptr2 = vec2.as_ptr().cast::(); + let len2 = vec2.len(); + ::core::mem::forget(vec2); + *ptr1.add(8).cast::() = len2; + *ptr1.add(4).cast::<*mut u8>() = ptr2.cast_mut(); + } + None => { + *ptr1.add(0).cast::() = (0i32) as u8; + } + }; + ptr1 + } + #[doc(hidden)] + #[allow(non_snake_case)] + pub unsafe fn __post_return_method_future_get_worker_name_result_get< + T: GuestFutureGetWorkerNameResult, + >( + arg0: *mut u8, + ) { + let l0 = i32::from(*arg0.add(0).cast::()); + match l0 { + 0 => (), + _ => { + let l1 = *arg0.add(4).cast::<*mut u8>(); + let l2 = *arg0.add(8).cast::(); + _rt::cabi_dealloc(l1, l2, 1); + } + } + } + #[doc(hidden)] + #[allow(non_snake_case)] + pub unsafe fn _export_method_future_get_idempotency_key_result_subscribe_cabi< + T: GuestFutureGetIdempotencyKeyResult, + >( + arg0: *mut u8, + ) -> i32 { + #[cfg(target_arch = "wasm32")] + _rt::run_ctors_once(); + let result0 = T::subscribe( + FutureGetIdempotencyKeyResultBorrow::lift(arg0 as u32 as usize).get(), + ); + (result0).take_handle() as i32 + } + #[doc(hidden)] + #[allow(non_snake_case)] + pub unsafe fn _export_method_future_get_idempotency_key_result_get_cabi< + T: GuestFutureGetIdempotencyKeyResult, + >( + arg0: *mut u8, + ) -> *mut u8 { + #[cfg(target_arch = "wasm32")] + _rt::run_ctors_once(); + let result0 = T::get( + FutureGetIdempotencyKeyResultBorrow::lift(arg0 as u32 as usize).get(), + ); + let ptr1 = _RET_AREA.0.as_mut_ptr().cast::(); + match result0 { + Some(e) => { + *ptr1.add(0).cast::() = (1i32) as u8; + let vec2 = (e.into_bytes()).into_boxed_slice(); + let ptr2 = vec2.as_ptr().cast::(); + let len2 = vec2.len(); + ::core::mem::forget(vec2); + *ptr1.add(8).cast::() = len2; + *ptr1.add(4).cast::<*mut u8>() = ptr2.cast_mut(); + } + None => { + *ptr1.add(0).cast::() = (0i32) as u8; + } + }; + ptr1 + } + #[doc(hidden)] + #[allow(non_snake_case)] + pub unsafe fn __post_return_method_future_get_idempotency_key_result_get< + T: GuestFutureGetIdempotencyKeyResult, + >( + arg0: *mut u8, + ) { + let l0 = i32::from(*arg0.add(0).cast::()); + match l0 { + 0 => (), + _ => { + let l1 = *arg0.add(4).cast::<*mut u8>(); + let l2 = *arg0.add(8).cast::(); + _rt::cabi_dealloc(l1, l2, 1); + } + } + } + #[doc(hidden)] + #[allow(non_snake_case)] + pub unsafe fn _export_constructor_api_cabi( + arg0: *mut u8, + arg1: usize, + ) -> i32 { + #[cfg(target_arch = "wasm32")] + _rt::run_ctors_once(); + let len0 = arg1; + let bytes0 = _rt::Vec::from_raw_parts(arg0.cast(), len0, len0); + let result1 = + Api::new(T::new(super::super::super::super::golem::rpc::types::Uri { + value: _rt::string_lift(bytes0), + })); + (result1).take_handle() as i32 + } + #[doc(hidden)] + #[allow(non_snake_case)] + pub unsafe fn _export_method_api_blocking_get_worker_name_cabi( + arg0: *mut u8, + ) -> *mut u8 { + #[cfg(target_arch = "wasm32")] + _rt::run_ctors_once(); + let result0 = + T::blocking_get_worker_name(ApiBorrow::lift(arg0 as u32 as usize).get()); + let ptr1 = _RET_AREA.0.as_mut_ptr().cast::(); + let vec2 = (result0.into_bytes()).into_boxed_slice(); + let ptr2 = vec2.as_ptr().cast::(); + let len2 = vec2.len(); + ::core::mem::forget(vec2); + *ptr1.add(4).cast::() = len2; + *ptr1.add(0).cast::<*mut u8>() = ptr2.cast_mut(); + ptr1 + } + #[doc(hidden)] + #[allow(non_snake_case)] + pub unsafe fn __post_return_method_api_blocking_get_worker_name( + arg0: *mut u8, + ) { + let l0 = *arg0.add(0).cast::<*mut u8>(); + let l1 = *arg0.add(4).cast::(); + _rt::cabi_dealloc(l0, l1, 1); + } + #[doc(hidden)] + #[allow(non_snake_case)] + pub unsafe fn _export_method_api_get_worker_name_cabi( + arg0: *mut u8, + ) -> i32 { + #[cfg(target_arch = "wasm32")] + _rt::run_ctors_once(); + let result0 = T::get_worker_name(ApiBorrow::lift(arg0 as u32 as usize).get()); + (result0).take_handle() as i32 + } + #[doc(hidden)] + #[allow(non_snake_case)] + pub unsafe fn _export_method_api_blocking_get_idempotency_key_cabi( + arg0: *mut u8, + ) -> *mut u8 { + #[cfg(target_arch = "wasm32")] + _rt::run_ctors_once(); + let result0 = T::blocking_get_idempotency_key( + ApiBorrow::lift(arg0 as u32 as usize).get(), + ); + let ptr1 = _RET_AREA.0.as_mut_ptr().cast::(); + let vec2 = (result0.into_bytes()).into_boxed_slice(); + let ptr2 = vec2.as_ptr().cast::(); + let len2 = vec2.len(); + ::core::mem::forget(vec2); + *ptr1.add(4).cast::() = len2; + *ptr1.add(0).cast::<*mut u8>() = ptr2.cast_mut(); + ptr1 + } + #[doc(hidden)] + #[allow(non_snake_case)] + pub unsafe fn __post_return_method_api_blocking_get_idempotency_key( + arg0: *mut u8, + ) { + let l0 = *arg0.add(0).cast::<*mut u8>(); + let l1 = *arg0.add(4).cast::(); + _rt::cabi_dealloc(l0, l1, 1); + } + #[doc(hidden)] + #[allow(non_snake_case)] + pub unsafe fn _export_method_api_get_idempotency_key_cabi( + arg0: *mut u8, + ) -> i32 { + #[cfg(target_arch = "wasm32")] + _rt::run_ctors_once(); + let result0 = + T::get_idempotency_key(ApiBorrow::lift(arg0 as u32 as usize).get()); + (result0).take_handle() as i32 + } + pub trait Guest { + type FutureGetWorkerNameResult: GuestFutureGetWorkerNameResult; + type FutureGetIdempotencyKeyResult: GuestFutureGetIdempotencyKeyResult; + type Api: GuestApi; + } + pub trait GuestFutureGetWorkerNameResult: 'static { + #[doc(hidden)] + unsafe fn _resource_new(val: *mut u8) -> u32 + where + Self: Sized, + { + #[cfg(not(target_arch = "wasm32"))] + { + let _ = val; + unreachable!(); + } + + #[cfg(target_arch = "wasm32")] + { + #[link( + wasm_import_module = "[export]rpc:ephemeral-stub/stub-ephemeral" + )] + extern "C" { + #[link_name = "[resource-new]future-get-worker-name-result"] + fn new(_: *mut u8) -> u32; + } + new(val) + } + } + + #[doc(hidden)] + fn _resource_rep(handle: u32) -> *mut u8 + where + Self: Sized, + { + #[cfg(not(target_arch = "wasm32"))] + { + let _ = handle; + unreachable!(); + } + + #[cfg(target_arch = "wasm32")] + { + #[link( + wasm_import_module = "[export]rpc:ephemeral-stub/stub-ephemeral" + )] + extern "C" { + #[link_name = "[resource-rep]future-get-worker-name-result"] + fn rep(_: u32) -> *mut u8; + } + unsafe { rep(handle) } + } + } + + fn subscribe(&self) -> Pollable; + fn get(&self) -> Option<_rt::String>; + } + pub trait GuestFutureGetIdempotencyKeyResult: 'static { + #[doc(hidden)] + unsafe fn _resource_new(val: *mut u8) -> u32 + where + Self: Sized, + { + #[cfg(not(target_arch = "wasm32"))] + { + let _ = val; + unreachable!(); + } + + #[cfg(target_arch = "wasm32")] + { + #[link( + wasm_import_module = "[export]rpc:ephemeral-stub/stub-ephemeral" + )] + extern "C" { + #[link_name = "[resource-new]future-get-idempotency-key-result"] + fn new(_: *mut u8) -> u32; + } + new(val) + } + } + + #[doc(hidden)] + fn _resource_rep(handle: u32) -> *mut u8 + where + Self: Sized, + { + #[cfg(not(target_arch = "wasm32"))] + { + let _ = handle; + unreachable!(); + } + + #[cfg(target_arch = "wasm32")] + { + #[link( + wasm_import_module = "[export]rpc:ephemeral-stub/stub-ephemeral" + )] + extern "C" { + #[link_name = "[resource-rep]future-get-idempotency-key-result"] + fn rep(_: u32) -> *mut u8; + } + unsafe { rep(handle) } + } + } + + fn subscribe(&self) -> Pollable; + fn get(&self) -> Option<_rt::String>; + } + pub trait GuestApi: 'static { + #[doc(hidden)] + unsafe fn _resource_new(val: *mut u8) -> u32 + where + Self: Sized, + { + #[cfg(not(target_arch = "wasm32"))] + { + let _ = val; + unreachable!(); + } + + #[cfg(target_arch = "wasm32")] + { + #[link( + wasm_import_module = "[export]rpc:ephemeral-stub/stub-ephemeral" + )] + extern "C" { + #[link_name = "[resource-new]api"] + fn new(_: *mut u8) -> u32; + } + new(val) + } + } + + #[doc(hidden)] + fn _resource_rep(handle: u32) -> *mut u8 + where + Self: Sized, + { + #[cfg(not(target_arch = "wasm32"))] + { + let _ = handle; + unreachable!(); + } + + #[cfg(target_arch = "wasm32")] + { + #[link( + wasm_import_module = "[export]rpc:ephemeral-stub/stub-ephemeral" + )] + extern "C" { + #[link_name = "[resource-rep]api"] + fn rep(_: u32) -> *mut u8; + } + unsafe { rep(handle) } + } + } + + fn new(location: Uri) -> Self; + fn blocking_get_worker_name(&self) -> _rt::String; + fn get_worker_name(&self) -> FutureGetWorkerNameResult; + fn blocking_get_idempotency_key(&self) -> _rt::String; + fn get_idempotency_key(&self) -> FutureGetIdempotencyKeyResult; + } + #[doc(hidden)] + + macro_rules! __export_rpc_ephemeral_stub_stub_ephemeral_cabi{ + ($ty:ident with_types_in $($path_to_types:tt)*) => (const _: () = { + + #[export_name = "rpc:ephemeral-stub/stub-ephemeral#[method]future-get-worker-name-result.subscribe"] + unsafe extern "C" fn export_method_future_get_worker_name_result_subscribe(arg0: *mut u8,) -> i32 { + $($path_to_types)*::_export_method_future_get_worker_name_result_subscribe_cabi::<<$ty as $($path_to_types)*::Guest>::FutureGetWorkerNameResult>(arg0) + } + #[export_name = "rpc:ephemeral-stub/stub-ephemeral#[method]future-get-worker-name-result.get"] + unsafe extern "C" fn export_method_future_get_worker_name_result_get(arg0: *mut u8,) -> *mut u8 { + $($path_to_types)*::_export_method_future_get_worker_name_result_get_cabi::<<$ty as $($path_to_types)*::Guest>::FutureGetWorkerNameResult>(arg0) + } + #[export_name = "cabi_post_rpc:ephemeral-stub/stub-ephemeral#[method]future-get-worker-name-result.get"] + unsafe extern "C" fn _post_return_method_future_get_worker_name_result_get(arg0: *mut u8,) { + $($path_to_types)*::__post_return_method_future_get_worker_name_result_get::<<$ty as $($path_to_types)*::Guest>::FutureGetWorkerNameResult>(arg0) + } + #[export_name = "rpc:ephemeral-stub/stub-ephemeral#[method]future-get-idempotency-key-result.subscribe"] + unsafe extern "C" fn export_method_future_get_idempotency_key_result_subscribe(arg0: *mut u8,) -> i32 { + $($path_to_types)*::_export_method_future_get_idempotency_key_result_subscribe_cabi::<<$ty as $($path_to_types)*::Guest>::FutureGetIdempotencyKeyResult>(arg0) + } + #[export_name = "rpc:ephemeral-stub/stub-ephemeral#[method]future-get-idempotency-key-result.get"] + unsafe extern "C" fn export_method_future_get_idempotency_key_result_get(arg0: *mut u8,) -> *mut u8 { + $($path_to_types)*::_export_method_future_get_idempotency_key_result_get_cabi::<<$ty as $($path_to_types)*::Guest>::FutureGetIdempotencyKeyResult>(arg0) + } + #[export_name = "cabi_post_rpc:ephemeral-stub/stub-ephemeral#[method]future-get-idempotency-key-result.get"] + unsafe extern "C" fn _post_return_method_future_get_idempotency_key_result_get(arg0: *mut u8,) { + $($path_to_types)*::__post_return_method_future_get_idempotency_key_result_get::<<$ty as $($path_to_types)*::Guest>::FutureGetIdempotencyKeyResult>(arg0) + } + #[export_name = "rpc:ephemeral-stub/stub-ephemeral#[constructor]api"] + unsafe extern "C" fn export_constructor_api(arg0: *mut u8,arg1: usize,) -> i32 { + $($path_to_types)*::_export_constructor_api_cabi::<<$ty as $($path_to_types)*::Guest>::Api>(arg0, arg1) + } + #[export_name = "rpc:ephemeral-stub/stub-ephemeral#[method]api.blocking-get-worker-name"] + unsafe extern "C" fn export_method_api_blocking_get_worker_name(arg0: *mut u8,) -> *mut u8 { + $($path_to_types)*::_export_method_api_blocking_get_worker_name_cabi::<<$ty as $($path_to_types)*::Guest>::Api>(arg0) + } + #[export_name = "cabi_post_rpc:ephemeral-stub/stub-ephemeral#[method]api.blocking-get-worker-name"] + unsafe extern "C" fn _post_return_method_api_blocking_get_worker_name(arg0: *mut u8,) { + $($path_to_types)*::__post_return_method_api_blocking_get_worker_name::<<$ty as $($path_to_types)*::Guest>::Api>(arg0) + } + #[export_name = "rpc:ephemeral-stub/stub-ephemeral#[method]api.get-worker-name"] + unsafe extern "C" fn export_method_api_get_worker_name(arg0: *mut u8,) -> i32 { + $($path_to_types)*::_export_method_api_get_worker_name_cabi::<<$ty as $($path_to_types)*::Guest>::Api>(arg0) + } + #[export_name = "rpc:ephemeral-stub/stub-ephemeral#[method]api.blocking-get-idempotency-key"] + unsafe extern "C" fn export_method_api_blocking_get_idempotency_key(arg0: *mut u8,) -> *mut u8 { + $($path_to_types)*::_export_method_api_blocking_get_idempotency_key_cabi::<<$ty as $($path_to_types)*::Guest>::Api>(arg0) + } + #[export_name = "cabi_post_rpc:ephemeral-stub/stub-ephemeral#[method]api.blocking-get-idempotency-key"] + unsafe extern "C" fn _post_return_method_api_blocking_get_idempotency_key(arg0: *mut u8,) { + $($path_to_types)*::__post_return_method_api_blocking_get_idempotency_key::<<$ty as $($path_to_types)*::Guest>::Api>(arg0) + } + #[export_name = "rpc:ephemeral-stub/stub-ephemeral#[method]api.get-idempotency-key"] + unsafe extern "C" fn export_method_api_get_idempotency_key(arg0: *mut u8,) -> i32 { + $($path_to_types)*::_export_method_api_get_idempotency_key_cabi::<<$ty as $($path_to_types)*::Guest>::Api>(arg0) + } + + const _: () = { + #[doc(hidden)] + #[export_name = "rpc:ephemeral-stub/stub-ephemeral#[dtor]future-get-worker-name-result"] + #[allow(non_snake_case)] + unsafe extern "C" fn dtor(rep: *mut u8) { + $($path_to_types)*::FutureGetWorkerNameResult::dtor::< + <$ty as $($path_to_types)*::Guest>::FutureGetWorkerNameResult + >(rep) + } + }; + + + const _: () = { + #[doc(hidden)] + #[export_name = "rpc:ephemeral-stub/stub-ephemeral#[dtor]future-get-idempotency-key-result"] + #[allow(non_snake_case)] + unsafe extern "C" fn dtor(rep: *mut u8) { + $($path_to_types)*::FutureGetIdempotencyKeyResult::dtor::< + <$ty as $($path_to_types)*::Guest>::FutureGetIdempotencyKeyResult + >(rep) + } + }; + + + const _: () = { + #[doc(hidden)] + #[export_name = "rpc:ephemeral-stub/stub-ephemeral#[dtor]api"] + #[allow(non_snake_case)] + unsafe extern "C" fn dtor(rep: *mut u8) { + $($path_to_types)*::Api::dtor::< + <$ty as $($path_to_types)*::Guest>::Api + >(rep) + } + }; + + };); + } + #[doc(hidden)] + pub(crate) use __export_rpc_ephemeral_stub_stub_ephemeral_cabi; + #[repr(align(4))] + struct _RetArea([::core::mem::MaybeUninit; 12]); + static mut _RET_AREA: _RetArea = _RetArea([::core::mem::MaybeUninit::uninit(); 12]); + } + } + } +} +mod _rt { + + use core::fmt; + use core::marker; + use core::sync::atomic::{AtomicU32, Ordering::Relaxed}; + + /// A type which represents a component model resource, either imported or + /// exported into this component. + /// + /// This is a low-level wrapper which handles the lifetime of the resource + /// (namely this has a destructor). The `T` provided defines the component model + /// intrinsics that this wrapper uses. + /// + /// One of the chief purposes of this type is to provide `Deref` implementations + /// to access the underlying data when it is owned. + /// + /// This type is primarily used in generated code for exported and imported + /// resources. + #[repr(transparent)] + pub struct Resource { + // NB: This would ideally be `u32` but it is not. The fact that this has + // interior mutability is not exposed in the API of this type except for the + // `take_handle` method which is supposed to in theory be private. + // + // This represents, almost all the time, a valid handle value. When it's + // invalid it's stored as `u32::MAX`. + handle: AtomicU32, + _marker: marker::PhantomData, + } + + /// A trait which all wasm resources implement, namely providing the ability to + /// drop a resource. + /// + /// This generally is implemented by generated code, not user-facing code. + #[allow(clippy::missing_safety_doc)] + pub unsafe trait WasmResource { + /// Invokes the `[resource-drop]...` intrinsic. + unsafe fn drop(handle: u32); + } + + impl Resource { + #[doc(hidden)] + pub unsafe fn from_handle(handle: u32) -> Self { + debug_assert!(handle != u32::MAX); + Self { + handle: AtomicU32::new(handle), + _marker: marker::PhantomData, + } + } + + /// Takes ownership of the handle owned by `resource`. + /// + /// Note that this ideally would be `into_handle` taking `Resource` by + /// ownership. The code generator does not enable that in all situations, + /// unfortunately, so this is provided instead. + /// + /// Also note that `take_handle` is in theory only ever called on values + /// owned by a generated function. For example a generated function might + /// take `Resource` as an argument but then call `take_handle` on a + /// reference to that argument. In that sense the dynamic nature of + /// `take_handle` should only be exposed internally to generated code, not + /// to user code. + #[doc(hidden)] + pub fn take_handle(resource: &Resource) -> u32 { + resource.handle.swap(u32::MAX, Relaxed) + } + + #[doc(hidden)] + pub fn handle(resource: &Resource) -> u32 { + resource.handle.load(Relaxed) + } + } + + impl fmt::Debug for Resource { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("Resource") + .field("handle", &self.handle) + .finish() + } + } + + impl Drop for Resource { + fn drop(&mut self) { + unsafe { + match self.handle.load(Relaxed) { + // If this handle was "taken" then don't do anything in the + // destructor. + u32::MAX => {} + + // ... but otherwise do actually destroy it with the imported + // component model intrinsic as defined through `T`. + other => T::drop(other), + } + } + } + } + pub unsafe fn bool_lift(val: u8) -> bool { + if cfg!(debug_assertions) { + match val { + 0 => false, + 1 => true, + _ => panic!("invalid bool discriminant"), + } + } else { + val != 0 + } + } + pub use alloc_crate::alloc; + pub use alloc_crate::string::String; + pub use alloc_crate::vec::Vec; + + pub fn as_i32(t: T) -> i32 { + t.as_i32() + } + + pub trait AsI32 { + fn as_i32(self) -> i32; + } + + impl<'a, T: Copy + AsI32> AsI32 for &'a T { + fn as_i32(self) -> i32 { + (*self).as_i32() + } + } + + impl AsI32 for i32 { + #[inline] + fn as_i32(self) -> i32 { + self as i32 + } + } + + impl AsI32 for u32 { + #[inline] + fn as_i32(self) -> i32 { + self as i32 + } + } + + impl AsI32 for i16 { + #[inline] + fn as_i32(self) -> i32 { + self as i32 + } + } + + impl AsI32 for u16 { + #[inline] + fn as_i32(self) -> i32 { + self as i32 + } + } + + impl AsI32 for i8 { + #[inline] + fn as_i32(self) -> i32 { + self as i32 + } + } + + impl AsI32 for u8 { + #[inline] + fn as_i32(self) -> i32 { + self as i32 + } + } + + impl AsI32 for char { + #[inline] + fn as_i32(self) -> i32 { + self as i32 + } + } + + impl AsI32 for usize { + #[inline] + fn as_i32(self) -> i32 { + self as i32 + } + } + + pub fn as_i64(t: T) -> i64 { + t.as_i64() + } + + pub trait AsI64 { + fn as_i64(self) -> i64; + } + + impl<'a, T: Copy + AsI64> AsI64 for &'a T { + fn as_i64(self) -> i64 { + (*self).as_i64() + } + } + + impl AsI64 for i64 { + #[inline] + fn as_i64(self) -> i64 { + self as i64 + } + } + + impl AsI64 for u64 { + #[inline] + fn as_i64(self) -> i64 { + self as i64 + } + } + + pub fn as_f32(t: T) -> f32 { + t.as_f32() + } + + pub trait AsF32 { + fn as_f32(self) -> f32; + } + + impl<'a, T: Copy + AsF32> AsF32 for &'a T { + fn as_f32(self) -> f32 { + (*self).as_f32() + } + } + + impl AsF32 for f32 { + #[inline] + fn as_f32(self) -> f32 { + self as f32 + } + } + + pub fn as_f64(t: T) -> f64 { + t.as_f64() + } + + pub trait AsF64 { + fn as_f64(self) -> f64; + } + + impl<'a, T: Copy + AsF64> AsF64 for &'a T { + fn as_f64(self) -> f64 { + (*self).as_f64() + } + } + + impl AsF64 for f64 { + #[inline] + fn as_f64(self) -> f64 { + self as f64 + } + } + pub unsafe fn invalid_enum_discriminant() -> T { + if cfg!(debug_assertions) { + panic!("invalid enum discriminant") + } else { + core::hint::unreachable_unchecked() + } + } + pub unsafe fn cabi_dealloc(ptr: *mut u8, size: usize, align: usize) { + if size == 0 { + return; + } + let layout = alloc::Layout::from_size_align_unchecked(size, align); + alloc::dealloc(ptr as *mut u8, layout); + } + pub unsafe fn char_lift(val: u32) -> char { + if cfg!(debug_assertions) { + core::char::from_u32(val).unwrap() + } else { + core::char::from_u32_unchecked(val) + } + } + pub unsafe fn string_lift(bytes: Vec) -> String { + if cfg!(debug_assertions) { + String::from_utf8(bytes).unwrap() + } else { + String::from_utf8_unchecked(bytes) + } + } + pub use alloc_crate::boxed::Box; + + #[cfg(target_arch = "wasm32")] + pub fn run_ctors_once() { + wit_bindgen_rt::run_ctors_once(); + } + extern crate alloc as alloc_crate; +} + +/// Generates `#[no_mangle]` functions to export the specified type as the +/// root implementation of all generated traits. +/// +/// For more information see the documentation of `wit_bindgen::generate!`. +/// +/// ```rust +/// # macro_rules! export{ ($($t:tt)*) => (); } +/// # trait Guest {} +/// struct MyType; +/// +/// impl Guest for MyType { +/// // ... +/// } +/// +/// export!(MyType); +/// ``` +#[allow(unused_macros)] +#[doc(hidden)] + +macro_rules! __export_wasm_rpc_stub_ephemeral_impl { + ($ty:ident) => (self::export!($ty with_types_in self);); + ($ty:ident with_types_in $($path_to_types_root:tt)*) => ( + $($path_to_types_root)*::exports::rpc::ephemeral_stub::stub_ephemeral::__export_rpc_ephemeral_stub_stub_ephemeral_cabi!($ty with_types_in $($path_to_types_root)*::exports::rpc::ephemeral_stub::stub_ephemeral); + ) + } +#[doc(inline)] +pub(crate) use __export_wasm_rpc_stub_ephemeral_impl as export; + +#[cfg(target_arch = "wasm32")] +#[link_section = "component-type:wit-bindgen:0.25.0:wasm-rpc-stub-ephemeral:encoded world"] +#[doc(hidden)] +pub static __WIT_BINDGEN_COMPONENT_TYPE: [u8; 1998] = *b"\ +\0asm\x0d\0\x01\0\0\x19\x16wit-component-encoding\x04\0\x07\xc0\x0e\x01A\x02\x01\ +A\x08\x01B\x0a\x04\0\x08pollable\x03\x01\x01h\0\x01@\x01\x04self\x01\0\x7f\x04\0\ +\x16[method]pollable.ready\x01\x02\x01@\x01\x04self\x01\x01\0\x04\0\x16[method]p\ +ollable.block\x01\x03\x01p\x01\x01py\x01@\x01\x02in\x04\0\x05\x04\0\x04poll\x01\x06\ +\x03\x01\x12wasi:io/poll@0.2.0\x05\0\x02\x03\0\0\x08pollable\x01B*\x02\x03\x02\x01\ +\x01\x04\0\x08pollable\x03\0\0\x01z\x04\0\x0anode-index\x03\0\x02\x01r\x01\x05va\ +lues\x04\0\x03uri\x03\0\x04\x01p\x03\x01k\x03\x01o\x02y\x07\x01p\x7f\x01j\x01\x07\ +\x01\x07\x01o\x02\x05w\x01q\x16\x0crecord-value\x01\x06\0\x0dvariant-value\x01\x08\ +\0\x0aenum-value\x01y\0\x0bflags-value\x01\x09\0\x0btuple-value\x01\x06\0\x0alis\ +t-value\x01\x06\0\x0coption-value\x01\x07\0\x0cresult-value\x01\x0a\0\x07prim-u8\ +\x01}\0\x08prim-u16\x01{\0\x08prim-u32\x01y\0\x08prim-u64\x01w\0\x07prim-s8\x01~\ +\0\x08prim-s16\x01|\0\x08prim-s32\x01z\0\x08prim-s64\x01x\0\x0cprim-float32\x01v\ +\0\x0cprim-float64\x01u\0\x09prim-char\x01t\0\x09prim-bool\x01\x7f\0\x0bprim-str\ +ing\x01s\0\x06handle\x01\x0b\0\x04\0\x08wit-node\x03\0\x0c\x01p\x0d\x01r\x01\x05\ +nodes\x0e\x04\0\x09wit-value\x03\0\x0f\x01q\x04\x0eprotocol-error\x01s\0\x06deni\ +ed\x01s\0\x09not-found\x01s\0\x15remote-internal-error\x01s\0\x04\0\x09rpc-error\ +\x03\0\x11\x04\0\x08wasm-rpc\x03\x01\x04\0\x14future-invoke-result\x03\x01\x01i\x13\ +\x01@\x01\x08location\x05\0\x15\x04\0\x15[constructor]wasm-rpc\x01\x16\x01h\x13\x01\ +p\x10\x01j\x01\x10\x01\x12\x01@\x03\x04self\x17\x0dfunction-names\x0ffunction-pa\ +rams\x18\0\x19\x04\0![method]wasm-rpc.invoke-and-await\x01\x1a\x01j\0\x01\x12\x01\ +@\x03\x04self\x17\x0dfunction-names\x0ffunction-params\x18\0\x1b\x04\0\x17[metho\ +d]wasm-rpc.invoke\x01\x1c\x01i\x14\x01@\x03\x04self\x17\x0dfunction-names\x0ffun\ +ction-params\x18\0\x1d\x04\0'[method]wasm-rpc.async-invoke-and-await\x01\x1e\x01\ +h\x14\x01i\x01\x01@\x01\x04self\x1f\0\x20\x04\0&[method]future-invoke-result.sub\ +scribe\x01!\x01k\x19\x01@\x01\x04self\x1f\0\"\x04\0\x20[method]future-invoke-res\ +ult.get\x01#\x03\x01\x15golem:rpc/types@0.1.0\x05\x02\x02\x03\0\x01\x03uri\x01B\x20\ +\x02\x03\x02\x01\x03\x04\0\x03uri\x03\0\0\x02\x03\x02\x01\x01\x04\0\x08pollable\x03\ +\0\x02\x04\0\x1dfuture-get-worker-name-result\x03\x01\x04\0!future-get-idempoten\ +cy-key-result\x03\x01\x04\0\x03api\x03\x01\x01h\x04\x01i\x03\x01@\x01\x04self\x07\ +\0\x08\x04\0/[method]future-get-worker-name-result.subscribe\x01\x09\x01ks\x01@\x01\ +\x04self\x07\0\x0a\x04\0)[method]future-get-worker-name-result.get\x01\x0b\x01h\x05\ +\x01@\x01\x04self\x0c\0\x08\x04\03[method]future-get-idempotency-key-result.subs\ +cribe\x01\x0d\x01@\x01\x04self\x0c\0\x0a\x04\0-[method]future-get-idempotency-ke\ +y-result.get\x01\x0e\x01i\x06\x01@\x01\x08location\x01\0\x0f\x04\0\x10[construct\ +or]api\x01\x10\x01h\x06\x01@\x01\x04self\x11\0s\x04\0$[method]api.blocking-get-w\ +orker-name\x01\x12\x01i\x04\x01@\x01\x04self\x11\0\x13\x04\0\x1b[method]api.get-\ +worker-name\x01\x14\x04\0([method]api.blocking-get-idempotency-key\x01\x12\x01i\x05\ +\x01@\x01\x04self\x11\0\x15\x04\0\x1f[method]api.get-idempotency-key\x01\x16\x04\ +\x01!rpc:ephemeral-stub/stub-ephemeral\x05\x04\x04\x01*rpc:ephemeral-stub/wasm-r\ +pc-stub-ephemeral\x04\0\x0b\x1d\x01\0\x17wasm-rpc-stub-ephemeral\x03\0\0\0G\x09p\ +roducers\x01\x0cprocessed-by\x02\x0dwit-component\x070.208.1\x10wit-bindgen-rust\ +\x060.25.0"; + +#[inline(never)] +#[doc(hidden)] +#[cfg(target_arch = "wasm32")] +pub fn __link_custom_section_describing_imports() { + wit_bindgen_rt::maybe_link_cabi_realloc(); +} diff --git a/test-components/rpc/ephemeral-stub/src/lib.rs b/test-components/rpc/ephemeral-stub/src/lib.rs new file mode 100644 index 000000000..eab9217d7 --- /dev/null +++ b/test-components/rpc/ephemeral-stub/src/lib.rs @@ -0,0 +1,143 @@ +#![allow(warnings)] +use golem_wasm_rpc::*; +#[allow(dead_code)] +mod bindings; +pub struct Api { + rpc: WasmRpc, +} +impl Api {} +pub struct FutureGetWorkerNameResult { + pub future_invoke_result: FutureInvokeResult, +} +pub struct FutureGetIdempotencyKeyResult { + pub future_invoke_result: FutureInvokeResult, +} +struct Component; +impl crate::bindings::exports::rpc::ephemeral_stub::stub_ephemeral::Guest for Component { + type Api = crate::Api; + type FutureGetWorkerNameResult = crate::FutureGetWorkerNameResult; + type FutureGetIdempotencyKeyResult = crate::FutureGetIdempotencyKeyResult; +} +impl crate::bindings::exports::rpc::ephemeral_stub::stub_ephemeral::GuestFutureGetWorkerNameResult +for FutureGetWorkerNameResult { + fn subscribe(&self) -> bindings::wasi::io::poll::Pollable { + let pollable = self.future_invoke_result.subscribe(); + let pollable = unsafe { + bindings::wasi::io::poll::Pollable::from_handle(pollable.take_handle()) + }; + pollable + } + fn get(&self) -> Option { + self.future_invoke_result + .get() + .map(|result| { + let result = result + .expect( + &format!( + "Failed to invoke remote {}", + "rpc:ephemeral/api.{get-worker-name}" + ), + ); + (result + .tuple_element(0) + .expect("tuple not found") + .string() + .expect("string not found") + .to_string()) + }) + } +} +impl crate::bindings::exports::rpc::ephemeral_stub::stub_ephemeral::GuestFutureGetIdempotencyKeyResult +for FutureGetIdempotencyKeyResult { + fn subscribe(&self) -> bindings::wasi::io::poll::Pollable { + let pollable = self.future_invoke_result.subscribe(); + let pollable = unsafe { + bindings::wasi::io::poll::Pollable::from_handle(pollable.take_handle()) + }; + pollable + } + fn get(&self) -> Option { + self.future_invoke_result + .get() + .map(|result| { + let result = result + .expect( + &format!( + "Failed to invoke remote {}", + "rpc:ephemeral/api.{get-idempotency-key}" + ), + ); + (result + .tuple_element(0) + .expect("tuple not found") + .string() + .expect("string not found") + .to_string()) + }) + } +} +impl crate::bindings::exports::rpc::ephemeral_stub::stub_ephemeral::GuestApi for Api { + fn new(location: crate::bindings::golem::rpc::types::Uri) -> Self { + let location = golem_wasm_rpc::Uri { + value: location.value, + }; + Self { + rpc: WasmRpc::new(&location), + } + } + fn blocking_get_worker_name(&self) -> String { + let result = self + .rpc + .invoke_and_await("rpc:ephemeral/api.{get-worker-name}", &[]) + .expect( + &format!( + "Failed to invoke-and-await remote {}", + "rpc:ephemeral/api.{get-worker-name}" + ), + ); + (result + .tuple_element(0) + .expect("tuple not found") + .string() + .expect("string not found") + .to_string()) + } + fn get_worker_name( + &self, + ) -> crate::bindings::exports::rpc::ephemeral_stub::stub_ephemeral::FutureGetWorkerNameResult { + let result = self + .rpc + .async_invoke_and_await("rpc:ephemeral/api.{get-worker-name}", &[]); + crate::bindings::exports::rpc::ephemeral_stub::stub_ephemeral::FutureGetWorkerNameResult::new(FutureGetWorkerNameResult { + future_invoke_result: result, + }) + } + fn blocking_get_idempotency_key(&self) -> String { + let result = self + .rpc + .invoke_and_await("rpc:ephemeral/api.{get-idempotency-key}", &[]) + .expect( + &format!( + "Failed to invoke-and-await remote {}", + "rpc:ephemeral/api.{get-idempotency-key}" + ), + ); + (result + .tuple_element(0) + .expect("tuple not found") + .string() + .expect("string not found") + .to_string()) + } + fn get_idempotency_key( + &self, + ) -> crate::bindings::exports::rpc::ephemeral_stub::stub_ephemeral::FutureGetIdempotencyKeyResult { + let result = self + .rpc + .async_invoke_and_await("rpc:ephemeral/api.{get-idempotency-key}", &[]); + crate::bindings::exports::rpc::ephemeral_stub::stub_ephemeral::FutureGetIdempotencyKeyResult::new(FutureGetIdempotencyKeyResult { + future_invoke_result: result, + }) + } +} +bindings::export!(Component with_types_in bindings); diff --git a/test-components/rpc/ephemeral-stub/wit/_stub.wit b/test-components/rpc/ephemeral-stub/wit/_stub.wit new file mode 100644 index 000000000..6d390e49a --- /dev/null +++ b/test-components/rpc/ephemeral-stub/wit/_stub.wit @@ -0,0 +1,27 @@ +package rpc:ephemeral-stub; + +interface stub-ephemeral { + use golem:rpc/types@0.1.0.{uri}; + use wasi:io/poll@0.2.0.{pollable}; + + resource future-get-worker-name-result { + subscribe: func() -> pollable; + get: func() -> option; + } + resource future-get-idempotency-key-result { + subscribe: func() -> pollable; + get: func() -> option; + } + resource api { + constructor(location: uri); + blocking-get-worker-name: func() -> string; + get-worker-name: func() -> future-get-worker-name-result; + blocking-get-idempotency-key: func() -> string; + get-idempotency-key: func() -> future-get-idempotency-key-result; + } + +} + +world wasm-rpc-stub-ephemeral { + export stub-ephemeral; +} diff --git a/test-components/rpc/ephemeral-stub/wit/deps/io/poll.wit b/test-components/rpc/ephemeral-stub/wit/deps/io/poll.wit new file mode 100644 index 000000000..82fa0f312 --- /dev/null +++ b/test-components/rpc/ephemeral-stub/wit/deps/io/poll.wit @@ -0,0 +1,41 @@ +package wasi:io@0.2.0; + +/// A poll API intended to let users wait for I/O events on multiple handles +/// at once. +interface poll { + /// `pollable` epresents a single I/O event which may be ready, or not. + resource pollable { + + /// Return the readiness of a pollable. This function never blocks. + /// + /// Returns `true` when the pollable is ready, and `false` otherwise. + ready: func() -> bool; + + /// `block` returns immediately if the pollable is ready, and otherwise + /// blocks until ready. + /// + /// This function is equivalent to calling `poll.poll` on a list + /// containing only this pollable. + block: func(); + } + + /// Poll for completion on a set of pollables. + /// + /// This function takes a list of pollables, which identify I/O sources of + /// interest, and waits until one or more of the events is ready for I/O. + /// + /// The result `list` contains one or more indices of handles in the + /// argument list that is ready for I/O. + /// + /// If the list contains more elements than can be indexed with a `u32` + /// value, this function traps. + /// + /// A timeout can be implemented by adding a pollable from the + /// wasi-clocks API to the list. + /// + /// This function does not return a `result`; polling in itself does not + /// do any I/O so it doesn't fail. If any of the I/O sources identified by + /// the pollables has an error, it is indicated by marking the source as + /// being reaedy for I/O. + poll: func(in: list>) -> list; +} diff --git a/test-components/rpc/ephemeral-stub/wit/deps/rpc_ephemeral/ephemeral.wit b/test-components/rpc/ephemeral-stub/wit/deps/rpc_ephemeral/ephemeral.wit new file mode 100644 index 000000000..fc59adcf6 --- /dev/null +++ b/test-components/rpc/ephemeral-stub/wit/deps/rpc_ephemeral/ephemeral.wit @@ -0,0 +1,10 @@ +package rpc:ephemeral; + +interface api { + get-worker-name: func() -> string; + get-idempotency-key: func() -> string; +} + +world ephemeral { + export api; +} diff --git a/test-components/rpc/ephemeral-stub/wit/deps/wasm-rpc/wasm-rpc.wit b/test-components/rpc/ephemeral-stub/wit/deps/wasm-rpc/wasm-rpc.wit new file mode 100644 index 000000000..69e1c8d46 --- /dev/null +++ b/test-components/rpc/ephemeral-stub/wit/deps/wasm-rpc/wasm-rpc.wit @@ -0,0 +1,65 @@ +package golem:rpc@0.1.0; + +interface types { + use wasi:io/poll@0.2.0.{pollable}; + + type node-index = s32; + + record wit-value { + nodes: list, + } + + variant wit-node { + record-value(list), + variant-value(tuple>), + enum-value(u32), + flags-value(list), + tuple-value(list), + list-value(list), + option-value(option), + result-value(result, option>), + prim-u8(u8), + prim-u16(u16), + prim-u32(u32), + prim-u64(u64), + prim-s8(s8), + prim-s16(s16), + prim-s32(s32), + prim-s64(s64), + prim-float32(float32), + prim-float64(float64), + prim-char(char), + prim-bool(bool), + prim-string(string), + handle(tuple) + } + + record uri { + value: string, + } + + variant rpc-error { + protocol-error(string), + denied(string), + not-found(string), + remote-internal-error(string) + } + + resource wasm-rpc { + constructor(location: uri); + + invoke-and-await: func(function-name: string, function-params: list) -> result; + invoke: func(function-name: string, function-params: list) -> result<_, rpc-error>; + + async-invoke-and-await: func(function-name: string, function-params: list) -> future-invoke-result; + } + + resource future-invoke-result { + subscribe: func() -> pollable; + get: func() -> option>; + } +} + +world wit-value { + import types; +} diff --git a/test-components/rpc/ephemeral/Cargo.toml b/test-components/rpc/ephemeral/Cargo.toml new file mode 100644 index 000000000..4e11b6b49 --- /dev/null +++ b/test-components/rpc/ephemeral/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "ephemeral" +version = "0.0.1" +edition = "2021" + +[lib] +path = "src/lib.rs" +crate-type = ["cdylib"] + +[dependencies] +once_cell = "1.17.1" +rand = "0.8.5" +uuid = { version = "1.4.1", features = ["v4"] } +wit-bindgen-rt = { version = "0.26.0", features = ["bitflags"] } + +golem-rust = "1" + +[package.metadata.component.target] +path = "wit" + +[package.metadata.component.dependencies] diff --git a/test-components/rpc/ephemeral/src/bindings.rs b/test-components/rpc/ephemeral/src/bindings.rs new file mode 100644 index 000000000..75b1c5c98 --- /dev/null +++ b/test-components/rpc/ephemeral/src/bindings.rs @@ -0,0 +1,158 @@ +// Generated by `wit-bindgen` 0.25.0. DO NOT EDIT! +// Options used: +#[allow(dead_code)] +pub mod exports { + #[allow(dead_code)] + pub mod rpc { + #[allow(dead_code)] + pub mod ephemeral { + #[allow(dead_code, clippy::all)] + pub mod api { + #[used] + #[doc(hidden)] + #[cfg(target_arch = "wasm32")] + static __FORCE_SECTION_REF: fn() = + super::super::super::super::__link_custom_section_describing_imports; + use super::super::super::super::_rt; + #[doc(hidden)] + #[allow(non_snake_case)] + pub unsafe fn _export_get_worker_name_cabi() -> *mut u8 { + #[cfg(target_arch = "wasm32")] + _rt::run_ctors_once(); + let result0 = T::get_worker_name(); + let ptr1 = _RET_AREA.0.as_mut_ptr().cast::(); + let vec2 = (result0.into_bytes()).into_boxed_slice(); + let ptr2 = vec2.as_ptr().cast::(); + let len2 = vec2.len(); + ::core::mem::forget(vec2); + *ptr1.add(4).cast::() = len2; + *ptr1.add(0).cast::<*mut u8>() = ptr2.cast_mut(); + ptr1 + } + #[doc(hidden)] + #[allow(non_snake_case)] + pub unsafe fn __post_return_get_worker_name(arg0: *mut u8) { + let l0 = *arg0.add(0).cast::<*mut u8>(); + let l1 = *arg0.add(4).cast::(); + _rt::cabi_dealloc(l0, l1, 1); + } + #[doc(hidden)] + #[allow(non_snake_case)] + pub unsafe fn _export_get_idempotency_key_cabi() -> *mut u8 { + #[cfg(target_arch = "wasm32")] + _rt::run_ctors_once(); + let result0 = T::get_idempotency_key(); + let ptr1 = _RET_AREA.0.as_mut_ptr().cast::(); + let vec2 = (result0.into_bytes()).into_boxed_slice(); + let ptr2 = vec2.as_ptr().cast::(); + let len2 = vec2.len(); + ::core::mem::forget(vec2); + *ptr1.add(4).cast::() = len2; + *ptr1.add(0).cast::<*mut u8>() = ptr2.cast_mut(); + ptr1 + } + #[doc(hidden)] + #[allow(non_snake_case)] + pub unsafe fn __post_return_get_idempotency_key(arg0: *mut u8) { + let l0 = *arg0.add(0).cast::<*mut u8>(); + let l1 = *arg0.add(4).cast::(); + _rt::cabi_dealloc(l0, l1, 1); + } + pub trait Guest { + fn get_worker_name() -> _rt::String; + fn get_idempotency_key() -> _rt::String; + } + #[doc(hidden)] + + macro_rules! __export_rpc_ephemeral_api_cabi{ + ($ty:ident with_types_in $($path_to_types:tt)*) => (const _: () = { + + #[export_name = "rpc:ephemeral/api#get-worker-name"] + unsafe extern "C" fn export_get_worker_name() -> *mut u8 { + $($path_to_types)*::_export_get_worker_name_cabi::<$ty>() + } + #[export_name = "cabi_post_rpc:ephemeral/api#get-worker-name"] + unsafe extern "C" fn _post_return_get_worker_name(arg0: *mut u8,) { + $($path_to_types)*::__post_return_get_worker_name::<$ty>(arg0) + } + #[export_name = "rpc:ephemeral/api#get-idempotency-key"] + unsafe extern "C" fn export_get_idempotency_key() -> *mut u8 { + $($path_to_types)*::_export_get_idempotency_key_cabi::<$ty>() + } + #[export_name = "cabi_post_rpc:ephemeral/api#get-idempotency-key"] + unsafe extern "C" fn _post_return_get_idempotency_key(arg0: *mut u8,) { + $($path_to_types)*::__post_return_get_idempotency_key::<$ty>(arg0) + } + };); + } + #[doc(hidden)] + pub(crate) use __export_rpc_ephemeral_api_cabi; + #[repr(align(4))] + struct _RetArea([::core::mem::MaybeUninit; 8]); + static mut _RET_AREA: _RetArea = _RetArea([::core::mem::MaybeUninit::uninit(); 8]); + } + } + } +} +mod _rt { + + #[cfg(target_arch = "wasm32")] + pub fn run_ctors_once() { + wit_bindgen_rt::run_ctors_once(); + } + pub unsafe fn cabi_dealloc(ptr: *mut u8, size: usize, align: usize) { + if size == 0 { + return; + } + let layout = alloc::Layout::from_size_align_unchecked(size, align); + alloc::dealloc(ptr as *mut u8, layout); + } + pub use alloc_crate::alloc; + pub use alloc_crate::string::String; + extern crate alloc as alloc_crate; +} + +/// Generates `#[no_mangle]` functions to export the specified type as the +/// root implementation of all generated traits. +/// +/// For more information see the documentation of `wit_bindgen::generate!`. +/// +/// ```rust +/// # macro_rules! export{ ($($t:tt)*) => (); } +/// # trait Guest {} +/// struct MyType; +/// +/// impl Guest for MyType { +/// // ... +/// } +/// +/// export!(MyType); +/// ``` +#[allow(unused_macros)] +#[doc(hidden)] + +macro_rules! __export_ephemeral_impl { + ($ty:ident) => (self::export!($ty with_types_in self);); + ($ty:ident with_types_in $($path_to_types_root:tt)*) => ( + $($path_to_types_root)*::exports::rpc::ephemeral::api::__export_rpc_ephemeral_api_cabi!($ty with_types_in $($path_to_types_root)*::exports::rpc::ephemeral::api); + ) +} +#[doc(inline)] +pub(crate) use __export_ephemeral_impl as export; + +#[cfg(target_arch = "wasm32")] +#[link_section = "component-type:wit-bindgen:0.25.0:ephemeral:encoded world"] +#[doc(hidden)] +pub static __WIT_BINDGEN_COMPONENT_TYPE: [u8; 235] = *b"\ +\0asm\x0d\0\x01\0\0\x19\x16wit-component-encoding\x04\0\x07l\x01A\x02\x01A\x02\x01\ +B\x03\x01@\0\0s\x04\0\x0fget-worker-name\x01\0\x04\0\x13get-idempotency-key\x01\0\ +\x04\x01\x11rpc:ephemeral/api\x05\0\x04\x01\x17rpc:ephemeral/ephemeral\x04\0\x0b\ +\x0f\x01\0\x09ephemeral\x03\0\0\0G\x09producers\x01\x0cprocessed-by\x02\x0dwit-c\ +omponent\x070.208.1\x10wit-bindgen-rust\x060.25.0"; + +#[inline(never)] +#[doc(hidden)] +#[cfg(target_arch = "wasm32")] +pub fn __link_custom_section_describing_imports() { + wit_bindgen_rt::maybe_link_cabi_realloc(); +} diff --git a/test-components/rpc/ephemeral/src/lib.rs b/test-components/rpc/ephemeral/src/lib.rs new file mode 100644 index 000000000..6e0bba394 --- /dev/null +++ b/test-components/rpc/ephemeral/src/lib.rs @@ -0,0 +1,17 @@ +use bindings::exports::rpc::ephemeral::api::Guest; + +mod bindings; + +pub struct Component; + +impl Guest for Component { + fn get_worker_name() -> String { + std::env::var("GOLEM_WORKER_NAME").unwrap() + } + + fn get_idempotency_key() -> String { + golem_rust::generate_idempotency_key().to_string() + } +} + +bindings::export!(Component with_types_in bindings); diff --git a/test-components/rpc/ephemeral/wit/ephemeral.wit b/test-components/rpc/ephemeral/wit/ephemeral.wit new file mode 100644 index 000000000..fc59adcf6 --- /dev/null +++ b/test-components/rpc/ephemeral/wit/ephemeral.wit @@ -0,0 +1,10 @@ +package rpc:ephemeral; + +interface api { + get-worker-name: func() -> string; + get-idempotency-key: func() -> string; +} + +world ephemeral { + export api; +} diff --git a/test-components/rpc/stubgen.sh b/test-components/rpc/stubgen.sh index bd1f30e2b..5ed50906b 100755 --- a/test-components/rpc/stubgen.sh +++ b/test-components/rpc/stubgen.sh @@ -8,3 +8,9 @@ mkdir -pv caller/wit/deps cp -rv counters-stub/wit/deps/* caller/wit/deps mkdir -pv caller/wit/deps/counters-stub cp counters-stub/wit/_stub.wit caller/wit/deps/counters-stub/stub.wit + +rm -rf ephemeral-stub +wasm-rpc-stubgen generate --source-wit-root ephemeral/wit --dest-crate-root ephemeral-stub --wasm-rpc-path-override /Users/vigoo/projects/ziverge/wasm-rpc/wasm-rpc +cp -rv ephemeral-stub/wit/deps/* caller/wit/deps +mkdir -pv caller/wit/deps/ephemeral-stub +cp ephemeral-stub/wit/_stub.wit caller/wit/deps/ephemeral-stub/stub.wit