“Một hệ thống bền bỉ được xây dựng trên một cấu trúc dữ liệu minh bạch, nơi trạng thái của tiến trình có thể kiểm chứng tại bất kỳ thời điểm nào.”
— Software Architecture Review

Mô hình vận hành & IPC

Kiến trúc của WinNest tuân thủ nghiêm ngặt nguyên lý phân tách mối quan tâm (separation of concerns). Nhân điều hành cốt lõi (Core Engine) được viết hoàn toàn bằng TypeScript và giao tiếp trực tiếp với hệ điều hành Linux và Wine.

Khi tích hợp giao diện người dùng để xuất bản ứng dụng Desktop (Electron GUI), phần hiển thị (Renderer Process) không được phép gọi trực tiếp các câu lệnh Wine hoặc thay đổi prefix. Mọi thao tác phải được định tuyến qua cơ chế IPC của main-process Electron để gọi các API dùng chung của WinNest Core. Điều này đảm bảo tính nhất quán của trạng thái ứng dụng và tránh xung đột dữ liệu.

Cấu trúc thư mục chi tiết

Mỗi phần mềm Windows được quản lý độc lập tại đường dẫn hệ thống:

~/.local/share/winnest/apps/<app-id>/
├── app.json           # Lưu metadata cài đặt (ID, Executables, Args)
├── prefix/            # Thư mục Wine Prefix ảo
│   ├── system.reg     # Registry ảo hệ thống của Windows ảo
│   ├── user.reg       # Registry ảo người dùng
│   └── drive_c/       # Thư mục đĩa C:\ chứa mã thực thi ảo
├── installer/         # Cache bản cài gốc của phần mềm
└── logs/              # Logs runtime lưu dạng JSON-lines (.jsonl)

Tệp cấu hình app.json là trung tâm thông tin của WinNest để theo dõi đường dẫn chạy file `.exe` thực tế bên trong đĩa ảo C: mà không cần quét lại ổ đĩa ở mỗi lần khởi chạy.

Khóa tiến trình cô lập (Locks)

Để tránh việc ghi đè Registry ảo hoặc thay đổi tệp tin hệ thống đồng thời (Race Conditions), WinNest trang bị cơ chế **Khóa tiến trình (Process Locking)**.

Khi một ứng dụng bắt đầu quá trình cài đặt (`install`), sửa chữa (`repair`), hoặc khởi chạy (`run`), WinNest sẽ tạo một tệp tin khóa tạm thời:
~/.local/share/winnest/apps/<app-id>/.winnest.lock

Tệp tin khóa chứa mã tiến trình (PID) của tác vụ WinNest hiện tại. Trước khi thực thi bất kỳ thao tác thay đổi nào trên prefix, hệ thống Core sẽ kiểm tra sự hiện diện của tệp lock. Nếu lock tồn tại và PID ghi trong lock vẫn đang hoạt động (alive) trên Linux, WinNest sẽ từ chối thao tác mới và trả về lỗi xung đột WinNestError để bảo vệ an toàn cho dữ liệu prefix.