Skip to content

Commit 2bc3ba4

Browse files
committed
Update python dependencies to latest versions
Includes updates for backward-incomptible websockets library changes and some linter and type checking fixes.
1 parent 4ea5692 commit 2bc3ba4

9 files changed

Lines changed: 59 additions & 41 deletions

File tree

com.chrisregado.googlemeet.sdPlugin/manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -428,7 +428,7 @@
428428
"Name": "Google Meet",
429429
"Icon": "images/plugin_icon",
430430
"URL": "https://github.com/ChrisRegado/streamdeck-googlemeet",
431-
"Version": "1.6.0",
431+
"Version": "1.6.1",
432432
"Category": "Google Meet",
433433
"CategoryIcon": "images/category_icon",
434434
"OS": [

streamdeck-plugin/requirements.txt

100755100644
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
altgraph==0.17.4
22
macholib==1.16.3
3-
packaging==24.1
4-
pyinstaller==6.11.0
5-
pyinstaller-hooks-contrib==2024.9
6-
setuptools==75.3.0
7-
websockets==13.1
3+
packaging==25.0
4+
pyinstaller==6.14.2
5+
pyinstaller-hooks-contrib==2025.8
6+
setuptools==80.9.0
7+
websockets==15.0.1

streamdeck-plugin/src/browser_websocket_server.py

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
import asyncio
22
import json
33
import logging
4-
from typing import List, Set
4+
from typing import List, TYPE_CHECKING, Set
55
import websockets
66

7+
if TYPE_CHECKING:
8+
from event_handlers.base_event_handler import EventHandler
9+
710

811
class BrowserWebsocketServer:
912
"""
@@ -31,15 +34,15 @@ def __init__(self):
3134
so we can use them to send outbound messages from this plugin to the
3235
extension.
3336
"""
34-
self._ws_clients: Set[websockets.WebSocketServerProtocol] = set()
37+
self._ws_clients: Set[websockets.ServerConnection] = set()
3538

3639
"""
3740
Any EventHandlers registered to receive inbound events from the browser extension.
3841
"""
3942
self._handlers: List["EventHandler"] = []
4043

41-
def start(self, hostname: str, port: int) -> None:
42-
return websockets.serve(self._message_receive_loop, hostname, port)
44+
async def start(self, hostname: str, port: int) -> websockets.Server:
45+
return await websockets.serve(self._message_receive_loop, hostname, port)
4346

4447
async def send_to_clients(self, message: str) -> None:
4548
"""
@@ -66,16 +69,16 @@ def register_event_handler(self, handler: "EventHandler") -> None:
6669
def num_connected_clients(self) -> int:
6770
return len(self._ws_clients)
6871

69-
def _register_client(self, ws: websockets.WebSocketServerProtocol) -> None:
72+
def _register_client(self, ws: websockets.ServerConnection) -> None:
7073
self._ws_clients.add(ws)
7174
self._logger.info(
7275
(f"{ws.remote_address} has connected to our browser websocket."
7376
f" We now have {len(self._ws_clients)} active connection(s)."))
7477

75-
async def _unregister_client(self, ws: websockets.WebSocketServerProtocol) -> None:
78+
async def _unregister_client(self, ws: websockets.ServerConnection) -> None:
7679
try:
7780
await ws.close()
78-
except:
81+
except Exception:
7982
self._logger.exception(
8083
"Exception while closing browser webocket connection.")
8184
if ws in self._ws_clients:
@@ -84,7 +87,7 @@ async def _unregister_client(self, ws: websockets.WebSocketServerProtocol) -> No
8487
(f"{ws.remote_address} has disconnected from our browser websocket."
8588
f" We now have {len(self._ws_clients)} active connection(s) remaining."))
8689

87-
async def _message_receive_loop(self, ws: websockets.WebSocketServerProtocol, uri: str) -> None:
90+
async def _message_receive_loop(self, ws: websockets.ServerConnection) -> None:
8891
"""
8992
Loop of waiting for and processing inbound websocket messages, until the
9093
connection dies. Each connection will create one of these coroutines.
@@ -93,9 +96,9 @@ async def _message_receive_loop(self, ws: websockets.WebSocketServerProtocol, ur
9396
try:
9497
async for message in ws:
9598
self._logger.info(
96-
f"Received inbound message from browser extension. Message: {message}")
99+
f"Received inbound message from browser extension. Message: {str(message)}")
97100
await self._process_inbound_message(message)
98-
except:
101+
except Exception:
99102
self._logger.exception(
100103
"BrowserWebsocketServer encountered an exception while waiting for inbound messages.")
101104
finally:
@@ -105,24 +108,24 @@ async def _message_receive_loop(self, ws: websockets.WebSocketServerProtocol, ur
105108
for handler in self._handlers:
106109
try:
107110
await handler.on_all_browsers_disconnected()
108-
except:
111+
except Exception:
109112
self._logger.exception(
110113
"Connection mananger received an exception from EventHandler!")
111114

112-
async def _process_inbound_message(self, message: str) -> None:
115+
async def _process_inbound_message(self, message: str | bytes) -> None:
113116
"""
114117
Process one individual inbound websocket message.
115118
"""
116119
try:
117120
parsed_event = json.loads(message)
118-
except:
121+
except Exception:
119122
self._logger.exception(
120-
f"Failed to parse browser websocket message as JSON. Message: {message}")
123+
f"Failed to parse browser websocket message as JSON. Message: {str(message)}")
121124
return
122125

123126
for handler in self._handlers:
124127
try:
125128
await handler.on_browser_event(parsed_event)
126-
except:
129+
except Exception:
127130
self._logger.exception(
128131
"Connection mananger received an exception from EventHandler!")

streamdeck-plugin/src/event_handlers/base_event_handler.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
import json
22
import logging
3+
from typing import TYPE_CHECKING
4+
5+
if TYPE_CHECKING:
6+
from browser_websocket_server import BrowserWebsocketServer
7+
from stream_deck_client import StreamDeckWebsocketClient
38

49

510
class EventHandler:
@@ -20,7 +25,7 @@ class EventHandler:
2025
"""
2126
STREAM_DECK_ACTION = "(invalid)"
2227
# If set to an action prefix string, allows matching a family of actions sharing a prefix.
23-
STREAM_DECK_ACTION_PREFIX = None
28+
STREAM_DECK_ACTION_PREFIX: str | None = None
2429

2530
def __init__(self, stream_deck: "StreamDeckWebsocketClient", browser_manager: "BrowserWebsocketServer") -> None:
2631
self._logger = logging.getLogger(__name__)

streamdeck-plugin/src/event_handlers/base_toggle_event_handler.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
import asyncio
22
from enum import Enum
33
import json
4-
from typing import List
4+
from typing import List, TYPE_CHECKING
55

66
from event_handlers.base_event_handler import EventHandler
77

8+
if TYPE_CHECKING:
9+
from browser_websocket_server import BrowserWebsocketServer
10+
from stream_deck_client import StreamDeckWebsocketClient
11+
812

913
class SDToggleState(Enum):
1014
"""

streamdeck-plugin/src/event_handlers/open_meet_event_handler.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import asyncio
21
import json
32
from event_handlers.base_event_handler import EventHandler
43

streamdeck-plugin/src/main.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,12 @@ def register_handlers(
9292

9393
register_handlers(stream_deck_client, browser_manager)
9494

95-
loop = asyncio.get_event_loop()
96-
loop.run_until_complete(browser_manager.start(
97-
hostname="127.0.0.1", port=BROWSER_WEBSOCKET_PORT))
98-
loop.run_until_complete(stream_deck_client.start(
99-
port=args.port, register_event=args.register_event, plugin_uuid=args.plugin_uuid))
95+
browser_manager_loop = browser_manager.start(
96+
hostname="127.0.0.1", port=BROWSER_WEBSOCKET_PORT)
97+
stream_deck_loop = stream_deck_client.start(
98+
port=args.port, register_event=args.register_event, plugin_uuid=args.plugin_uuid)
99+
100+
async def websocket_loop():
101+
await asyncio.gather(browser_manager_loop, stream_deck_loop)
102+
103+
asyncio.run(websocket_loop())

streamdeck-plugin/src/stream_deck_client.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
import json
22
import logging
3-
from typing import List
3+
from typing import List, TYPE_CHECKING
44
import websockets
55

6+
if TYPE_CHECKING:
7+
from event_handlers.base_event_handler import EventHandler
8+
69

710
class StreamDeckWebsocketClient:
811
"""
@@ -26,7 +29,7 @@ def __init__(self):
2629
"""
2730
Our socket to the Stream Deck desktop software.
2831
"""
29-
self._websocket: "WebSocketClientProtocol" = None
32+
self._websocket: websockets.ClientConnection | None = None
3033

3134
async def start(self, port: int, register_event: str, plugin_uuid: str) -> None:
3235
uri = f"ws://127.0.0.1:{port}"
@@ -64,23 +67,23 @@ async def send_outbound_message(self, message: str) -> None:
6467
f"Sending outbound message to Stream Deck. Message: {message}")
6568
await self._websocket.send(message)
6669

67-
async def _message_receive_loop(self, websocket: websockets.WebSocketClientProtocol) -> None:
70+
async def _message_receive_loop(self, websocket: websockets.ClientConnection) -> None:
6871
"""
6972
Loop of waiting for and processing inbound websocket messages, until the
7073
connection dies.
7174
"""
7275
async for message in websocket:
7376
self._logger.info(
74-
f"Received inbound message from Stream Deck: {message}")
77+
f"Received inbound message from Stream Deck: {str(message)}")
7578
await self._process_inbound_message(message)
7679

77-
async def _process_inbound_message(self, message: str) -> None:
80+
async def _process_inbound_message(self, message: str | bytes) -> None:
7881
"""
7982
Process one individual inbound websocket message.
8083
"""
8184
try:
8285
parsed_event = json.loads(message)
83-
except:
86+
except Exception:
8487
"""
8588
If we're receiving invalid data from the Stream Deck app, our socket
8689
is in a questionable state... Let the error propagate. If the plugin
@@ -93,6 +96,6 @@ async def _process_inbound_message(self, message: str) -> None:
9396
for handler in self._handlers:
9497
try:
9598
await handler.on_stream_deck_event(parsed_event)
96-
except:
99+
except Exception:
97100
self._logger.exception(
98101
"StreamDeckWebsocketClient received an exception from EventHandler!")

streamdeck-plugin/tests/test_browser_websocket_server.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ async def test_socket_registration(self):
4242
server._register_client = MagicMock()
4343
server._unregister_client = AsyncMock()
4444

45-
await server._message_receive_loop(mock_websocket, "testUri")
45+
await server._message_receive_loop(mock_websocket)
4646

4747
server._register_client.assert_called_with(mock_websocket)
4848
server._unregister_client.assert_called_with(mock_websocket)
@@ -56,7 +56,7 @@ async def test_sockets_gracefully_closed(self):
5656
mock_websocket = AsyncMock()
5757
server._ws_clients = set([mock_websocket])
5858

59-
await server._message_receive_loop(mock_websocket, "testUri")
59+
await server._message_receive_loop(mock_websocket)
6060

6161
mock_websocket.close.assert_called_once()
6262

@@ -70,7 +70,7 @@ async def test_browser_disconnected_callback_called(self):
7070
server.register_event_handler(event_handler)
7171
mock_websocket = AsyncMock()
7272

73-
await server._message_receive_loop(mock_websocket, "testUri")
73+
await server._message_receive_loop(mock_websocket)
7474

7575
event_handler.on_all_browsers_disconnected.assert_called_with()
7676

@@ -86,7 +86,7 @@ async def test_browser_disconnected_callback_not_called(self):
8686
server.register_event_handler(event_handler)
8787
server._register_client(mock_websocket_1)
8888

89-
await server._message_receive_loop(mock_websocket_2, "testUri")
89+
await server._message_receive_loop(mock_websocket_2)
9090

9191
event_handler.on_all_browsers_disconnected.assert_not_called()
9292

@@ -99,7 +99,7 @@ async def test_socket_messages_read(self):
9999
mock_websocket.__aiter__.return_value = ["m1", "m2"]
100100
server._process_inbound_message = AsyncMock()
101101

102-
await server._message_receive_loop(mock_websocket, "testUri")
102+
await server._message_receive_loop(mock_websocket)
103103

104104
mock_websocket.__aiter__.assert_called_with()
105105
server._process_inbound_message.assert_has_calls(

0 commit comments

Comments
 (0)