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
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
use serde::{Deserialize, Serialize};

use crate::data::DataConnectionIdWrapper;
use crate::media::MediaConnectionIdWrapper;

/// Identifier for PeerObject.
///
/// To avoid misuse, it is used with Token.
#[derive(Serialize, Deserialize, Debug, Clone, PartialOrd, PartialEq, Eq, Ord, Hash)]
pub struct PeerId(pub String);

impl PeerId {
    pub fn as_str(&self) -> &str {
        self.0.as_str()
    }

    pub fn new(peer_id: impl Into<String>) -> Self {
        PeerId(peer_id.into())
    }
}

/// Token to avoid misuse of Peer.
///
/// It is used with PeerId.
#[derive(Serialize, Deserialize, Debug, Clone, PartialOrd, PartialEq, Eq, Ord, Hash)]
pub struct Token(pub String);

impl Token {
    pub fn as_str(&self) -> &str {
        self.0.as_str()
    }

    pub fn new(token: impl Into<String>) -> Self {
        Token(token.into())
    }
}

/// Pair of PeerId and Token.
#[derive(Serialize, Deserialize, Debug, Clone, PartialOrd, PartialEq, Eq, Ord, Hash)]
pub struct PeerInfo {
    pub peer_id: PeerId,
    pub token: Token,
}

/// Query for POST /peers.
///
/// [API](http://35.200.46.204/#/1.peers/peer)
#[derive(Serialize, Deserialize, Debug, Clone, PartialOrd, PartialEq)]
pub struct CreatePeerQuery {
    /// SkyWay's API Key.
    pub key: String,
    /// Registered domain of the API Key
    pub domain: String,
    /// Peer Id that user want to use.
    pub peer_id: PeerId,
    /// Whether does user want to use TURN server or not.
    pub turn: bool,
}

/// Response from POST /peers
///
/// [API](http://35.200.46.204/#/1.peers/peer)
#[derive(Serialize, Deserialize, Debug, Clone, PartialOrd, PartialEq)]
pub struct CreatedResponse {
    /// Fixed value as `"PEERS_CREATE"`.
    pub command_type: String,
    /// Pair of PeerId and Token. PeerId is not allocated in the server in this timing.
    pub params: PeerInfo,
}

/// Events from GET /peer/events
#[derive(Serialize, Deserialize, Debug, Clone, PartialOrd, PartialEq)]
#[serde(tag = "event")]
pub(crate) enum EventEnum {
    OPEN(PeerOpenEvent),
    CLOSE(PeerCloseEvent),
    CONNECTION(PeerConnectionEvent),
    CALL(PeerCallEvent),
    ERROR(PeerErrorEvent),
    TIMEOUT,
}

/// Response from GET /peers/{peer_id}/events
///
/// [API](http://35.200.46.204/#/1.peers/peer_event)
///
/// Indicates peer object is registered to SkyWay Server
#[derive(Serialize, Deserialize, Debug, Clone, PartialOrd, PartialEq)]
pub struct PeerOpenEvent {
    /// Pair of PeerId and Token. PeerId has been allocated in the server.
    pub params: PeerInfo,
}

/// Response from GET /peers/{peer_id}/events
///
/// [API](http://35.200.46.204/#/1.peers/peer_event)
///
/// Indicates peer object is deleted
#[derive(Serialize, Deserialize, Debug, Clone, PartialOrd, PartialEq)]
pub struct PeerCloseEvent {
    /// Pair of PeerId and Token. Just for indicating which Peer Object is deleted.
    pub params: PeerInfo,
}

/// Response from GET /peers/{peer_id}/events
///
/// [API](http://35.200.46.204/#/1.peers/peer_event)
///
/// Shows Error about PeerObject
#[derive(Serialize, Deserialize, Debug, Clone, PartialOrd, PartialEq)]
pub struct PeerErrorEvent {
    /// Pair of PeerId and Token. Indicate which Peer Object is regarded.
    pub params: PeerInfo,
    /// Shows detail of the error.
    pub error_message: String,
}

/// Shows that the Peer Object receives a request to establish DataConnection with neighbour.
///
/// [API](http://35.200.46.204/#/1.peers/peer_event)
///
/// DataConnection is automatically established when the request comes.
#[derive(Serialize, Deserialize, Debug, Clone, PartialOrd, PartialEq)]
pub struct PeerConnectionEvent {
    /// Pair of PeerId and Token. Indicate which Peer Object is regarded.
    pub params: PeerInfo,
    /// Id to identify the DataConnection
    pub data_params: DataConnectionIdWrapper,
}

/// Shows that the Peer Object receives a request to establish MediaConnection with neighbour.
///
/// [API](http://35.200.46.204/#/1.peers/peer_event)
#[derive(Serialize, Deserialize, Debug, Clone, PartialOrd, PartialEq)]
pub struct PeerCallEvent {
    pub params: PeerInfo,
    pub call_params: MediaConnectionIdWrapper,
}

/// Response from GET /peer/{peer_id}/status
///
/// [API](http://35.200.46.204/#/1.peers/peer_status)
#[derive(Serialize, Deserialize, Debug, Clone, PartialOrd, PartialEq)]
pub struct PeerStatusMessage {
    pub peer_id: PeerId,
    pub disconnected: bool,
}