diff options
| author | Lukas Senionis <warliukz@gmail.com> | 2026-07-14 05:02:13 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-07-13 22:02:13 -0400 |
| commit | 91abff7811c6db3a80c9426c0c9a0a247a3ada37 (patch) | |
| tree | ee5f4899214d6b1f618764f151385761421a8829 /backend/decky_loader/plugin | |
| parent | 69475d9a0fbd4cb4a4e1fb257dff13385f2827a7 (diff) | |
| download | decky-loader-91abff7811c6db3a80c9426c0c9a0a247a3ada37.tar.gz decky-loader-91abff7811c6db3a80c9426c0c9a0a247a3ada37.zip | |
fix(wsrouter): ensure no message reply is lost (#906)
Diffstat (limited to 'backend/decky_loader/plugin')
| -rw-r--r-- | backend/decky_loader/plugin/messages.py | 11 | ||||
| -rw-r--r-- | backend/decky_loader/plugin/plugin.py | 6 |
2 files changed, 16 insertions, 1 deletions
diff --git a/backend/decky_loader/plugin/messages.py b/backend/decky_loader/plugin/messages.py index d53efbee..8e9bdf7a 100644 --- a/backend/decky_loader/plugin/messages.py +++ b/backend/decky_loader/plugin/messages.py @@ -19,18 +19,27 @@ class MethodCallResponse: self.success = success self.result = result +class PluginStopped(Exception): + pass + class MethodCallRequest: def __init__(self) -> None: self.id = str(uuid4()) self.event = Event() - self.response: MethodCallResponse + self.response: MethodCallResponse | PluginStopped def set_result(self, dc: SocketResponseDict): self.response = MethodCallResponse(dc["success"], dc["res"]) self.event.set() + + def cancel(self): + self.response = PluginStopped("Plugin has been stopped") + self.event.set() async def wait_for_result(self): await self.event.wait() + if isinstance(self.response, PluginStopped): + raise self.response if not self.response.success: raise Exception(self.response.result) return self.response.result
\ No newline at end of file diff --git a/backend/decky_loader/plugin/plugin.py b/backend/decky_loader/plugin/plugin.py index a7edaa45..8648a5d6 100644 --- a/backend/decky_loader/plugin/plugin.py +++ b/backend/decky_loader/plugin/plugin.py @@ -94,6 +94,12 @@ class PluginWrapper: except CancelledError: self.log.info(f"Stopping response listener for {self.name}") await self._socket.close_socket_connection() + + # Cancel the request so that WSRouter can perform cleanup + for request in self._method_call_requests.values(): + request.cancel() + + self._method_call_requests = {} raise except: pass |
