@f2a/network 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +8 -1
- package/.github/workflows/ci.yml +0 -113
- package/.github/workflows/publish.yml +0 -60
- package/MONOREPO.md +0 -58
- package/SKILL.md +0 -137
- package/dist/adapters/openclaw.d.ts +0 -103
- package/dist/adapters/openclaw.d.ts.map +0 -1
- package/dist/adapters/openclaw.js +0 -297
- package/dist/adapters/openclaw.js.map +0 -1
- package/dist/core/connection-manager.d.ts +0 -80
- package/dist/core/connection-manager.d.ts.map +0 -1
- package/dist/core/connection-manager.js +0 -235
- package/dist/core/connection-manager.js.map +0 -1
- package/dist/core/connection-manager.test.d.ts +0 -2
- package/dist/core/connection-manager.test.d.ts.map +0 -1
- package/dist/core/connection-manager.test.js +0 -52
- package/dist/core/connection-manager.test.js.map +0 -1
- package/dist/core/identity.d.ts +0 -47
- package/dist/core/identity.d.ts.map +0 -1
- package/dist/core/identity.js +0 -130
- package/dist/core/identity.js.map +0 -1
- package/dist/core/identity.test.d.ts +0 -2
- package/dist/core/identity.test.d.ts.map +0 -1
- package/dist/core/identity.test.js +0 -43
- package/dist/core/identity.test.js.map +0 -1
- package/dist/core/serverless.d.ts +0 -155
- package/dist/core/serverless.d.ts.map +0 -1
- package/dist/core/serverless.js +0 -615
- package/dist/core/serverless.js.map +0 -1
- package/dist/daemon/webhook.test.d.ts +0 -2
- package/dist/daemon/webhook.test.d.ts.map +0 -1
- package/dist/daemon/webhook.test.js +0 -24
- package/dist/daemon/webhook.test.js.map +0 -1
- package/dist/protocol/messages.d.ts +0 -739
- package/dist/protocol/messages.d.ts.map +0 -1
- package/dist/protocol/messages.js +0 -188
- package/dist/protocol/messages.js.map +0 -1
- package/dist/protocol/messages.test.d.ts +0 -2
- package/dist/protocol/messages.test.d.ts.map +0 -1
- package/dist/protocol/messages.test.js +0 -55
- package/dist/protocol/messages.test.js.map +0 -1
- package/docs/F2A-PROTOCOL.md +0 -61
- package/docs/MOBILE_BOOTSTRAP_DESIGN.md +0 -126
- package/docs/a2a-lessons.md +0 -316
- package/docs/middleware-guide.md +0 -448
- package/docs/readme-update-checklist.md +0 -90
- package/docs/reputation-guide.md +0 -396
- package/docs/rfcs/001-reputation-system.md +0 -712
- package/docs/security-design.md +0 -247
- package/install.sh +0 -231
- package/packages/openclaw-adapter/README.md +0 -510
- package/packages/openclaw-adapter/openclaw.plugin.json +0 -106
- package/packages/openclaw-adapter/package.json +0 -40
- package/packages/openclaw-adapter/src/announcement-queue.test.ts +0 -449
- package/packages/openclaw-adapter/src/announcement-queue.ts +0 -403
- package/packages/openclaw-adapter/src/capability-detector.test.ts +0 -99
- package/packages/openclaw-adapter/src/capability-detector.ts +0 -183
- package/packages/openclaw-adapter/src/claim-handlers.test.ts +0 -974
- package/packages/openclaw-adapter/src/claim-handlers.ts +0 -482
- package/packages/openclaw-adapter/src/connector.business.test.ts +0 -583
- package/packages/openclaw-adapter/src/connector.ts +0 -795
- package/packages/openclaw-adapter/src/index.test.ts +0 -82
- package/packages/openclaw-adapter/src/index.ts +0 -18
- package/packages/openclaw-adapter/src/integration.e2e.test.ts +0 -829
- package/packages/openclaw-adapter/src/logger.ts +0 -51
- package/packages/openclaw-adapter/src/network-client.test.ts +0 -266
- package/packages/openclaw-adapter/src/network-client.ts +0 -251
- package/packages/openclaw-adapter/src/network-recovery.test.ts +0 -465
- package/packages/openclaw-adapter/src/node-manager.test.ts +0 -136
- package/packages/openclaw-adapter/src/node-manager.ts +0 -429
- package/packages/openclaw-adapter/src/plugin.test.ts +0 -439
- package/packages/openclaw-adapter/src/plugin.ts +0 -104
- package/packages/openclaw-adapter/src/reputation.test.ts +0 -221
- package/packages/openclaw-adapter/src/reputation.ts +0 -368
- package/packages/openclaw-adapter/src/task-guard.test.ts +0 -502
- package/packages/openclaw-adapter/src/task-guard.ts +0 -860
- package/packages/openclaw-adapter/src/task-queue.concurrency.test.ts +0 -462
- package/packages/openclaw-adapter/src/task-queue.edge-cases.test.ts +0 -284
- package/packages/openclaw-adapter/src/task-queue.persistence.test.ts +0 -408
- package/packages/openclaw-adapter/src/task-queue.ts +0 -668
- package/packages/openclaw-adapter/src/tool-handlers.test.ts +0 -906
- package/packages/openclaw-adapter/src/tool-handlers.ts +0 -574
- package/packages/openclaw-adapter/src/types.ts +0 -361
- package/packages/openclaw-adapter/src/webhook-pusher.test.ts +0 -188
- package/packages/openclaw-adapter/src/webhook-pusher.ts +0 -220
- package/packages/openclaw-adapter/src/webhook-server.test.ts +0 -580
- package/packages/openclaw-adapter/src/webhook-server.ts +0 -202
- package/packages/openclaw-adapter/tsconfig.json +0 -20
- package/src/cli/commands.test.ts +0 -157
- package/src/cli/commands.ts +0 -129
- package/src/cli/index.test.ts +0 -77
- package/src/cli/index.ts +0 -234
- package/src/core/autonomous-economy.test.ts +0 -291
- package/src/core/autonomous-economy.ts +0 -428
- package/src/core/e2ee-crypto.test.ts +0 -125
- package/src/core/e2ee-crypto.ts +0 -246
- package/src/core/f2a.test.ts +0 -269
- package/src/core/f2a.ts +0 -618
- package/src/core/p2p-network.test.ts +0 -199
- package/src/core/p2p-network.ts +0 -1432
- package/src/core/reputation-security.test.ts +0 -403
- package/src/core/reputation-security.ts +0 -562
- package/src/core/reputation.test.ts +0 -260
- package/src/core/reputation.ts +0 -576
- package/src/core/review-committee.test.ts +0 -380
- package/src/core/review-committee.ts +0 -401
- package/src/core/token-manager.test.ts +0 -133
- package/src/core/token-manager.ts +0 -140
- package/src/daemon/control-server.test.ts +0 -216
- package/src/daemon/control-server.ts +0 -292
- package/src/daemon/index.test.ts +0 -85
- package/src/daemon/index.ts +0 -89
- package/src/daemon/main.ts +0 -44
- package/src/daemon/start.ts +0 -29
- package/src/daemon/webhook.test.ts +0 -68
- package/src/daemon/webhook.ts +0 -105
- package/src/index.test.ts +0 -436
- package/src/index.ts +0 -72
- package/src/types/index.test.ts +0 -87
- package/src/types/index.ts +0 -341
- package/src/types/result.ts +0 -68
- package/src/utils/benchmark.ts +0 -237
- package/src/utils/logger.ts +0 -331
- package/src/utils/middleware.ts +0 -229
- package/src/utils/rate-limiter.ts +0 -207
- package/src/utils/signature.ts +0 -136
- package/src/utils/validation.ts +0 -186
- package/tests/docker/Dockerfile.node +0 -23
- package/tests/docker/Dockerfile.runner +0 -18
- package/tests/docker/docker-compose.test.yml +0 -73
- package/tests/integration/message-passing.test.ts +0 -109
- package/tests/integration/multi-node.test.ts +0 -92
- package/tests/integration/p2p-connection.test.ts +0 -83
- package/tests/integration/test-config.ts +0 -32
- package/tsconfig.json +0 -21
- package/vitest.config.ts +0 -26
package/docs/middleware-guide.md
DELETED
|
@@ -1,448 +0,0 @@
|
|
|
1
|
-
# F2A 中间件使用指南
|
|
2
|
-
|
|
3
|
-
中间件系统允许你在消息处理流程中插入自定义逻辑,实现消息过滤、转换、日志记录等功能。
|
|
4
|
-
|
|
5
|
-
## 目录
|
|
6
|
-
|
|
7
|
-
- [快速开始](#快速开始)
|
|
8
|
-
- [中间件概念](#中间件概念)
|
|
9
|
-
- [内置中间件](#内置中间件)
|
|
10
|
-
- [自定义中间件](#自定义中间件)
|
|
11
|
-
- [中间件执行顺序](#中间件执行顺序)
|
|
12
|
-
- [最佳实践](#最佳实践)
|
|
13
|
-
|
|
14
|
-
## 快速开始
|
|
15
|
-
|
|
16
|
-
```typescript
|
|
17
|
-
import { F2A, createMessageSizeLimitMiddleware } from 'f2a-network';
|
|
18
|
-
|
|
19
|
-
const f2a = await F2A.create({ displayName: 'My Agent' });
|
|
20
|
-
|
|
21
|
-
// 注册中间件 - 限制消息大小为 1MB
|
|
22
|
-
f2a.useMiddleware(createMessageSizeLimitMiddleware(1024 * 1024));
|
|
23
|
-
|
|
24
|
-
await f2a.start();
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
## 中间件概念
|
|
28
|
-
|
|
29
|
-
### 中间件接口
|
|
30
|
-
|
|
31
|
-
```typescript
|
|
32
|
-
interface Middleware {
|
|
33
|
-
/** 中间件名称,用于日志和调试 */
|
|
34
|
-
name: string;
|
|
35
|
-
|
|
36
|
-
/** 执行优先级(数字越小优先级越高,默认 0) */
|
|
37
|
-
priority?: number;
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* 中间件类型
|
|
41
|
-
* - 'essential': 核心中间件,异常时中断链
|
|
42
|
-
* - 'optional': 可选中间件,异常时继续处理(默认)
|
|
43
|
-
*/
|
|
44
|
-
type?: 'essential' | 'optional';
|
|
45
|
-
|
|
46
|
-
/** 处理函数 */
|
|
47
|
-
process(context: MiddlewareContext): Promise<MiddlewareResult> | MiddlewareResult;
|
|
48
|
-
}
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
### 中间件上下文
|
|
52
|
-
|
|
53
|
-
```typescript
|
|
54
|
-
interface MiddlewareContext {
|
|
55
|
-
/** 原始消息 */
|
|
56
|
-
message: F2AMessage;
|
|
57
|
-
|
|
58
|
-
/** 发送方 Peer ID */
|
|
59
|
-
peerId: string;
|
|
60
|
-
|
|
61
|
-
/** 发送方 Agent 信息(可选) */
|
|
62
|
-
agentInfo?: AgentInfo;
|
|
63
|
-
|
|
64
|
-
/** 中间件元数据,用于在中间件间传递数据 */
|
|
65
|
-
metadata: Map<string, unknown>;
|
|
66
|
-
}
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
### 处理结果
|
|
70
|
-
|
|
71
|
-
中间件的 `process` 方法返回三种结果之一:
|
|
72
|
-
|
|
73
|
-
```typescript
|
|
74
|
-
type MiddlewareResult =
|
|
75
|
-
| { action: 'continue'; context: MiddlewareContext } // 继续处理
|
|
76
|
-
| { action: 'drop'; reason: string } // 丢弃消息
|
|
77
|
-
| { action: 'modify'; context: MiddlewareContext }; // 修改消息后继续
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
| Action | 说明 |
|
|
81
|
-
|--------|------|
|
|
82
|
-
| `continue` | 通过中间件,继续执行下一个中间件 |
|
|
83
|
-
| `drop` | 丢弃消息,不再处理(用于安全过滤) |
|
|
84
|
-
| `modify` | 修改消息内容后继续处理 |
|
|
85
|
-
|
|
86
|
-
## 内置中间件
|
|
87
|
-
|
|
88
|
-
### 消息大小限制
|
|
89
|
-
|
|
90
|
-
限制消息大小,防止过大的消息消耗资源:
|
|
91
|
-
|
|
92
|
-
```typescript
|
|
93
|
-
import { createMessageSizeLimitMiddleware } from 'f2a-network';
|
|
94
|
-
|
|
95
|
-
// 限制消息最大 1MB
|
|
96
|
-
f2a.useMiddleware(createMessageSizeLimitMiddleware(1024 * 1024));
|
|
97
|
-
|
|
98
|
-
// 限制消息最大 100KB
|
|
99
|
-
f2a.useMiddleware(createMessageSizeLimitMiddleware(100 * 1024));
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
### 消息类型过滤
|
|
103
|
-
|
|
104
|
-
只允许特定类型的消息通过:
|
|
105
|
-
|
|
106
|
-
```typescript
|
|
107
|
-
import { createMessageTypeFilterMiddleware } from 'f2a-network';
|
|
108
|
-
|
|
109
|
-
// 只允许任务请求和响应消息
|
|
110
|
-
f2a.useMiddleware(
|
|
111
|
-
createMessageTypeFilterMiddleware(['TASK_REQUEST', 'TASK_RESPONSE'])
|
|
112
|
-
);
|
|
113
|
-
|
|
114
|
-
// 允许所有发现和任务相关消息
|
|
115
|
-
f2a.useMiddleware(
|
|
116
|
-
createMessageTypeFilterMiddleware(['DISCOVER', 'TASK_REQUEST', 'TASK_RESPONSE'])
|
|
117
|
-
);
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
### 消息日志
|
|
121
|
-
|
|
122
|
-
记录消息处理日志,用于调试:
|
|
123
|
-
|
|
124
|
-
```typescript
|
|
125
|
-
import { createMessageLoggingMiddleware } from 'f2a-network';
|
|
126
|
-
|
|
127
|
-
// 使用默认日志器
|
|
128
|
-
f2a.useMiddleware(createMessageLoggingMiddleware());
|
|
129
|
-
|
|
130
|
-
// 使用自定义日志器
|
|
131
|
-
import { Logger } from 'f2a-network';
|
|
132
|
-
const logger = new Logger({ level: 'debug', component: 'MyLogger' });
|
|
133
|
-
f2a.useMiddleware(createMessageLoggingMiddleware(logger));
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
### 消息转换
|
|
137
|
-
|
|
138
|
-
在处理前修改消息内容:
|
|
139
|
-
|
|
140
|
-
```typescript
|
|
141
|
-
import { createMessageTransformMiddleware } from 'f2a-network';
|
|
142
|
-
|
|
143
|
-
// 添加时间戳到所有消息
|
|
144
|
-
f2a.useMiddleware(
|
|
145
|
-
createMessageTransformMiddleware((msg) => ({
|
|
146
|
-
...msg,
|
|
147
|
-
timestamp: Date.now()
|
|
148
|
-
}))
|
|
149
|
-
);
|
|
150
|
-
|
|
151
|
-
// 过滤敏感信息
|
|
152
|
-
f2a.useMiddleware(
|
|
153
|
-
createMessageTransformMiddleware((msg) => {
|
|
154
|
-
if (msg.payload?.token) {
|
|
155
|
-
msg.payload.token = '[REDACTED]';
|
|
156
|
-
}
|
|
157
|
-
return msg;
|
|
158
|
-
})
|
|
159
|
-
);
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
### 速率限制
|
|
163
|
-
|
|
164
|
-
限制每个节点的请求频率:
|
|
165
|
-
|
|
166
|
-
```typescript
|
|
167
|
-
import { createRateLimitMiddleware } from 'f2a-network';
|
|
168
|
-
|
|
169
|
-
// 每分钟最多 100 个请求
|
|
170
|
-
f2a.useMiddleware(createRateLimitMiddleware(100));
|
|
171
|
-
|
|
172
|
-
// 每 30 秒最多 50 个请求
|
|
173
|
-
f2a.useMiddleware(createRateLimitMiddleware(50, 30000));
|
|
174
|
-
```
|
|
175
|
-
|
|
176
|
-
## 自定义中间件
|
|
177
|
-
|
|
178
|
-
### 基础示例
|
|
179
|
-
|
|
180
|
-
```typescript
|
|
181
|
-
import { Middleware, MiddlewareContext, MiddlewareResult } from 'f2a-network';
|
|
182
|
-
|
|
183
|
-
// 创建一个简单的日志中间件
|
|
184
|
-
const myLogger: Middleware = {
|
|
185
|
-
name: 'MyLogger',
|
|
186
|
-
priority: 50,
|
|
187
|
-
process(context: MiddlewareContext): MiddlewareResult {
|
|
188
|
-
console.log(`[${new Date().toISOString()}] ${context.message.type} from ${context.peerId}`);
|
|
189
|
-
return { action: 'continue', context };
|
|
190
|
-
}
|
|
191
|
-
};
|
|
192
|
-
|
|
193
|
-
f2a.useMiddleware(myLogger);
|
|
194
|
-
```
|
|
195
|
-
|
|
196
|
-
### 安全过滤中间件
|
|
197
|
-
|
|
198
|
-
```typescript
|
|
199
|
-
// 过滤来自黑名单节点的消息
|
|
200
|
-
function createBlacklistMiddleware(blacklist: Set<string>): Middleware {
|
|
201
|
-
return {
|
|
202
|
-
name: 'BlacklistFilter',
|
|
203
|
-
priority: 100, // 高优先级,尽早过滤
|
|
204
|
-
type: 'essential', // 核心中间件,异常时中断
|
|
205
|
-
process(context: MiddlewareContext): MiddlewareResult {
|
|
206
|
-
if (blacklist.has(context.peerId)) {
|
|
207
|
-
return {
|
|
208
|
-
action: 'drop',
|
|
209
|
-
reason: `Peer ${context.peerId} is blacklisted`
|
|
210
|
-
};
|
|
211
|
-
}
|
|
212
|
-
return { action: 'continue', context };
|
|
213
|
-
}
|
|
214
|
-
};
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
// 使用
|
|
218
|
-
const blacklist = new Set(['12D3KooW...', '12D3KooX...']);
|
|
219
|
-
f2a.useMiddleware(createBlacklistMiddleware(blacklist));
|
|
220
|
-
```
|
|
221
|
-
|
|
222
|
-
### 消息修改中间件
|
|
223
|
-
|
|
224
|
-
```typescript
|
|
225
|
-
// 为消息添加处理链路追踪
|
|
226
|
-
function createTracingMiddleware(): Middleware {
|
|
227
|
-
return {
|
|
228
|
-
name: 'Tracing',
|
|
229
|
-
priority: 10, // 低优先级,最后执行
|
|
230
|
-
process(context: MiddlewareContext): MiddlewareResult {
|
|
231
|
-
const traceId = context.metadata.get('traceId') || crypto.randomUUID();
|
|
232
|
-
context.metadata.set('traceId', traceId);
|
|
233
|
-
|
|
234
|
-
return {
|
|
235
|
-
action: 'modify',
|
|
236
|
-
context: {
|
|
237
|
-
...context,
|
|
238
|
-
message: {
|
|
239
|
-
...context.message,
|
|
240
|
-
traceId
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
};
|
|
244
|
-
}
|
|
245
|
-
};
|
|
246
|
-
}
|
|
247
|
-
```
|
|
248
|
-
|
|
249
|
-
### 异步中间件
|
|
250
|
-
|
|
251
|
-
```typescript
|
|
252
|
-
// 验证消息签名(需要异步操作)
|
|
253
|
-
function createSignatureVerificationMiddleware(): Middleware {
|
|
254
|
-
return {
|
|
255
|
-
name: 'SignatureVerifier',
|
|
256
|
-
priority: 90,
|
|
257
|
-
type: 'essential',
|
|
258
|
-
async process(context: MiddlewareContext): Promise<MiddlewareResult> {
|
|
259
|
-
const signature = context.message.signature;
|
|
260
|
-
if (!signature) {
|
|
261
|
-
return { action: 'drop', reason: 'Missing signature' };
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
// 异步验证签名
|
|
265
|
-
const isValid = await verifySignature(context.message, signature);
|
|
266
|
-
if (!isValid) {
|
|
267
|
-
return { action: 'drop', reason: 'Invalid signature' };
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
return { action: 'continue', context };
|
|
271
|
-
}
|
|
272
|
-
};
|
|
273
|
-
}
|
|
274
|
-
```
|
|
275
|
-
|
|
276
|
-
## 中间件执行顺序
|
|
277
|
-
|
|
278
|
-
中间件按 `priority` 从小到大依次执行:
|
|
279
|
-
|
|
280
|
-
```
|
|
281
|
-
Priority: 0 ──► 50 ──► 100 ──► 1000
|
|
282
|
-
│ │ │
|
|
283
|
-
▼ ▼ ▼
|
|
284
|
-
[安全检查] [日志] [业务逻辑]
|
|
285
|
-
```
|
|
286
|
-
|
|
287
|
-
### 执行流程示例
|
|
288
|
-
|
|
289
|
-
```
|
|
290
|
-
消息进入
|
|
291
|
-
│
|
|
292
|
-
▼
|
|
293
|
-
┌─────────────────────────┐
|
|
294
|
-
│ RateLimit (priority=80) │ ── 超限? ──► DROP
|
|
295
|
-
└─────────────────────────┘
|
|
296
|
-
│ continue
|
|
297
|
-
▼
|
|
298
|
-
┌─────────────────────────┐
|
|
299
|
-
│ Blacklist (priority=90) │ ── 黑名单? ──► DROP
|
|
300
|
-
└─────────────────────────┘
|
|
301
|
-
│ continue
|
|
302
|
-
▼
|
|
303
|
-
┌─────────────────────────┐
|
|
304
|
-
│ Logging (priority=100) │
|
|
305
|
-
└─────────────────────────┘
|
|
306
|
-
│ continue
|
|
307
|
-
▼
|
|
308
|
-
┌─────────────────────────┐
|
|
309
|
-
│ Transform (priority=10) │ ── modify
|
|
310
|
-
└─────────────────────────┘
|
|
311
|
-
│
|
|
312
|
-
▼
|
|
313
|
-
消息处理完成
|
|
314
|
-
```
|
|
315
|
-
|
|
316
|
-
### 推荐优先级范围
|
|
317
|
-
|
|
318
|
-
| 范围 | 用途 | 示例 |
|
|
319
|
-
|------|------|------|
|
|
320
|
-
| 0-50 | 消息修改 | Transform, Enrichment |
|
|
321
|
-
| 50-80 | 日志、监控 | Logging, Metrics |
|
|
322
|
-
| 80-95 | 安全过滤 | Blacklist, Signature |
|
|
323
|
-
| 95-100 | 基础检查 | SizeLimit, TypeFilter |
|
|
324
|
-
|
|
325
|
-
## 中间件管理
|
|
326
|
-
|
|
327
|
-
### 查看已注册中间件
|
|
328
|
-
|
|
329
|
-
```typescript
|
|
330
|
-
const middlewares = f2a.listMiddlewares();
|
|
331
|
-
console.log('已注册的中间件:', middlewares);
|
|
332
|
-
// 输出: ['RateLimit', 'BlacklistFilter', 'Logging']
|
|
333
|
-
```
|
|
334
|
-
|
|
335
|
-
### 移除中间件
|
|
336
|
-
|
|
337
|
-
```typescript
|
|
338
|
-
// 按名称移除
|
|
339
|
-
f2a.removeMiddleware('BlacklistFilter');
|
|
340
|
-
```
|
|
341
|
-
|
|
342
|
-
## 最佳实践
|
|
343
|
-
|
|
344
|
-
### 1. 选择正确的优先级
|
|
345
|
-
|
|
346
|
-
```typescript
|
|
347
|
-
// ✅ 好的做法:安全检查优先执行
|
|
348
|
-
const securityMiddleware: Middleware = {
|
|
349
|
-
name: 'SecurityCheck',
|
|
350
|
-
priority: 100, // 高优先级
|
|
351
|
-
type: 'essential',
|
|
352
|
-
// ...
|
|
353
|
-
};
|
|
354
|
-
|
|
355
|
-
// ❌ 不好的做法:业务逻辑优先于安全检查
|
|
356
|
-
const businessMiddleware: Middleware = {
|
|
357
|
-
name: 'BusinessLogic',
|
|
358
|
-
priority: 0, // 太高了
|
|
359
|
-
// ...
|
|
360
|
-
};
|
|
361
|
-
```
|
|
362
|
-
|
|
363
|
-
### 2. 使用 metadata 传递数据
|
|
364
|
-
|
|
365
|
-
```typescript
|
|
366
|
-
// 第一个中间件设置数据
|
|
367
|
-
const middleware1: Middleware = {
|
|
368
|
-
name: 'SetData',
|
|
369
|
-
process(context) {
|
|
370
|
-
context.metadata.set('startTime', Date.now());
|
|
371
|
-
return { action: 'continue', context };
|
|
372
|
-
}
|
|
373
|
-
};
|
|
374
|
-
|
|
375
|
-
// 后续中间件读取数据
|
|
376
|
-
const middleware2: Middleware = {
|
|
377
|
-
name: 'UseData',
|
|
378
|
-
process(context) {
|
|
379
|
-
const startTime = context.metadata.get('startTime') as number;
|
|
380
|
-
const elapsed = Date.now() - startTime;
|
|
381
|
-
console.log(`处理耗时: ${elapsed}ms`);
|
|
382
|
-
return { action: 'continue', context };
|
|
383
|
-
}
|
|
384
|
-
};
|
|
385
|
-
```
|
|
386
|
-
|
|
387
|
-
### 3. 合理使用 type
|
|
388
|
-
|
|
389
|
-
```typescript
|
|
390
|
-
// 核心安全中间件 - 异常时中断
|
|
391
|
-
const authMiddleware: Middleware = {
|
|
392
|
-
name: 'Authentication',
|
|
393
|
-
type: 'essential', // 异常时中断整个处理链
|
|
394
|
-
// ...
|
|
395
|
-
};
|
|
396
|
-
|
|
397
|
-
// 可选的日志中间件 - 异常时继续
|
|
398
|
-
const loggingMiddleware: Middleware = {
|
|
399
|
-
name: 'Logging',
|
|
400
|
-
type: 'optional', // 异常时继续处理(默认)
|
|
401
|
-
// ...
|
|
402
|
-
};
|
|
403
|
-
```
|
|
404
|
-
|
|
405
|
-
### 4. 提供有意义的 drop 原因
|
|
406
|
-
|
|
407
|
-
```typescript
|
|
408
|
-
// ✅ 好的做法
|
|
409
|
-
return {
|
|
410
|
-
action: 'drop',
|
|
411
|
-
reason: `Message size ${size} exceeds limit ${maxSize}`
|
|
412
|
-
};
|
|
413
|
-
|
|
414
|
-
// ❌ 不好的做法
|
|
415
|
-
return { action: 'drop', reason: 'Error' };
|
|
416
|
-
```
|
|
417
|
-
|
|
418
|
-
### 5. 避免副作用
|
|
419
|
-
|
|
420
|
-
中间件应该是纯函数,避免修改外部状态:
|
|
421
|
-
|
|
422
|
-
```typescript
|
|
423
|
-
// ❌ 避免修改外部状态
|
|
424
|
-
let requestCount = 0;
|
|
425
|
-
const badMiddleware: Middleware = {
|
|
426
|
-
name: 'Counter',
|
|
427
|
-
process(context) {
|
|
428
|
-
requestCount++; // 副作用!
|
|
429
|
-
return { action: 'continue', context };
|
|
430
|
-
}
|
|
431
|
-
};
|
|
432
|
-
|
|
433
|
-
// ✅ 使用 metadata 存储状态
|
|
434
|
-
const goodMiddleware: Middleware = {
|
|
435
|
-
name: 'Counter',
|
|
436
|
-
process(context) {
|
|
437
|
-
const count = (context.metadata.get('requestCount') as number || 0) + 1;
|
|
438
|
-
context.metadata.set('requestCount', count);
|
|
439
|
-
return { action: 'continue', context };
|
|
440
|
-
}
|
|
441
|
-
};
|
|
442
|
-
```
|
|
443
|
-
|
|
444
|
-
## 相关文档
|
|
445
|
-
|
|
446
|
-
- [信誉系统用户指南](./reputation-guide.md)
|
|
447
|
-
- [F2A 协议文档](./F2A-PROTOCOL.md)
|
|
448
|
-
- [安全设计](./security-design.md)
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
# README.md 文档更新检查清单
|
|
2
|
-
|
|
3
|
-
## 需要更新的内容
|
|
4
|
-
|
|
5
|
-
### 1. 架构概览部分 ⚠️ 过时
|
|
6
|
-
**当前状态**: 只提到基础 P2P 网络
|
|
7
|
-
**需要添加**:
|
|
8
|
-
- [ ] 中间件系统 (Middleware)
|
|
9
|
-
- [ ] 性能基准测试 (Benchmark)
|
|
10
|
-
- [ ] 输入验证系统 (Zod validation)
|
|
11
|
-
- [ ] 速率限制 (RateLimiter)
|
|
12
|
-
- [ ] 结构化日志 (Logger)
|
|
13
|
-
- [ ] 请求签名验证 (RequestSigner)
|
|
14
|
-
- [ ] 信誉系统 (ReputationManager) - Phase 1
|
|
15
|
-
|
|
16
|
-
### 2. 快速开始部分 ✅ 基本正确
|
|
17
|
-
**需要添加**:
|
|
18
|
-
- [ ] 中间件使用示例
|
|
19
|
-
- [ ] 签名配置示例
|
|
20
|
-
|
|
21
|
-
### 3. 环境变量部分 ⚠️ 不完整
|
|
22
|
-
**当前**: 只有 F2A_CONTROL_PORT 和 F2A_CONTROL_TOKEN
|
|
23
|
-
**需要添加**:
|
|
24
|
-
- [ ] F2A_SIGNATURE_KEY - 请求签名密钥
|
|
25
|
-
- [ ] F2A_SIGNATURE_TOLERANCE - 签名时间戳容忍度
|
|
26
|
-
- [ ] NODE_ENV - 生产环境启用 JSON 日志格式
|
|
27
|
-
|
|
28
|
-
### 4. 安全注意事项 ⚠️ 需要更新
|
|
29
|
-
**当前**: 只提到 CONTROL_TOKEN
|
|
30
|
-
**需要添加**:
|
|
31
|
-
- [ ] 强制 E2EE 加密说明
|
|
32
|
-
- [ ] 请求签名验证说明
|
|
33
|
-
- [ ] 速率限制保护
|
|
34
|
-
- [ ] 输入验证 (Zod)
|
|
35
|
-
|
|
36
|
-
### 5. API 参考部分 ⚠️ 严重过时
|
|
37
|
-
**当前**: 只有基础 F2A 类方法
|
|
38
|
-
**需要添加**:
|
|
39
|
-
- [ ] P2PNetwork 中间件 API
|
|
40
|
-
- [ ] 签名验证 API
|
|
41
|
-
- [ ] 信誉系统 API
|
|
42
|
-
- [ ] 基准测试 API
|
|
43
|
-
|
|
44
|
-
### 6. 路线图部分 ⚠️ 过时
|
|
45
|
-
**当前状态**:
|
|
46
|
-
- [x] 基础 P2P 网络
|
|
47
|
-
- [ ] DHT 全局发现 (实际已完成)
|
|
48
|
-
- [ ] 端到端加密 (实际已完成)
|
|
49
|
-
- [ ] 信誉系统 (Phase 1 已完成)
|
|
50
|
-
|
|
51
|
-
**需要更新为**:
|
|
52
|
-
- [x] 基础 P2P 网络 (libp2p)
|
|
53
|
-
- [x] Agent 发现与能力广播
|
|
54
|
-
- [x] 任务委托与响应
|
|
55
|
-
- [x] E2EE 端到端加密
|
|
56
|
-
- [x] DHT 全局发现
|
|
57
|
-
- [x] 中间件系统
|
|
58
|
-
- [x] 输入验证与速率限制
|
|
59
|
-
- [x] 结构化日志系统
|
|
60
|
-
- [x] 请求签名验证
|
|
61
|
-
- [x] 信誉系统 Phase 1
|
|
62
|
-
- [ ] 信誉系统 Phase 2 (评审机制)
|
|
63
|
-
- [ ] 信誉系统 Phase 3 (安全机制)
|
|
64
|
-
- [ ] 多 Agent 类型支持
|
|
65
|
-
|
|
66
|
-
### 7. 新增文档章节
|
|
67
|
-
**需要添加**:
|
|
68
|
-
- [ ] 中间件使用指南
|
|
69
|
-
- [ ] 性能基准测试指南
|
|
70
|
-
- [ ] 安全配置指南 (Token + 签名 + E2EE)
|
|
71
|
-
- [ ] 信誉系统使用指南
|
|
72
|
-
|
|
73
|
-
### 8. 测试覆盖率数据 ⚠️ 过时
|
|
74
|
-
**当前**: 显示旧数据
|
|
75
|
-
**需要更新**: 最新覆盖率统计
|
|
76
|
-
|
|
77
|
-
## 优先级
|
|
78
|
-
|
|
79
|
-
**P0 (必须立即更新)**:
|
|
80
|
-
1. 路线图 - 已完成的功能标记为完成
|
|
81
|
-
2. 环境变量 - 添加缺失的配置项
|
|
82
|
-
3. 安全注意事项 - 更新安全特性说明
|
|
83
|
-
|
|
84
|
-
**P1 (应该更新)**:
|
|
85
|
-
4. 架构概览 - 添加新组件
|
|
86
|
-
5. API 参考 - 补充新 API
|
|
87
|
-
|
|
88
|
-
**P2 (可以后续更新)**:
|
|
89
|
-
6. 新增文档章节
|
|
90
|
-
7. 测试覆盖率数据
|