| 235 | } |
| 236 | |
| 237 | fn poll( |
| 238 | &mut self, |
| 239 | cx: &mut Context<'_>, |
| 240 | ) -> Poll<libp2p::swarm::ToSwarm<Self::ToSwarm, libp2p::swarm::THandlerInEvent<Self>>> { |
| 241 | if let Some(mut peers) = self.peers_fut.take() { |
| 242 | match peers.poll_unpin(cx) { |
| 243 | Poll::Ready(peers) => match peers { |
| 244 | Ok(peers) => { |
| 245 | for peer_entry in peers { |
| 246 | self.ceramic_peers |
| 247 | .entry(peer_entry.id().peer_id()) |
| 248 | .and_modify(|peer| { |
| 249 | let count = peer.addrs.len(); |
| 250 | peer.addrs.extend(peer_entry.addresses().iter().cloned()); |
| 251 | if count != peer.addrs.len() { |
| 252 | peer.start_redial() |
| 253 | } |
| 254 | }) |
| 255 | .or_insert(CeramicPeer::new(peer_entry.addresses().to_vec())); |
| 256 | } |
| 257 | } |
| 258 | Err(err) => warn!(%err,"failed to get set of remote peers"), |
| 259 | }, |
| 260 | Poll::Pending => { |
| 261 | self.peers_fut.replace(peers); |
| 262 | } |
| 263 | } |
| 264 | } |
| 265 | for (peer_id, peer) in self.ceramic_peers.iter_mut() { |
| 266 | if let Some(mut dial_future) = peer.dial_future.take() { |
| 267 | match dial_future.as_mut().poll_unpin(cx) { |
| 268 | Poll::Ready(()) => { |
| 269 | return Poll::Ready(ToSwarm::Dial { |
| 270 | opts: DialOpts::peer_id(*peer_id) |
| 271 | .addresses(peer.addrs.iter().cloned().collect()) |
| 272 | .condition(PeerCondition::Disconnected) |
| 273 | .build(), |
| 274 | }) |
| 275 | } |
| 276 | Poll::Pending => { |
| 277 | // Put the future back |
| 278 | peer.dial_future.replace(dial_future); |
| 279 | } |
| 280 | } |
| 281 | } |
| 282 | } |
| 283 | Poll::Pending |
| 284 | } |
| 285 | |
| 286 | fn handle_established_inbound_connection( |
| 287 | &mut self, |