Files
SubMiner/src/main/runtime/app-lifecycle-main-cleanup.ts
sudacode 7e1a7df403 perf(main): buffer MPV OSD log writes asynchronously
Move OSD log appends off sync fs calls to reduce main-process blocking under frequent OSD activity. Add buffered flush wiring into quit cleanup so pending log lines are drained best-effort during shutdown.
2026-02-21 21:27:31 -08:00

101 lines
3.1 KiB
TypeScript

// Narrow structural types used by cleanup assembly.
type Destroyable = {
destroy: () => void;
};
type DestroyableWindow = Destroyable & {
isDestroyed: () => boolean;
};
type Stoppable = {
stop: () => void;
};
type SocketLike = {
destroy: () => void;
};
type TimerLike = ReturnType<typeof setTimeout>;
export function createBuildOnWillQuitCleanupDepsHandler(deps: {
destroyTray: () => void;
stopConfigHotReload: () => void;
restorePreviousSecondarySubVisibility: () => void;
unregisterAllGlobalShortcuts: () => void;
stopSubtitleWebsocket: () => void;
stopTexthookerService: () => void;
getYomitanParserWindow: () => DestroyableWindow | null;
clearYomitanParserState: () => void;
getWindowTracker: () => Stoppable | null;
flushMpvLog: () => void;
getMpvSocket: () => SocketLike | null;
getReconnectTimer: () => TimerLike | null;
clearReconnectTimerRef: () => void;
getSubtitleTimingTracker: () => Destroyable | null;
getImmersionTracker: () => Destroyable | null;
clearImmersionTracker: () => void;
getAnkiIntegration: () => Destroyable | null;
getAnilistSetupWindow: () => Destroyable | null;
clearAnilistSetupWindow: () => void;
getJellyfinSetupWindow: () => Destroyable | null;
clearJellyfinSetupWindow: () => void;
stopJellyfinRemoteSession: () => void;
}) {
return () => ({
destroyTray: () => deps.destroyTray(),
stopConfigHotReload: () => deps.stopConfigHotReload(),
restorePreviousSecondarySubVisibility: () => deps.restorePreviousSecondarySubVisibility(),
unregisterAllGlobalShortcuts: () => deps.unregisterAllGlobalShortcuts(),
stopSubtitleWebsocket: () => deps.stopSubtitleWebsocket(),
stopTexthookerService: () => deps.stopTexthookerService(),
destroyYomitanParserWindow: () => {
const window = deps.getYomitanParserWindow();
if (!window) return;
if (window.isDestroyed()) return;
window.destroy();
},
clearYomitanParserState: () => deps.clearYomitanParserState(),
stopWindowTracker: () => {
const tracker = deps.getWindowTracker();
tracker?.stop();
},
flushMpvLog: () => deps.flushMpvLog(),
destroyMpvSocket: () => {
const socket = deps.getMpvSocket();
socket?.destroy();
},
clearReconnectTimer: () => {
const timer = deps.getReconnectTimer();
if (!timer) return;
clearTimeout(timer);
deps.clearReconnectTimerRef();
},
destroySubtitleTimingTracker: () => {
deps.getSubtitleTimingTracker()?.destroy();
},
destroyImmersionTracker: () => {
const tracker = deps.getImmersionTracker();
if (!tracker) return;
tracker.destroy();
deps.clearImmersionTracker();
},
destroyAnkiIntegration: () => {
deps.getAnkiIntegration()?.destroy();
},
destroyAnilistSetupWindow: () => {
deps.getAnilistSetupWindow()?.destroy();
},
clearAnilistSetupWindow: () => deps.clearAnilistSetupWindow(),
destroyJellyfinSetupWindow: () => {
deps.getJellyfinSetupWindow()?.destroy();
},
clearJellyfinSetupWindow: () => deps.clearJellyfinSetupWindow(),
stopJellyfinRemoteSession: () => deps.stopJellyfinRemoteSession(),
});
}