summaryrefslogtreecommitdiff
path: root/backend/utilities.py
diff options
context:
space:
mode:
authorAAGaming <aa@mail.catvibers.me>2022-10-15 23:46:42 -0400
committerGitHub <noreply@github.com>2022-10-15 20:46:42 -0700
commit6e3c05072cb507e2a376b7019836bea7bf663cb0 (patch)
tree6171eb40ba1a76e1e2b24f8cac8545114a5ad4ef /backend/utilities.py
parent9b405e4bdc6ead86d69ad8f54af89a8d5b484f08 (diff)
downloaddecky-loader-6e3c05072cb507e2a376b7019836bea7bf663cb0.tar.gz
decky-loader-6e3c05072cb507e2a376b7019836bea7bf663cb0.zip
Developer menu (#211)v2.3.0-pre1
* add settings utils to use settings outside of components * initial implementation of developer menu * ✨ Add support for addScriptToEvaluateOnNewDocument * React DevTools support * increase chance of RDT successfully injecting * Rewrite toaster hook to not re-create the window * remove friends focus workaround because it's fixed * Expose various DFL utilities as DFL in dev mode * try to fix text field focuss * move focusable to outside field * add onTouchEnd and onClick to focusable * Update pnpm-lock.yaml Co-authored-by: FinalDoom <7464170-FinalDoom@users.noreply.gitlab.com> Co-authored-by: TrainDoctor <traindoctor@protonmail.com>
Diffstat (limited to 'backend/utilities.py')
-rw-r--r--backend/utilities.py73
1 files changed, 71 insertions, 2 deletions
diff --git a/backend/utilities.py b/backend/utilities.py
index 853f60d2..8d899c0d 100644
--- a/backend/utilities.py
+++ b/backend/utilities.py
@@ -1,10 +1,13 @@
import uuid
import os
from json.decoder import JSONDecodeError
+from traceback import format_exc
+from asyncio import sleep, start_server, gather, open_connection
from aiohttp import ClientSession, web
-from injector import inject_to_tab
+from logging import getLogger
+from injector import inject_to_tab, get_tab
import helpers
import subprocess
@@ -26,9 +29,17 @@ class Utilities:
"disallow_remote_debugging": self.disallow_remote_debugging,
"set_setting": self.set_setting,
"get_setting": self.get_setting,
- "filepicker_ls": self.filepicker_ls
+ "filepicker_ls": self.filepicker_ls,
+ "disable_rdt": self.disable_rdt,
+ "enable_rdt": self.enable_rdt
}
+ self.logger = getLogger("Utilities")
+
+ self.rdt_proxy_server = None
+ self.rdt_script_id = None
+ self.rdt_proxy_task = None
+
if context:
context.web_app.add_routes([
web.post("/methods/{method_name}", self._handle_server_method_call)
@@ -194,3 +205,61 @@ class Utilities:
"realpath": os.path.realpath(path),
"files": files
}
+
+ # Based on https://stackoverflow.com/a/46422554/13174603
+ def start_rdt_proxy(self, ip, port):
+ async def pipe(reader, writer):
+ try:
+ while not reader.at_eof():
+ writer.write(await reader.read(2048))
+ finally:
+ writer.close()
+ async def handle_client(local_reader, local_writer):
+ try:
+ remote_reader, remote_writer = await open_connection(
+ ip, port)
+ pipe1 = pipe(local_reader, remote_writer)
+ pipe2 = pipe(remote_reader, local_writer)
+ await gather(pipe1, pipe2)
+ finally:
+ local_writer.close()
+
+ self.rdt_proxy_server = start_server(handle_client, "127.0.0.1", port)
+ self.rdt_proxy_task = self.context.loop.create_task(self.rdt_proxy_server)
+
+ def stop_rdt_proxy(self):
+ if self.rdt_proxy_server:
+ self.rdt_proxy_server.close()
+ self.rdt_proxy_task.cancel()
+
+ async def enable_rdt(self):
+ # TODO un-hardcode port
+ try:
+ self.stop_rdt_proxy()
+ ip = self.context.settings.getSetting("developer.rdt.ip", None)
+
+ if ip != None:
+ self.logger.info("Connecting to React DevTools at " + ip)
+ async with ClientSession() as web:
+ async with web.request("GET", "http://" + ip + ":8097", ssl=helpers.get_ssl_context()) as res:
+ if res.status != 200:
+ self.logger.error("Failed to connect to React DevTools at " + ip)
+ return False
+ self.start_rdt_proxy(ip, 8097)
+ script = "if(!window.deckyHasConnectedRDT){window.deckyHasConnectedRDT=true;\n" + await res.text() + "\n}"
+ self.logger.info("Connected to React DevTools, loading script")
+ tab = await get_tab("SP")
+ # RDT needs to load before React itself to work.
+ result = await tab.reload_and_evaluate(script)
+ self.logger.info(result)
+
+ except Exception:
+ self.logger.error("Failed to connect to React DevTools")
+ self.logger.error(format_exc())
+
+ async def disable_rdt(self):
+ self.logger.info("Disabling React DevTools")
+ tab = await get_tab("SP")
+ self.rdt_script_id = None
+ await tab.evaluate_js("location.reload();", False, True, False)
+ self.logger.info("React DevTools disabled")