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"