annotate sat/tools/async_trigger.py @ 3728:b15644cae50d

component AP gateway: JID/node ⟺ AP outbox conversion: - convert a combination of JID and optional pubsub node to AP actor handle (see `getJIDAndNode` for details) and vice versa - the gateway now provides a Pubsub service - retrieve pubsub node and convert it to AP collection, AP pagination is converted to RSM - do the opposite: convert AP collection to pubsub and handle RSM request. Due to ActivityStream collection pagination limitations, some RSM request produce inefficient requests, but caching should be used most of the time in the future and avoid the problem. - set specific name to HTTP Server - new `local_only` setting (`True` by default) to indicate if the gateway can request or not XMPP Pubsub nodes from other servers - disco info now specifies important features such as Pubsub RSM, and nodes metadata ticket 363
author Goffi <goffi@goffi.org>
date Tue, 25 Jan 2022 17:54:06 +0100
parents 7f5bf108961a
children e14847bf65c0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
1 #!/usr/bin/env python3
3137
559a625a236b fixed shebangs
Goffi <goffi@goffi.org>
parents: 3136
diff changeset
2
2645
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
3
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
4 # SAT: a jabber client
3479
be6d91572633 date update
Goffi <goffi@goffi.org>
parents: 3397
diff changeset
5 # Copyright (C) 2009-2021 Jérôme Poisson (goffi@goffi.org)
2645
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
6
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
7 # This program is free software: you can redistribute it and/or modify
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
8 # it under the terms of the GNU Affero General Public License as published by
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
9 # the Free Software Foundation, either version 3 of the License, or
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
10 # (at your option) any later version.
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
11
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
12 # This program is distributed in the hope that it will be useful,
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
15 # GNU Affero General Public License for more details.
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
16
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
17 # You should have received a copy of the GNU Affero General Public License
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
19
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
20 """Misc usefull classes"""
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
21
3397
c069882f64cb tools (async_trigger): use `utils.asDeferred` for async triggers:
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
22 from . import trigger as sync_trigger
c069882f64cb tools (async_trigger): use `utils.asDeferred` for async triggers:
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
23 from . import utils
2645
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
24 from twisted.internet import defer
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
25
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
26 class TriggerManager(sync_trigger.TriggerManager):
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
27 """This is a TriggerManager with an new asyncPoint method"""
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
28
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
29 @defer.inlineCallbacks
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
30 def asyncPoint(self, point_name, *args, **kwargs):
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
31 """This put a trigger point with potentially async Deferred
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
32
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
33 All the triggers for that point will be run
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
34 @param point_name: name of the trigger point
2650
3a8e7ec4648a tools (trigger, async_trigger): added no_cancel argument to point and asyncPoint when a trigger must not be cancellable
Goffi <goffi@goffi.org>
parents: 2645
diff changeset
35 @param *args: args to transmit to trigger
3a8e7ec4648a tools (trigger, async_trigger): added no_cancel argument to point and asyncPoint when a trigger must not be cancellable
Goffi <goffi@goffi.org>
parents: 2645
diff changeset
36 @param *kwargs: kwargs to transmit to trigger
3a8e7ec4648a tools (trigger, async_trigger): added no_cancel argument to point and asyncPoint when a trigger must not be cancellable
Goffi <goffi@goffi.org>
parents: 2645
diff changeset
37 if "triggers_no_cancel" is present, it will be popped out
3a8e7ec4648a tools (trigger, async_trigger): added no_cancel argument to point and asyncPoint when a trigger must not be cancellable
Goffi <goffi@goffi.org>
parents: 2645
diff changeset
38 when set to True, this argument don't let triggers stop
3a8e7ec4648a tools (trigger, async_trigger): added no_cancel argument to point and asyncPoint when a trigger must not be cancellable
Goffi <goffi@goffi.org>
parents: 2645
diff changeset
39 the workflow
2645
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
40 @return D(bool): True if the action must be continued, False else
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
41 """
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
42 if point_name not in self.__triggers:
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
43 defer.returnValue(True)
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
44
2650
3a8e7ec4648a tools (trigger, async_trigger): added no_cancel argument to point and asyncPoint when a trigger must not be cancellable
Goffi <goffi@goffi.org>
parents: 2645
diff changeset
45 can_cancel = not kwargs.pop('triggers_no_cancel', False)
3a8e7ec4648a tools (trigger, async_trigger): added no_cancel argument to point and asyncPoint when a trigger must not be cancellable
Goffi <goffi@goffi.org>
parents: 2645
diff changeset
46
2645
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
47 for priority, trigger in self.__triggers[point_name]:
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
48 try:
3397
c069882f64cb tools (async_trigger): use `utils.asDeferred` for async triggers:
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
49 cont = yield utils.asDeferred(trigger, *args, **kwargs)
2650
3a8e7ec4648a tools (trigger, async_trigger): added no_cancel argument to point and asyncPoint when a trigger must not be cancellable
Goffi <goffi@goffi.org>
parents: 2645
diff changeset
50 if can_cancel and not cont:
2645
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
51 defer.returnValue(False)
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
52 except sync_trigger.SkipOtherTriggers:
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
53 break
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
54 defer.returnValue(True)
3525
7f5bf108961a tools (async_trigger): new `asyncReturnPoint` method
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
55
7f5bf108961a tools (async_trigger): new `asyncReturnPoint` method
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
56 async def asyncReturnPoint(self, point_name, *args, **kwargs):
7f5bf108961a tools (async_trigger): new `asyncReturnPoint` method
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
57 """Async version of returnPoint"""
7f5bf108961a tools (async_trigger): new `asyncReturnPoint` method
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
58 if point_name not in self.__triggers:
7f5bf108961a tools (async_trigger): new `asyncReturnPoint` method
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
59 return True
7f5bf108961a tools (async_trigger): new `asyncReturnPoint` method
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
60
7f5bf108961a tools (async_trigger): new `asyncReturnPoint` method
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
61 for priority, trigger in self.__triggers[point_name]:
7f5bf108961a tools (async_trigger): new `asyncReturnPoint` method
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
62 try:
7f5bf108961a tools (async_trigger): new `asyncReturnPoint` method
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
63 cont, ret_value = await utils.asDeferred(trigger, *args, **kwargs)
7f5bf108961a tools (async_trigger): new `asyncReturnPoint` method
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
64 if not cont:
7f5bf108961a tools (async_trigger): new `asyncReturnPoint` method
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
65 return False, ret_value
7f5bf108961a tools (async_trigger): new `asyncReturnPoint` method
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
66 except sync_trigger.SkipOtherTriggers:
7f5bf108961a tools (async_trigger): new `asyncReturnPoint` method
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
67 break
7f5bf108961a tools (async_trigger): new `asyncReturnPoint` method
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
68 return True, None
7f5bf108961a tools (async_trigger): new `asyncReturnPoint` method
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
69