From 3719cecd3d77382c31642d09497030579e54c56e Mon Sep 17 00:00:00 2001 From: NotNite Date: Tue, 28 Jan 2025 13:00:54 -0500 Subject: [PATCH] Add events to node-preload --- packages/browser/src/index.ts | 4 ++++ packages/core/src/extension/loader.ts | 10 +++++----- packages/core/src/patch.ts | 6 +++--- packages/node-preload/src/index.ts | 4 ++++ packages/types/src/core/event.ts | 17 +++++++++++++---- packages/types/src/globals.ts | 11 +++++++++-- packages/web-preload/src/index.ts | 4 ++-- 7 files changed, 40 insertions(+), 16 deletions(-) diff --git a/packages/browser/src/index.ts b/packages/browser/src/index.ts index 9511138e..78e9c4c1 100644 --- a/packages/browser/src/index.ts +++ b/packages/browser/src/index.ts @@ -8,6 +8,8 @@ import { getConfig, getConfigOption, getManifest, setConfigOption } from "@moonl import { IndexedDB } from "@zenfs/dom"; import { configureSingle } from "@zenfs/core"; import * as fs from "@zenfs/core/promises"; +import { NodeEventPayloads, NodeEventType } from "@moonlight-mod/types/core/event"; +import { createEventEmitter } from "@moonlight-mod/core/util/event"; function getParts(path: string) { if (path.startsWith("/")) path = path.substring(1); @@ -110,6 +112,7 @@ window._moonlightBrowserInit = async () => { processedExtensions, nativesCache: {}, isBrowser: true, + events: createEventEmitter(), version: MOONLIGHT_VERSION, branch: MOONLIGHT_BRANCH as MoonlightBranch, @@ -141,6 +144,7 @@ window._moonlightBrowserInit = async () => { async writeConfig(newConfig) { await writeConfig(newConfig); config = newConfig; + this.events.dispatchEvent(NodeEventType.ConfigSaved, newConfig); } }; diff --git a/packages/core/src/extension/loader.ts b/packages/core/src/extension/loader.ts index b50d50ed..ecbda8ae 100644 --- a/packages/core/src/extension/loader.ts +++ b/packages/core/src/extension/loader.ts @@ -13,7 +13,7 @@ import { registerPatch, registerWebpackModule } from "../patch"; import calculateDependencies from "../util/dependency"; import { createEventEmitter } from "../util/event"; import { registerStyles } from "../styles"; -import { EventPayloads, EventType } from "@moonlight-mod/types/core/event"; +import { WebEventPayloads, WebEventType } from "@moonlight-mod/types/core/event"; const logger = new Logger("core/extension/loader"); @@ -202,7 +202,7 @@ export async function loadExtensions(exts: DetectedExtension[]): Promise(); + const eventEmitter = createEventEmitter(); const finished: Set = new Set(); logger.trace( @@ -224,11 +224,11 @@ export async function loadProcessedExtensions({ extensions, dependencyGraph }: P } function done() { - eventEmitter.removeEventListener(EventType.ExtensionLoad, cb); + eventEmitter.removeEventListener(WebEventType.ExtensionLoad, cb); r(); } - eventEmitter.addEventListener(EventType.ExtensionLoad, cb); + eventEmitter.addEventListener(WebEventType.ExtensionLoad, cb); if (finished.has(dep)) done(); }) ); @@ -242,7 +242,7 @@ export async function loadProcessedExtensions({ extensions, dependencyGraph }: P await loadExt(ext); finished.add(ext.id); - eventEmitter.dispatchEvent(EventType.ExtensionLoad, ext.id); + eventEmitter.dispatchEvent(WebEventType.ExtensionLoad, ext.id); logger.debug(`Loaded "${ext.id}"`); } diff --git a/packages/core/src/patch.ts b/packages/core/src/patch.ts index 85524d4c..b058c946 100644 --- a/packages/core/src/patch.ts +++ b/packages/core/src/patch.ts @@ -11,7 +11,7 @@ import { } from "@moonlight-mod/types"; import Logger from "./util/logger"; import calculateDependencies, { Dependency } from "./util/dependency"; -import { EventType } from "@moonlight-mod/types/core/event"; +import { WebEventType } from "@moonlight-mod/types/core/event"; import { processFind, processReplace, testFind } from "./util/patch"; const logger = new Logger("core/patch"); @@ -402,7 +402,7 @@ export async function installWebpackPatcher() { const realPush = jsonp.push; if (jsonp.push.__moonlight !== true) { jsonp.push = (items) => { - moonlight.events.dispatchEvent(EventType.ChunkLoad, { + moonlight.events.dispatchEvent(WebEventType.ChunkLoad, { chunkId: items[0], modules: items[1], require: items[2] @@ -450,7 +450,7 @@ export async function installWebpackPatcher() { set(modules: any) { const { stack } = new Error(); if (stack!.includes("/assets/") && !Array.isArray(modules)) { - moonlight.events.dispatchEvent(EventType.ChunkLoad, { + moonlight.events.dispatchEvent(WebEventType.ChunkLoad, { modules: modules }); patchModules(modules); diff --git a/packages/node-preload/src/index.ts b/packages/node-preload/src/index.ts index 83c57fc1..6909f136 100644 --- a/packages/node-preload/src/index.ts +++ b/packages/node-preload/src/index.ts @@ -11,6 +11,8 @@ import { loadExtensions, loadProcessedExtensions } from "@moonlight-mod/core/ext import createFS from "@moonlight-mod/core/fs"; import { registerCors, registerBlocked, getDynamicCors } from "@moonlight-mod/core/cors"; import { getConfig, getConfigOption, getManifest, setConfigOption } from "@moonlight-mod/core/util/config"; +import { NodeEventPayloads, NodeEventType } from "@moonlight-mod/types/core/event"; +import { createEventEmitter } from "@moonlight-mod/core/util/event"; let initialized = false; let logger: Logger; @@ -51,6 +53,7 @@ async function injectGlobals() { processedExtensions, nativesCache: {}, isBrowser: false, + events: createEventEmitter(), version: MOONLIGHT_VERSION, branch: MOONLIGHT_BRANCH as MoonlightBranch, @@ -69,6 +72,7 @@ async function injectGlobals() { async writeConfig(newConfig) { await writeConfig(newConfig); config = newConfig; + this.events.dispatchEvent(NodeEventType.ConfigSaved, newConfig); }, getNatives: (ext: string) => global.moonlightNode.nativesCache[ext], diff --git a/packages/types/src/core/event.ts b/packages/types/src/core/event.ts index 1f7f431b..5f11c2ba 100644 --- a/packages/types/src/core/event.ts +++ b/packages/types/src/core/event.ts @@ -1,3 +1,4 @@ +import { Config } from "../config"; import { WebpackModuleFunc, WebpackRequireType } from "../discord"; export interface MoonlightEventEmitter> { @@ -6,16 +7,24 @@ export interface MoonlightEventEmitter(id: Id, cb: (data: EventData[Id]) => void) => void; } -export enum EventType { +export enum WebEventType { ChunkLoad = "chunkLoad", ExtensionLoad = "extensionLoad" } -export type EventPayloads = { - [EventType.ChunkLoad]: { +export type WebEventPayloads = { + [WebEventType.ChunkLoad]: { chunkId?: number[]; modules: { [id: string]: WebpackModuleFunc }; require?: (require: WebpackRequireType) => any; }; - [EventType.ExtensionLoad]: string; + [WebEventType.ExtensionLoad]: string; +}; + +export enum NodeEventType { + ConfigSaved = "configSaved" +} + +export type NodeEventPayloads = { + [NodeEventType.ConfigSaved]: Config; }; diff --git a/packages/types/src/globals.ts b/packages/types/src/globals.ts index 0943ea1a..9433d961 100644 --- a/packages/types/src/globals.ts +++ b/packages/types/src/globals.ts @@ -4,7 +4,13 @@ import type { DetectedExtension, IdentifiedPatch, IdentifiedWebpackModule, Proce import type EventEmitter from "events"; import type LunAST from "@moonlight-mod/lunast"; import type Moonmap from "@moonlight-mod/moonmap"; -import type { EventPayloads, EventType, MoonlightEventEmitter } from "./core/event"; +import type { + WebEventPayloads, + WebEventType, + MoonlightEventEmitter, + NodeEventType, + NodeEventPayloads +} from "./core/event"; import { MoonlightFS } from "./fs"; export type MoonlightHost = { @@ -34,6 +40,7 @@ export type MoonlightNode = { processedExtensions: ProcessedExtensions; nativesCache: Record; isBrowser: boolean; + events: MoonlightEventEmitter; version: string; branch: MoonlightBranch; @@ -60,7 +67,7 @@ export type MoonlightWeb = { unpatched: Set; pendingModules: Set; enabledExtensions: Set; - events: MoonlightEventEmitter; + events: MoonlightEventEmitter; patchingInternals: { onModuleLoad: (moduleId: string | string[], callback: (moduleId: string) => void) => void; registerPatch: (patch: IdentifiedPatch) => void; diff --git a/packages/web-preload/src/index.ts b/packages/web-preload/src/index.ts index a6f1c915..8dce29b0 100644 --- a/packages/web-preload/src/index.ts +++ b/packages/web-preload/src/index.ts @@ -7,7 +7,7 @@ import LunAST from "@moonlight-mod/lunast"; import Moonmap from "@moonlight-mod/moonmap"; import loadMappings from "@moonlight-mod/mappings"; import { createEventEmitter } from "@moonlight-mod/core/util/event"; -import { EventPayloads, EventType } from "@moonlight-mod/types/core/event"; +import { WebEventPayloads, WebEventType } from "@moonlight-mod/types/core/event"; async function load() { delete window._moonlightWebLoad; @@ -20,7 +20,7 @@ async function load() { pendingModules: new Set(), enabledExtensions: new Set(), - events: createEventEmitter(), + events: createEventEmitter(), patchingInternals: { onModuleLoad, registerPatch,