mirror of
https://github.com/SteamDeckHomebrew/decky-loader.git
synced 2026-07-11 21:11:58 +00:00
make frontend -> backend errors actually work
This commit is contained in:
@@ -282,3 +282,4 @@ class Updater:
|
|||||||
await self.download_decky_binary(down_link, f'PR-{pr_id}' , True)
|
await self.download_decky_binary(down_link, f'PR-{pr_id}' , True)
|
||||||
else:
|
else:
|
||||||
logger.error("workflow run not found", str(works))
|
logger.error("workflow run not found", str(works))
|
||||||
|
raise Exception("Workflow run not found.")
|
||||||
|
|||||||
@@ -60,7 +60,13 @@ class WSRouter:
|
|||||||
|
|
||||||
async def _call_route(self, route: str, args: ..., call_id: int):
|
async def _call_route(self, route: str, args: ..., call_id: int):
|
||||||
instance_id = self.instance_id
|
instance_id = self.instance_id
|
||||||
|
error = None
|
||||||
|
try:
|
||||||
res = await self.routes[route](*args)
|
res = await self.routes[route](*args)
|
||||||
|
except Exception as err:
|
||||||
|
error = {"name":err.__class__.__name__, "message":str(err), "traceback":format_exc()}
|
||||||
|
res = None
|
||||||
|
|
||||||
if instance_id != self.instance_id:
|
if instance_id != self.instance_id:
|
||||||
try:
|
try:
|
||||||
self.logger.warn("Ignoring %s reply from stale instance %d with args %s and response %s", route, instance_id, args, res)
|
self.logger.warn("Ignoring %s reply from stale instance %d with args %s and response %s", route, instance_id, args, res)
|
||||||
@@ -68,6 +74,10 @@ class WSRouter:
|
|||||||
self.logger.warn("Ignoring %s reply from stale instance %d (failed to log event data)", route, instance_id)
|
self.logger.warn("Ignoring %s reply from stale instance %d (failed to log event data)", route, instance_id)
|
||||||
finally:
|
finally:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
if error:
|
||||||
|
await self.write({"type": MessageType.ERROR.value, "id": call_id, "error": error})
|
||||||
|
else:
|
||||||
await self.write({"type": MessageType.REPLY.value, "id": call_id, "result": res})
|
await self.write({"type": MessageType.REPLY.value, "id": call_id, "result": res})
|
||||||
|
|
||||||
async def handle(self, request: Request):
|
async def handle(self, request: Request):
|
||||||
@@ -103,14 +113,12 @@ class WSRouter:
|
|||||||
case MessageType.CALL.value:
|
case MessageType.CALL.value:
|
||||||
# do stuff with the message
|
# do stuff with the message
|
||||||
if data["route"] in self.routes:
|
if data["route"] in self.routes:
|
||||||
try:
|
|
||||||
self.logger.debug(f'Started PY call {data["route"]} ID {data["id"]}')
|
self.logger.debug(f'Started PY call {data["route"]} ID {data["id"]}')
|
||||||
create_task(self._call_route(data["route"], data["args"], data["id"]))
|
create_task(self._call_route(data["route"], data["args"], data["id"]))
|
||||||
except:
|
|
||||||
create_task(self.write({"type": MessageType.ERROR.value, "id": data["id"], "error": format_exc()}))
|
|
||||||
else:
|
else:
|
||||||
|
error = {"error":"Route " + data["route"] + " does not exist.", "name": "NameMeOrNoneIDK", "traceback": None}
|
||||||
# Dunno why but fstring doesnt work here
|
# Dunno why but fstring doesnt work here
|
||||||
create_task(self.write({"type": MessageType.ERROR.value, "id": data["id"], "error": "Route " + data["route"] + " does not exist."}))
|
create_task(self.write({"type": MessageType.ERROR.value, "id": data["id"], "message": error}))
|
||||||
case _:
|
case _:
|
||||||
self.logger.error("Unknown message type", data)
|
self.logger.error("Unknown message type", data)
|
||||||
finally:
|
finally:
|
||||||
|
|||||||
@@ -70,8 +70,14 @@ export default function TestingVersionList() {
|
|||||||
<Focusable style={{ height: '40px', marginLeft: 'auto', display: 'flex' }}>
|
<Focusable style={{ height: '40px', marginLeft: 'auto', display: 'flex' }}>
|
||||||
<DialogButton
|
<DialogButton
|
||||||
style={{ height: '40px', minWidth: '60px', marginRight: '10px' }}
|
style={{ height: '40px', minWidth: '60px', marginRight: '10px' }}
|
||||||
onClick={() => {
|
onClick={async () => {
|
||||||
downloadTestingVersion(version.id, version.head_sha);
|
try {
|
||||||
|
await downloadTestingVersion(version.id, version.head_sha);
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Error) {
|
||||||
|
DeckyPluginLoader.toaster.toast({ title: 'Error Installing PR', body: e.message });
|
||||||
|
}
|
||||||
|
}
|
||||||
setSetting('branch', UpdateBranch.Testing);
|
setSetting('branch', UpdateBranch.Testing);
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -30,10 +30,20 @@ interface ReplyMessage {
|
|||||||
|
|
||||||
interface ErrorMessage {
|
interface ErrorMessage {
|
||||||
type: MessageType.ERROR;
|
type: MessageType.ERROR;
|
||||||
error: any;
|
error: { name: string; message: string; traceback: string | null };
|
||||||
id: number;
|
id: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export class PyError extends Error {
|
||||||
|
pythonTraceback: string | null;
|
||||||
|
|
||||||
|
constructor(name: string, message: string, traceback: string | null) {
|
||||||
|
super(message);
|
||||||
|
this.name = `Python ${name}`;
|
||||||
|
this.pythonTraceback = traceback;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
interface EventMessage {
|
interface EventMessage {
|
||||||
type: MessageType.EVENT;
|
type: MessageType.EVENT;
|
||||||
event: string;
|
event: string;
|
||||||
@@ -45,7 +55,7 @@ type Message = CallMessage | ReplyMessage | ErrorMessage | EventMessage;
|
|||||||
// Helper to resolve a promise from the outside
|
// Helper to resolve a promise from the outside
|
||||||
interface PromiseResolver<T> {
|
interface PromiseResolver<T> {
|
||||||
resolve: (res: T) => void;
|
resolve: (res: T) => void;
|
||||||
reject: (error: string) => void;
|
reject: (error: PyError) => void;
|
||||||
promise: Promise<T>;
|
promise: Promise<T>;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -124,7 +134,8 @@ export class WSRouter extends Logger {
|
|||||||
|
|
||||||
case MessageType.ERROR:
|
case MessageType.ERROR:
|
||||||
if (this.runningCalls.has(data.id)) {
|
if (this.runningCalls.has(data.id)) {
|
||||||
this.runningCalls.get(data.id)!.reject(data.error);
|
let err = new PyError(data.error.name, data.error.message, data.error.traceback);
|
||||||
|
this.runningCalls.get(data.id)!.reject(err);
|
||||||
this.runningCalls.delete(data.id);
|
this.runningCalls.delete(data.id);
|
||||||
this.debug(`Rejected PY call ${data.id} with error`, data.error);
|
this.debug(`Rejected PY call ${data.id} with error`, data.error);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user