[Global] Preliminary debug ws implementation
This commit is contained in:
parent
b4f5bdc996
commit
daf0357d60
6 changed files with 117 additions and 6 deletions
|
@ -14,6 +14,7 @@
|
||||||
"author": "Beef",
|
"author": "Beef",
|
||||||
"license": "BSD-3-Clause",
|
"license": "BSD-3-Clause",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@react-native-async-storage/async-storage": "^1.17.10",
|
||||||
"@types/react": "^18.0.21",
|
"@types/react": "^18.0.21",
|
||||||
"@types/react-native": "^0.70.5",
|
"@types/react-native": "^0.70.5",
|
||||||
"esbuild": "^0.15.11",
|
"esbuild": "^0.15.11",
|
||||||
|
@ -23,7 +24,8 @@
|
||||||
"zustand": "^4.1.2"
|
"zustand": "^4.1.2"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"spitroast": "^1.4.2"
|
"spitroast": "^1.4.2",
|
||||||
|
"valtio": "^1.7.4"
|
||||||
},
|
},
|
||||||
"pnpm": {
|
"pnpm": {
|
||||||
"peerDependencyRules": {
|
"peerDependencyRules": {
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
lockfileVersion: 5.4
|
lockfileVersion: 5.4
|
||||||
|
|
||||||
specifiers:
|
specifiers:
|
||||||
|
'@react-native-async-storage/async-storage': ^1.17.10
|
||||||
'@types/react': ^18.0.21
|
'@types/react': ^18.0.21
|
||||||
'@types/react-native': ^0.70.5
|
'@types/react-native': ^0.70.5
|
||||||
esbuild: ^0.15.11
|
esbuild: ^0.15.11
|
||||||
|
@ -8,12 +9,15 @@ specifiers:
|
||||||
redux: ^4.2.0
|
redux: ^4.2.0
|
||||||
spitroast: ^1.4.2
|
spitroast: ^1.4.2
|
||||||
typescript: ^4.8.4
|
typescript: ^4.8.4
|
||||||
|
valtio: ^1.7.4
|
||||||
zustand: ^4.1.2
|
zustand: ^4.1.2
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
spitroast: 1.4.2
|
spitroast: 1.4.2
|
||||||
|
valtio: 1.7.4
|
||||||
|
|
||||||
devDependencies:
|
devDependencies:
|
||||||
|
'@react-native-async-storage/async-storage': 1.17.10
|
||||||
'@types/react': 18.0.21
|
'@types/react': 18.0.21
|
||||||
'@types/react-native': 0.70.5
|
'@types/react-native': 0.70.5
|
||||||
esbuild: 0.15.11
|
esbuild: 0.15.11
|
||||||
|
@ -49,6 +53,17 @@ packages:
|
||||||
dev: true
|
dev: true
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
|
/@react-native-async-storage/async-storage/1.17.10:
|
||||||
|
resolution: {integrity: sha512-KrR021BmBLsA0TT1AAsfH16bHYy0MSbhdAeBAqpriak3GS1T2alFcdTUvn13p0ZW6FKRD6Bd3ryU2zhU/IYYJQ==}
|
||||||
|
peerDependencies:
|
||||||
|
react-native: ^0.0.0-0 || 0.60 - 0.70 || 1000.0.0
|
||||||
|
peerDependenciesMeta:
|
||||||
|
react-native:
|
||||||
|
optional: true
|
||||||
|
dependencies:
|
||||||
|
merge-options: 3.0.4
|
||||||
|
dev: true
|
||||||
|
|
||||||
/@types/prop-types/15.7.5:
|
/@types/prop-types/15.7.5:
|
||||||
resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==}
|
resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==}
|
||||||
dev: true
|
dev: true
|
||||||
|
@ -289,6 +304,22 @@ packages:
|
||||||
esbuild-windows-arm64: 0.15.11
|
esbuild-windows-arm64: 0.15.11
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/is-plain-obj/2.1.0:
|
||||||
|
resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==}
|
||||||
|
engines: {node: '>=8'}
|
||||||
|
dev: true
|
||||||
|
|
||||||
|
/merge-options/3.0.4:
|
||||||
|
resolution: {integrity: sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==}
|
||||||
|
engines: {node: '>=10'}
|
||||||
|
dependencies:
|
||||||
|
is-plain-obj: 2.1.0
|
||||||
|
dev: true
|
||||||
|
|
||||||
|
/proxy-compare/2.3.0:
|
||||||
|
resolution: {integrity: sha512-c3L2CcAi7f7pvlD0D7xsF+2CQIW8C3HaYx2Pfgq8eA4HAl3GAH6/dVYsyBbYF/0XJs2ziGLrzmz5fmzPm6A0pQ==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/redux/4.2.0:
|
/redux/4.2.0:
|
||||||
resolution: {integrity: sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA==}
|
resolution: {integrity: sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA==}
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -316,7 +347,34 @@ packages:
|
||||||
peerDependenciesMeta:
|
peerDependenciesMeta:
|
||||||
react:
|
react:
|
||||||
optional: true
|
optional: true
|
||||||
dev: true
|
|
||||||
|
/valtio/1.7.4:
|
||||||
|
resolution: {integrity: sha512-x8N7I7hfIlRHQyRe8cx3QJsEYdzMHb12HYUGIDjPruEwLrMpegvS8iZDk4PZ/i8HgeiOPF7Qr78Ke3HA1CGu9A==}
|
||||||
|
engines: {node: '>=12.7.0'}
|
||||||
|
peerDependencies:
|
||||||
|
'@babel/helper-module-imports': '>=7.12'
|
||||||
|
'@babel/types': '>=7.13'
|
||||||
|
aslemammad-vite-plugin-macro: '>=1.0.0-alpha.1'
|
||||||
|
babel-plugin-macros: '>=3.0'
|
||||||
|
react: '>=16.8'
|
||||||
|
vite: '>=2.8.6'
|
||||||
|
peerDependenciesMeta:
|
||||||
|
'@babel/helper-module-imports':
|
||||||
|
optional: true
|
||||||
|
'@babel/types':
|
||||||
|
optional: true
|
||||||
|
aslemammad-vite-plugin-macro:
|
||||||
|
optional: true
|
||||||
|
babel-plugin-macros:
|
||||||
|
optional: true
|
||||||
|
react:
|
||||||
|
optional: true
|
||||||
|
vite:
|
||||||
|
optional: true
|
||||||
|
dependencies:
|
||||||
|
proxy-compare: 2.3.0
|
||||||
|
use-sync-external-store: 1.2.0
|
||||||
|
dev: false
|
||||||
|
|
||||||
/zustand/4.1.2:
|
/zustand/4.1.2:
|
||||||
resolution: {integrity: sha512-gcRaKchcxFPbImrBb/BKgujOhHhik9YhVpIeP87ETT7uokEe2Szu7KkuZ9ghjtD+/KKkcrRNktR2AiLXPIbKIQ==}
|
resolution: {integrity: sha512-gcRaKchcxFPbImrBb/BKgujOhHhik9YhVpIeP87ETT7uokEe2Szu7KkuZ9ghjtD+/KKkcrRNktR2AiLXPIbKIQ==}
|
||||||
|
|
|
@ -3,12 +3,14 @@ import logger from "@lib/logger";
|
||||||
import * as metro from "@metro/filters";
|
import * as metro from "@metro/filters";
|
||||||
import * as common from "@metro/common";
|
import * as common from "@metro/common";
|
||||||
import initSettings from "./ui/settings";
|
import initSettings from "./ui/settings";
|
||||||
|
import { patchLogHook } from "./lib/debug";
|
||||||
|
|
||||||
console.log("Hello from Vendetta!");
|
console.log("Hello from Vendetta!");
|
||||||
let erroredOnLoad = false;
|
let erroredOnLoad = false;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
initSettings();
|
initSettings();
|
||||||
|
patchLogHook();
|
||||||
|
|
||||||
window.vendetta = {
|
window.vendetta = {
|
||||||
patcher: patcher,
|
patcher: patcher,
|
||||||
|
|
31
src/lib/debug.ts
Normal file
31
src/lib/debug.ts
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
import { after } from "spitroast";
|
||||||
|
import logger from "./logger";
|
||||||
|
export let socket: WebSocket;
|
||||||
|
|
||||||
|
let iLoveBundlers = eval;
|
||||||
|
|
||||||
|
export function connectToDebugWS(url: string) {
|
||||||
|
if (socket !== undefined && socket.readyState !== WebSocket.CLOSED) {
|
||||||
|
socket.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
socket = new WebSocket(`ws://${url}`);
|
||||||
|
|
||||||
|
socket.addEventListener("message", (message: any) => {
|
||||||
|
try {
|
||||||
|
console.log(iLoveBundlers(message.data));
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export function patchLogHook() {
|
||||||
|
after("nativeLoggingHook", globalThis, (args, ret) => {
|
||||||
|
if (socket?.readyState === WebSocket.OPEN) {
|
||||||
|
socket.send(JSON.stringify({ message: args[0], level: args[1] }));
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.log(args[0]);
|
||||||
|
});
|
||||||
|
}
|
|
@ -8,3 +8,6 @@ export const i18n = findByProps("Messages");
|
||||||
// React
|
// React
|
||||||
export const React = findByProps("createElement") as typeof import("react");
|
export const React = findByProps("createElement") as typeof import("react");
|
||||||
export const ReactNative = findByProps("Text", "Image") as typeof import("react-native");
|
export const ReactNative = findByProps("Text", "Image") as typeof import("react-native");
|
||||||
|
|
||||||
|
// AsyncStorage
|
||||||
|
export const AsyncStorage = findByProps("setItem") as typeof import("@react-native-async-storage/async-storage").default;
|
|
@ -1,12 +1,15 @@
|
||||||
import { React, ReactNative as RN } from "@metro/common";
|
import { connectToDebugWS } from "@/lib/debug";
|
||||||
|
import { AsyncStorage, React, ReactNative as RN } from "@metro/common";
|
||||||
import { Forms } from "@ui/components";
|
import { Forms } from "@ui/components";
|
||||||
import Version from "./Version";
|
import Version from "./Version";
|
||||||
|
|
||||||
const { FormRow, FormSection } = Forms;
|
const { FormRow, FormSection, FormInput } = Forms;
|
||||||
const hermesProps = window.HermesInternal.getRuntimeProperties();
|
const hermesProps = window.HermesInternal.getRuntimeProperties();
|
||||||
const rnVer = RN.Platform.constants.reactNativeVersion;
|
const rnVer = RN.Platform.constants.reactNativeVersion;
|
||||||
|
|
||||||
export default function Settings() {
|
export default function Settings() {
|
||||||
|
const [debuggerUrl, setDebuggerUrl] = React.useState("");
|
||||||
|
|
||||||
const versions = [
|
const versions = [
|
||||||
{
|
{
|
||||||
label: "Discord",
|
label: "Discord",
|
||||||
|
@ -33,12 +36,24 @@ export default function Settings() {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{/* Why is there still a divider? */}
|
{/* Why is there still a divider? */}
|
||||||
<FormSection title="Actions" android_noDivider>
|
<FormSection title="Debug" android_noDivider>
|
||||||
|
<FormInput
|
||||||
|
value={debuggerUrl}
|
||||||
|
onChange={(v: string) => setDebuggerUrl(v)}
|
||||||
|
title="DEBUGGER URL"
|
||||||
|
/>
|
||||||
|
</FormSection>
|
||||||
|
<FormSection title="Actions">
|
||||||
<FormRow
|
<FormRow
|
||||||
label="Reload Discord"
|
label="Reload Discord"
|
||||||
trailing={FormRow.Arrow}
|
trailing={FormRow.Arrow}
|
||||||
onPress={() => RN.NativeModules.BundleUpdaterManager.reload()}
|
onPress={() => RN.NativeModules.BundleUpdaterManager.reload()}
|
||||||
/>
|
/>
|
||||||
|
<FormRow
|
||||||
|
label="Connect to debug websocket"
|
||||||
|
trailing={FormRow.Arrow}
|
||||||
|
onPress={() => connectToDebugWS(debuggerUrl)}
|
||||||
|
/>
|
||||||
</FormSection>
|
</FormSection>
|
||||||
<FormSection title="Versions">
|
<FormSection title="Versions">
|
||||||
{versions.map((v) => <Version label={v.label} version={v.version} /> )}
|
{versions.map((v) => <Version label={v.label} version={v.version} /> )}
|
||||||
|
|
Loading…
Reference in a new issue