Improve connection handling, especially in case of conflicting names. v0.3.1
authorBenjamin Braatz <bb@bbraatz.eu>
Tue, 25 Jul 2023 09:31:05 +0000 (11:31 +0200)
committerBenjamin Braatz <bb@bbraatz.eu>
Tue, 25 Jul 2023 10:59:03 +0000 (12:59 +0200)
controlpi_plugins/wsserver.py
setup.py

index aefbdbf2a48aa3b2682f66d1e11df5776c593470..2eaf2154deb7915b61564394504969fa46d19e28 100644 (file)
@@ -39,6 +39,7 @@ class Connection:
                            [MessageTemplate()],
                            [([MessageTemplate()],
                              self._receive)])
+        self._registered = True
 
     async def _receive(self, message: Message) -> None:
         """Receive messages from bus and relay to websocket."""
@@ -61,41 +62,49 @@ class Connection:
                         message['command'] == 'configure websocket' and
                         'target' in message and
                         message['target'] == ''):
-                    await self._bus.send(Message(self._name,
-                                                 {'event':
-                                                  'connection closed'}))
+                    self._registered = False
                     self._bus.unregister(self._name)
+                    new_name = self._name
                     if 'name' in message:
-                        self._name = message['name']
+                        new_name = message['name']
                     sends = []
                     sends.append(MessageTemplate({'event':
                                                   {'const':
                                                    'connection opened'}}))
+                    sends.append(MessageTemplate({'event':
+                                                  {'const':
+                                                   'connection configured'}}))
                     sends.append(MessageTemplate({'event':
                                                   {'const':
                                                    'connection closed'}}))
                     for template in message['up filter']:
                         sends.append(template)
                     try:
-                        self._bus.register(self._name, 'WSServer', sends,
+                        self._bus.register(new_name, 'WSServer', sends,
                                            [(message['down filter'],
                                              self._receive)])
+                        self._registered = True
+                        self._name = new_name
+                        configure_message = Message(self._name)
+                        configure_message['event'] = 'connection configured'
+                        configure_message['address'] = self._address
+                        configure_message['port'] = self._port
+                        if 'mac' in message:
+                            configure_message['mac'] = message['mac']
+                        await self._bus.send(configure_message)
                     except BusException as e:
-                        print(f"Unable to register client '{self._name}'"
+                        print(f"Unable to register client '{new_name}'"
                               f"on bus: {e}")
-                    open_message = Message(self._name)
-                    open_message['event'] = 'connection opened'
-                    open_message['address'] = self._address
-                    open_message['port'] = self._port
-                    if 'mac' in message:
-                        open_message['mac'] = message['mac']
-                    await self._bus.send(open_message)
+                        await self._websocket.close()
                 else:
-                    await self._bus.send(Message(self._name, message))
+                    if self._registered:
+                        await self._bus.send(Message(self._name, message))
         except ConnectionClosed:
             pass
-        await self._bus.send(Message(self._name,
-                                     {'event': 'connection closed'}))
+        if self._registered:
+            await self._bus.send(Message(self._name,
+                                         {'event': 'connection closed'}))
+        self._registered = False
         self._bus.unregister(self._name)
 
 
index ae38e84de966e6a3b296cb4f4beaa3c4925fbb30..7c093724e00d60a911cb50ccc355f6a05376e24a 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -5,7 +5,7 @@ with open("README.md", "r") as readme_file:
 
 setuptools.setup(
     name="controlpi-wsserver",
-    version="0.3.0",
+    version="0.3.1",
     author="Graph-IT GmbH",
     author_email="info@graph-it.com",
     description="ControlPi Plugin for Websocket Servers",