@lzpenguin/server 1.0.5 → 1.0.7
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/README.md +2 -163
- package/index.d.ts +2 -72
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -37,80 +37,6 @@ server.init({
|
|
|
37
37
|
});
|
|
38
38
|
```
|
|
39
39
|
|
|
40
|
-
## 新特性 🎉
|
|
41
|
-
|
|
42
|
-
### 同步优化(v2.0+)
|
|
43
|
-
|
|
44
|
-
我们对同步机制进行了全面优化,提供更可靠和高效的数据同步:
|
|
45
|
-
|
|
46
|
-
#### 1. **时间戳和序列号**
|
|
47
|
-
- ✅ 每条消息都包含服务器时间戳和序列号
|
|
48
|
-
- ✅ 自动检测消息丢失和延迟警告
|
|
49
|
-
- ✅ 确保数据按正确顺序处理
|
|
50
|
-
- ✅ 实时显示网络延迟和序列号状态
|
|
51
|
-
|
|
52
|
-
```javascript
|
|
53
|
-
server.onData((data) => {
|
|
54
|
-
console.log('时间戳:', data.timestamp);
|
|
55
|
-
console.log('序列号:', data.sequence);
|
|
56
|
-
console.log('数据:', data.world);
|
|
57
|
-
});
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
#### 2. **操作确认机制**
|
|
61
|
-
- 支持回调确认每个更新操作
|
|
62
|
-
- 自动超时检测(5秒)
|
|
63
|
-
- 返回唯一操作ID用于追踪
|
|
64
|
-
|
|
65
|
-
```javascript
|
|
66
|
-
server.update({
|
|
67
|
-
world: { score: 100 }
|
|
68
|
-
}, (error, result) => {
|
|
69
|
-
if (error) {
|
|
70
|
-
console.error('更新失败:', error);
|
|
71
|
-
} else {
|
|
72
|
-
console.log('更新已确认:', result);
|
|
73
|
-
}
|
|
74
|
-
});
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
#### 3. **增量更新**
|
|
78
|
-
- 只发送变化的数据,节省带宽
|
|
79
|
-
- 支持数组追加操作
|
|
80
|
-
- 特别适合笔画等增量数据
|
|
81
|
-
|
|
82
|
-
```javascript
|
|
83
|
-
server.updateDelta({
|
|
84
|
-
world: {
|
|
85
|
-
strokes: {
|
|
86
|
-
$append: [newStroke] // 只追加新笔画
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}, (error, result) => {
|
|
90
|
-
console.log('增量更新完成');
|
|
91
|
-
});
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
#### 4. **自适应推送频率**
|
|
95
|
-
- 服务器根据活动情况动态调整推送频率
|
|
96
|
-
- 高活动:50ms 推送一次
|
|
97
|
-
- 中活动:100ms 推送一次
|
|
98
|
-
- 低活动:200ms 推送一次
|
|
99
|
-
- 无活动:500ms 推送一次
|
|
100
|
-
|
|
101
|
-
#### 5. **统计信息**
|
|
102
|
-
- 实时查看连接状态和同步统计
|
|
103
|
-
- 监控消息丢失和延迟
|
|
104
|
-
|
|
105
|
-
```javascript
|
|
106
|
-
const stats = server.getStats();
|
|
107
|
-
console.log('连接状态:', stats.connected);
|
|
108
|
-
console.log('本地序列号:', stats.localSequence);
|
|
109
|
-
console.log('最后接收序列号:', stats.lastReceivedSequence);
|
|
110
|
-
console.log('待确认操作数:', stats.pendingOperations);
|
|
111
|
-
console.log('更新次数:', stats.updateCount);
|
|
112
|
-
```
|
|
113
|
-
|
|
114
40
|
## API
|
|
115
41
|
|
|
116
42
|
### 构造函数
|
|
@@ -168,20 +94,9 @@ server.init({
|
|
|
168
94
|
部分更新数据(合并到现有数据,不替换)。
|
|
169
95
|
|
|
170
96
|
```javascript
|
|
171
|
-
//
|
|
97
|
+
// 更新世界数据
|
|
172
98
|
server.update({ world: { score: 200 } });
|
|
173
99
|
|
|
174
|
-
// 带确认回调的更新(推荐)
|
|
175
|
-
server.update({
|
|
176
|
-
world: { score: 200 }
|
|
177
|
-
}, (error, result) => {
|
|
178
|
-
if (error) {
|
|
179
|
-
console.error('更新失败:', error);
|
|
180
|
-
} else {
|
|
181
|
-
console.log('更新已确认');
|
|
182
|
-
}
|
|
183
|
-
});
|
|
184
|
-
|
|
185
100
|
// 更新玩家数据
|
|
186
101
|
server.update({
|
|
187
102
|
self: {
|
|
@@ -197,12 +112,6 @@ server.update({
|
|
|
197
112
|
});
|
|
198
113
|
```
|
|
199
114
|
|
|
200
|
-
**参数:**
|
|
201
|
-
- `updateData`: 要更新的数据对象
|
|
202
|
-
- `callback` (可选): 确认回调函数 `(error, result) => {}`
|
|
203
|
-
|
|
204
|
-
**返回值:** 操作ID(字符串),可用于追踪操作
|
|
205
|
-
|
|
206
115
|
**响应数据(通过 onData 接收):**
|
|
207
116
|
```json
|
|
208
117
|
{
|
|
@@ -235,11 +144,9 @@ unsubscribe();
|
|
|
235
144
|
**数据格式:**
|
|
236
145
|
```json
|
|
237
146
|
{
|
|
238
|
-
"timestamp": 1705123456789,
|
|
239
|
-
"sequence": 42,
|
|
240
147
|
"world": { "score": 200, "level": 1 },
|
|
241
148
|
"self": {
|
|
242
|
-
"public": { "name": "Player1", "position": { "x": 15, y: 25 } },
|
|
149
|
+
"public": { "name": "Player1", "position": { "x": 15, "y": 25 } },
|
|
243
150
|
"private": { "health": 90, "mana": 50 }
|
|
244
151
|
},
|
|
245
152
|
"players": [
|
|
@@ -249,74 +156,6 @@ unsubscribe();
|
|
|
249
156
|
}
|
|
250
157
|
```
|
|
251
158
|
|
|
252
|
-
**字段说明:**
|
|
253
|
-
- `timestamp`: 服务器时间戳(毫秒)
|
|
254
|
-
- `sequence`: 消息序列号(用于检测消息丢失)
|
|
255
|
-
- `world`: 世界数据
|
|
256
|
-
- `self`: 当前玩家数据
|
|
257
|
-
- `players`: 其他玩家数据
|
|
258
|
-
|
|
259
|
-
### 4. updateDelta() - 增量更新 ✨
|
|
260
|
-
|
|
261
|
-
只发送变化的数据,适合频繁更新的场景(如画板笔画)。
|
|
262
|
-
|
|
263
|
-
```javascript
|
|
264
|
-
// 追加新笔画(不发送整个数组)
|
|
265
|
-
const newStroke = {
|
|
266
|
-
id: 'stroke_123',
|
|
267
|
-
points: [{ x: 0, y: 0 }, { x: 10, y: 10 }],
|
|
268
|
-
color: '#FF0000',
|
|
269
|
-
width: 2
|
|
270
|
-
};
|
|
271
|
-
|
|
272
|
-
server.updateDelta({
|
|
273
|
-
world: {
|
|
274
|
-
strokes: {
|
|
275
|
-
$append: [newStroke] // 使用 $append 标记表示追加
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
}, (error, result) => {
|
|
279
|
-
if (!error) {
|
|
280
|
-
console.log('笔画已添加');
|
|
281
|
-
}
|
|
282
|
-
});
|
|
283
|
-
```
|
|
284
|
-
|
|
285
|
-
**参数:**
|
|
286
|
-
- `delta`: 增量数据对象(支持 `$append` 等特殊操作)
|
|
287
|
-
- `callback` (可选): 确认回调函数
|
|
288
|
-
|
|
289
|
-
**返回值:** 操作ID
|
|
290
|
-
|
|
291
|
-
### 5. getStats() - 获取统计信息 ✨
|
|
292
|
-
|
|
293
|
-
获取实时同步统计信息,用于监控和调试。
|
|
294
|
-
|
|
295
|
-
```javascript
|
|
296
|
-
const stats = server.getStats();
|
|
297
|
-
console.log(stats);
|
|
298
|
-
// {
|
|
299
|
-
// connected: true,
|
|
300
|
-
// initialized: true,
|
|
301
|
-
// localSequence: 10,
|
|
302
|
-
// lastReceivedSequence: 8,
|
|
303
|
-
// lastReceivedTimestamp: 1705123456789,
|
|
304
|
-
// pendingOperations: 2,
|
|
305
|
-
// updateCount: 10,
|
|
306
|
-
// lastUpdateTime: 1705123456789
|
|
307
|
-
// }
|
|
308
|
-
```
|
|
309
|
-
|
|
310
|
-
**返回值:**
|
|
311
|
-
- `connected`: 是否已连接
|
|
312
|
-
- `initialized`: 是否已初始化
|
|
313
|
-
- `localSequence`: 本地发送的序列号
|
|
314
|
-
- `lastReceivedSequence`: 最后接收的序列号
|
|
315
|
-
- `lastReceivedTimestamp`: 最后接收的时间戳
|
|
316
|
-
- `pendingOperations`: 待确认的操作数量
|
|
317
|
-
- `updateCount`: 总更新次数
|
|
318
|
-
- `lastUpdateTime`: 最后更新时间
|
|
319
|
-
|
|
320
159
|
**推送时机:** init 响应、定时推送(每 0.2 秒)、init/update 后立即推送
|
|
321
160
|
|
|
322
161
|
## 联机游戏示例
|
package/index.d.ts
CHANGED
|
@@ -54,10 +54,6 @@ export interface UpdateData {
|
|
|
54
54
|
* 服务器推送的数据
|
|
55
55
|
*/
|
|
56
56
|
export interface ServerData {
|
|
57
|
-
/** 服务器时间戳(毫秒) */
|
|
58
|
-
timestamp?: number;
|
|
59
|
-
/** 消息序列号 */
|
|
60
|
-
sequence?: number;
|
|
61
57
|
/** 世界数据 */
|
|
62
58
|
world: Record<string, any>;
|
|
63
59
|
/** 当前玩家数据 */
|
|
@@ -66,43 +62,6 @@ export interface ServerData {
|
|
|
66
62
|
players: Array<Record<string, any>>;
|
|
67
63
|
}
|
|
68
64
|
|
|
69
|
-
/**
|
|
70
|
-
* 增量更新数据
|
|
71
|
-
*/
|
|
72
|
-
export interface DeltaData {
|
|
73
|
-
/** 世界数据(支持 $append 等特殊操作) */
|
|
74
|
-
world?: Record<string, any>;
|
|
75
|
-
/** 玩家数据 */
|
|
76
|
-
self?: PlayerSelfData;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* 统计信息
|
|
81
|
-
*/
|
|
82
|
-
export interface Stats {
|
|
83
|
-
/** 是否已连接 */
|
|
84
|
-
connected: boolean;
|
|
85
|
-
/** 是否已初始化 */
|
|
86
|
-
initialized: boolean;
|
|
87
|
-
/** 本地发送的序列号 */
|
|
88
|
-
localSequence: number;
|
|
89
|
-
/** 最后接收的序列号 */
|
|
90
|
-
lastReceivedSequence: number;
|
|
91
|
-
/** 最后接收的时间戳 */
|
|
92
|
-
lastReceivedTimestamp: number;
|
|
93
|
-
/** 待确认的操作数量 */
|
|
94
|
-
pendingOperations: number;
|
|
95
|
-
/** 总更新次数 */
|
|
96
|
-
updateCount: number;
|
|
97
|
-
/** 最后更新时间 */
|
|
98
|
-
lastUpdateTime: number;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* 确认回调函数
|
|
103
|
-
*/
|
|
104
|
-
export type ConfirmCallback = (error: Error | null, result: { confirmed: boolean } | null) => void;
|
|
105
|
-
|
|
106
65
|
/**
|
|
107
66
|
* RiffleServer - 游戏服务器 WebSocket 客户端
|
|
108
67
|
*/
|
|
@@ -123,43 +82,14 @@ export class RiffleServer {
|
|
|
123
82
|
/**
|
|
124
83
|
* 初始化服务器(必需,连接后必须先调用)
|
|
125
84
|
* @param initData 初始化数据
|
|
126
|
-
* @param callback 确认回调函数(可选)
|
|
127
|
-
* @returns 操作ID(如果已连接)
|
|
128
85
|
*/
|
|
129
|
-
init(initData: InitData
|
|
86
|
+
init(initData: InitData): void;
|
|
130
87
|
|
|
131
88
|
/**
|
|
132
89
|
* 更新数据(部分更新,合并到现有数据)
|
|
133
90
|
* @param updateData 更新数据
|
|
134
|
-
* @param callback 确认回调函数(可选)
|
|
135
|
-
* @returns 操作ID
|
|
136
|
-
*/
|
|
137
|
-
update(updateData: UpdateData, callback?: ConfirmCallback): string | null;
|
|
138
|
-
|
|
139
|
-
/**
|
|
140
|
-
* 增量更新(只发送变化的数据)
|
|
141
|
-
* @param delta 增量数据
|
|
142
|
-
* @param callback 确认回调函数(可选)
|
|
143
|
-
* @returns 操作ID
|
|
144
|
-
* @example
|
|
145
|
-
* ```typescript
|
|
146
|
-
* // 只追加新笔画,而不是发送整个数组
|
|
147
|
-
* server.updateDelta({
|
|
148
|
-
* world: {
|
|
149
|
-
* strokes: {
|
|
150
|
-
* $append: [newStroke]
|
|
151
|
-
* }
|
|
152
|
-
* }
|
|
153
|
-
* });
|
|
154
|
-
* ```
|
|
155
|
-
*/
|
|
156
|
-
updateDelta(delta: DeltaData, callback?: ConfirmCallback): string | null;
|
|
157
|
-
|
|
158
|
-
/**
|
|
159
|
-
* 获取同步统计信息
|
|
160
|
-
* @returns 统计信息对象
|
|
161
91
|
*/
|
|
162
|
-
|
|
92
|
+
update(updateData: UpdateData): void;
|
|
163
93
|
|
|
164
94
|
/**
|
|
165
95
|
* 监听服务器推送的最新数据
|