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:
@@ -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) => {
|
||||
|
||||
Reference in New Issue
Block a user