From b3d0e30c07802178200292a079c8399d99943623 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=B0=D0=BD=D0=B8=D1=97=D0=BB=20=D0=93=D1=80=D0=B8?= =?UTF-8?q?=D0=B3=D0=BE=D1=80=27=D1=94=D0=B2?= Date: Sat, 14 Jun 2025 22:54:06 +0300 Subject: [PATCH] Manually debounce force reload event Remove chokidar built-in event debouncing/aggregating and replace it with a basic custom implementation with a 250ms settle delay. --- electron/src/mods/loader.ts | 12 +++++++++++- electron/src/mods/locator.ts | 2 -- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/electron/src/mods/loader.ts b/electron/src/mods/loader.ts index 093df329..d18f571e 100644 --- a/electron/src/mods/loader.ts +++ b/electron/src/mods/loader.ts @@ -63,7 +63,7 @@ export class ModLoader extends EventEmitter { this.locators.set("dev", devLocator); // If requested, restart automatically when dev mods are modified - devLocator.fsWatcher?.on("all", () => this.forceReload()); + devLocator.fsWatcher?.on("all", this.delayedForceReload()); } /** @@ -115,6 +115,16 @@ export class ModLoader extends EventEmitter { return this.mods.find(mod => mod.metadata.id === id); } + private delayedForceReload() { + // Debounce the force reload manually as chokidar won't aggregate events the way we want + // NOTE: The delay chosen here (250ms) is quite arbitrary! + let timeout: NodeJS.Timeout | undefined = undefined; + return () => { + clearTimeout(timeout); + timeout = setTimeout(() => this.forceReload(), 250); + }; + } + private async locateAllMods(): Promise { // Sort locators by priority, lowest number is highest priority const locators = [...this.locators.entries()].sort(([, a], [, b]) => a.priority - b.priority); diff --git a/electron/src/mods/locator.ts b/electron/src/mods/locator.ts index 66dcd562..112468a6 100644 --- a/electron/src/mods/locator.ts +++ b/electron/src/mods/locator.ts @@ -179,8 +179,6 @@ export class DevelopmentModLocator implements ModLocator { this.fsWatcher = chokidar.watch(this.modFiles, { persistent: false, ignoreInitial: true, - awaitWriteFinish: true, - atomic: true, }); }