WebRTC
Version 17 (Saúl Ibarra Corretgé, 07/31/2015 02:48 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 | 7 | Saúl Ibarra Corretgé | The API uses JSON messages and is modeled around 2 concepts: requests and events. |
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 | 6 | Saúl Ibarra Corretgé | { |
34 | 6 | Saúl Ibarra Corretgé | "sylkrtc": "event", |
35 | 6 | Saúl Ibarra Corretgé | "event": "ready" |
36 | 6 | Saúl Ibarra Corretgé | } |
37 | 6 | Saúl Ibarra Corretgé | |
38 | 6 | Saúl Ibarra Corretgé | </pre> |
39 | 1 | Saúl Ibarra Corretgé | |
40 | 7 | Saúl Ibarra Corretgé | Example: |
41 | 7 | Saúl Ibarra Corretgé | |
42 | 7 | Saúl Ibarra Corretgé | <pre> |
43 | 7 | Saúl Ibarra Corretgé | var conn = new WebSocket('wss://example.com/webrtcgateway/ws', 'sylkRTC-1'); |
44 | 7 | Saúl Ibarra Corretgé | conn.onmessage = function(event) { |
45 | 7 | Saúl Ibarra Corretgé | var message = JSON.parse(event.data); |
46 | 7 | Saúl Ibarra Corretgé | switch (message.sylkrtc) { |
47 | 7 | Saúl Ibarra Corretgé | case 'event': |
48 | 7 | Saúl Ibarra Corretgé | if (message.event === 'ready') { |
49 | 7 | Saúl Ibarra Corretgé | console.log('Ready to rock!'); |
50 | 7 | Saúl Ibarra Corretgé | } |
51 | 7 | Saúl Ibarra Corretgé | break; |
52 | 7 | Saúl Ibarra Corretgé | default: |
53 | 7 | Saúl Ibarra Corretgé | console.log('Received message type: ' + message.sylkrtc); |
54 | 7 | Saúl Ibarra Corretgé | break; |
55 | 7 | Saúl Ibarra Corretgé | } |
56 | 7 | Saúl Ibarra Corretgé | }; |
57 | 7 | Saúl Ibarra Corretgé | </pre> |
58 | 7 | Saúl Ibarra Corretgé | |
59 | 5 | Saúl Ibarra Corretgé | h3. Account management |
60 | 5 | Saúl Ibarra Corretgé | |
61 | 8 | Saúl Ibarra Corretgé | Multiple accounts can be managed from a single WebSocket connection. 2 types of requests are used to manage accounts: "add_account" and "remove_account". Once an account has been added it can be registered via SIP using the "register" command, and unregistered using the "unregister" command. |
62 | 8 | Saúl Ibarra Corretgé | |
63 | 10 | Saúl Ibarra Corretgé | Note: it's not necessary to register an account in order to make outgoing calls. |
64 | 10 | Saúl Ibarra Corretgé | |
65 | 13 | Saúl Ibarra Corretgé | h5. add_account |
66 | 8 | Saúl Ibarra Corretgé | |
67 | 9 | Saúl Ibarra Corretgé | Configures an account on the current connection. |
68 | 8 | Saúl Ibarra Corretgé | |
69 | 8 | Saúl Ibarra Corretgé | <pre> |
70 | 8 | Saúl Ibarra Corretgé | {'account': 'saghul@sip2sip.info', |
71 | 8 | Saúl Ibarra Corretgé | 'password': '884edfee38ed471b8a15006700139485', |
72 | 8 | Saúl Ibarra Corretgé | 'sylkrtc': 'add_account', |
73 | 8 | Saúl Ibarra Corretgé | 'transaction': '04013f0f-25bb-4082-a02f-44399df492ff'} |
74 | 8 | Saúl Ibarra Corretgé | </pre> |
75 | 8 | Saúl Ibarra Corretgé | |
76 | 9 | Saúl Ibarra Corretgé | The password MUST be in "HA1 format":https://en.wikipedia.org/wiki/Digest_access_authentication#Overview |
77 | 1 | Saúl Ibarra Corretgé | |
78 | 13 | Saúl Ibarra Corretgé | h5. remove_account |
79 | 9 | Saúl Ibarra Corretgé | |
80 | 9 | Saúl Ibarra Corretgé | Removes an account from the current connection. |
81 | 9 | Saúl Ibarra Corretgé | |
82 | 8 | Saúl Ibarra Corretgé | <pre> |
83 | 9 | Saúl Ibarra Corretgé | {'account': 'saghul@sip2sip.info', |
84 | 9 | Saúl Ibarra Corretgé | 'sylkrtc': 'remove_account', |
85 | 9 | Saúl Ibarra Corretgé | 'transaction': 'bd3ee25d-5f16-4f76-b34e-8ac3fe0a4ac0'} |
86 | 8 | Saúl Ibarra Corretgé | </pre> |
87 | 1 | Saúl Ibarra Corretgé | |
88 | 13 | Saúl Ibarra Corretgé | h5. register |
89 | 1 | Saúl Ibarra Corretgé | |
90 | 9 | Saúl Ibarra Corretgé | Triggers the account registration via SIP. |
91 | 1 | Saúl Ibarra Corretgé | |
92 | 9 | Saúl Ibarra Corretgé | <pre> |
93 | 9 | Saúl Ibarra Corretgé | {'account': 'saghul@sip2sip.info', |
94 | 9 | Saúl Ibarra Corretgé | 'sylkrtc': 'register', |
95 | 9 | Saúl Ibarra Corretgé | 'transaction': 'bcb87b0f-0cc7-42a9-897e-81f035910670'} |
96 | 9 | Saúl Ibarra Corretgé | </pre> |
97 | 9 | Saúl Ibarra Corretgé | |
98 | 9 | Saúl Ibarra Corretgé | The registration progress will be reported in form of events. |
99 | 9 | Saúl Ibarra Corretgé | |
100 | 9 | Saúl Ibarra Corretgé | <pre> |
101 | 9 | Saúl Ibarra Corretgé | {'account': 'saghul@sip2sip.info', |
102 | 9 | Saúl Ibarra Corretgé | 'data': {'state': 'registering'}, |
103 | 9 | Saúl Ibarra Corretgé | 'event': 'registration_state', |
104 | 9 | Saúl Ibarra Corretgé | 'sylkrtc': 'account_event'} |
105 | 9 | Saúl Ibarra Corretgé | |
106 | 9 | Saúl Ibarra Corretgé | {'account': 'saghul@sip2sip.info', |
107 | 9 | Saúl Ibarra Corretgé | 'data': {'state': 'registered'}, |
108 | 9 | Saúl Ibarra Corretgé | 'event': 'registration_state', |
109 | 9 | Saúl Ibarra Corretgé | 'sylkrtc': 'account_event'} |
110 | 9 | Saúl Ibarra Corretgé | </pre> |
111 | 9 | Saúl Ibarra Corretgé | |
112 | 9 | Saúl Ibarra Corretgé | Example of failed registration: |
113 | 9 | Saúl Ibarra Corretgé | |
114 | 9 | Saúl Ibarra Corretgé | <pre> |
115 | 9 | Saúl Ibarra Corretgé | {'account': 'saghul@sip2sip.info', |
116 | 9 | Saúl Ibarra Corretgé | 'data': {'reason': '904 Operation has no matching challenge ', |
117 | 9 | Saúl Ibarra Corretgé | 'state': 'failed'}, |
118 | 9 | Saúl Ibarra Corretgé | 'event': 'registration_state', |
119 | 9 | Saúl Ibarra Corretgé | 'sylkrtc': 'account_event'} |
120 | 10 | Saúl Ibarra Corretgé | </pre> |
121 | 10 | Saúl Ibarra Corretgé | |
122 | 13 | Saúl Ibarra Corretgé | h5. unregister |
123 | 10 | Saúl Ibarra Corretgé | |
124 | 10 | Saúl Ibarra Corretgé | Unregister the account, via SIP. |
125 | 10 | Saúl Ibarra Corretgé | |
126 | 10 | Saúl Ibarra Corretgé | <pre> |
127 | 10 | Saúl Ibarra Corretgé | {'account': 'saghul@sip2sip.info', |
128 | 10 | Saúl Ibarra Corretgé | 'sylkrtc': 'unregister', |
129 | 10 | Saúl Ibarra Corretgé | 'transaction': '1c81eea0-b247-4ced-b3b3-3ced1eba810e'} |
130 | 9 | Saúl Ibarra Corretgé | </pre> |
131 | 5 | Saúl Ibarra Corretgé | |
132 | 5 | Saúl Ibarra Corretgé | h3. Calling |
133 | 5 | Saúl Ibarra Corretgé | |
134 | 1 | Saúl Ibarra Corretgé | h5. Incoming calls |
135 | 1 | Saúl Ibarra Corretgé | |
136 | 14 | Saúl Ibarra Corretgé | Incoming calls are received via an *incoming_call* event: |
137 | 14 | Saúl Ibarra Corretgé | |
138 | 14 | Saúl Ibarra Corretgé | <pre> |
139 | 14 | Saúl Ibarra Corretgé | {'account': 'saghul@sip2sip.info', |
140 | 14 | Saúl Ibarra Corretgé | 'data': {'caller': '31208005163@ag-projects.com', 'sdp': '...'}, |
141 | 14 | Saúl Ibarra Corretgé | 'event': 'incoming_call', |
142 | 14 | Saúl Ibarra Corretgé | 'session': '509b256aa6a14540a2a37553e6bd33e1', |
143 | 1 | Saúl Ibarra Corretgé | 'sylkrtc': 'account_event'} |
144 | 14 | Saúl Ibarra Corretgé | |
145 | 1 | Saúl Ibarra Corretgé | </pre> |
146 | 1 | Saúl Ibarra Corretgé | |
147 | 15 | Saúl Ibarra Corretgé | The "answer" request can be used in order to answer an incoming call: |
148 | 1 | Saúl Ibarra Corretgé | |
149 | 15 | Saúl Ibarra Corretgé | <pre> |
150 | 15 | Saúl Ibarra Corretgé | {'sdp': '...', |
151 | 15 | Saúl Ibarra Corretgé | 'session': '38dffdf81acb44b2b11b61f4488c4ca9', |
152 | 15 | Saúl Ibarra Corretgé | 'sylkrtc': 'answer', |
153 | 15 | Saúl Ibarra Corretgé | 'transaction': '179a855f-75a0-45a4-b5ef-0be8eb8389d1'} |
154 | 15 | Saúl Ibarra Corretgé | </pre> |
155 | 15 | Saúl Ibarra Corretgé | |
156 | 14 | Saúl Ibarra Corretgé | h5. Outgoing calls |
157 | 14 | Saúl Ibarra Corretgé | |
158 | 14 | Saúl Ibarra Corretgé | In order to create an outgoing call the "call" 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. |
159 | 14 | Saúl Ibarra Corretgé | |
160 | 14 | Saúl Ibarra Corretgé | <pre> |
161 | 14 | Saúl Ibarra Corretgé | {'account': 'saghul@sip2sip.info', |
162 | 14 | Saúl Ibarra Corretgé | 'sdp': '...', |
163 | 14 | Saúl Ibarra Corretgé | 'session': '20c40185-1ef2-419e-b91a-70415778acb4', |
164 | 14 | Saúl Ibarra Corretgé | 'sylkrtc': 'call', |
165 | 1 | Saúl Ibarra Corretgé | 'transaction': '7afcb91a-8a64-4664-9448-8cb760492e1f', |
166 | 1 | Saúl Ibarra Corretgé | 'uri': '3333@sip2sip.info'} |
167 | 14 | Saúl Ibarra Corretgé | </pre> |
168 | 14 | Saúl Ibarra Corretgé | |
169 | 15 | Saúl Ibarra Corretgé | h5. Trickle ICE |
170 | 15 | Saúl Ibarra Corretgé | |
171 | 14 | Saúl Ibarra Corretgé | As new candidates are discovered they must be sent to the server using 'trickle' requests: |
172 | 14 | Saúl Ibarra Corretgé | |
173 | 14 | Saúl Ibarra Corretgé | <pre> |
174 | 14 | Saúl Ibarra Corretgé | {'candidates': [{'candidate': 'candidate:0 1 UDP 2130379007 192.168.99.44 59051 typ host', |
175 | 14 | Saúl Ibarra Corretgé | 'sdpMLineIndex': 0, |
176 | 14 | Saúl Ibarra Corretgé | 'sdpMid': ''}], |
177 | 1 | Saúl Ibarra Corretgé | 'session': '20c40185-1ef2-419e-b91a-70415778acb4', |
178 | 1 | Saúl Ibarra Corretgé | 'sylkrtc': 'trickle', |
179 | 1 | Saúl Ibarra Corretgé | 'transaction': 'ecf777d8-7d26-4f16-bace-18f6fae5d8f8'} |
180 | 1 | Saúl Ibarra Corretgé | </pre> |
181 | 1 | Saúl Ibarra Corretgé | |
182 | 15 | Saúl Ibarra Corretgé | This applies to both incoming and outgoing calls. |
183 | 15 | Saúl Ibarra Corretgé | |
184 | 15 | Saúl Ibarra Corretgé | There is no need to wait for the acknowledgement for the "call" or "answer" request before sending "trickle" requests. |
185 | 15 | Saúl Ibarra Corretgé | |
186 | 15 | Saúl Ibarra Corretgé | h5. Terminating calls |
187 | 15 | Saúl Ibarra Corretgé | |
188 | 15 | Saúl Ibarra Corretgé | A call can be terminated at any time by sending the "terminate" request: |
189 | 15 | Saúl Ibarra Corretgé | |
190 | 15 | Saúl Ibarra Corretgé | <pre> |
191 | 15 | Saúl Ibarra Corretgé | {'session': '38dffdf81acb44b2b11b61f4488c4ca9', |
192 | 15 | Saúl Ibarra Corretgé | 'sylkrtc': 'terminate', |
193 | 15 | Saúl Ibarra Corretgé | 'transaction': '4d169de8-fe55-41f8-9a5c-c5f66c0a23c7'} |
194 | 15 | Saúl Ibarra Corretgé | </pre> |
195 | 15 | Saúl Ibarra Corretgé | |
196 | 15 | Saúl Ibarra Corretgé | h5. Events |
197 | 15 | Saúl Ibarra Corretgé | |
198 | 16 | Saúl Ibarra Corretgé | Call state related events are reported via the "session_event" event: |
199 | 16 | Saúl Ibarra Corretgé | |
200 | 16 | Saúl Ibarra Corretgé | <pre> |
201 | 16 | Saúl Ibarra Corretgé | 'data': {'state': 'established'}, |
202 | 16 | Saúl Ibarra Corretgé | 'event': 'state', |
203 | 16 | Saúl Ibarra Corretgé | 'session': '38dffdf81acb44b2b11b61f4488c4ca9', |
204 | 16 | Saúl Ibarra Corretgé | 'sylkrtc': 'session_event'} |
205 | 16 | Saúl Ibarra Corretgé | </pre> |
206 | 16 | Saúl Ibarra Corretgé | |
207 | 16 | Saúl Ibarra Corretgé | <pre> |
208 | 16 | Saúl Ibarra Corretgé | {'data': {'sdp': '...', 'state': 'accepted'}, |
209 | 16 | Saúl Ibarra Corretgé | 'event': 'state', |
210 | 16 | Saúl Ibarra Corretgé | 'session': '20c40185-1ef2-419e-b91a-70415778acb4', |
211 | 16 | Saúl Ibarra Corretgé | 'sylkrtc': 'session_event'} |
212 | 16 | Saúl Ibarra Corretgé | </pre> |
213 | 16 | Saúl Ibarra Corretgé | |
214 | 16 | Saúl Ibarra Corretgé | <pre> |
215 | 16 | Saúl Ibarra Corretgé | {'data': {'reason': '200 to BYE', 'state': 'terminated'}, |
216 | 16 | Saúl Ibarra Corretgé | 'event': 'state', |
217 | 16 | Saúl Ibarra Corretgé | 'session': '20c40185-1ef2-419e-b91a-70415778acb4', |
218 | 16 | Saúl Ibarra Corretgé | 'sylkrtc': 'session_event'} |
219 | 16 | Saúl Ibarra Corretgé | </pre> |
220 | 16 | Saúl Ibarra Corretgé | |
221 | 16 | Saúl Ibarra Corretgé | Valid call states: |
222 | 16 | Saúl Ibarra Corretgé | |
223 | 17 | Saúl Ibarra Corretgé | * incoming: initial state for incoming calls, no state event is sent for this state. |
224 | 16 | Saúl Ibarra Corretgé | * calling: on outgoing calls, when the call is in progress. |
225 | 16 | Saúl Ibarra Corretgé | * accepted: both for incoming and outgoing, when the call has been accepted by the remote party. For incoming calls, an "sdp" attribute will be present in the "data" section, as shown in the example above. |
226 | 16 | Saúl Ibarra Corretgé | * established: the call has been established media-wise. |
227 | 15 | Saúl Ibarra Corretgé | * terminated: call was terminated, the "reason" attribute indicates the termination reason. |
228 | 4 | Saúl Ibarra Corretgé | |
229 | 4 | Saúl Ibarra Corretgé | h2. Configuration |
230 | 4 | Saúl Ibarra Corretgé | |
231 | 4 | Saúl Ibarra Corretgé | TODO |
232 | 2 | Saúl Ibarra Corretgé | |
233 | 2 | Saúl Ibarra Corretgé | h2. Client libraries |
234 | 2 | Saúl Ibarra Corretgé | |
235 | 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. |