summaryrefslogtreecommitdiff
path: root/backend/decky_loader/plugin
diff options
context:
space:
mode:
authorLukas Senionis <warliukz@gmail.com>2026-07-14 05:02:13 +0300
committerGitHub <noreply@github.com>2026-07-13 22:02:13 -0400
commit91abff7811c6db3a80c9426c0c9a0a247a3ada37 (patch)
treeee5f4899214d6b1f618764f151385761421a8829 /backend/decky_loader/plugin
parent69475d9a0fbd4cb4a4e1fb257dff13385f2827a7 (diff)
downloaddecky-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.py11
-rw-r--r--backend/decky_loader/plugin/plugin.py6
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