@startuml title WebRTC actor ClientA as ClientA participant "Signal" as Signal participant "Stun" as Stun actor ClientB as ClientB autonumber ClientA -> Signal: Connect activate Signal ClientB -> Signal: Connect deactivate Signal ClientA -> ClientA: new PeerConnection activate ClientA ClientA -> ClientA: addStream deactivate ClientA ClientB -> ClientB: new PeerConnection activate ClientB ClientB -> ClientB: addStream deactivate ClientB ClientA -> ClientA: createOffer & setLocalDescription activate ClientA ClientA -> Signal: Send Offer SDP activate Signal Signal -> ClientB: Relay Offer SDP activate ClientB ClientB -> ClientB: setRemoteDescription ClientB -> ClientB: createAnswer & setLocalDescription ClientB --> Signal: Send Answer SDP deactivate ClientB Signal --> ClientA: Relay Answer SDP deactivate Signal ClientA -> ClientA: setRemoteDescription deactivate ClientA ClientA -> Stun: ICE Request activate ClientA activate Stun Stun --> ClientA: onicecandidate deactivate Stun ClientA -> Signal: Send ICE Candidate activate Signal Signal -> ClientB: Relay ICE Candidate activate ClientB ClientB -> ClientB: addIceCandidate ClientB -> Stun: ICE Request activate Stun Stun --> ClientB: onicecandidate deactivate Stun ClientB--> Signal: Send ICE Candidate deactivate ClientB Signal --> ClientA: Relay ICE Candidate deactivate Signal ClientA -> ClientA: addIceCandidate deactivate ClientA ClientA <-> ClientB: Media activate ClientA activate ClientB ClientA -> ClientA: onaddstream ClientB -> ClientB: onaddstream ClientA -> ClientA: onremovestream ClientB -> ClientB: onremovestream ClientA <-> ClientB: Media deactivate ClientA deactivate ClientB @enduml