1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#[cfg(feature = "websockets")]
mod websocket;
use crate::connector::{
  ButtplugConnectorError,
  ButtplugConnectorResultFuture,
  ButtplugSerializedMessage,
};
use async_channel::{Receiver, Sender};
use futures::future::BoxFuture;
#[cfg(feature = "websockets")]
pub use websocket::{ButtplugWebsocketClientTransport, TungsteniteError};
#[cfg(all(feature = "websockets", feature = "async-std-runtime"))]
pub use websocket::{ButtplugWebsocketServerTransport, ButtplugWebsocketServerTransportOptions};

use thiserror::Error;

/// Enum of messages we can receive from a connector.

pub enum ButtplugTransportMessage {
  /// Send when connection is established.

  Connected,
  /// Text version of message we received from remote server.

  Message(ButtplugSerializedMessage),
  /// Error received from remote server.

  Error(String),
  /// Connector (or remote server) itself closed the connection.

  Close(String),
}

pub type ButtplugConnectorTransportConnectResult = BoxFuture<
  'static,
  Result<
    (
      Sender<ButtplugSerializedMessage>,
      Receiver<ButtplugTransportMessage>,
    ),
    ButtplugConnectorError,
  >,
>;

pub trait ButtplugConnectorTransport: Send + Sync {
  fn connect(&self) -> ButtplugConnectorTransportConnectResult;
  fn disconnect(self) -> ButtplugConnectorResultFuture;
}

#[derive(Error, Debug)]
pub enum ButtplugConnectorTransportSpecificError {
  #[cfg(feature = "websockets")]
  #[error("Tungstenite specific error: {0}")]
  TungsteniteError(#[from] TungsteniteError),

  #[error("Secure server error: %s")]
  SecureServerError(String),
}