perf+fix: sprint B — async I/O, before-quit, immutable getState, lucide tree-shake

#2  atomicWrite spin-loop → async setTimeout. Раньше при retry на
    EBUSY/EPERM (антивирус, OneDrive) main process замораживался на
    50/200/800ms × до 3 итераций ≈ секунда залипания UI. Сейчас async
    sleep — event-loop живёт. Сохранён atomicWriteSync для flushNow
    (вызывается из before-quit когда event-loop уже умирает).
    Аналогичный фикс в games/steam-launch-options.ts.
#5  before-quit теперь дожидается stopGamesRegistry через
    e.preventDefault() + app.exit(0). Раньше GSI HTTP server не успевал
    closeAllConnections до exit, и следующий запуск получал
    EADDRINUSE на port 4701 (TIME_WAIT) — GSI молча не работал.
#10 IPC.getState возвращает поверхностную копию settings вместо мутации
    кэша. Раньше startWithWindows писалось напрямую в state.settings,
    разъезжаясь с persisted-disk-значением до следующего mutation.
#19 lib/icon.tsx: `import * as Lucide` (wildcard, ~500KB в bundle,
    1500+ иконок) → explicit named imports + ICON_MAP. В bundle
    остаются только 18 ICON_CHOICES.
This commit is contained in:
AnRil
2026-05-22 01:15:31 +07:00
parent a41dce511b
commit 4745f5e091
5 changed files with 137 additions and 35 deletions

View File

@@ -56,9 +56,16 @@ import {
export function registerIpc(): void {
ipcMain.handle(IPC.getState, () => {
// Накладываем актуальное значение autostart (источник истины — OS),
// но НЕ мутируем кэш. Раньше прямая мутация state.settings оставляла
// в RAM startWithWindows, отличающийся от persisted-disk-значения,
// и при следующем flush на диск шла OS-правда, а не пользовательский
// toggle. Сейчас возвращаем поверхностную копию.
const state = getState()
state.settings.startWithWindows = isAutostartEnabled()
return state
return {
...state,
settings: { ...state.settings, startWithWindows: isAutostartEnabled() }
}
})
ipcMain.handle(IPC.addExercise, (_e, input: unknown) => {