-
Notifications
You must be signed in to change notification settings - Fork 0
/
flask_wamp.py
93 lines (71 loc) · 2.82 KB
/
flask_wamp.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import logging
from functools import partial
from flask import g
from wampy.peers.clients import Client
from wampy.constants import CROSSBAR_DEFAULT, DEFAULT_REALM
logger = logging.getLogger(__name__)
class FlaskWAMPClient(Client):
def __init__(self, url, realm):
super(FlaskWAMPClient, self).__init__(url=url, realm=realm)
self._procedures = {}
self._topics = {}
def __getattr__(self, name):
# implemented to intercept calls to entrypoints which are not
# found on the wamp Client (as ususal) but instead on the Flask
# app
if name in self._procedures:
return self._procedures[name]
try:
return getattr(self.flask_app, name)
except AttributeError:
return getattr(self, name)
def _topic_callback(self, *args, **kwargs):
message = kwargs['message']
topic = kwargs['meta']['topic']
for recognised_topic in self._topics:
if recognised_topic == topic:
self._topics[recognised_topic](message=message)
class WAMP(object):
def __init__(self, app=None):
self.app = app
if app is not None:
self.init_app(app)
def init_app(self, app):
app.config.setdefault('CROSSBAR_URL', CROSSBAR_DEFAULT)
app.config.setdefault('WAMP_REALM', DEFAULT_REALM)
app.teardown_appcontext(self.teardown)
self.client = FlaskWAMPClient(
url=app.config['CROSSBAR_URL'],
realm=app.config['REALM'],
)
logger.info('connecting to Crossbar')
self.client.start()
app.before_request(self._inject_wampy)
if not hasattr(app, 'extensions'):
app.extensions = {}
app.extensions['flask_wamp'] = self
logger.info('Flask-WAMP initialised for %s', app)
def _inject_wampy(self):
if not hasattr(g, 'wanmpy'):
g.wampy = self.client
def teardown(self, exception):
if hasattr(g, 'wampy'):
logger.warning('tearing down Crossbar connection')
self.client.stop()
del g.wampy
def callee(self, *args, **kwargs):
def registering_decorator(fn, args, kwargs):
self.client.session._register_procedure(fn.__name__)
self.client._procedures[fn.__name__] = fn
return fn
return registering_decorator(args[0], args=(), kwargs={})
def consume(self, *args, **kwargs):
# whilst i decide on something better
assert 'topic' in kwargs
def registering_decorator(fn, args, kwargs):
self.client.session._subscribe_to_topic(
self.client._topic_callback, kwargs['topic'],
)
self.client._topics[kwargs['topic']] = fn
return fn
return partial(registering_decorator, args=args, kwargs=kwargs)