You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
56 lines
1.6 KiB
56 lines
1.6 KiB
4 years ago
|
from signalr.events import EventHook
|
||
|
|
||
|
|
||
|
class Hub:
|
||
|
def __init__(self, name, connection):
|
||
|
self.name = name
|
||
|
self.server = HubServer(name, connection, self)
|
||
|
self.client = HubClient(name, connection)
|
||
|
self.error = EventHook()
|
||
|
|
||
|
|
||
|
class HubServer:
|
||
|
def __init__(self, name, connection, hub):
|
||
|
self.name = name
|
||
|
self.__connection = connection
|
||
|
self.__hub = hub
|
||
|
|
||
|
def invoke(self, method, *data):
|
||
|
self.__connection.send({
|
||
|
'H': self.name,
|
||
|
'M': method,
|
||
|
'A': data,
|
||
|
'I': self.__connection.increment_send_counter()
|
||
|
})
|
||
|
|
||
|
|
||
|
class HubClient(object):
|
||
|
def __init__(self, name, connection):
|
||
|
self.name = name
|
||
|
self.__handlers = {}
|
||
|
|
||
|
def handle(**kwargs):
|
||
|
messages = kwargs['M'] if 'M' in kwargs and len(kwargs['M']) > 0 else {}
|
||
|
for inner_data in messages:
|
||
|
hub = inner_data['H'] if 'H' in inner_data else ''
|
||
|
if hub.lower() == self.name.lower():
|
||
|
method = inner_data['name']
|
||
|
if method in self.__handlers:
|
||
|
self.__handlers[method].fire(inner_data)
|
||
|
|
||
|
connection.received += handle
|
||
|
|
||
|
def on(self, method, handler):
|
||
|
if method not in self.__handlers:
|
||
|
self.__handlers[method] = EventHook()
|
||
|
self.__handlers[method] += handler
|
||
|
|
||
|
def off(self, method, handler):
|
||
|
if method in self.__handlers:
|
||
|
self.__handlers[method] -= handler
|
||
|
|
||
|
|
||
|
class DictToObj:
|
||
|
def __init__(self, d):
|
||
|
self.__dict__ = d
|