diff --git a/docs/rfc/0002-webrc-client-api.md b/docs/rfc/0002-webrc-client-api.md
index 1b056b8cc..1415f159a 100644
--- a/docs/rfc/0002-webrc-client-api.md
+++ b/docs/rfc/0002-webrc-client-api.md
@@ -525,7 +525,7 @@ This event is sent during SDP negotiation/re-negotiation.
#### 7. IceCandidateDiscovered
```rust
-struct IceCandidatesDiscovered {
+struct IceCandidateDiscovered {
peer_id: u64,
candidate: String,
}
@@ -990,7 +990,7 @@ struct GetMembers {
### Extended examples
-1 <=> 1 p2p with unpublish and republish
+1 <=> 1 P2P with unpublish and republish
```
.----user1----. .->-->-->--. .----user2----.
@@ -998,388 +998,407 @@ struct GetMembers {
'-------------' '-<--<--<--' '-------------'
```
-1\. Server send `PeerCreated` to `user1`:
-
-```json
-{
- "method": "PeerCreated",
- "payload": {
- "peer": {
- "peer_id": 1,
- "tracks": [{
- "id": 1,
- "media_type": {
- "Audio": {}
- },
- "direction": {
- "Send": {
- "receivers": [2]
- }
- }
- }, {
- "id": 2,
- "media_type": {
- "Video": {}
+1. `Media Server` sends `PeerCreated` event to `user1`:
+
+ ```json
+ {
+ "event": "PeerCreated",
+ "data": {
+ "peer": {
+ "peer_id": 1,
+ "tracks": [{
+ "id": 1,
+ "media_type": {
+ "Audio": {}
+ },
+ "direction": {
+ "Send": {
+ "receivers": [2]
+ }
+ }
+ }, {
+ "id": 2,
+ "media_type": {
+ "Video": {}
+ },
+ "direction": {
+ "Send": {
+ "receivers": [2]
+ }
+ }
+ }, {
+ "id": 3,
+ "media_type": {
+ "Audio": {}
+ },
+ "direction": {
+ "Recv": {
+ "sender": 2
+ }
+ }
+ }, {
+ "id": 4,
+ "media_type": {
+ "Video": {}
+ },
+ "direction": {
+ "Recv": {
+ "sender": 2
+ }
+ }
+ }]
},
- "direction": {
- "Send": {
- "receivers": [2]
- }
- }
- }, {
- "id": 3,
- "media_type": {
- "Audio": {}
- },
- "direction": {
- "Recv": {
- "sender": 2
- }
- }
- }, {
- "id": 4,
- "media_type": {
- "Video": {}
- },
- "direction": {
- "Recv": {
- "sender": 2
- }
- }
- }]
- },
- "sdp_offer": null,
- "ice_servers": [{
- "urls": [
- "turn:turnserver.com:3478",
- "turn:turnserver.com:3478?transport=tcp"
- ],
- "username": "turn_user",
- "credential": "turn_credential"
- }]
- }
-}
-```
+ "sdp_offer": null,
+ "ice_servers": [{
+ "urls": [
+ "turn:turnserver.com:3478",
+ "turn:turnserver.com:3478?transport=tcp"
+ ],
+ "username": "turn_user",
+ "credential": "turn_credential"
+ }]
+ }
+ }
+ ```
-2\. `user1` answers with [SDP Offer]:
-
-```json
-{
- "method": "MakeSdpOffer",
- "payload": {
- "peer_id": 1,
- "sdp_offer": "user1_sendrecv_offer"
- }
-}
-```
+2. `user1` answers with [SDP Offer] (`MakeSdpOffer` command):
+
+ ```json
+ {
+ "command": "MakeSdpOffer",
+ "data": {
+ "peer_id": 1,
+ "sdp_offer": "user1_sendrecv_offer"
+ }
+ }
+ ```
-3\. Server send `PeerCreated` with `user1`'s [SDP Offer] to `user2`:
-
-```json
-{
- "method": "PeerCreated",
- "payload": {
- "peer": {
- "peer_id": 2,
- "tracks": [{
- "id": 1,
- "media_type": {
- "Audio": {}
+3. `Media Server` sends `PeerCreated` event with `user1`'s [SDP Offer] to `user2`:
+
+ ```json
+ {
+ "event": "PeerCreated",
+ "data": {
+ "peer": {
+ "peer_id": 2,
+ "tracks": [{
+ "id": 1,
+ "media_type": {
+ "Audio": {}
+ },
+ "direction": {
+ "Recv": {
+ "sender": 1
+ }
+ }
+ }, {
+ "id": 2,
+ "media_type": {
+ "Audio": {}
+ },
+ "direction": {
+ "Recv": {
+ "sender": 1
+ }
+ }
+ }, {
+ "id": 3,
+ "media_type": {
+ "Audio": {}
+ },
+ "direction": {
+ "Send": {
+ "receivers": [1]
+ }
+ }
+ }, {
+ "id": 4,
+ "media_type": {
+ "Video": {}
+ },
+ "direction": {
+ "Send": {
+ "receivers": [1]
+ }
+ }
+ }]
},
- "direction": {
- "Recv": {
- "sender": 1
- }
- }
- }, {
- "id": 2,
- "media_type": {
- "Audio": {}
- },
- "direction": {
- "Recv": {
- "sender": 1
- }
- }
- }, {
- "id": 3,
- "media_type": {
- "Audio": {}
- },
- "direction": {
- "Send": {
- "receivers": [1]
- }
- }
- }, {
- "id": 4,
- "media_type": {
- "Video": {}
- },
- "direction": {
- "Send": {
- "receivers": [1]
- }
- }
- }]
- },
- "sdp_offer": "user1_sendrecv_offer",
- "ice_servers": [{
- "urls": [
- "turn:turnserver.com:3478",
- "turn:turnserver.com:3478?transport=tcp"
- ],
- "username": "turn_user",
- "credential": "turn_credential"
- }]
- }
-}
-```
+ "sdp_offer": "user1_sendrecv_offer",
+ "ice_servers": [{
+ "urls": [
+ "turn:turnserver.com:3478",
+ "turn:turnserver.com:3478?transport=tcp"
+ ],
+ "username": "turn_user",
+ "credential": "turn_credential"
+ }]
+ }
+ }
+ ```
-4\. `user2` answers with [SDP Answer]:
+4. `user2` answers with [SDP Answer] (`MakeSdpAnswer` command):
-```json
-{
- "method": "MakeSDPAnswer",
- "payload": {
- "peer_id": 2,
- "sdp_answer": "user2_sendrecv_answer"
- }
-}
-```
+ ```json
+ {
+ "command": "MakeSdpAnswer",
+ "data": {
+ "peer_id": 2,
+ "sdp_answer": "user2_sendrecv_answer"
+ }
+ }
+ ```
-5\. Both peers exchange discovered [ICE Candidate]'s:
+5. Both peers exchange discovered [ICE Candidate]s:
-`user1` => `Server`
-```json
-{
- "method": "SetIceCandidate",
- "payload": {
- "peer_id": 1,
- "candidate": "user1_ice_candidate"
- }
-}
-```
+ 1. `user1` => `Media Server`:
-`Server` => `user2`
-```json
-{
- "method": "IceCandidatesDiscovered",
- "payload": {
- "peer_id": 2,
- "candidate": "user1_ice_candidate"
- }
-}
-```
+ ```json
+ {
+ "command": "SetIceCandidate",
+ "data": {
+ "peer_id": 1,
+ "candidate": "user1_ice_candidate"
+ }
+ }
+ ```
-`user2` => `Server`
-```json
-{
- "method": "SetIceCandidate",
- "payload": {
- "peer_id": 2,
- "candidate": "user2_ice_candidate"
- }
-}
-```
+ 2. `Media Server` => `user2`:
-`Server` => `user1`
-```json
-{
- "method": "IceCandidatesDiscovered",
- "payload": {
- "peer_id": 1,
- "candidate": "user2_ice_candidate"
- }
-}
-```
+ ```json
+ {
+ "event": "IceCandidateDiscovered",
+ "data": {
+ "peer_id": 2,
+ "candidate": "user1_ice_candidate"
+ }
+ }
+ ```
-6\. At this point connection is supposed to be established:
+ 3. `user2` => `Media Server`:
-```
-.----user1----. .->-->-->--. .----user2----.
-: o(1)=: :=o(2) :
-'-------------' '-<--<--<--' '-------------'
-```
+ ```json
+ {
+ "command": "SetIceCandidate",
+ "data": {
+ "peer_id": 2,
+ "candidate": "user2_ice_candidate"
+ }
+ }
+ ```
-7\. `user1` wants to unpublish his tracks, so he sends `TracksRemoved` to the server:
+ 4. `Media Server` => `user1`:
-```json
-{
- "method": "RemoveTracks",
- "payload": {
- "peer_id": 1,
- "tracks": [1, 2]
- }
-}
-```
+ ```json
+ {
+ "event": "IceCandidateDiscovered",
+ "data": {
+ "peer_id": 1,
+ "candidate": "user2_ice_candidate"
+ }
+ }
+ ```
+
+6. At this point connection is supposed to be established:
+
+ ```
+ .----user1----. .->-->-->--. .----user2----.
+ : o(1)=: :=o(2) :
+ '-------------' '-<--<--<--' '-------------'
+ ```
+
+7. `user1` wants to unpublish his `Track`s, so he sends `RemoveTracks` command to `Media Server`:
+
+ ```json
+ {
+ "command": "RemoveTracks",
+ "data": {
+ "peer_id": 1,
+ "tracks": [1, 2]
+ }
+ }
+ ```
-8\. Server updates `user2` tracks:
+8. `Media Server` updates `user2` `Track`s:
-```json
-{
- "method": "TracksRemoved",
- "payload": {
- "peer_id": 2,
- "tracks": [1, 2]
- }
-}
-```
+ ```json
+ {
+ "event": "TracksRemoved",
+ "data": {
+ "peer_id": 2,
+ "tracks": [1, 2]
+ }
+ }
+ ```
-9\. Server updates `user1` tracks:
+9. `Media Server` updates `user1` `Track`s:
-```json
-{
- "method": "TracksRemoved",
- "payload": {
- "peer_id": 1,
- "tracks": [1, 2]
- }
-}
-```
+ ```json
+ {
+ "event": "TracksRemoved",
+ "data": {
+ "peer_id": 1,
+ "tracks": [1, 2]
+ }
+ }
+ ```
-10\. `user1` initiates SDP re-negotiation: `user1` sends `MakeSdpOffer`, `Server` relays `SdpOfferMade` to `user2`, `user2` sends `MakeSDPAnswer`, `Server` relays `SdpAnswerMade` to `user1`.
+10. `user1` initiates SDP re-negotiation:
-```
-.----user1----. .----user2----.
-: o(1)-<--<-o(2) :
-'-------------' '-------------'
-```
+ 1. `user1` sends `MakeSdpOffer` command.
-11\. Server notifies `user1` that he can publish to `user2`:
+ 2. `Media Server` sends `SdpOfferMade` event to `user2`.
-```json
-{
- "method": "RemotePeersUpdated",
- "payload": {
- "peers": [{
- "peer_id": 2,
- "member_id": "user_2",
- "can_rx": null,
- "can_tx": {
- "AudioVideo": {
- "audio_settings": {},
- "video_settings": {}
- }
- }
- }]
- }
-}
-```
+ 3. `user2` sends `MakeSdpAnswer` command.
-12\. Server notifies `user2` that he can subscribe to `user1`:
+ 4. `Media Server` sends `SdpAnswerMade` event to `user1`.
-```json
-{
- "method": "RemotePeersUpdated",
- "payload": {
- "peers": [{
- "peer_id": 1,
- "member_id": "user_1",
- "can_rx": {
- "AudioVideo": {
- "audio_settings": {},
- "video_settings": {}
- }
- },
- "can_tx": null
- }]
- }
-}
-```
+ ```
+ .----user1----. .----user2----.
+ : o(1)-<--<-o(2) :
+ '-------------' '-------------'
+ ```
-13\. `user1` requests to publish to `user2`:
+11. `Media Server` notifies `user1` that he can publish to `user2`:
-```json
-{
- "method": "RequestRemoteTracks",
- "payload": {
- "peer_id": 1,
- "remote_peer_id": 2,
- "rx": null,
- "tx": {
- "AudioVideo": {
- "audio_settings": {},
- "video_settings": {}
+ ```json
+ {
+ "event": "RemotePeersUpdated",
+ "data": {
+ "peers": [{
+ "peer_id": 2,
+ "member_id": "user_2",
+ "can_rx": null,
+ "can_tx": {
+ "AudioVideo": {
+ "audio_settings": {},
+ "video_settings": {}
+ }
+ }
+ }]
}
}
- }
-}
-```
-
-14\. Server updates `user2` tracks:
-
-```json
-{
- "method": "TracksApplied",
- "payload": {
- "peer_id": 2,
- "tracks": [{
- "id": 1,
- "media_type": {
- "Audio": {}
- },
- "direction": {
- "Recv": {
- "sender": 1
- }
+ ```
+
+12. `Media Server` notifies `user2` that he can subscribe to `user1`:
+
+ ```json
+ {
+ "event": "RemotePeersUpdated",
+ "data": {
+ "peers": [{
+ "peer_id": 1,
+ "member_id": "user_1",
+ "can_rx": {
+ "AudioVideo": {
+ "audio_settings": {},
+ "video_settings": {}
+ }
+ },
+ "can_tx": null
+ }]
}
- }, {
- "id": 2,
- "media_type": {
- "Audio": {}
- },
- "direction": {
- "Recv": {
- "sender": 1
+ }
+ ```
+
+13. `user1` requests to publish to `user2`:
+
+ ```json
+ {
+ "command": "RequestRemoteTracks",
+ "data": {
+ "peer_id": 1,
+ "remote_peer_id": 2,
+ "rx": null,
+ "tx": {
+ "AudioVideo": {
+ "audio_settings": {},
+ "video_settings": {}
+ }
}
}
- }]
- }
-}
-```
-
-15\. Server updates `user1` tracks:
-
-```json
-{
- "method": "TracksApplied",
- "payload": {
- "peer_id": 1,
- "tracks": [{
- "id": 1,
- "media_type": {
- "Audio": {}
- },
- "direction": {
- "Send": {
- "receivers": [2]
- }
+ }
+ ```
+
+14. `Media Server` updates `user2` `Track`s:
+
+ ```json
+ {
+ "event": "TracksApplied",
+ "data": {
+ "peer_id": 2,
+ "tracks": [{
+ "id": 1,
+ "media_type": {
+ "Audio": {}
+ },
+ "direction": {
+ "Recv": {
+ "sender": 1
+ }
+ }
+ }, {
+ "id": 2,
+ "media_type": {
+ "Audio": {}
+ },
+ "direction": {
+ "Recv": {
+ "sender": 1
+ }
+ }
+ }]
}
- }, {
- "id": 2,
- "media_type": {
- "Video": {}
- },
- "direction": {
- "Send": {
- "receivers": [2]
- }
+ }
+ ```
+
+15. `Media Server` updates `user1` `Track`s:
+
+ ```json
+ {
+ "event": "TracksApplied",
+ "data": {
+ "peer_id": 1,
+ "tracks": [{
+ "id": 1,
+ "media_type": {
+ "Audio": {}
+ },
+ "direction": {
+ "Send": {
+ "receivers": [2]
+ }
+ }
+ }, {
+ "id": 2,
+ "media_type": {
+ "Video": {}
+ },
+ "direction": {
+ "Send": {
+ "receivers": [2]
+ }
+ }
+ }]
}
- }]
- }
-}
-```
+ }
+ ```
-16\. SDP re-negotiation: `user1` sends `MakeSdpOffer`, `Server` relays `SdpOfferMade` to `user2`, `user2` sends `MakeSDPAnswer`, `Server` relays `SdpAnswerMade` to `user1`.
+16. SDP re-negotiation:
-```
-.----user1----. .->-->-->--. .----user2----.
-: o(1)=: :=o(2) :
-'-------------' '-<--<--<--' '-------------'
-```
-
+ 1. `user1` sends `MakeSdpOffer` command.
+ 2. `Media Server` sends `SdpOfferMade` event to `user2`.
+
+ 3. `user2` sends `MakeSdpAnswer` command.
+
+ 4. `Media Server` sends `SdpAnswerMade` event to `user1`.
+
+ ```
+ .----user1----. .->-->-->--. .----user2----.
+ : o(1)=: :=o(2) :
+ '-------------' '-<--<--<--' '-------------'
+ ```
+
1 => 2 SFU
@@ -1465,7 +1484,7 @@ struct GetMembers {
`Server` => `user1`
```json
{
- "method": "IceCandidatesDiscovered",
+ "method": "IceCandidateDiscovered",
"payload": {
"peer_id": 1,
"candidate": "server_ice_candidate"
@@ -1554,7 +1573,7 @@ struct GetMembers {
`Server` => `user2`
```json
{
- "method": "IceCandidatesDiscovered",
+ "method": "IceCandidateDiscovered",
"payload": {
"peer_id": 2,
"candidate": "server_ice_candidate"
@@ -1687,7 +1706,7 @@ struct GetMembers {
`Server` => `user3`
```json
{
- "method": "IceCandidatesDiscovered",
+ "method": "IceCandidateDiscovered",
"payload": {
"peer_id": 3,
"candidate": "server_ice_candidate"