aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/packages/docs/content/zh/architecture.mdx
blob: 6a2a2dfc81e54816760073ee9905473c2f1b3db7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
---
title: 架构设计
description: DropOut Minecraft 启动器的技术架构和设计
---

# 架构设计

DropOut 采用现代技术栈构建,旨在实现高性能、安全性和跨平台兼容性。

## 技术栈

### 后端(Rust)
- **框架**: Tauri v2
- **语言**: Rust(Edition 2021)
- **异步运行时**: Tokio
- **HTTP 客户端**: reqwest with native-tls

### 前端(Svelte)
- **框架**: Svelte 5(with runes)
- **样式**: Tailwind CSS 4
- **构建工具**: Vite with Rolldown
- **包管理器**: pnpm

### 文档
- **框架**: Fumadocs with React Router v7
- **内容**: MDX 文件
- **样式**: Tailwind CSS 4

## 系统架构

```
┌─────────────────────────────────────────────────────────┐
│                  前端(Svelte 5)                        │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌─────────┐ │
│  │  Stores  │  │Components│  │ UI Views │  │Particles│ │
│  └────┬─────┘  └────┬─────┘  └────┬─────┘  └────┬────┘ │
│       │             │             │              │      │
│       └─────────────┴─────────────┴──────────────┘      │
│                          │                              │
│                   Tauri 命令                            │
│                    事件/发射器                          │
└──────────────────────────┬──────────────────────────────┘
                           │
┌──────────────────────────┴──────────────────────────────┐
│                后端(Rust/Tauri)                        │
│  ┌─────────────────────────────────────────────────┐    │
│  │               main.rs(命令)                    │    │
│  └──────────────┬──────────────────────────────────┘    │
│                 │                                        │
│  ┌──────────────┴───────────────────────────────┐       │
│  │               核心模块                       │       │
│  │  ┌──────┐ ┌────────┐ ┌──────┐ ┌──────────┐  │       │
│  │  │ Auth │ │Download│ │ Java │ │ Instance │  │       │
│  │  └──────┘ └────────┘ └──────┘ └──────────┘  │       │
│  │  ┌──────┐ ┌────────┐ ┌──────┐ ┌──────────┐  │       │
│  │  │Fabric│ │ Forge  │ │Config│ │Manifest  │  │       │
│  │  └──────┘ └────────┘ └──────┘ └──────────┘  │       │
│  └──────────────────────────────────────────────┘       │
│                                                          │
│  ┌─────────────────────────────────────────────────┐    │
│  │                工具和辅助函数                    │    │
│  │  • ZIP 提取  • 路径工具                         │    │
│  └─────────────────────────────────────────────────┘    │
└──────────────────────────┬──────────────────────────────┘
                           │
                    外部 API
                           │
        ┌──────────────────┼──────────────────┐
        │                  │                  │
  ┌─────┴────┐      ┌──────┴─────┐    ┌──────┴─────┐
  │  Mojang  │      │   Fabric   │    │   Forge    │
  │   APIs   │      │    Meta    │    │   Maven    │
  └──────────┘      └────────────┘    └────────────┘
```

## 核心组件

### 前端状态管理

DropOut 使用 **Svelte 5 runes** 进行响应式状态管理:

```typescript
// stores/auth.svelte.ts
export class AuthState {
  currentAccount = $state<Account | null>(null);  // 响应式
  isLoginModalOpen = $state(false);
  
  $effect(() => {  // 副作用
    // 依赖变化时自动运行
  });
}
```

**关键 Stores:**
- `auth.svelte.ts`: 认证状态和登录流程
- `settings.svelte.ts`: 启动器设置和 Java 检测
- `game.svelte.ts`: 游戏运行状态和日志
- `instances.svelte.ts`: 实例管理
- `ui.svelte.ts`: UI 状态(提示、模态框、活动视图)

### 后端架构

#### 命令模式
所有 Tauri 命令遵循此结构:

```rust
#[tauri::command]
async fn command_name(
    window: Window,
    state: State<'_, SomeState>,
    param: Type,
) -> Result<ReturnType, String> {
    emit_log!(window, "状态消息");
    // 异步逻辑
    Ok(result)
}
```

#### 事件通信

**Rust → 前端(进度更新):**
```rust
window.emit("launcher-log", "正在下载...")?;
window.emit("download-progress", progress_struct)?;
```

**前端 → Rust(命令):**
```typescript
import { invoke } from "@tauri-apps/api/core";
const result = await invoke("start_game", { versionId: "1.20.4" });
```

### 核心模块

#### 认证(`core/auth.rs`)
- **微软 OAuth 2.0**: 设备代码流
- **离线认证**: 本地 UUID 生成
- **令牌管理**: 刷新令牌存储和自动刷新
- **Xbox Live 集成**: 完整认证链

**认证流程:**
1. 设备代码请求 → MS 令牌
2. Xbox Live 认证
3. XSTS 授权
4. Minecraft 令牌交换
5. 配置文件获取

#### 下载器(`core/downloader.rs`)
- **并发下载**: 可配置线程池
- **断点续传**: `.part` 和 `.part.meta` 文件
- **多段下载**: 大文件分割成块
- **校验和验证**: SHA1/SHA256 验证
- **进度跟踪**: 实时事件到前端

#### Java 管理(`core/java.rs`)
- **自动检测**: 扫描系统路径
- **Adoptium 集成**: 按需下载 JDK/JRE
- **目录缓存**: 版本列表 24 小时缓存
- **安装**: 提取到应用数据目录
- **取消**: 下载取消的原子标志

#### Fabric 支持(`core/fabric.rs`)
- **Meta API 集成**: 获取加载器版本
- **配置文件生成**: 创建版本 JSON
- **库解析**: Maven 构件处理

#### Forge 支持(`core/forge.rs`)
- **安装程序执行**: 运行 Forge 安装程序
- **配置文件解析**: 提取安装配置文件
- **库管理**: 处理 Forge 特定库

#### 实例系统(`core/instance.rs`)
- **隔离**: 每个实例独立目录
- **配置**: 每个实例的设置
- **模组管理**: 实例特定模组
- **版本锁定**: 可复现环境

#### 版本管理
- **清单解析**(`manifest.rs`): Mojang 版本清单
- **继承系统**(`version_merge.rs`): 父版本合并
- **游戏版本**(`game_version.rs`): JSON 解析和验证
- **规则引擎**(`rules.rs`): 操作系统/功能条件逻辑

### 文件结构

```
~/.local/share/com.dropout.launcher/  (Linux)
~/Library/Application Support/com.dropout.launcher/  (macOS)
%APPDATA%/com.dropout.launcher/  (Windows)
├── versions/
│   └── <version_id>/
│       ├── <version_id>.json
│       ├── <version_id>.jar
│       └── natives/
├── libraries/
│   └── <maven-path>/
├── assets/
│   ├── indexes/
│   └── objects/
├── instances/
│   └── <instance_name>/
│       ├── mods/
│       ├── config/
│       └── saves/
├── java/
│   └── <version>/
├── config.json
└── accounts.json
```

## 数据流

### 游戏启动序列

1. **前端**: 用户点击"启动游戏"
2. **命令**: 调用 `start_game(version_id)`
3. **后端处理**:
   - 加载版本 JSON(带继承)
   - 解析所有库
   - 下载缺少的资源
   - 提取原生库
   - 构建类路径
   - 构造 JVM 参数
   - 替换占位符
4. **进程生成**: 使用参数启动 Java
5. **流日志**: 向前端发送 stdout/stderr
6. **监视**: 跟踪游戏进程状态

### 下载流程

1. **队列创建**: 要下载的文件列表
2. **并发处理**: 信号量限制线程
3. **恢复检查**: 验证现有 `.part` 文件
4. **下载**: 大文件多段
5. **验证**: 校验和验证
6. **进度事件**: 实时更新到 UI
7. **完成**: 从 `.part` 移动到最终位置

### 认证流程

1. **设备代码请求**: 获取用户代码 + 设备代码
2. **用户授权**: 用户访问 URL 并输入代码
3. **令牌轮询**: 前端轮询完成
4. **令牌交换**: MS 令牌 → Xbox → XSTS → Minecraft
5. **配置文件获取**: 获取用户名和 UUID
6. **存储**: 使用刷新令牌保存账户
7. **自动刷新**: 过期时后台令牌刷新

## 平台特定考虑

### Linux
- 使用 GTK WebView(`webkit2gtk`)
- 从 `/usr/lib/jvm` 系统 Java 检测
- 桌面文件集成

### macOS
- 使用系统 WebKit
- 应用程序包结构
- 钥匙串集成用于安全存储

### Windows
- 使用 WebView2 运行时
- 注册表 Java 检测
- MSI 安装程序支持
- 发布版本中无控制台窗口

## 性能优化

- **并发下载**: 并行资源/库下载
- **延迟加载**: 按需加载版本清单
- **缓存**: Java 目录、版本清单
- **原生代码**: 用于 CPU 密集型操作的 Rust
- **异步 I/O**: 用于非阻塞操作的 Tokio

## 安全功能

- **令牌加密**: 安全存储认证令牌
- **仅 HTTPS**: 所有外部 API 调用
- **校验和验证**: 文件完整性验证
- **沙箱执行**: Tauri 安全模型
- **无任意代码**: 无 eval 或动态代码执行