@startuml
!include skin.inc

autonumber "#'.'"

participant "Server" as srv
participant "Application" as app 
participant "<i>Browser</i>" as bro #ffffff

note left of srv: Receive invitation
[-->>srv: <i>INVITE(userId, offerSdp1)</i>
srv -> app: POST or NOTIFY VvoipSessionInvitationNotification(offerSdp1, sessionId)

app -->> bro: <i>Create PeerConnection and set up media sources</i>
app -->> bro: <i>peerConnection.SetRemoteDescription(offer, offerSdp1)</i>
app -->> bro: <i>answerSdp1=peerConnection.CreateAnswer()</i>
app -->> bro: <i>peerConnection.SetLocalDescription(answer, answerSdp1)</i>

app -> srv: PUT VvoipAnswer(answer, answerSdp1)
srv --> app: Response

note left of srv: Indicate an initial answer\nbut do not ring yet
[<<-- srv: <i>183 Session Progress (answerSdp1; 100rel)</i>
[-->> srv: <i>PRACK</i>
[<<-- srv: <i>200 OK PRACK</i>

note over bro, srv
 Running ICE connectivity checks
end note
bro -->> app: <i>oniceconnectionstatechange(connected)</i>
app -> srv: PUT VvoipIceStatus(Connected)
srv --> app: Response

app -> srv: PUT VvoipSessionStatus(Ringing)
srv --> app: Response
note left of srv: Indicate that user is being alerted
[<<-- srv: <i>180 Ringing</i>

app -->> app: <i>Alert the user</i>
note right of app: User accepts
app -> srv: PUT VvoipSessionStatus(Connected)
srv --> app: Response
note left of srv: Accept invitation (no new answer is sent)
[<<-- srv: <i>200 OK INVITE</i>
[-->>srv: <i>ACK</i>

note over bro, srv
 Originator and Terminating Participant are in a call now.
end note

note left of srv: Session termination request
[-->> srv: <i>BYE</i>
[<<-- srv: <i>200 OK BYE</i>
srv -> app: POST or NOTIFY VvoipEventNotification(SessionEnded)
app -->> bro: <i>peerConnection.Close()</i>

@enduml