protocol_version.rs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. use futures::FutureExt;
  2. use smol::Executor;
  3. use std::sync::Arc;
  4. use crate::net::error::{NetError, NetResult};
  5. use crate::net::messages;
  6. use crate::net::utility::sleep;
  7. use crate::net::{ChannelPtr, SettingsPtr};
  8. pub struct ProtocolVersion {
  9. channel: ChannelPtr,
  10. settings: SettingsPtr,
  11. }
  12. impl ProtocolVersion {
  13. pub fn new(channel: ChannelPtr, settings: SettingsPtr) -> Arc<Self> {
  14. Arc::new(Self { channel, settings })
  15. }
  16. pub async fn run(self: Arc<Self>, executor: Arc<Executor<'_>>) -> NetResult<()> {
  17. // Start timer
  18. // Send version, wait for verack
  19. // Wait for version, send verack
  20. // Fin.
  21. futures::select! {
  22. _ = self.clone().exchange_versions(executor).fuse() => Ok(()),
  23. _ = sleep(self.settings.channel_handshake_seconds).fuse() => Err(NetError::ChannelTimeout)
  24. }
  25. }
  26. async fn exchange_versions(self: Arc<Self>, executor: Arc<Executor<'_>>) -> NetResult<()> {
  27. let send = executor.spawn(self.clone().send_version());
  28. let recv = executor.spawn(self.recv_version());
  29. send.await.and(recv.await)
  30. }
  31. async fn send_version(self: Arc<Self>) -> NetResult<()> {
  32. let version = messages::Message::Version(messages::VersionMessage {});
  33. self.channel.clone().send(version).await?;
  34. Ok(())
  35. }
  36. async fn recv_version(self: Arc<Self>) -> NetResult<()> {
  37. let version_sub = self
  38. .channel
  39. .clone()
  40. .subscribe_msg(messages::PacketType::Version)
  41. .await;
  42. let _version_msg = version_sub.receive().await?;
  43. // Check the message is OK
  44. Ok(())
  45. }
  46. }