Files
Seewo-HugoAura/src/core/hook.js
Minoricew 807ac913da [🤯 Refactor] Use standalone window for WebSocket connections
1. [-] 删除了对于 desktopAssistant 的 Hook 逻辑
2. [/] 现在不再使用 desktopAssistant 保活 WS 连接, 而是用一个单独的不可见窗口处理 WS (#25)
2025-06-17 18:14:58 +08:00

214 lines
6.3 KiB
JavaScript
Executable File

// @ts-check
if (!global.__HUGO_AURA__) {
const __HUGO_AURA__ = {
hookedWindows: new Map(),
configInit: false,
central: () => {},
ipcInit: false,
auraDir: "",
plsStats: null,
plsSettings: null,
plsRules: null,
uiHooks: new Map(),
windowHooks: new Map(),
version: require("./preload").__AURA_VERSION__,
};
global.__HUGO_AURA__ = __HUGO_AURA__;
}
if (!global.__HUGO_AURA_API__) {
/** @type {import("../aura/types/shared/global").GlobalHugoAuraApiInfo} */
const __HUGO_AURA_API__ = {
domains: [
"https://api-aura-projekts.delta.ooo",
"https://api-aura.asaka.site",
"https://api.hugoaura.dpdns.org",
"https://api-aura-projekts.minorice.moe",
"https://api.aura.vim.moe",
],
plsUpdate: "/api/getPLSLatestVersion",
auraUpdate: "/api/getAuraLatestVersion",
};
global.__HUGO_AURA_API__ = __HUGO_AURA_API__;
}
if (!global.__HUGO_AURA_CONFIG__) {
global.__HUGO_AURA_CONFIG__ = {};
}
const path = require("path");
const os = require("os");
const MainProcessHooksManager = require("../aura/init/main/windowHooksManager");
const RendererHooksManager = require("../aura/init/rendererHook/uiHooksManager");
const EventBus = require("../aura/utils/eventBus");
const NetworkHook = require("../aura/init/rendererHook/networkHook");
const ConfigManager = require("../aura/init/shared/configManager");
const RegistryManager = require("../aura/init/shared/registryManager");
const { buildIpcMain } = require("../aura/init/main/ipcHandler");
const plsUtils = require("../aura/utils/pls");
const { initLogger } = require("../aura/init/main/logger");
const getUserDocumentsDirPath = () => {
const registryManager = new RegistryManager();
const pathInfo = registryManager.readRegKeySync(
'"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders"',
"Personal",
false,
true,
/REG_EXPAND_SZ\s+(.+)/
);
if (pathInfo.success && pathInfo.data) {
const resolvedPath = pathInfo.data.replace(
/%([^%]+)%/g,
(match, varName) => {
return process.env[varName] || match;
}
);
return resolvedPath;
} else {
console.error(
"[HugoAura / Init / Logger] Failed to get the path of documents dir, using default val."
);
return path.join(os.homedir(), "Documents");
}
};
/**
*
* @param {import("../aura/types/main/core").LauncherArgs} param0
* @returns
*/
const launcher = ({ central, windowName, config }) => {
// >>> Init STD <<< //
process.stdout.isTTY = true;
process.stderr.isTTY = true;
// >>> Basic Config <<< //
/** @type {Electron} */
const electron = central(1);
const app = electron.app;
if (!global.__HUGO_AURA__.central) global.__HUGO_AURA__.central = central;
global.reloadApp = () => {
app.relaunch({ args: process.argv.slice(1).concat(["--inspect 5858"]) });
app.exit(0);
};
global.__HUGO_AURA__.auraDir = path.join(
getUserDocumentsDirPath(),
"HugoAura"
);
// >>> Init Logger <<< //
initLogger(windowName);
console.log("[HugoAura / Loaded] Aura is loaded!");
console.debug(`[HugoAura / Debug] curWindowName: ${windowName}`);
// >>> Init EventBus <<< //
if (!global.__HUGO_AURA_EVENT_BUS__)
global.__HUGO_AURA_EVENT_BUS__ = new EventBus();
// >>> Init Config <<< //
const configManager = new ConfigManager();
configManager.side = "main";
configManager.migrateOldConfigFile();
configManager.ensureConfigExists();
const loadedConfig = configManager.loadConfig();
if (!global.__HUGO_AURA__.configInit) global.__HUGO_AURA__.configInit = true;
if (!global.__HUGO_AURA_CONFIG_MGR__)
global.__HUGO_AURA_CONFIG_MGR__ = configManager;
global.__HUGO_AURA_CONFIG__ = loadedConfig;
global.__HUGO_AURA_EVENT_BUS__.on("$aura.config.refreshConfig", () => {
global.__HUGO_AURA_CONFIG__ = configManager.loadConfig();
});
// >>> Init IPC Main <<< //
if (!global.__HUGO_AURA__.ipcInit) {
buildIpcMain(electron);
global.__HUGO_AURA__.ipcInit = true;
}
// >>> Init Main Process Hooks <<< //
const mainProcessHooksManager = new MainProcessHooksManager();
const _windowHooks = mainProcessHooksManager.loadHooks();
// >>> Init Renderer Process Hooks <<< //
const uiHooksManager = new RendererHooksManager();
const uiHooks = uiHooksManager.loadHooks();
// >>> Activate DevTools <<< //
if (loadedConfig.devTools && !config.canOpenDevTool) {
config.canOpenDevTool = true;
}
// >>> Create WebSocket KeepAlive Window <<< //
if (!global.__HUGO_AURA__.hookedWindows?.has("auraWsKeepAlive")) {
const wsKaWin = plsUtils.createWsWindow(electron);
// @ts-expect-error
global.__HUGO_AURA__.hookedWindows.set("auraWsKeepAlive", wsKaWin);
}
// >>> Listeners <<< //
/**
*
* @param {any} _event
* @param {import("electron").BrowserWindow} browserWindow
*/
const browserWindowCreatedListener = (_event, browserWindow) => {
mainProcessHooksManager.initHookForWindow(
windowName,
central,
app,
browserWindow
);
};
/**
*
* @param {any} _event
* @param {import("electron").WebContents} webContents
*/
const webContentsCreatedListener = (_event, webContents) => {
const hookConfig = uiHooks.get(windowName.split("_")[0]);
const initNetworkHook = () => {
const networkHook = new NetworkHook();
networkHook.installHook(webContents.session, loadedConfig);
console.debug(
`[HugoAura / Init / Done / NetworkHook] Network Hook for ${windowName} installed.`
);
};
initNetworkHook();
if (hookConfig) {
uiHooksManager.handleWindowHook(webContents, hookConfig, windowName);
} else {
console.log(
`[HugoAura / Init / RDH] Window ${windowName} has no corresponding ui hooks, ignoring...`
);
}
};
app.once("browser-window-created", browserWindowCreatedListener);
app.once("web-contents-created", webContentsCreatedListener);
return () => {
app.removeListener("browser-window-created", browserWindowCreatedListener);
app.removeListener("web-contents-created", webContentsCreatedListener);
};
};
module.exports = launcher;