Voice over IP ============= This module outlines how two users in a room can set up a Voice over IP (VoIP) call to each other. Voice and video calls are built upon the WebRTC 1.0 standard. Call signalling is achieved by sending `message events`_ to the room. As a result, this means that clients MUST only send call events to rooms with exactly two participants as currently the WebRTC standard is based around two-party communication. .. _message events: `sect:events`_ Message Exchange ---------------- A call is set up with message events exchanged as follows: :: Caller Callee [Place Call] m.call.invite -----------> m.call.candidate --------> [..candidates..] --------> [Answers call] <--------------- m.call.answer [Call is active and ongoing] <--------------- m.call.hangup Or a rejected call: :: Caller Callee m.call.invite ------------> m.call.candidate ---------> [..candidates..] ---------> [Rejects call] <-------------- m.call.hangup Calls are negotiated according to the WebRTC specification. Events ------ {{voip_events}} Client behaviour ---------------- Glare ~~~~~ "Glare" is a problem which occurs when two users call each other at roughly the same time. This results in the call failing to set up as there already is an incoming/outgoing call. A glare resolution algorithm can be used to determine which call to hangup and which call to answer. If both clients implement the same algorithm then they will both select the same call and the call will be successfully connected. As calls are "placed" to rooms rather than users, the glare resolution algorithm outlined below is only considered for calls which are to the same room. The algorithm is as follows: - If an invite to a room is received whilst the client is **preparing to send** an invite to the same room: * the client should cancel its outgoing call and instead automatically accept the incoming call on behalf of the user. - If an invite to a room is received **after the client has sent** an invite to the same room and is waiting for a response: * the client should perform a lexicographical comparison of the call IDs of the two calls and use the **lesser** of the two calls, aborting the greater. If the incoming call is the lesser, the client should accept this call on behalf of the user. The call setup should appear seamless to the user as if they had simply placed a call and the other party had accepted. This means any media stream that had been setup for use on a call should be transferred and used for the call that replaces it. Server behaviour ---------------- TURN Servers ~~~~~~~~~~~~ Security considerations -----------------------