stream
— Stanza stream¶
The stanza stream is the layer of abstraction above the XML stream. It deals with sending and receiving stream-level elements, mainly stanzas. It also handles stream liveness and stream management.
It provides ways to track stanzas on their way to the remote, as far as that is possible.
General information¶
Timeouts / Stream Aliveness checks¶
The StanzaStream
relies on the XMLStream
dead time aliveness
monitoring (see also deadtime_soft_limit
) to detect a
broken stream.
The limits can be configured with the two attributes
soft_timeout
and round_trip_time
.
When soft_timeout
elapses after the last bit of data
received from the server, the StanzaStream
issues a ping. The server
then has one round_trip_time
worth of time to answer.
If this does not happen, the XMLStream
will be terminated by the
aliveness monitor and normal handling of a broken connection takes over.
Stanza Filters¶
Stanza filters allow to hook into the stanza sending/reception pipeline after/before the application sees the stanza.
Inbound stanza filters¶
Inbound stanza filters allow to hook into the stanza processing by replacing, modifying or otherwise processing stanza contents before the usual handlers for that stanza are invoked. With inbound stanza filters, there are no restrictions as to what processing may take place on a stanza, as no one but the stream may have references to its contents.
Warning
Raising an exception from within a stanza filter kills the stream.
Note that if a filter function drops an incoming stanza (by returning
None
), it must ensure that the client still behaves RFC
compliant. The inbound stanza filters are found here:
Outbound stanza filters¶
Outbound stanza filters work similar to inbound stanza filters, but due to their location in the processing chain and possible interactions with senders of stanzas, there are some things to consider:
Per convention, a outbound stanza filter must not modify any child elements which are already present in the stanza when it receives the stanza.
It may however add new child elements or remove existing child elements, as well as copying and then modifying existing child elements.
If the stanza filter replaces the stanza, it is responsible for making sure that the new stanza has appropriate
from_
,to
andid
values. There are no checks to enforce this, because error handling at this point is peculiar. The stanzas will be sent as-is.Similar to inbound filters, it is the responsibility of the filters that if stanzas are dropped, the client still behaves RFC-compliant.
Now that you have been warned, here are the attributes for accessing the outbound filter chains. These otherwise work exactly like their inbound counterparts, but service filters run after application filters on outbound processing.
service_outbound_message_filter
When to use stanza filters?¶
In general, applications will rarely need them. However, services may make profitable use of them, and it is a convenient way for them to inspect or modify incoming or outgoing stanzas before any normally registered handler processes them.
In general, whenever you do something which supplements the use of the stanza with respect to the RFC but does not fulfill the original intent of the stanza, it is advisable to use a filter instead of a callback on the actual stanza.
Vice versa, if you were to develop a service which manages presence
subscriptions, it would be more correct to use
register_presence_callback()
; this prevents other services which try
to do the same from conflicting with you. You would then provide callbacks
to the application to let it learn about presence subscriptions.
Stanza Stream class¶
This section features the complete documentation of the (rather important and
complex) StanzaStream
. Some more general information has been moved to
the previous section (General information) to make it
easier to read and find.
-
class
aioxmpp.stream.
StanzaStream
(local_jid=None, *, loop=None, base_logger=<Logger aioxmpp (WARNING)>)[source]¶ A stanza stream. This is the next layer of abstraction above the XMPP XML stream, which mostly deals with stanzas (but also with certain other stream-level elements, such as XEP-0198 Stream Management Request/Acks).
It is independent from a specific
XMLStream
instance. AStanzaStream
can be started with one XML stream, stopped later and then resumed with another XML stream. The user of theStanzaStream
has to make sure that the XML streams are compatible, identity-wise (use the same JID).local_jid may be the bare sender JID associated with the stanza stream. This is required for compatibility with ejabberd. If it is omitted, communication with ejabberd instances may not work.
loop may be used to explicitly specify the
asyncio.BaseEventLoop
to use, otherwise the current event loop is used.base_logger can be used to explicitly specify a
logging.Logger
instance to fork off the logger from. TheStanzaStream
will use a child logger of base_logger calledStanzaStream
.Changed in version 0.4: The local_jid argument was added.
Changed in version 0.10: Ping handling was reworked.
Starting/Stopping the stream:
-
start
(xmlstream)[source]¶ Start or resume the stanza stream on the given
aioxmpp.protocol.XMLStream
xmlstream.This starts the main broker task, registers stanza classes at the xmlstream .
-
stop
()[source]¶ Send a signal to the main broker task to terminate. You have to check
running
and possibly wait for it to becomeFalse
— the task takes at least one loop through the event loop to terminate.It is guaranteed that the task will not attempt to send stanzas over the existing xmlstream after a call to
stop()
has been made.It is legal to call
stop()
even if the task is already stopped. It is a no-op in that case.
-
async
wait_stop
()[source]¶ Stop the stream and wait for it to stop.
See
stop()
for the general stopping conditions. You can assume thatstop()
is the first thing this coroutine calls.
-
async
close
()[source]¶ Close the stream and the underlying XML stream (if any is connected).
This is essentially a way of saying “I do not want to use this stream anymore” (until the next call to
start()
). If the stream is currently running, the XML stream is closed gracefully (potentially sending an SM ack), the worker is stopped and any Stream Management state is cleaned up.If an error occurs while the stream stops, the error is ignored.
After the call to
close()
has started,on_failure()
will not be emitted, even if the XML stream fails before closure has completed.After a call to
close()
, the stream is stopped, all SM state is discarded and calls toenqueue_stanza()
raise aDestructionRequested
"close() called"
. Such aStanzaStream
can be re-started by callingstart()
.Changed in version 0.8: Before 0.8, an error during a call to
close()
would stop the stream from closing completely, and the exception was re-raised. If SM was enabled, the state would have been kept, allowing for resumption and ensuring that stanzas still enqueued or unacknowledged would get a chance to be sent.If you want to have guarantees that all stanzas sent up to a certain point are sent, you should be using
send_and_wait_for_sent()
with stream management.
-
flush_incoming
()[source]¶ Flush all incoming queues to the respective processing methods. The handlers are called as usual, thus it may require at least one iteration through the asyncio event loop before effects can be seen.
The incoming queues are empty after a call to this method.
It is legal (but pretty useless) to call this method while the stream is
running
.
Timeout configuration (see Timeouts / Stream Aliveness checks):
-
round_trip_time
¶ The maximum expected round-trip time as
datetime.timedelta
.This is used to configure the maximum time between asking the server to send something and receiving something from the server in stream aliveness checks.
This does not affect IQ requests or other stanzas.
If set to
None
, no application-level timeouts are used at all. This is not recommended since TCP timeouts are generally not sufficient for interactive applications.
-
soft_timeout
¶ Soft timeout after which the server will be asked to send something if nothing has been received.
If set to
None
, no application-level timeouts are used at all. This is not recommended since TCP timeouts are generally not sufficient for interactive applications.
Sending stanzas:
Deprecated since version 0.10: Sending stanzas directly on the stream is deprecated. The methods have been moved to the client:
aioxmpp.Client.send
(stanza, *[, timeout, cb])Send a stanza.
aioxmpp.Client.enqueue
(stanza, **kwargs)Put a stanza in the internal transmission queue and return a token to track it.
-
async
send
(stanza, timeout=None, *, cb=None)[source]¶ Deprecated alias of
aioxmpp.Client.send()
.This is only available on streams owned by a
aioxmpp.Client
.Deprecated since version 0.10.
-
enqueue
(stanza, **kwargs)[source]¶ Deprecated alias of
aioxmpp.Client.enqueue()
.This is only available on streams owned by a
aioxmpp.Client
.Deprecated since version 0.10.
-
enqueue_stanza
()¶ Alias of
enqueue()
.Deprecated since version 0.8: This alias is deprecated and will be removed in 1.0.
-
async
send_and_wait_for_sent
(stanza)[source]¶ Send the given stanza over the given
StanzaStream
stream.Deprecated since version 0.8: This method will be removed in 1.0. Use
send()
instead.
-
async
send_iq_and_wait_for_reply
(iq, *, timeout=None)[source]¶ Send an IQ stanza iq and wait for the response. If timeout is not
None
, it must be the time in seconds for which to wait for a response.If the response is a
"result"
IQ, the value of thepayload
attribute is returned. Otherwise, the exception generated from theerror
attribute is raised.See also
register_iq_response_future()
andsend_and_wait_for_sent()
for other cases raising exceptions.Deprecated since version 0.8: This method will be removed in 1.0. Use
send()
instead.Changed in version 0.8: On a timeout,
TimeoutError
is now raised instead ofasyncio.TimeoutError
.
Receiving stanzas:
-
register_iq_request_handler
(type_, payload_cls, cb, *, with_send_reply=False)[source]¶ Register a coroutine function or a function returning an awaitable to run when an IQ request is received.
- Parameters
type (
IQType
) – IQ type to react to (must be a request type).payload_cls (
XMLStreamClass
) – Payload class to react to (subclass ofXSO
)cb – Function or coroutine function to invoke
with_send_reply (
bool
) – Whether to pass a function to send a reply to cb as second argument.
- Raises
ValueError – if there is already a coroutine registered for this target
ValueError – if type_ is not a request IQ type
ValueError – if type_ is not a valid
IQType
(and cannot be cast to aIQType
)
The callback cb will be called whenever an IQ stanza with the given type_ and payload being an instance of the payload_cls is received.
The callback must either be a coroutine function or otherwise return an awaitable. The awaitable must evaluate to a valid value for the
IQ.payload
attribute. That value will be set as the payload attribute value of an IQ response (with typeRESULT
) which is generated and sent by the stream.If the awaitable or the function raises an exception, it will be converted to a
Error
object. That error object is then used as payload for an IQ response (with typeERROR
) which is generated and sent by the stream.If the exception is a subclass of
aioxmpp.errors.XMPPError
, it is converted to anError
instance directly. Otherwise, it is wrapped in aaioxmpp.XMPPCancelError
withundefined-condition
.For this to work, payload_cls must be registered using
as_payload_class()
. Otherwise, the payload will not be recognised by the stream parser and the IQ is automatically responded to with afeature-not-implemented
error.Warning
When using a coroutine function for cb, there is no guarantee that concurrent IQ handlers and other coroutines will execute in any defined order. This implies that the strong ordering guarantees normally provided by XMPP XML Streams are lost when using coroutine functions for cb. For this reason, the use of non-coroutine functions is allowed.
Note
Using a non-coroutine function for cb will generally lead to less readable code. For the sake of readability, it is recommended to prefer coroutine functions when strong ordering guarantees are not needed.
New in version 0.11: When the argument with_send_reply is true cb will be called with two arguments: the IQ stanza to handle and a unary function send_reply(result=None) that sends a response to the IQ request and prevents that an automatic response is sent. If result is an instance of
XMPPError
an error result is generated.This is useful when the handler function needs to execute actions which happen after the IQ result has been sent, for example, sending other stanzas.
Changed in version 0.10: Accepts an awaitable as last argument in addition to coroutine functions.
Renamed from
register_iq_request_coro()
.New in version 0.6: If the stream is
stop()
-ped (only if SM is not enabled) orclose()
ed, running IQ response coroutines areasyncio.Task.cancel()
-led.To protect against that, fork from your coroutine using
asyncio.ensure_future()
.Changed in version 0.7: The type_ argument is now supposed to be a
IQType
member.Deprecated since version 0.7: Passing a
str
as type_ argument is deprecated and will raise aTypeError
as of the 1.0 release. See the Changelog for Version 0.7 for further details on how to upgrade your code efficiently.
-
unregister_iq_request_handler
(type_, payload_cls)[source]¶ Unregister a coroutine previously registered with
register_iq_request_handler()
.- Parameters
type (
IQType
) – IQ type to react to (must be a request type).payload_cls (
XMLStreamClass
) – Payload class to react to (subclass ofXSO
)
- Raises
KeyError – if no coroutine has been registered for the given
(type_, payload_cls)
pairValueError – if type_ is not a valid
IQType
(and cannot be cast to aIQType
)
The match is solely made using the type_ and payload_cls arguments, which have the same meaning as in
register_iq_request_coro()
.Changed in version 0.10: Renamed from
unregister_iq_request_coro()
.Changed in version 0.7: The type_ argument is now supposed to be a
IQType
member.Deprecated since version 0.7: Passing a
str
as type_ argument is deprecated and will raise aTypeError
as of the 1.0 release. See the Changelog for Version 0.7 for further details on how to upgrade your code efficiently.
-
register_message_callback
(type_, from_, cb)[source]¶ Register a callback to be called when a message is received.
- Parameters
- Raises
ValueError – if another function is already registered for the same
(type_, from_)
pair.ValueError – if type_ is not a valid
MessageType
(and cannot be cast to aMessageType
)
cb will be called whenever a message stanza matching the type_ and from_ is received, according to the wildcarding rules below. More specific callbacks win over less specific callbacks, and the match on the from_ address takes precedence over the match on the type_.
See
SimpleStanzaDispatcher.register_callback()
for the exact wildcarding rules.Changed in version 0.7: The type_ argument is now supposed to be a
MessageType
member.Deprecated since version 0.7: Passing a
str
as type_ argument is deprecated and will raise aTypeError
as of the 1.0 release. See the Changelog for Version 0.7 for further details on how to upgrade your code efficiently.Deprecated since version 0.9: This method has been deprecated in favour of and is now implemented in terms of the
aioxmpp.dispatcher.SimpleMessageDispatcher
service.It is equivalent to call
register_callback()
, except that the latter is not deprecated.
-
unregister_message_callback
(type_, from_)[source]¶ Unregister a callback previously registered with
register_message_callback()
.- Parameters
type (
MessageType
orNone
) – Message type to listen for.
- Raises
KeyError – if no function is currently registered for the given
(type_, from_)
pair.ValueError – if type_ is not a valid
MessageType
(and cannot be cast to aMessageType
)
The match is made on the exact pair; it is not possible to unregister arbitrary listeners by passing
None
to both arguments (i.e. the wildcarding only applies for receiving stanzas, not for unregistering callbacks; unregistering the super-wildcard with both arguments set toNone
is of course possible).Changed in version 0.7: The type_ argument is now supposed to be a
MessageType
member.Deprecated since version 0.7: Passing a
str
as type_ argument is deprecated and will raise aTypeError
as of the 1.0 release. See the Changelog for Version 0.7 for further details on how to upgrade your code efficiently.Deprecated since version 0.9: This method has been deprecated in favour of and is now implemented in terms of the
aioxmpp.dispatcher.SimpleMessageDispatcher
service.It is equivalent to call
unregister_callback()
, except that the latter is not deprecated.
-
register_presence_callback
(type_, from_, cb)[source]¶ Register a callback to be called when a presence stanza is received.
- Parameters
type (
PresenceType
) – Presence type to listen for.from (
JID
orNone
.) – Sender JID to listen for, orNone
for a wildcard match.cb – Callback function
- Raises
ValueError – if another listener with the same
(type_, from_)
pair is already registeredValueError – if type_ is not a valid
PresenceType
(and cannot be cast to aPresenceType
)
cb will be called whenever a presence stanza matching the type_ is received from the specified sender. from_ may be
None
to indicate a wildcard. Like withregister_message_callback()
, more specific callbacks win over less specific callbacks. The fallback order is identical, except that thetype_=None
entries described there do not apply for presence stanzas and are thus omitted.See
SimpleStanzaDispatcher.register_callback()
for the exact wildcarding rules.Changed in version 0.7: The type_ argument is now supposed to be a
PresenceType
member.Deprecated since version 0.7: Passing a
str
as type_ argument is deprecated and will raise aTypeError
as of the 1.0 release. See the Changelog for Version 0.7 for further details on how to upgrade your code efficiently.Deprecated since version 0.9: This method has been deprecated. It is recommended to use
aioxmpp.PresenceClient
instead.
-
unregister_presence_callback
(type_, from_)[source]¶ Unregister a callback previously registered with
register_presence_callback()
.- Parameters
type (
PresenceType
) – Presence type to listen for.from (
JID
orNone
.) – Sender JID to listen for, orNone
for a wildcard match.
- Raises
KeyError – if no callback is currently registered for the given
(type_, from_)
pairValueError – if type_ is not a valid
PresenceType
(and cannot be cast to aPresenceType
)
The match is made on the exact pair; it is not possible to unregister arbitrary listeners by passing
None
to the from_ arguments (i.e. the wildcarding only applies for receiving stanzas, not for unregistering callbacks; unregistering a wildcard match with from_ set toNone
is of course possible).Changed in version 0.7: The type_ argument is now supposed to be a
PresenceType
member.Deprecated since version 0.7: Passing a
str
as type_ argument is deprecated and will raise aTypeError
as of the 1.0 release. See the Changelog for Version 0.7 for further details on how to upgrade your code efficiently.Deprecated since version 0.9: This method has been deprecated. It is recommended to use
aioxmpp.PresenceClient
instead.
Rarely used registries / deprecated aliases:
-
register_iq_request_coro
(type_, payload_cls, coro)[source]¶ Alias of
register_iq_request_handler()
.Deprecated since version 0.10: This alias will be removed in version 1.0.
-
register_iq_response_future
(from_, id_, fut)[source]¶ Register a future fut for an IQ stanza with type
result
orerror
from theJID
from_ with the id id_.If the type of the IQ stanza is
result
, the stanza is set as result to the future. If the type of the IQ stanza iserror
, the stanzas error field is converted to an exception and set as the exception of the future.The future might also receive different exceptions:
errors.ErroneousStanza
, if the response stanza received could not be parsed.Note that this exception is not emitted if the
from
address of the stanza is unset, because the code cannot determine whether a sender deliberately used an erroneous address to make parsing fail or no sender address was used. In the former case, an attacker could use that to inject a stanza which would be taken as a stanza from the peer server. Thus, the future will never be fulfilled in these cases.Also note that this exception does not derive from
errors.XMPPError
, as it cannot provide the same attributes. Instead, it derives fromerrors.StanzaError
, from whicherrors.XMPPError
also derives; to catch all possible stanza errors, catchingerrors.StanzaError
is sufficient and future-proof.ConnectionError
if the stream isstop()
-ped (only if SM is not enabled) orclose()
-ed.Any
Exception
which may be raised fromsend_xso()
, which are generally alsoConnectionError
or at leastOSError
subclasses.
-
register_iq_response_callback
(from_, id_, cb)[source]¶ Register a callback function cb to be called when a IQ stanza with type
result
orerror
is received from theJID
from_ with the id id_.The callback is called at most once.
Note
In contrast to
register_iq_response_future()
, errors which occur on a level below XMPP stanzas cannot be caught using a callback.If you need notification about other errors and still want to use callbacks, use of a future with
asyncio.Future.add_done_callback()
is recommended.
-
unregister_iq_response
(from_, id_)[source]¶ Unregister a registered callback or future for the IQ response identified by from_ and id_. See
register_iq_response_future()
orregister_iq_response_callback()
for details on the arguments meanings and how to register futures and callbacks respectively.Note
Futures will automatically be unregistered when they are cancelled.
Inbound Stanza Filters (see Stanza Filters):
-
app_inbound_presence_filter
¶ This is a
AppFilter
based filter chain on inbound presence stanzas. It can be used to attach application-specific filters.
-
service_inbound_presence_filter
¶ This is another filter chain for inbound presence stanzas. It runs before the
app_inbound_presence_filter
chain and all functions registered there must haveservice.Service
classes as order value (seeFilter.register()
).This filter chain is intended to be used by library services, such as a XEP-0115 implementation which may start a XEP-0030 lookup at the target entity to resolve the capability hash or prime the XEP-0030 cache with the service information obtained by interpreting the XEP-0115 hash value.
-
app_inbound_message_filter
¶ This is a
AppFilter
based filter chain on inbound message stanzas. It can be used to attach application-specific filters.
-
service_inbound_message_filter
¶ This is the analogon of
service_inbound_presence_filter
forapp_inbound_message_filter
.
Outbound Stanza Filters (see Stanza Filters):
-
app_outbound_presence_filter
¶ This is a
AppFilter
based filter chain on outbound presence stanzas. It can be used to attach application-specific filters.Before using this attribute, make sure that you have read the notes above.
-
service_outbound_presence_filter
¶ This is the analogon of
service_inbound_presence_filter
, but for outbound presence. It runs after theapp_outbound_presence_filter()
.Before using this attribute, make sure that you have read the notes above.
-
app_outbound_message_filter
¶ This is a
AppFilter
based filter chain on inbound message stanzas. It can be used to attach application-specific filters.Before using this attribute, make sure that you have read the notes above.
-
service_outbound_messages_filter
¶ This is the analogon of
service_outbound_presence_filter
, but for outbound messages.Before using this attribute, make sure that you have read the notes above.
Using stream management:
-
async
start_sm
(request_resumption=True, resumption_timeout=None)[source]¶ Start stream management (version 3).
- Parameters
- Raises
aioxmpp.errors.StreamNegotiationFailure – if the server rejects the attempt to enable stream management.
This method attempts to starts stream management on the stream.
resumption_timeout is the
max
attribute onnonza.SMEnabled
; it can be used to set a maximum time for which the server shall consider the stream to still be alive after the underlying transport (TCP) has failed. The server may impose its own maximum or ignore the request, so there are no guarantees that the session will stay alive for at most or at least resumption_timeout seconds. Passing a resumption_timeout of 0 is equivalent to passing false to request_resumption and takes precedence over request_resumption.Note
In addition to server implementation details, it is very well possible that the server does not even detect that the underlying transport has failed for quite some time for various reasons (including high TCP timeouts).
If the server rejects the attempt to enable stream management, a
errors.StreamNegotiationFailure
is raised. The stream is still running in that case.Warning
This method cannot and does not check whether the server advertised support for stream management. Attempting to negotiate stream management without server support might lead to termination of the stream.
If an XML stream error occurs during the negotiation, the result depends on a few factors. In any case, the stream is not running afterwards. If the
nonza.SMEnabled
response was not received before the XML stream died, SM is also disabled and the exception which caused the stream to die is re-raised (this is due to the implementation ofsend_and_wait_for()
). If thenonza.SMEnabled
response was received and annonuced support for resumption, SM is enabled. Otherwise, it is disabled. No exception is raised ifnonza.SMEnabled
was received, as this method has no way to determine that the stream failed.If negotiation succeeds, this coroutine initializes a new stream management session. The stream management state attributes become available and
sm_enabled
becomesTrue
.
-
async
resume_sm
(xmlstream)[source]¶ Resume an SM-enabled stream using the given xmlstream.
If the server rejects the attempt to resume stream management, a
errors.StreamNegotiationFailure
is raised. The stream is then in stopped state and stream management has been stopped.Warning
This method cannot and does not check whether the server advertised support for stream management. Attempting to negotiate stream management without server support might lead to termination of the stream.
If the XML stream dies at any point during the negotiation, the SM state is left unchanged. If no response has been received yet, the exception which caused the stream to die is re-raised. The state of the stream depends on whether the main task already noticed the dead stream.
If negotiation succeeds, this coroutine resumes the stream management session and initiates the retransmission of any unacked stanzas. The stream is then in running state.
Changed in version 0.11: Support for using the counter value provided some servers on a failed resumption was added. Stanzas which are covered by the counter will be marked as
ACKED
; other stanzas will be marked asDISCONNECTED
.This is in contrast to the behaviour when resumption fails without a counter given. In that case, stanzas which have not been acked are marked as
SENT_WITHOUT_SM
.
-
stop_sm
()[source]¶ Disable stream management on the stream.
Attempting to call this method while the stream is running or without stream management enabled results in a
RuntimeError
.Any sent stanzas which have not been acked by the remote yet are put into
StanzaState.SENT_WITHOUT_SM
state.
Stream management state inspection:
-
sm_outbound_base
¶ The last value of the remote stanza counter.
Note
Accessing this attribute when
sm_enabled
isFalse
raisesRuntimeError
.
-
sm_inbound_ctr
¶ The current value of the inbound stanza counter.
Note
Accessing this attribute when
sm_enabled
isFalse
raisesRuntimeError
.
-
sm_unacked_list
¶ A copy of the list of stanza tokens which have not yet been acked by the remote party.
Note
Accessing this attribute when
sm_enabled
isFalse
raisesRuntimeError
.Accessing this attribute is expensive, as the list is copied. In general, access to this attribute should not be necessary at all.
-
sm_id
¶ The value of the
id
attribute of theSMEnabled
response from the server.Note
Accessing this attribute when
sm_enabled
isFalse
raisesRuntimeError
.
-
sm_max
¶ The value of the
max
attribute of theSMEnabled
response from the server.Note
Accessing this attribute when
sm_enabled
isFalse
raisesRuntimeError
.
-
sm_location
¶ The value of the
location
attribute of theSMEnabled
response from the server.Note
Accessing this attribute when
sm_enabled
isFalse
raisesRuntimeError
.
-
sm_resumable
¶ The value of the
resume
attribute of theSMEnabled
response from the server.Note
Accessing this attribute when
sm_enabled
isFalse
raisesRuntimeError
.
Miscellaneous:
-
local_jid
¶ The local_jid argument to the constructor.
Warning
Changing this arbitrarily while the stream is running may have unintended side effects.
Signals:
-
signal
on_failure
(exc)¶ Emits when the stream has failed, i.e. entered stopped state without request by the user.
- Parameters
exc (
Exception
) – The exception which caused the stream to fail.
A failure occurs whenever the main task of the
StanzaStream
(the one started bystart()
) terminates with an exception.Examples are
ConnectionError
as raised upon a ping timeout and any exceptions which may be raised by theaioxmpp.protocol.XMLStream.send_xso()
method.Before
on_failure()
is emitted, theXMLStream
isabort()
-ed if SM is enabled andclose()
-ed if SM is not enabled.Changed in version 0.6: The closing behaviour was added.
-
signal
on_stream_destroyed
(reason)¶ The stream has been stopped in a manner which means that all state must be discarded.
- Parameters
reason (
Exception
) – The exception which caused the stream to be destroyed.
When this signal is emitted, others have or will most likely see unavailable presence from the XMPP resource associated with the stream, and stanzas sent in the mean time are not guaranteed to be received.
reason may be a
DestructionRequested
instance to indicate that the destruction was requested by the user, in some way.There is no guarantee (it is not even likely) that it is possible to send stanzas over the stream at the time this signal is emitted.
Changed in version 0.8: The reason argument was added.
-
signal
on_stream_established
()¶ When a stream is newly established, this signal is fired. This happens whenever a non-SM stream is started and whenever a stream which previously had SM disabled is started with SM enabled.
-
signal
on_message_received
(stanza)¶ Emits when a
aioxmpp.Message
stanza has been received.- Parameters
stanza (
aioxmpp.Message
) – The received stanza.
See also
aioxmpp.dispatcher.SimpleMessageDispatcher
for a service which allows to register callbacks for messages based on the sender and type of the message.
New in version 0.9.
-
signal
on_presence_received
(stanza)¶ Emits when a
aioxmpp.Presence
stanza has been received.- Parameters
stanza (
aioxmpp.Presence
) – The received stanza.
See also
aioxmpp.dispatcher.SimplePresenceDispatcher
for a service which allows to register callbacks for presences based on the sender and type of the message.
New in version 0.9.
-
Context managers¶
The following context managers can be used together with StanzaStream
instances and the filters available on them.
-
aioxmpp.stream.
iq_handler
(stream, type_, payload_cls, coro, *, with_send_reply=False)[source]¶ Context manager to temporarily register a coroutine to handle IQ requests on a
StanzaStream
.- Parameters
stream (
StanzaStream
) – Stanza stream to register the coroutine attype (
IQType
) – IQ type to react to (must be a request type).payload_cls (
XMLStreamClass
) – Payload class to react to (subclass ofXSO
)coro – Coroutine to register
with_send_reply (
bool
) – Whether to pass a function to send the reply early to cb.
The coroutine is registered when the context is entered and unregistered when the context is exited. Running coroutines are not affected by exiting the context manager.
New in version 0.11: The with_send_reply argument. See
aioxmpp.stream.StanzaStream.register_iq_request_handler()
for more detail.New in version 0.8.
-
aioxmpp.stream.
message_handler
(stream, type_, from_, cb)[source]¶ Context manager to temporarily register a callback to handle messages on a
StanzaStream
.- Parameters
stream (
StanzaStream
) – Stanza stream to register the coroutine attype (
MessageType
orNone
) – Message type to listen for, orNone
for a wildcard match.from (
JID
orNone
) – Sender JID to listen for, orNone
for a wildcard match.cb – Callback to register
The callback is registered when the context is entered and unregistered when the context is exited.
New in version 0.8.
-
aioxmpp.stream.
presence_handler
(stream, type_, from_, cb)[source]¶ Context manager to temporarily register a callback to handle presence stanzas on a
StanzaStream
.- Parameters
stream (
StanzaStream
) – Stanza stream to register the coroutine attype (
PresenceType
) – Presence type to listen for.from (
JID
orNone
.) – Sender JID to listen for, orNone
for a wildcard match.cb – Callback to register
The callback is registered when the context is entered and unregistered when the context is exited.
New in version 0.8.
-
aioxmpp.stream.
stanza_filter
(filter_, func, order=<object object>)[source]¶ This is a deprecated alias of
aioxmpp.callbacks.Filter.context_register()
.New in version 0.8.
Deprecated since version 0.9.
Low-level stanza tracking¶
The following classes are used to track stanzas in the XML stream to the
server. This is independent of things like Message Delivery Receipts (for which services are provided at aioxmpp.tracking
); it
only provides tracking to the remote server and even that only if stream
management is used. Otherwise, it only provides tracking in the aioxmpp
internal queues.
-
class
aioxmpp.stream.
StanzaToken
(stanza, *, on_state_change=None)[source]¶ A token to follow the processing of a stanza.
on_state_change may be a function which will be called with the token and the new
StanzaState
whenever the state of the token changes.New in version 0.8: Stanza tokens are awaitable.
-
await token
-
yield from token
Wait until the stanza is either sent or failed to sent.
Warning
This only works with Python 3.5 or newer.
- Raises ConnectionError
if the stanza enters
DISCONNECTED
state.- Raises RuntimeError
- Raises Exception
re-raised if the stanza token fails to serialise or another transient transport problem occurs.
- Return
If a coroutine awaiting a token is cancelled, the token is aborted. Use
asyncio.shield()
to prevent this.Warning
This is no guarantee that the recipient received the stanza. Without stream management, it can not even guaranteed that the server has seen the stanza.
This is primarily useful as a synchronisation primitive between the sending of a stanza and another stream operation, such as closing the stream.
Note
Exceptions sent to the stanza token (when it enters
StanzaState.FAILED
) are only available by awaiting the token, not via the callback.-
state
¶ The current
StanzaState
of the token. Tokens are created withStanzaState.ACTIVE
.
-
abort
()[source]¶ Abort the stanza. Attempting to call this when the stanza is in any non-
ACTIVE
, non-ABORTED
state results in aRuntimeError
.When a stanza is aborted, it will reside in the active queue of the stream, not will be sent and instead discarded silently.
-
-
class
aioxmpp.stream.
StanzaState
(value)[source]¶ The various states an outgoing stanza can have.
-
ACTIVE
¶ The stanza has just been enqueued for sending and has not been taken care of by the StanzaStream yet.
-
SENT
¶ The stanza has been sent over a stream with Stream Management enabled, but not acked by the remote yet.
-
ACKED
¶ The stanza has been sent over a stream with Stream Management enabled and has been acked by the remote.
This is a final state.
-
SENT_WITHOUT_SM
¶ The stanza has been sent over a stream without Stream Management enabled or has been sent over a stream with Stream Management enabled, but for which resumption has failed before the stanza has been acked.
This is a final state.
-
ABORTED
¶ The stanza has been retracted before it left the active queue.
This is a final state.
-
DROPPED
¶ The stanza has been dropped by one of the filters configured in the
StanzaStream
.This is a final state.
-
DISCONNECTED
¶ The stream has been stopped (without SM) or closed before the stanza was sent.
This is a final state.
-
FAILED
¶ It was attempted to send the stanza, but it failed to serialise to valid XML or another non-fatal transport error occurred.
This is a final state.
New in version 0.9.
-
Filters¶
The service-level filters used by the StanzaStream
use
Filter
. The application-level filters are using the
following class:
-
class
aioxmpp.stream.
AppFilter
[source]¶ A specialized
Filter
version. The only difference is in the handling of the order argument toregister()
:
Exceptions¶
-
class
aioxmpp.stream.
DestructionRequested
[source]¶ Subclass of
ConnectionError
indicating that the destruction of the stream was requested by the user, directly or indirectly.