@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 \nwhich informs about \npreconditions not met
srv -> app: POST or NOTIFY VvoipSessionInvitationNotification(\nofferSdp1, holdAlerting, 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>

note right of app: Indicate an initial answer\nbut do not ring yet
app -> srv: PUT VvoipAnswer(answer, answerSdp1)
srv --> app: Response
note left of srv: Send answer 

note over bro, srv
 Running ICE connectivity checks
end note
bro -> app: oniceconnectionstatechange(connected)</i>
app -> srv: PUT VvoipIceStatus(Connected)
srv --> app: Response
note right of app: Own ICE finished but still cannot ring

note left of srv: Receive another offer informing \nthat preconditions are met
srv -> app: VvoipOfferNotification(offerSdp2)
app -->> bro: <i>peerConnection.setRemoteDescription(offer, offerSdp2)</i>
app -->> bro: <i>answerSdp2=peerConnection.CreateAnswer()</i>
app -->> bro: <i>peerConnection.SetLocalDescription(answer, answerSdp2)</i>
app -> srv: PUT VvoipAnswer(answer, answerSdp2)
app <-- srv: Response
note left of srv: Send answer 

note right of app: After receiving offer\nwithout "holdAlerting" flag,\nalerting can now take place
app -> srv: PUT VvoipSessionStatus(Ringing)
srv --> app: Response
note left of srv: Indicate that user \nis being alerted
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 \n(no new answer is sent)

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


@enduml