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,