|
| 1 | +# IPC 채널 요약 (도메인별) |
| 2 | + |
| 3 | +아래 표기는 메인 프로세스에서 노출하는 IPC 채널과 페이로드 개요입니다. `window.api`는 `src/main/preload.ts`에서 래핑된 형태로 제공됩니다. |
| 4 | + |
| 5 | +## 데이터 흐름 개요 |
| 6 | + |
| 7 | +- 초기화(앱 시작) |
| 8 | + 1) 메인 `Application`이 `electron-store` 스냅샷을 로드하고, 도메인/윈도우/서비스를 초기화합니다. |
| 9 | + 2) 렌더러는 `window.api.app.bootstrap()`을 호출해 초기 스냅샷(Settings/Keys/Positions/CustomTabs/SelectedKeyType/Overlay)을 받습니다. |
| 10 | + 3) `useAppBootstrap` 훅이 스냅샷을 Zustand 스토어에 반영하고, 아래 브로드캐스트 이벤트를 구독합니다. |
| 11 | + |
| 12 | +- 변경(런타임) |
| 13 | + 1) 렌더러가 `settings:update`, `keys:update` 등 invoke 채널을 호출합니다. |
| 14 | + 2) 도메인이 입력을 `zod`로 정규화 후 `electron-store`에 저장, 필요한 부수효과(예: 오버레이 잠금/항상 위)를 적용합니다. |
| 15 | + 3) 변경 결과를 각 브로드캐스트 채널(`settings:changed`, `keys:changed` 등)로 전파 → 렌더러 스토어가 구독해 동기화합니다. |
| 16 | + |
| 17 | +- 입력 이벤트(키보드) |
| 18 | + - `KeyboardService`가 전역 키 이벤트를 수집하여 현재 모드에 한해 `keys:state` 이벤트로 오버레이 렌더러에 전달합니다. |
| 19 | + |
| 20 | +## app |
| 21 | +- `app:bootstrap` (invoke) |
| 22 | + - 요청: `void` |
| 23 | + - 응답: `BootstrapPayload` (설정/키/포지션/커스텀탭/선택 탭/오버레이 상태) |
| 24 | + |
| 25 | +## system |
| 26 | +- `window:minimize` (invoke) |
| 27 | +- `window:close` (invoke) |
| 28 | +- `app:open-external` (invoke) |
| 29 | + - 요청: `{ url: string }` |
| 30 | +- `app:restart` (invoke) |
| 31 | + |
| 32 | +## settings |
| 33 | +- `settings:get` (invoke) |
| 34 | + - 응답: `SettingsState` |
| 35 | +- `settings:update` (invoke) |
| 36 | + - 요청: `Partial<SettingsState>` (중첩 필드는 필요한 부분만) |
| 37 | + - 응답: `SettingsState` (정규화된 전체 상태) |
| 38 | +- `settings:changed` (broadcast) |
| 39 | + - 페이로드: `SettingsState` |
| 40 | + |
| 41 | +## keys / positions / customTabs |
| 42 | +- `keys:get` (invoke) → `KeyMappings` |
| 43 | +- `keys:update` (invoke) → 요청: `KeyMappings`, 응답: `KeyMappings` |
| 44 | +- `positions:get` (invoke) → `KeyPositions` |
| 45 | +- `positions:update` (invoke) → 요청: `KeyPositions`, 응답: `KeyPositions` |
| 46 | +- `keys:set-mode` (invoke) → 요청: `{ mode: string }`, 응답: `{ success: boolean; mode: string }` |
| 47 | +- `keys:reset-all` (invoke) → `{ keys: KeyMappings; positions: KeyPositions }` |
| 48 | +- `keys:reset-mode` (invoke) → 요청: `{ mode: string }`, 응답: `{ success: boolean; mode: string }` |
| 49 | +- `custom-tabs:list` (invoke) → `CustomTab[]` |
| 50 | +- `custom-tabs:create` (invoke) → 요청: `{ name: string }`, 응답: `{ result?: CustomTab; error?: string }` |
| 51 | +- `custom-tabs:delete` (invoke) → 요청: `{ id: string }`, 응답: `{ success: boolean; selected: string; error?: string }` |
| 52 | +- `custom-tabs:select` (invoke) → 요청: `{ id: string }`, 응답: `{ success: boolean; selected: string; error?: string }` |
| 53 | + |
| 54 | +브로드캐스트 |
| 55 | +- `keys:changed` → `KeyMappings` |
| 56 | +- `positions:changed` → `KeyPositions` |
| 57 | +- `keys:mode-changed` → `{ mode: string }` |
| 58 | +- `customTabs:changed` → `{ customTabs: CustomTab[]; selectedKeyType: string }` |
| 59 | +- `keys:state` → `{ key: string; state: string; mode: string }` (키보드 이벤트) |
| 60 | + |
| 61 | +## overlay |
| 62 | +- `overlay:get` (invoke) → `{ visible: boolean; locked: boolean; anchor: string }` |
| 63 | +- `overlay:set-visible` (invoke) → 요청: `{ visible: boolean }`, 응답: `{ visible: boolean }` |
| 64 | +- `overlay:set-lock` (invoke) → 요청: `{ locked: boolean }`, 응답: `{ locked: boolean }` |
| 65 | +- `overlay:set-anchor` (invoke) → 요청: `{ anchor: string }`, 응답: `{ anchor: string }` |
| 66 | +- `overlay:resize` (invoke) |
| 67 | + - 요청: `{ width: number; height: number; anchor?: string; contentTopOffset?: number }` |
| 68 | + - 응답: `{ bounds?: { x: number; y: number; width: number; height: number }; error?: string }` |
| 69 | + |
| 70 | +브로드캐스트 |
| 71 | +- `overlay:visibility` → `{ visible: boolean }` |
| 72 | +- `overlay:lock` → `{ locked: boolean }` |
| 73 | +- `overlay:anchor` → `{ anchor: string }` |
| 74 | +- `overlay:resized` → `{ x: number; y: number; width: number; height: number }` |
| 75 | + |
| 76 | +## css |
| 77 | +- `css:get` (invoke) → `CustomCss` |
| 78 | +- `css:get-use` (invoke) → `boolean` |
| 79 | +- `css:toggle` (invoke) → 요청: `{ enabled: boolean }`, 응답: `{ enabled: boolean }` |
| 80 | +- `css:load` (invoke) → `{ success: boolean; content?: string; path?: string; error?: string }` |
| 81 | +- `css:set-content` (invoke) → 요청: `{ content: string }`, 응답: `{ success?: true; error?: string }` |
| 82 | +- `css:reset` (invoke) |
| 83 | + |
| 84 | +브로드캐스트 |
| 85 | +- `css:use` → `{ enabled: boolean }` |
| 86 | +- `css:content` → `CustomCss` |
| 87 | + |
| 88 | +## preset |
| 89 | +- `preset:save` (invoke) → `{ success: boolean; error?: string }` |
| 90 | +- `preset:load` (invoke) → `{ success: boolean; error?: string }` |
| 91 | + - 로드 성공 시 관련 상태 채널(`keys:*`, `positions:*`, `customTabs:changed`, `settings:changed`, `css:*`)이 일괄 브로드캐스트됩니다. |
0 commit comments