# 🔌 สัญญาทางเทคนิค: Wails v3 IPC & Type-Safe Bindings Architecture เอกสารนี้อธิบายกลไกการสื่อสารข้ามเลเยอร์ (IPC Bridge) ระหว่าง **Go Core Services** และ **React 19 Frontend** ในสถาปัตยกรรม Wails v3 Alpha ของ G-Launcher --- ## 1. ลำดับการลงทะเบียนและส่งผ่านข้อมูล (IPC Gateway Flow) ```mermaid sequenceDiagram autonumber participant GoService as Go Service (internal/*-service) participant MainGo as main.go (RegisterService) participant WailsCLI as wails3 generate bindings participant TSBindings as frontend/bindings/@bindings/... participant ReactUI as React Component (frontend/src/...) GoService->>MainGo: ประกาศ Method พร้อม Input/Output Type ชัดเจน MainGo->>MainGo: app.RegisterService(application.NewService(serviceInstance)) MainGo-->>WailsCLI: Wails CLI ทำการสแกน Abstract Syntax Tree (AST) ของ Go WailsCLI->>TSBindings: สร้างไฟล์ TypeScript Definition (.d.ts) และ JS Wrapper TSBindings->>ReactUI: นำเข้า (Import) มาใช้ใน React ด้วย Type Safety 100% ReactUI->>GoService: เรียกใช้แบบ Async Promise ผ่าน Native Webview IPC Bridge GoService-->>ReactUI: คืนค่า Array Result [value1, value2, ...] ตามธรรมเนียม Wails v3 ``` --- ## 2. ทำไมต้องยึดกฎ "System-First Architecture" อย่างเคร่งครัด? 1. **Static AST Analysis:** Wails v3 สร้าง Bindings โดยการวิเคราะห์โค้ด Go แบบ Static AST หากแก้ไข UI ให้เรียกฟังก์ชันหรือส่งพารามิเตอร์ที่ Go Backend ยังไม่มี โค้ดฝั่ง Frontend จะเกิด Type Error ทันทีตอนรัน `tsc` 2. **Runtime IPC Exception:** หากหลุดจากการตรวจสอบของ TypeScript (เช่น ใช้ `any` หรือเรียกแบบไดนามิก) เมื่อ Webview ส่ง IPC Message ผ่าน MessageHandler ของ Windows WebView2 ไปยัง Go Backend ที่ไม่มีตัวรับ จะทำให้เกิด `Unhandled IPC Error` ส่งผลให้หน้าต่างโปรแกรมค้าง จอดำ หรือเปิดมาเป็นหน้าจอสีขาวสนิท (White Screen of Death) 3. **แนวปฏิบัติที่ถูกต้อง:** * ขั้นที่ 1: เพิ่ม Struct หรือ Method ใน Go Backend ก่อน * ขั้นที่ 2: รัน `go vet ./...` ให้มั่นใจว่า Backend ไม่มีข้อผิดพลาด * ขั้นที่ 3: สั่งรัน `wails3 generate bindings` เพื่อซิงก์ TypeScript Bindings ลง `frontend/bindings/` * ขั้นที่ 4: ตรวจสอบ Interface ใน `frontend/bindings/` * ขั้นที่ 5: แก้ไข UI และ State Store ใน Frontend ให้สอดคล้องกัน --- ## 3. รายการบริการและผัง Bindings ทั้ง 5 โมดูล ### 1. `AppService` (`@bindings/g-launcher/internal/app-service`) * `CloseAppAfterTimeout(seconds: number): Promise` * `GetCurrentLauncherVersion(): Promise<[boolean, string]>` * `Minimize(): Promise` * `ToggleMaximize(): Promise` * `Close(): Promise` ### 2. `FSService` (`@bindings/g-launcher/internal/fs-service`) * `FileExists(path: string): Promise` * `OpenFileDialog(title: string, filter: string): Promise` * `SaveGameSelection(path: string): Promise` * `GetSavedGameSelection(): Promise<[boolean, string]>` * `StartGameProcess(gamePath: string): Promise<[boolean, string]>` ### 3. `GitService` (`@bindings/g-launcher/internal/git-service`) * `GetLatestLauncherVersion(): Promise<[boolean, string, string]>` * `UpdateLauncherProgress(version: string): Promise<[boolean, string]>` * `BuildAndUpdateFromSource(branch: string): Promise<[boolean, string]>` * `GetLatestProxyVersion(): Promise<[boolean, string, string]>` * `DownloadProxy(version: string): Promise<[boolean, string]>` * `GetLatestServerVersion(): Promise<[boolean, string, string]>` * `DownloadServer(version: string): Promise<[boolean, string]>` ### 4. `DiffService` (`@bindings/g-launcher/internal/diff-service`) * `ApplyHDiffPatch(targetDir: string, diffFilePath: string): Promise<[boolean, string]>` * `ApplyZiffPatch(targetDir: string, ziffFilePath: string): Promise<[boolean, string]>` * `VerifyChunkChecksum(filePath: string, expectedHash: string): Promise` ### 5. `LanguageService` (`@bindings/g-launcher/internal/language-service`) * `InstallThaiPatch(gameDir: string): Promise<[boolean, string]>` * `UninstallThaiPatch(gameDir: string): Promise<[boolean, string]>` * `CheckThaiPatchStatus(gameDir: string): Promise<[boolean, boolean]>` --- ## 4. ผลการตรวจสอบความสมบูรณ์ (Verification Status) * คำสั่ง `wails3 generate bindings` สแกนพบ: **470 Packages, 5 Services, 41 Methods, 0 Errors** * โค้ดฝั่ง React คอมไพล์ผ่าน TypeScript Check (`tsc`) และ Vite Build ได้อย่างสมบูรณ์แบบ