wasmtime_wasi/p2/
ip_name_lookup.rs1use crate::p2::SocketError;
2use crate::p2::bindings::sockets::ip_name_lookup::{Host, HostResolveAddressStream};
3use crate::p2::bindings::sockets::network::{ErrorCode, IpAddress, Network};
4use crate::sockets::ip_name_lookup::resolve_addresses;
5use crate::sockets::{MaybeReady, WasiSocketsCtxView, noop_cx};
6use std::net::IpAddr;
7use std::task::Poll;
8use std::vec;
9use wasmtime::Result;
10use wasmtime::component::Resource;
11use wasmtime_wasi_io::poll::{DynPollable, Pollable, subscribe};
12
13pub struct ResolveAddressStream(MaybeReady<Result<vec::IntoIter<IpAddr>, ErrorCode>>);
14
15impl Host for WasiSocketsCtxView<'_> {
16 fn resolve_addresses(
17 &mut self,
18 network: Resource<Network>,
19 name: String,
20 ) -> Result<Resource<ResolveAddressStream>, SocketError> {
21 _ = self.table.get(&network)?;
25
26 let fut = resolve_addresses(&self.ctx, name);
27 let stream = ResolveAddressStream(MaybeReady::poll_or_spawn(async move {
28 Ok(fut.await?.into_iter())
29 }));
30
31 if let MaybeReady::Ready(Err(err)) = &stream.0 {
33 return Err((*err).into());
34 }
35 Ok(self.table.push(stream)?)
36 }
37}
38
39impl HostResolveAddressStream for WasiSocketsCtxView<'_> {
40 fn resolve_next_address(
41 &mut self,
42 resource: Resource<ResolveAddressStream>,
43 ) -> Result<Option<IpAddress>, SocketError> {
44 let stream: &mut ResolveAddressStream = self.table.get_mut(&resource)?;
45 let Poll::Ready(result) = stream.0.poll_ready(&mut noop_cx()) else {
46 return Err(ErrorCode::WouldBlock.into());
47 };
48
49 match result {
50 Ok(iter) => Ok(iter.next().map(|addr| addr.into())),
51 Err(err) => Err((*err).into()),
52 }
53 }
54
55 fn subscribe(
56 &mut self,
57 resource: Resource<ResolveAddressStream>,
58 ) -> Result<Resource<DynPollable>> {
59 subscribe(self.table, resource)
60 }
61
62 fn drop(&mut self, resource: Resource<ResolveAddressStream>) -> Result<()> {
63 self.table.delete(resource)?;
64 Ok(())
65 }
66}
67
68#[async_trait::async_trait]
69impl Pollable for ResolveAddressStream {
70 async fn ready(&mut self) {
71 std::future::poll_fn(|cx| self.0.poll_ready(cx).map(|_| ())).await
72 }
73}