Mercurial > libervia-backend
comparison libervia/backend/plugins/plugin_xep_0166/__init__.py @ 4116:23fa52acf72c
plugin XEP-0167, XEP-0176: transport-info and ICE candidate sending are delayed if session is not active yet
author | Goffi <goffi@goffi.org> |
---|---|
date | Mon, 21 Aug 2023 15:19:45 +0200 |
parents | 79ec7d7beef3 |
children | e11b13418ba6 |
comparison
equal
deleted
inserted
replaced
4115:0da563780ffc | 4116:23fa52acf72c |
---|---|
53 | 53 |
54 IQ_SET : Final = '/iq[@type="set"]' | 54 IQ_SET : Final = '/iq[@type="set"]' |
55 NS_JINGLE : Final = "urn:xmpp:jingle:1" | 55 NS_JINGLE : Final = "urn:xmpp:jingle:1" |
56 NS_JINGLE_ERROR : Final = "urn:xmpp:jingle:errors:1" | 56 NS_JINGLE_ERROR : Final = "urn:xmpp:jingle:errors:1" |
57 JINGLE_REQUEST : Final = f'{IQ_SET}/jingle[@xmlns="{NS_JINGLE}"]' | 57 JINGLE_REQUEST : Final = f'{IQ_SET}/jingle[@xmlns="{NS_JINGLE}"]' |
58 STATE_PENDING : Final = "PENDING" | |
59 STATE_ACTIVE : Final = "ACTIVE" | |
60 STATE_ENDED : Final = "ENDED" | |
61 CONFIRM_TXT : Final = D_( | 58 CONFIRM_TXT : Final = D_( |
62 "{entity} want to start a jingle session with you, do you accept ?" | 59 "{entity} want to start a jingle session with you, do you accept ?" |
63 ) | 60 ) |
64 | 61 |
65 PLUGIN_INFO : Final = { | 62 PLUGIN_INFO : Final = { |
86 REASON_SUCCESS : Final = "success" | 83 REASON_SUCCESS : Final = "success" |
87 REASON_DECLINE : Final = "decline" | 84 REASON_DECLINE : Final = "decline" |
88 REASON_FAILED_APPLICATION : Final = "failed-application" | 85 REASON_FAILED_APPLICATION : Final = "failed-application" |
89 REASON_FAILED_TRANSPORT : Final = "failed-transport" | 86 REASON_FAILED_TRANSPORT : Final = "failed-transport" |
90 REASON_CONNECTIVITY_ERROR : Final = "connectivity-error" | 87 REASON_CONNECTIVITY_ERROR : Final = "connectivity-error" |
88 | |
89 STATE_PENDING : Final = "PENDING" | |
90 STATE_ACTIVE : Final = "ACTIVE" | |
91 STATE_ENDED : Final = "ENDED" | |
91 | 92 |
92 # standard actions | 93 # standard actions |
93 | 94 |
94 A_SESSION_INITIATE : Final = "session-initiate" | 95 A_SESSION_INITIATE : Final = "session-initiate" |
95 A_SESSION_ACCEPT : Final = "session-accept" | 96 A_SESSION_ACCEPT : Final = "session-accept" |
192 raise ValueError(f"Invalid role {role}. Expected initiator or responder.") | 193 raise ValueError(f"Invalid role {role}. Expected initiator or responder.") |
193 | 194 |
194 | 195 |
195 session_data = { | 196 session_data = { |
196 "id": sid, | 197 "id": sid, |
197 "state": STATE_PENDING, | 198 "state": XEP_0166.STATE_PENDING, |
198 "initiator": client.jid if role == XEP_0166.ROLE_INITIATOR else peer_jid, | 199 "initiator": client.jid if role == XEP_0166.ROLE_INITIATOR else peer_jid, |
199 "role": role, | 200 "role": role, |
200 "local_jid": local_jid or client.jid, | 201 "local_jid": local_jid or client.jid, |
201 "peer_jid": peer_jid, | 202 "peer_jid": peer_jid, |
202 "started": time.time(), | 203 "started": time.time(), |
500 content_elt = jingle_elt.addElement("content") | 501 content_elt = jingle_elt.addElement("content") |
501 content_elt["name"] = content_name | 502 content_elt["name"] = content_name |
502 content_elt["creator"] = content_data["creator"] | 503 content_elt["creator"] = content_data["creator"] |
503 | 504 |
504 if context_elt is not None: | 505 if context_elt is not None: |
505 pass | 506 if context_elt.parent is None: |
507 content_elt.addChild(context_elt) | |
506 elif action == XEP_0166.A_TRANSPORT_INFO: | 508 elif action == XEP_0166.A_TRANSPORT_INFO: |
507 context_elt = transport_elt = content_elt.addElement( | 509 context_elt = transport_elt = content_elt.addElement( |
508 "transport", content_data["transport"].namespace | 510 "transport", content_data["transport"].namespace |
509 ) | 511 ) |
510 else: | 512 else: |
1189 ) | 1191 ) |
1190 d_list.addCallback(lambda __: session.pop("jingle_elt")) | 1192 d_list.addCallback(lambda __: session.pop("jingle_elt")) |
1191 d_list.addCallback(lambda __: iq_elt.send()) | 1193 d_list.addCallback(lambda __: iq_elt.send()) |
1192 | 1194 |
1193 def change_state(__, session): | 1195 def change_state(__, session): |
1194 session["state"] = STATE_ACTIVE | 1196 session["state"] = XEP_0166.STATE_ACTIVE |
1195 | 1197 |
1196 d_list.addCallback(change_state, session) | 1198 d_list.addCallback(change_state, session) |
1197 d_list.addCallback( | 1199 d_list.addCallback( |
1198 lambda __: self._call_plugins( | 1200 lambda __: self._call_plugins( |
1199 client, XEP_0166.A_ACCEPTED_ACK, session, elements=False | 1201 client, XEP_0166.A_ACCEPTED_ACK, session, elements=False |
1277 return | 1279 return |
1278 | 1280 |
1279 # at this point we can send the <iq/> result to confirm reception of the request | 1281 # at this point we can send the <iq/> result to confirm reception of the request |
1280 client.send(xmlstream.toResponse(request, "result")) | 1282 client.send(xmlstream.toResponse(request, "result")) |
1281 # and change the state | 1283 # and change the state |
1282 session["state"] = STATE_ACTIVE | 1284 session["state"] = XEP_0166.STATE_ACTIVE |
1283 session["jingle_elt"] = jingle_elt | 1285 session["jingle_elt"] = jingle_elt |
1284 | 1286 |
1285 await defer.DeferredList(self._call_plugins( | 1287 await defer.DeferredList(self._call_plugins( |
1286 client, | 1288 client, |
1287 XEP_0166.A_PREPARE_INITIATOR, | 1289 XEP_0166.A_PREPARE_INITIATOR, |