WebRTC

Version 19 (Saúl Ibarra Corretgé, 07/31/2015 03:41 pm)

1 1 Saúl Ibarra Corretgé
h1. SylkServer WebRTC gateway application
2 1 Saúl Ibarra Corretgé
3 2 Saúl Ibarra Corretgé
Starting with version 3.0.0 SylkServer includes a WebRTC gateway application. The application implements a WebSocket protocol which WebRTC endpoints can use in order to interact with the SIP world.
4 2 Saúl Ibarra Corretgé
5 2 Saúl Ibarra Corretgé
6 2 Saúl Ibarra Corretgé
h2. Architecture
7 2 Saúl Ibarra Corretgé
8 1 Saúl Ibarra Corretgé
TODO
9 2 Saúl Ibarra Corretgé
10 2 Saúl Ibarra Corretgé
h2. WebSocket API
11 2 Saúl Ibarra Corretgé
12 5 Saúl Ibarra Corretgé
SylkServer offers the WebSocket API in order to interact with the WebRTC gateway in the @ws(s)://hostname:port/webrtcgateway/ws@ endpoint. Both WebSocket and Secure WebSocket are supported, depending on how SylkServer was configured, check the configuration section.
13 1 Saúl Ibarra Corretgé
14 18 Saúl Ibarra Corretgé
The API uses JSON messages and is modeled around 2 concepts: requests and events. We call this the sylkRTC protocol.
15 5 Saúl Ibarra Corretgé
16 5 Saúl Ibarra Corretgé
A request represents an action which SylkServer should perform, and it's identified with a transaction ID which the user must provide. SylkServer will reply with either an 'ack' or an 'error' response, with the associated transaction ID. An example transaction is that of adding an account.
17 5 Saúl Ibarra Corretgé
18 5 Saúl Ibarra Corretgé
Events are notifications sent by SylkServer to the client. They are the result of some change triggered by a user action, but they don't have a transaction ID associated with them. An example event would be the connection state changed event.
19 1 Saúl Ibarra Corretgé
20 7 Saúl Ibarra Corretgé
All messages are valid JSON and contain the "sylkrtc" key indicating the message type. A message without the "sylkrtc" key is an invalid message.
21 7 Saúl Ibarra Corretgé
22 5 Saúl Ibarra Corretgé
h3. Establishing the connection
23 1 Saúl Ibarra Corretgé
24 6 Saúl Ibarra Corretgé
In order to connect to SylkServer to begin to use the API a WebSocket connection must be established, using the @sylkRTC-1@ subprotocol. Example:
25 6 Saúl Ibarra Corretgé
26 6 Saúl Ibarra Corretgé
<pre>
27 6 Saúl Ibarra Corretgé
var conn = new WebSocket('wss://example.com/webrtcgateway/ws', 'sylkRTC-1');
28 6 Saúl Ibarra Corretgé
</pre>
29 6 Saúl Ibarra Corretgé
30 6 Saúl Ibarra Corretgé
After the connection is established, a 'ready' event will be sent to the client, indicating that the connection is ready to be used:
31 6 Saúl Ibarra Corretgé
32 6 Saúl Ibarra Corretgé
<pre>
33 18 Saúl Ibarra Corretgé
{"event": "ready", "sylkrtc": "event"}
34 6 Saúl Ibarra Corretgé
</pre>
35 1 Saúl Ibarra Corretgé
36 7 Saúl Ibarra Corretgé
Example:
37 7 Saúl Ibarra Corretgé
38 7 Saúl Ibarra Corretgé
<pre>
39 7 Saúl Ibarra Corretgé
var conn = new WebSocket('wss://example.com/webrtcgateway/ws', 'sylkRTC-1');
40 7 Saúl Ibarra Corretgé
conn.onmessage = function(event) {
41 7 Saúl Ibarra Corretgé
    var message = JSON.parse(event.data);
42 7 Saúl Ibarra Corretgé
    switch (message.sylkrtc) {
43 7 Saúl Ibarra Corretgé
        case 'event':
44 7 Saúl Ibarra Corretgé
            if (message.event === 'ready') {
45 7 Saúl Ibarra Corretgé
                console.log('Ready to rock!');
46 7 Saúl Ibarra Corretgé
            }
47 7 Saúl Ibarra Corretgé
            break;
48 7 Saúl Ibarra Corretgé
        default:
49 7 Saúl Ibarra Corretgé
            console.log('Received message type: ' + message.sylkrtc);
50 7 Saúl Ibarra Corretgé
            break;
51 1 Saúl Ibarra Corretgé
    }
52 7 Saúl Ibarra Corretgé
};
53 7 Saúl Ibarra Corretgé
</pre>
54 7 Saúl Ibarra Corretgé
55 7 Saúl Ibarra Corretgé
h3. Account management
56 5 Saúl Ibarra Corretgé
57 18 Saúl Ibarra Corretgé
Multiple accounts can be managed from a single WebSocket connection. 2 types of requests are used to manage accounts: "account-add" and "account-remove". Once an account has been added it can be registered via SIP using the "account-register" command, and unregistered using the "account-unregister" command.
58 8 Saúl Ibarra Corretgé
59 10 Saúl Ibarra Corretgé
Note: it's not necessary to register an account in order to make outgoing calls.
60 1 Saúl Ibarra Corretgé
61 18 Saúl Ibarra Corretgé
h5. account-add
62 13 Saúl Ibarra Corretgé
63 8 Saúl Ibarra Corretgé
Configures an account on the current connection.
64 8 Saúl Ibarra Corretgé
65 1 Saúl Ibarra Corretgé
<pre>
66 8 Saúl Ibarra Corretgé
{'account': 'saghul@sip2sip.info',
67 8 Saúl Ibarra Corretgé
 'password': '884edfee38ed471b8a15006700139485',
68 18 Saúl Ibarra Corretgé
 'sylkrtc': 'account-add',
69 8 Saúl Ibarra Corretgé
 'transaction': '04013f0f-25bb-4082-a02f-44399df492ff'}
70 1 Saúl Ibarra Corretgé
</pre>
71 8 Saúl Ibarra Corretgé
72 8 Saúl Ibarra Corretgé
The password MUST be in "HA1 format":https://en.wikipedia.org/wiki/Digest_access_authentication#Overview
73 9 Saúl Ibarra Corretgé
74 18 Saúl Ibarra Corretgé
h5. account-remove
75 9 Saúl Ibarra Corretgé
76 9 Saúl Ibarra Corretgé
Removes an account from the current connection.
77 9 Saúl Ibarra Corretgé
78 8 Saúl Ibarra Corretgé
<pre>
79 1 Saúl Ibarra Corretgé
{'account': 'saghul@sip2sip.info',
80 18 Saúl Ibarra Corretgé
 'sylkrtc': 'account-remove',
81 9 Saúl Ibarra Corretgé
 'transaction': 'bd3ee25d-5f16-4f76-b34e-8ac3fe0a4ac0'}
82 9 Saúl Ibarra Corretgé
</pre>
83 1 Saúl Ibarra Corretgé
84 13 Saúl Ibarra Corretgé
h5. register
85 1 Saúl Ibarra Corretgé
86 9 Saúl Ibarra Corretgé
Triggers the account registration via SIP.
87 1 Saúl Ibarra Corretgé
88 9 Saúl Ibarra Corretgé
<pre>
89 9 Saúl Ibarra Corretgé
{'account': 'saghul@sip2sip.info',
90 18 Saúl Ibarra Corretgé
 'sylkrtc': 'account-register',
91 9 Saúl Ibarra Corretgé
 'transaction': 'bcb87b0f-0cc7-42a9-897e-81f035910670'}
92 9 Saúl Ibarra Corretgé
</pre>
93 9 Saúl Ibarra Corretgé
94 9 Saúl Ibarra Corretgé
The registration progress will be reported in form of events.
95 9 Saúl Ibarra Corretgé
96 9 Saúl Ibarra Corretgé
<pre>
97 9 Saúl Ibarra Corretgé
{'account': 'saghul@sip2sip.info',
98 9 Saúl Ibarra Corretgé
 'data': {'state': 'registering'},
99 9 Saúl Ibarra Corretgé
 'event': 'registration_state',
100 9 Saúl Ibarra Corretgé
 'sylkrtc': 'account_event'}
101 9 Saúl Ibarra Corretgé
102 9 Saúl Ibarra Corretgé
{'account': 'saghul@sip2sip.info',
103 9 Saúl Ibarra Corretgé
 'data': {'state': 'registered'},
104 9 Saúl Ibarra Corretgé
 'event': 'registration_state',
105 9 Saúl Ibarra Corretgé
 'sylkrtc': 'account_event'}
106 1 Saúl Ibarra Corretgé
</pre>
107 9 Saúl Ibarra Corretgé
108 9 Saúl Ibarra Corretgé
Example of failed registration:
109 9 Saúl Ibarra Corretgé
110 9 Saúl Ibarra Corretgé
<pre>
111 1 Saúl Ibarra Corretgé
{'account': 'saghul@sip2sip.info',
112 9 Saúl Ibarra Corretgé
 'data': {'reason': '904 Operation has no matching challenge ',
113 9 Saúl Ibarra Corretgé
          'state': 'failed'},
114 9 Saúl Ibarra Corretgé
 'event': 'registration_state',
115 9 Saúl Ibarra Corretgé
 'sylkrtc': 'account_event'}
116 1 Saúl Ibarra Corretgé
</pre>
117 9 Saúl Ibarra Corretgé
118 18 Saúl Ibarra Corretgé
h5. account-unregister
119 13 Saúl Ibarra Corretgé
120 1 Saúl Ibarra Corretgé
Unregister the account, via SIP.
121 10 Saúl Ibarra Corretgé
122 10 Saúl Ibarra Corretgé
<pre>
123 10 Saúl Ibarra Corretgé
{'account': 'saghul@sip2sip.info',
124 18 Saúl Ibarra Corretgé
 'sylkrtc': 'account-unregister',
125 1 Saúl Ibarra Corretgé
 'transaction': '1c81eea0-b247-4ced-b3b3-3ced1eba810e'}
126 10 Saúl Ibarra Corretgé
</pre>
127 9 Saúl Ibarra Corretgé
128 18 Saúl Ibarra Corretgé
h3. Sessions
129 1 Saúl Ibarra Corretgé
130 18 Saúl Ibarra Corretgé
h5. Incoming sessions
131 1 Saúl Ibarra Corretgé
132 18 Saúl Ibarra Corretgé
Incoming sessions are received via an *incoming_session* event:
133 14 Saúl Ibarra Corretgé
134 1 Saúl Ibarra Corretgé
<pre>
135 14 Saúl Ibarra Corretgé
{'account': 'saghul@sip2sip.info',
136 14 Saúl Ibarra Corretgé
 'data': {'caller': '31208005163@ag-projects.com', 'sdp': '...'},
137 18 Saúl Ibarra Corretgé
 'event': 'incoming_session',
138 1 Saúl Ibarra Corretgé
 'session': '509b256aa6a14540a2a37553e6bd33e1',
139 14 Saúl Ibarra Corretgé
 'sylkrtc': 'account_event'}
140 1 Saúl Ibarra Corretgé
141 14 Saúl Ibarra Corretgé
</pre>
142 1 Saúl Ibarra Corretgé
143 18 Saúl Ibarra Corretgé
The "session-answer" request can be used in order to answer an incoming session:
144 1 Saúl Ibarra Corretgé
145 1 Saúl Ibarra Corretgé
<pre>
146 15 Saúl Ibarra Corretgé
{'sdp': '...',
147 15 Saúl Ibarra Corretgé
 'session': '38dffdf81acb44b2b11b61f4488c4ca9',
148 18 Saúl Ibarra Corretgé
 'sylkrtc': 'session-answer',
149 15 Saúl Ibarra Corretgé
 'transaction': '179a855f-75a0-45a4-b5ef-0be8eb8389d1'}
150 1 Saúl Ibarra Corretgé
</pre>
151 15 Saúl Ibarra Corretgé
152 18 Saúl Ibarra Corretgé
h5. Outgoing sessions
153 14 Saúl Ibarra Corretgé
154 18 Saúl Ibarra Corretgé
In order to create an outgoing session the "session-create" request is used, by passing the SDP returned by the web browser. There is no need to wait for all ICE candidates since trickle ICE is used.
155 1 Saúl Ibarra Corretgé
156 14 Saúl Ibarra Corretgé
<pre>
157 14 Saúl Ibarra Corretgé
{'account': 'saghul@sip2sip.info',
158 14 Saúl Ibarra Corretgé
 'sdp': '...',
159 14 Saúl Ibarra Corretgé
 'session': '20c40185-1ef2-419e-b91a-70415778acb4',
160 18 Saúl Ibarra Corretgé
 'sylkrtc': 'session-create',
161 1 Saúl Ibarra Corretgé
 'transaction': '7afcb91a-8a64-4664-9448-8cb760492e1f',
162 1 Saúl Ibarra Corretgé
 'uri': '3333@sip2sip.info'}
163 14 Saúl Ibarra Corretgé
</pre>
164 14 Saúl Ibarra Corretgé
165 15 Saúl Ibarra Corretgé
h5. Trickle ICE
166 15 Saúl Ibarra Corretgé
167 18 Saúl Ibarra Corretgé
As new candidates are discovered they must be sent to the server using 'session-trickle' requests:
168 14 Saúl Ibarra Corretgé
169 14 Saúl Ibarra Corretgé
<pre>
170 14 Saúl Ibarra Corretgé
{'candidates': [{'candidate': 'candidate:0 1 UDP 2130379007 192.168.99.44 59051 typ host',
171 14 Saúl Ibarra Corretgé
                 'sdpMLineIndex': 0,
172 14 Saúl Ibarra Corretgé
                 'sdpMid': ''}],
173 1 Saúl Ibarra Corretgé
 'session': '20c40185-1ef2-419e-b91a-70415778acb4',
174 18 Saúl Ibarra Corretgé
 'sylkrtc': 'session-trickle',
175 1 Saúl Ibarra Corretgé
 'transaction': 'ecf777d8-7d26-4f16-bace-18f6fae5d8f8'}
176 1 Saúl Ibarra Corretgé
</pre>
177 1 Saúl Ibarra Corretgé
178 19 Saúl Ibarra Corretgé
Use an empty list of candidates to indicate that no more candidates will be sent.
179 19 Saúl Ibarra Corretgé
180 15 Saúl Ibarra Corretgé
This applies to both incoming and outgoing calls.
181 15 Saúl Ibarra Corretgé
182 15 Saúl Ibarra Corretgé
There is no need to wait for the acknowledgement for the "session-create" or "session-answer" request before sending "session-trickle" requests.
183 1 Saúl Ibarra Corretgé
184 19 Saúl Ibarra Corretgé
h5. Terminating sessions
185 15 Saúl Ibarra Corretgé
186 19 Saúl Ibarra Corretgé
A session can be terminated at any time by sending the "session-terminate" request:
187 1 Saúl Ibarra Corretgé
188 15 Saúl Ibarra Corretgé
<pre>
189 15 Saúl Ibarra Corretgé
{'session': '38dffdf81acb44b2b11b61f4488c4ca9',
190 19 Saúl Ibarra Corretgé
 'sylkrtc': 'session-terminate',
191 15 Saúl Ibarra Corretgé
 'transaction': '4d169de8-fe55-41f8-9a5c-c5f66c0a23c7'}
192 1 Saúl Ibarra Corretgé
</pre>
193 15 Saúl Ibarra Corretgé
194 15 Saúl Ibarra Corretgé
h5. Events
195 15 Saúl Ibarra Corretgé
196 19 Saúl Ibarra Corretgé
Session state related events are reported via the "session_event" event:
197 16 Saúl Ibarra Corretgé
198 16 Saúl Ibarra Corretgé
<pre>
199 16 Saúl Ibarra Corretgé
'data': {'state': 'established'},
200 16 Saúl Ibarra Corretgé
 'event': 'state',
201 16 Saúl Ibarra Corretgé
 'session': '38dffdf81acb44b2b11b61f4488c4ca9',
202 16 Saúl Ibarra Corretgé
 'sylkrtc': 'session_event'}
203 16 Saúl Ibarra Corretgé
</pre>
204 16 Saúl Ibarra Corretgé
205 16 Saúl Ibarra Corretgé
<pre>
206 16 Saúl Ibarra Corretgé
{'data': {'sdp': '...', 'state': 'accepted'},
207 16 Saúl Ibarra Corretgé
 'event': 'state',
208 16 Saúl Ibarra Corretgé
 'session': '20c40185-1ef2-419e-b91a-70415778acb4',
209 16 Saúl Ibarra Corretgé
 'sylkrtc': 'session_event'}
210 16 Saúl Ibarra Corretgé
</pre>
211 16 Saúl Ibarra Corretgé
212 16 Saúl Ibarra Corretgé
<pre>
213 16 Saúl Ibarra Corretgé
{'data': {'reason': '200 to BYE', 'state': 'terminated'},
214 1 Saúl Ibarra Corretgé
 'event': 'state',
215 1 Saúl Ibarra Corretgé
 'session': '20c40185-1ef2-419e-b91a-70415778acb4',
216 16 Saúl Ibarra Corretgé
 'sylkrtc': 'session_event'}
217 16 Saúl Ibarra Corretgé
</pre>
218 16 Saúl Ibarra Corretgé
219 19 Saúl Ibarra Corretgé
Valid session states:
220 17 Saúl Ibarra Corretgé
221 19 Saúl Ibarra Corretgé
* incoming: initial state for incoming sessions, no state event is sent for this state.
222 19 Saúl Ibarra Corretgé
* progress: on outgoing sessions, when in progress.
223 19 Saúl Ibarra Corretgé
* accepted: both for incoming and outgoing, when the session has been accepted by the remote party. For incoming, an "sdp" attribute will be present in the "data" section, as shown in the example above. 
224 19 Saúl Ibarra Corretgé
* established: the session has been established media-wise.
225 19 Saúl Ibarra Corretgé
* terminated: session was terminated, the "reason" attribute indicates the termination reason.
226 4 Saúl Ibarra Corretgé
227 4 Saúl Ibarra Corretgé
h2. Configuration
228 4 Saúl Ibarra Corretgé
229 2 Saúl Ibarra Corretgé
TODO
230 2 Saúl Ibarra Corretgé
231 2 Saúl Ibarra Corretgé
h2. Client libraries
232 1 Saúl Ibarra Corretgé
233 1 Saúl Ibarra Corretgé
In order to interact with SylkServer's WebRTC gateway, we provide the "sylkrtc.js":http://projects.ag-projects.com/projects/sylkrtc JavaScript library. It implements the API described in this document in an easy to use manner. Check the README file in the project for the JavaScript API documentation.