diff --git a/examples/router/.crossbar/config.json b/examples/router/.crossbar/config.json index 86af96c4..776c9610 100644 --- a/examples/router/.crossbar/config.json +++ b/examples/router/.crossbar/config.json @@ -6,6 +6,15 @@ "realms": [ { "name": "crossbardemo", + "store": { + "type": "memory", + "event-history": [ + { + "uri": "com.example.history", + "limit": 100 + } + ] + }, "roles": [ { "name": "anonymous", diff --git a/examples/twisted/wamp/pubsub/retained/README.md b/examples/twisted/wamp/pubsub/retained/README.md new file mode 100644 index 00000000..3595909b --- /dev/null +++ b/examples/twisted/wamp/pubsub/retained/README.md @@ -0,0 +1,23 @@ +This shows how to use "retained" events as well as "event history". + +The "backend.py" does some publishing to two different topics: +"com.example.history" and "com.example.no_history_here". The former +has event-history enabled (see the example router's config in the +"crossbardemo" realm). + +When "frontend.py" attaches and subscribes to *either* of the two +topics, it will immediately receive the latest event. + +After that, the WAMP Meta API is used to retrieve the event-history +from the "com.example.history" topic. + +Things to try: + + - run backend.py, then run frontend.py in a new shell + + - run backend.py, kill it, then run frontend.py + + - with frontend.py running, kill and re-run backend.py several times + + - ...then try starting frontend.py again (which will show more events + in the history diff --git a/examples/twisted/wamp/pubsub/retained/backend.py b/examples/twisted/wamp/pubsub/retained/backend.py new file mode 100644 index 00000000..c40d5521 --- /dev/null +++ b/examples/twisted/wamp/pubsub/retained/backend.py @@ -0,0 +1,59 @@ +############################################################################### +# +# The MIT License (MIT) +# +# Copyright (c) Crossbar.io Technologies GmbH +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +############################################################################### + +from os import environ +from twisted.internet import reactor +from twisted.internet.defer import inlineCallbacks + +from autobahn.twisted.wamp import Session, ApplicationRunner +from autobahn.twisted.util import sleep +from autobahn.wamp.types import PublishOptions + + +class Component(Session): + """ + An application component calling the different backend procedures. + """ + + @inlineCallbacks + def onJoin(self, details): + print("session attached {}".format(details)) + + for topic in [u"com.example.history", u"com.example.no_history_here"]: + print("publishing '{}' as retained event".format(topic)) + pub = yield self.publish( + topic, "some data, topic was '{}'".format(topic), + options=PublishOptions(retain=True, acknowledge=True), + ) + print("published: {}".format(pub)) + + +if __name__ == '__main__': + runner = ApplicationRunner( + environ.get("AUTOBAHN_DEMO_ROUTER", u"ws://127.0.0.1:8080/auth_ws"), + u"crossbardemo", + ) + runner.run(Component) diff --git a/examples/twisted/wamp/pubsub/retained/frontend.py b/examples/twisted/wamp/pubsub/retained/frontend.py new file mode 100644 index 00000000..da75a0b4 --- /dev/null +++ b/examples/twisted/wamp/pubsub/retained/frontend.py @@ -0,0 +1,71 @@ +############################################################################### +# +# The MIT License (MIT) +# +# Copyright (c) Crossbar.io Technologies GmbH +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +############################################################################### + +from os import environ +from twisted.internet import reactor +from twisted.internet.defer import inlineCallbacks + +from autobahn.twisted.wamp import Session, ApplicationRunner +from autobahn.twisted.util import sleep +from autobahn.wamp.types import SubscribeOptions + + +class Component(Session): + """ + An application component calling the different backend procedures. + """ + + @inlineCallbacks + def onJoin(self, details): + print("session attached {}".format(details)) + + def got_event(*args, **kw): + print("got_event(): args={}, kwargs={}".format(args, kw)) + + # note: we're relying on 'com.example.history' (the one with + # event-history enabled) being last so that "pub" has the + # right ID for wamp.subscription.get_events after the loop + for topic in [u"com.example.no_history_here", u"com.example.history"]: + print("subscribing to '{}'".format(topic)) + pub = yield self.subscribe( + got_event, topic, + options=SubscribeOptions(get_retained=True), + ) + print("id={}".format(pub.id)) + + events = yield self.call(u"wamp.subscription.get_events", pub.id) + print("Using the WAMP Meta API:") + print("wamp.subscription.get_events {}: {}".format(pub.id, len(events))) + for event in events: + print(" {event[timestamp]} {event[topic]} args={event[args]} kwargs={event[kwargs]}".format(event=event)) + + +if __name__ == '__main__': + runner = ApplicationRunner( + environ.get("AUTOBAHN_DEMO_ROUTER", u"ws://127.0.0.1:8080/auth_ws"), + u"crossbardemo", + ) + runner.run(Component)