diff options
| author | AAGaming <aa@mail.catvibers.me> | 2022-10-15 23:46:42 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-10-15 20:46:42 -0700 |
| commit | 6e3c05072cb507e2a376b7019836bea7bf663cb0 (patch) | |
| tree | 6171eb40ba1a76e1e2b24f8cac8545114a5ad4ef /backend/utilities.py | |
| parent | 9b405e4bdc6ead86d69ad8f54af89a8d5b484f08 (diff) | |
| download | decky-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.py | 73 |
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") |
