diff --git a/core/CHANGELOG.md b/core/CHANGELOG.md index d3a5ac63..47206b69 100644 --- a/core/CHANGELOG.md +++ b/core/CHANGELOG.md @@ -13,8 +13,12 @@ We delete the `ProtocolName` trait and replace it with a requirement for `AsRef`. See [PR 3746] +- Remove `SingletonMuxer`. + See [PR 3883]. + [spec]: https://github.com/libp2p/specs/blob/master/connections/README.md#multistream-select [PR 3746]: https://github.com/libp2p/rust-libp2p/pull/3746 +[PR 3883]: https://github.com/libp2p/rust-libp2p/pull/3883 ## 0.39.2 diff --git a/core/src/muxing.rs b/core/src/muxing.rs index cb3f79e6..13b826ba 100644 --- a/core/src/muxing.rs +++ b/core/src/muxing.rs @@ -57,10 +57,8 @@ use std::pin::Pin; pub use self::boxed::StreamMuxerBox; pub use self::boxed::SubstreamBox; -pub use self::singleton::SingletonMuxer; mod boxed; -mod singleton; /// Provides multiplexing for a connection by allowing users to open substreams. /// diff --git a/core/src/muxing/singleton.rs b/core/src/muxing/singleton.rs deleted file mode 100644 index 3ba2c1cb..00000000 --- a/core/src/muxing/singleton.rs +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the "Software"), -// to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, -// and/or sell copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -// DEALINGS IN THE SOFTWARE. - -use crate::connection::Endpoint; -use crate::muxing::{StreamMuxer, StreamMuxerEvent}; - -use futures::prelude::*; -use std::cell::Cell; -use std::pin::Pin; -use std::{io, task::Context, task::Poll}; - -/// Implementation of `StreamMuxer` that allows only one substream on top of a connection, -/// yielding the connection itself. -/// -/// Applying this muxer on a connection doesn't read or write any data on the connection itself. -/// Most notably, no protocol is negotiated. -pub struct SingletonMuxer { - /// The inner connection. - inner: Cell>, - /// Our local endpoint. Always the same value as was passed to `new`. - endpoint: Endpoint, -} - -impl SingletonMuxer { - /// Creates a new `SingletonMuxer`. - /// - /// If `endpoint` is `Dialer`, then only one outbound substream will be permitted. - /// If `endpoint` is `Listener`, then only one inbound substream will be permitted. - pub fn new(inner: TSocket, endpoint: Endpoint) -> Self { - SingletonMuxer { - inner: Cell::new(Some(inner)), - endpoint, - } - } -} - -impl StreamMuxer for SingletonMuxer -where - TSocket: AsyncRead + AsyncWrite + Unpin, -{ - type Substream = TSocket; - type Error = io::Error; - - fn poll_inbound( - self: Pin<&mut Self>, - _: &mut Context<'_>, - ) -> Poll> { - let this = self.get_mut(); - - match this.endpoint { - Endpoint::Dialer => Poll::Pending, - Endpoint::Listener => match this.inner.replace(None) { - None => Poll::Pending, - Some(stream) => Poll::Ready(Ok(stream)), - }, - } - } - - fn poll_outbound( - self: Pin<&mut Self>, - _: &mut Context<'_>, - ) -> Poll> { - let this = self.get_mut(); - - match this.endpoint { - Endpoint::Listener => Poll::Pending, - Endpoint::Dialer => match this.inner.replace(None) { - None => Poll::Pending, - Some(stream) => Poll::Ready(Ok(stream)), - }, - } - } - - fn poll_close(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) - } - - fn poll( - self: Pin<&mut Self>, - _: &mut Context<'_>, - ) -> Poll> { - Poll::Pending - } -}