@roomkit/state 1.1.2 → 1.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.
Files changed (59) hide show
  1. package/dist/State.d.ts +86 -0
  2. package/dist/State.d.ts.map +1 -0
  3. package/dist/State.js +279 -0
  4. package/dist/State.js.map +1 -0
  5. package/dist/collections/TrackedArray.d.ts +87 -0
  6. package/dist/collections/TrackedArray.d.ts.map +1 -0
  7. package/dist/collections/TrackedArray.js +203 -0
  8. package/dist/collections/TrackedArray.js.map +1 -0
  9. package/dist/collections/TrackedMap.d.ts +77 -0
  10. package/dist/collections/TrackedMap.d.ts.map +1 -0
  11. package/dist/collections/TrackedMap.js +183 -0
  12. package/dist/collections/TrackedMap.js.map +1 -0
  13. package/dist/collections/TrackedSet.d.ts +81 -0
  14. package/dist/collections/TrackedSet.d.ts.map +1 -0
  15. package/dist/collections/TrackedSet.js +175 -0
  16. package/dist/collections/TrackedSet.js.map +1 -0
  17. package/dist/collections/index.d.ts +9 -0
  18. package/dist/collections/index.d.ts.map +1 -0
  19. package/dist/collections/index.js +8 -0
  20. package/dist/collections/index.js.map +1 -0
  21. package/dist/compression/CompressionStrategy.d.ts +81 -0
  22. package/dist/compression/CompressionStrategy.d.ts.map +1 -0
  23. package/dist/compression/CompressionStrategy.js +195 -0
  24. package/dist/compression/CompressionStrategy.js.map +1 -0
  25. package/dist/compression/index.d.ts +5 -0
  26. package/dist/compression/index.d.ts.map +1 -0
  27. package/dist/compression/index.js +5 -0
  28. package/dist/compression/index.js.map +1 -0
  29. package/dist/decorators/index.d.ts +61 -0
  30. package/dist/decorators/index.d.ts.map +1 -0
  31. package/dist/decorators/index.js +136 -0
  32. package/dist/decorators/index.js.map +1 -0
  33. package/dist/encoding/index.d.ts +68 -0
  34. package/dist/encoding/index.d.ts.map +1 -0
  35. package/dist/encoding/index.js +227 -0
  36. package/dist/encoding/index.js.map +1 -0
  37. package/dist/index.js +8 -24
  38. package/dist/index.js.map +1 -1
  39. package/dist/optimization/BatchQueue.d.ts +96 -0
  40. package/dist/optimization/BatchQueue.d.ts.map +1 -0
  41. package/dist/optimization/BatchQueue.js +231 -0
  42. package/dist/optimization/BatchQueue.js.map +1 -0
  43. package/dist/optimization/index.d.ts +5 -0
  44. package/dist/optimization/index.d.ts.map +1 -0
  45. package/dist/optimization/index.js +5 -0
  46. package/dist/optimization/index.js.map +1 -0
  47. package/dist/tracking/ChangeTracker.d.ts +75 -0
  48. package/dist/tracking/ChangeTracker.d.ts.map +1 -0
  49. package/dist/tracking/ChangeTracker.js +341 -0
  50. package/dist/tracking/ChangeTracker.js.map +1 -0
  51. package/dist/tracking/deep-tracking.d.ts +22 -0
  52. package/dist/tracking/deep-tracking.d.ts.map +1 -0
  53. package/dist/tracking/deep-tracking.js +173 -0
  54. package/dist/tracking/deep-tracking.js.map +1 -0
  55. package/dist/types.d.ts +140 -0
  56. package/dist/types.d.ts.map +1 -0
  57. package/dist/types.js +21 -0
  58. package/dist/types.js.map +1 -0
  59. package/package.json +1 -1
@@ -0,0 +1,195 @@
1
+ /**
2
+ * 压缩策略管理器
3
+ * 根据数据大小和类型智能选择压缩方案
4
+ */
5
+ import { deflate, inflate } from 'pako';
6
+ /**
7
+ * 压缩策略
8
+ */
9
+ export class CompressionStrategy {
10
+ defaultOptions = {
11
+ threshold: 1024, // 1KB 以下不压缩
12
+ minCompressionRatio: 0.8, // 压缩率低于 80% 才使用
13
+ level: 6, // 默认压缩级别
14
+ force: false,
15
+ adaptive: true,
16
+ };
17
+ // 统计数据用于自适应
18
+ stats = {
19
+ totalAttempts: 0,
20
+ totalCompressed: 0,
21
+ totalSaved: 0,
22
+ averageRatio: 1.0,
23
+ };
24
+ constructor(options) {
25
+ if (options) {
26
+ this.defaultOptions = { ...this.defaultOptions, ...options };
27
+ }
28
+ }
29
+ /**
30
+ * 压缩数据
31
+ */
32
+ compress(data, options) {
33
+ const opts = { ...this.defaultOptions, ...options };
34
+ const originalSize = data.length;
35
+ // 太小不压缩
36
+ if (!opts.force && originalSize < opts.threshold) {
37
+ return {
38
+ data,
39
+ compressed: false,
40
+ originalSize,
41
+ compressedSize: originalSize,
42
+ compressionRatio: 1.0,
43
+ };
44
+ }
45
+ // 自适应:如果历史压缩效果不好,跳过
46
+ if (opts.adaptive && this.stats.totalAttempts > 10) {
47
+ if (this.stats.averageRatio > 0.95) {
48
+ return {
49
+ data,
50
+ compressed: false,
51
+ originalSize,
52
+ compressedSize: originalSize,
53
+ compressionRatio: 1.0,
54
+ };
55
+ }
56
+ }
57
+ try {
58
+ const startTime = Date.now();
59
+ const compressed = deflate(data, { level: opts.level });
60
+ const compressionTime = Date.now() - startTime;
61
+ const compressedSize = compressed.length;
62
+ const ratio = compressedSize / originalSize;
63
+ // 更新统计
64
+ this.stats.totalAttempts++;
65
+ // 压缩效果不好,不使用压缩结果
66
+ if (!opts.force && ratio > opts.minCompressionRatio) {
67
+ return {
68
+ data,
69
+ compressed: false,
70
+ originalSize,
71
+ compressedSize: originalSize,
72
+ compressionRatio: 1.0,
73
+ };
74
+ }
75
+ // 压缩成功
76
+ this.stats.totalCompressed++;
77
+ this.stats.totalSaved += (originalSize - compressedSize);
78
+ this.stats.averageRatio = (this.stats.averageRatio * (this.stats.totalAttempts - 1) + ratio) / this.stats.totalAttempts;
79
+ if (compressionTime > 100) {
80
+ console.warn(`[Compression] Slow compression: ${compressionTime}ms for ${originalSize} bytes`);
81
+ }
82
+ return {
83
+ data: compressed,
84
+ compressed: true,
85
+ originalSize,
86
+ compressedSize,
87
+ compressionRatio: ratio,
88
+ };
89
+ }
90
+ catch (error) {
91
+ console.error('[Compression] Error:', error);
92
+ return {
93
+ data,
94
+ compressed: false,
95
+ originalSize,
96
+ compressedSize: originalSize,
97
+ compressionRatio: 1.0,
98
+ };
99
+ }
100
+ }
101
+ /**
102
+ * 解压数据
103
+ */
104
+ decompress(data, compressed) {
105
+ if (!compressed)
106
+ return data;
107
+ try {
108
+ return inflate(data);
109
+ }
110
+ catch (error) {
111
+ console.error('[Compression] Decompress error:', error);
112
+ return data;
113
+ }
114
+ }
115
+ /**
116
+ * 批量压缩(用于多个小对象)
117
+ */
118
+ compressBatch(dataArray) {
119
+ // 合并所有数据
120
+ const totalSize = dataArray.reduce((sum, d) => sum + d.length, 0);
121
+ const merged = new Uint8Array(totalSize);
122
+ let offset = 0;
123
+ for (const data of dataArray) {
124
+ merged.set(data, offset);
125
+ offset += data.length;
126
+ }
127
+ // 压缩合并后的数据
128
+ return this.compress(merged);
129
+ }
130
+ /**
131
+ * 获取压缩统计
132
+ */
133
+ getStats() {
134
+ return {
135
+ ...this.stats,
136
+ compressionRate: this.stats.totalAttempts > 0
137
+ ? this.stats.totalCompressed / this.stats.totalAttempts
138
+ : 0,
139
+ averageSaving: this.stats.totalCompressed > 0
140
+ ? this.stats.totalSaved / this.stats.totalCompressed
141
+ : 0,
142
+ };
143
+ }
144
+ /**
145
+ * 重置统计
146
+ */
147
+ resetStats() {
148
+ this.stats = {
149
+ totalAttempts: 0,
150
+ totalCompressed: 0,
151
+ totalSaved: 0,
152
+ averageRatio: 1.0,
153
+ };
154
+ }
155
+ /**
156
+ * 根据数据类型建议压缩级别
157
+ */
158
+ static suggestLevel(dataType) {
159
+ switch (dataType) {
160
+ case 'text':
161
+ return 9; // 文本压缩效果好,使用最高级别
162
+ case 'binary':
163
+ return 3; // 二进制数据可能已压缩,使用低级别
164
+ case 'mixed':
165
+ default:
166
+ return 6; // 混合数据使用中等级别
167
+ }
168
+ }
169
+ /**
170
+ * 估算压缩后大小(不实际压缩)
171
+ */
172
+ static estimateSize(data) {
173
+ // 简单启发式估算
174
+ const size = data.length;
175
+ // 检查数据熵(重复模式)
176
+ const sample = data.slice(0, Math.min(1024, size));
177
+ const unique = new Set(sample);
178
+ const entropy = unique.size / sample.length;
179
+ // 高熵(随机)数据压缩效果差
180
+ if (entropy > 0.9) {
181
+ return Math.floor(size * 0.95); // 估计只能压缩 5%
182
+ }
183
+ // 低熵数据压缩效果好
184
+ if (entropy < 0.3) {
185
+ return Math.floor(size * 0.4); // 估计能压缩 60%
186
+ }
187
+ // 中等熵
188
+ return Math.floor(size * 0.7); // 估计能压缩 30%
189
+ }
190
+ }
191
+ /**
192
+ * 全局压缩策略实例
193
+ */
194
+ export const globalCompressionStrategy = new CompressionStrategy();
195
+ //# sourceMappingURL=CompressionStrategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CompressionStrategy.js","sourceRoot":"","sources":["../../src/compression/CompressionStrategy.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAqCxC;;GAEG;AACH,MAAM,OAAO,mBAAmB;IACtB,cAAc,GAAiC;QACrD,SAAS,EAAE,IAAI,EAAS,YAAY;QACpC,mBAAmB,EAAE,GAAG,EAAE,gBAAgB;QAC1C,KAAK,EAAE,CAAC,EAAgB,SAAS;QACjC,KAAK,EAAE,KAAK;QACZ,QAAQ,EAAE,IAAI;KACf,CAAC;IAEF,YAAY;IACJ,KAAK,GAAG;QACd,aAAa,EAAE,CAAC;QAChB,eAAe,EAAE,CAAC;QAClB,UAAU,EAAE,CAAC;QACb,YAAY,EAAE,GAAG;KAClB,CAAC;IAEF,YAAY,OAA4B;QACtC,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,cAAc,GAAG,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE,GAAG,OAAO,EAAE,CAAC;QAC/D,CAAC;IACH,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,IAAgB,EAAE,OAA4B;QACrD,MAAM,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE,GAAG,OAAO,EAAE,CAAC;QACpD,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC;QAEjC,QAAQ;QACR,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YACjD,OAAO;gBACL,IAAI;gBACJ,UAAU,EAAE,KAAK;gBACjB,YAAY;gBACZ,cAAc,EAAE,YAAY;gBAC5B,gBAAgB,EAAE,GAAG;aACtB,CAAC;QACJ,CAAC;QAED,oBAAoB;QACpB,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,EAAE,EAAE,CAAC;YACnD,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,EAAE,CAAC;gBACnC,OAAO;oBACL,IAAI;oBACJ,UAAU,EAAE,KAAK;oBACjB,YAAY;oBACZ,cAAc,EAAE,YAAY;oBAC5B,gBAAgB,EAAE,GAAG;iBACtB,CAAC;YACJ,CAAC;QACH,CAAC;QAED,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7B,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAA8C,EAAE,CAAC,CAAC;YACjG,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAE/C,MAAM,cAAc,GAAG,UAAU,CAAC,MAAM,CAAC;YACzC,MAAM,KAAK,GAAG,cAAc,GAAG,YAAY,CAAC;YAE5C,OAAO;YACP,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;YAE3B,iBAAiB;YACjB,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBACpD,OAAO;oBACL,IAAI;oBACJ,UAAU,EAAE,KAAK;oBACjB,YAAY;oBACZ,cAAc,EAAE,YAAY;oBAC5B,gBAAgB,EAAE,GAAG;iBACtB,CAAC;YACJ,CAAC;YAED,OAAO;YACP,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;YAC7B,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,YAAY,GAAG,cAAc,CAAC,CAAC;YACzD,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;YAExH,IAAI,eAAe,GAAG,GAAG,EAAE,CAAC;gBAC1B,OAAO,CAAC,IAAI,CAAC,mCAAmC,eAAe,UAAU,YAAY,QAAQ,CAAC,CAAC;YACjG,CAAC;YAED,OAAO;gBACL,IAAI,EAAE,UAAU;gBAChB,UAAU,EAAE,IAAI;gBAChB,YAAY;gBACZ,cAAc;gBACd,gBAAgB,EAAE,KAAK;aACxB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;YAC7C,OAAO;gBACL,IAAI;gBACJ,UAAU,EAAE,KAAK;gBACjB,YAAY;gBACZ,cAAc,EAAE,YAAY;gBAC5B,gBAAgB,EAAE,GAAG;aACtB,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,IAAgB,EAAE,UAAmB;QAC9C,IAAI,CAAC,UAAU;YAAE,OAAO,IAAI,CAAC;QAE7B,IAAI,CAAC;YACH,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;YACxD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,SAAuB;QACnC,SAAS;QACT,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAClE,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,CAAC;QAEzC,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACzB,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC;QACxB,CAAC;QAED,WAAW;QACX,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO;YACL,GAAG,IAAI,CAAC,KAAK;YACb,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,CAAC;gBAC3C,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa;gBACvD,CAAC,CAAC,CAAC;YACL,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,CAAC;gBAC3C,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe;gBACpD,CAAC,CAAC,CAAC;SACN,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,UAAU;QACR,IAAI,CAAC,KAAK,GAAG;YACX,aAAa,EAAE,CAAC;YAChB,eAAe,EAAE,CAAC;YAClB,UAAU,EAAE,CAAC;YACb,YAAY,EAAE,GAAG;SAClB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,QAAqC;QACvD,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,MAAM;gBACT,OAAO,CAAC,CAAC,CAAC,iBAAiB;YAC7B,KAAK,QAAQ;gBACX,OAAO,CAAC,CAAC,CAAC,mBAAmB;YAC/B,KAAK,OAAO,CAAC;YACb;gBACE,OAAO,CAAC,CAAC,CAAC,aAAa;QAC3B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,IAAgB;QAClC,UAAU;QACV,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;QAEzB,cAAc;QACd,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;QAC/B,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;QAE5C,gBAAgB;QAChB,IAAI,OAAO,GAAG,GAAG,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,YAAY;QAC9C,CAAC;QAED,YAAY;QACZ,IAAI,OAAO,GAAG,GAAG,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,YAAY;QAC7C,CAAC;QAED,MAAM;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,YAAY;IAC7C,CAAC;CACF;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,IAAI,mBAAmB,EAAE,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Compression utilities
3
+ */
4
+ export * from './CompressionStrategy.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/compression/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,0BAA0B,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Compression utilities
3
+ */
4
+ export * from './CompressionStrategy.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/compression/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,0BAA0B,CAAC"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * State Schema Decorators
3
+ */
4
+ import 'reflect-metadata';
5
+ import { FieldType, FieldMetadata } from '../types.js';
6
+ /**
7
+ * @Field - 定义一个可序列化的字段
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * class Player {
12
+ * @Field('string') name: string = '';
13
+ * @Field('number') health: number = 100;
14
+ * @Field('boolean') isAlive: boolean = true;
15
+ * }
16
+ * ```
17
+ */
18
+ export declare function Field(type: FieldType, optional?: boolean): (target: any, propertyKey: string) => void;
19
+ /**
20
+ * @MapField - 定义一个 Map 集合字段
21
+ *
22
+ * @example
23
+ * ```typescript
24
+ * class GameState {
25
+ * @MapField(Player) players = new Map<string, Player>();
26
+ * }
27
+ * ```
28
+ */
29
+ export declare function MapField(valueType: Function): (target: any, propertyKey: string) => void;
30
+ /**
31
+ * @ArrayField - 定义一个 Array 集合字段
32
+ *
33
+ * @example
34
+ * ```typescript
35
+ * class GameState {
36
+ * @ArrayField('number') scores: number[] = [];
37
+ * @ArrayField(Item) inventory: Item[] = [];
38
+ * }
39
+ * ```
40
+ */
41
+ export declare function ArrayField(type: FieldType): (target: any, propertyKey: string) => void;
42
+ /**
43
+ * @SetField - 定义一个 Set 集合字段
44
+ *
45
+ * @example
46
+ * ```typescript
47
+ * class GameState {
48
+ * @SetField('string') activePlayers = new Set<string>();
49
+ * }
50
+ * ```
51
+ */
52
+ export declare function SetField(type: FieldType): (target: any, propertyKey: string) => void;
53
+ /**
54
+ * 获取类的所有字段元数据
55
+ */
56
+ export declare function getFieldsMetadata(target: any): Map<string, FieldMetadata>;
57
+ /**
58
+ * 检查对象是否有 State 装饰器定义
59
+ */
60
+ export declare function hasStateMetadata(target: any): boolean;
61
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/decorators/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,aAAa,EAAiB,MAAM,aAAa,CAAC;AAgBtE;;;;;;;;;;;GAWG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,GAAE,OAAe,IAC7C,QAAQ,GAAG,EAAE,aAAa,MAAM,UAYlD;AAED;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,SAAS,EAAE,QAAQ,IACzB,QAAQ,GAAG,EAAE,aAAa,MAAM,UAWlD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,SAAS,IACvB,QAAQ,GAAG,EAAE,aAAa,MAAM,UAWlD;AAED;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,SAAS,IACrB,QAAQ,GAAG,EAAE,aAAa,MAAM,UAWlD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,GAAG,GAAG,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAgBzE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAGrD"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * State Schema Decorators
3
+ */
4
+ import 'reflect-metadata';
5
+ import { METADATA_KEYS } from '../types.js';
6
+ /**
7
+ * 获取或创建类的字段元数据
8
+ */
9
+ function getOrCreateFieldsMetadata(target) {
10
+ if (!target)
11
+ return new Map();
12
+ let fields = Reflect.getMetadata(METADATA_KEYS.FIELDS, target);
13
+ if (!fields) {
14
+ fields = new Map();
15
+ Reflect.defineMetadata(METADATA_KEYS.FIELDS, fields, target);
16
+ }
17
+ return fields;
18
+ }
19
+ /**
20
+ * @Field - 定义一个可序列化的字段
21
+ *
22
+ * @example
23
+ * ```typescript
24
+ * class Player {
25
+ * @Field('string') name: string = '';
26
+ * @Field('number') health: number = 100;
27
+ * @Field('boolean') isAlive: boolean = true;
28
+ * }
29
+ * ```
30
+ */
31
+ export function Field(type, optional = false) {
32
+ return function (target, propertyKey) {
33
+ const fields = getOrCreateFieldsMetadata(target);
34
+ fields.set(propertyKey, {
35
+ key: propertyKey,
36
+ type,
37
+ isArray: false,
38
+ isMap: false,
39
+ isSet: false,
40
+ optional,
41
+ });
42
+ };
43
+ }
44
+ /**
45
+ * @MapField - 定义一个 Map 集合字段
46
+ *
47
+ * @example
48
+ * ```typescript
49
+ * class GameState {
50
+ * @MapField(Player) players = new Map<string, Player>();
51
+ * }
52
+ * ```
53
+ */
54
+ export function MapField(valueType) {
55
+ return function (target, propertyKey) {
56
+ const fields = getOrCreateFieldsMetadata(target);
57
+ fields.set(propertyKey, {
58
+ key: propertyKey,
59
+ type: valueType,
60
+ isArray: false,
61
+ isMap: true,
62
+ isSet: false,
63
+ });
64
+ };
65
+ }
66
+ /**
67
+ * @ArrayField - 定义一个 Array 集合字段
68
+ *
69
+ * @example
70
+ * ```typescript
71
+ * class GameState {
72
+ * @ArrayField('number') scores: number[] = [];
73
+ * @ArrayField(Item) inventory: Item[] = [];
74
+ * }
75
+ * ```
76
+ */
77
+ export function ArrayField(type) {
78
+ return function (target, propertyKey) {
79
+ const fields = getOrCreateFieldsMetadata(target);
80
+ fields.set(propertyKey, {
81
+ key: propertyKey,
82
+ type,
83
+ isArray: true,
84
+ isMap: false,
85
+ isSet: false,
86
+ });
87
+ };
88
+ }
89
+ /**
90
+ * @SetField - 定义一个 Set 集合字段
91
+ *
92
+ * @example
93
+ * ```typescript
94
+ * class GameState {
95
+ * @SetField('string') activePlayers = new Set<string>();
96
+ * }
97
+ * ```
98
+ */
99
+ export function SetField(type) {
100
+ return function (target, propertyKey) {
101
+ const fields = getOrCreateFieldsMetadata(target);
102
+ fields.set(propertyKey, {
103
+ key: propertyKey,
104
+ type,
105
+ isArray: false,
106
+ isMap: false,
107
+ isSet: true,
108
+ });
109
+ };
110
+ }
111
+ /**
112
+ * 获取类的所有字段元数据
113
+ */
114
+ export function getFieldsMetadata(target) {
115
+ if (!target)
116
+ return new Map();
117
+ // 尝试从实例获取
118
+ let fields = Reflect.hasMetadata(METADATA_KEYS.FIELDS, target)
119
+ ? Reflect.getMetadata(METADATA_KEYS.FIELDS, target)
120
+ : undefined;
121
+ // 如果没有,尝试从原型获取
122
+ if (!fields && target.constructor && target.constructor.prototype) {
123
+ fields = Reflect.hasMetadata(METADATA_KEYS.FIELDS, target.constructor.prototype)
124
+ ? Reflect.getMetadata(METADATA_KEYS.FIELDS, target.constructor.prototype)
125
+ : undefined;
126
+ }
127
+ return fields || new Map();
128
+ }
129
+ /**
130
+ * 检查对象是否有 State 装饰器定义
131
+ */
132
+ export function hasStateMetadata(target) {
133
+ const fields = getFieldsMetadata(target);
134
+ return fields.size > 0;
135
+ }
136
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/decorators/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * State Encoding and Decoding
3
+ * 使用 MessagePack 进行高性能二进制编码
4
+ */
5
+ import { CompressionStrategy } from '../compression/CompressionStrategy.js';
6
+ import type { Patch, EncodedState, EncodeOptions, DecodeOptions } from '../types.js';
7
+ /**
8
+ * StateEncoder - 状态编码器
9
+ */
10
+ export declare class StateEncoder {
11
+ private compressionStrategy;
12
+ constructor(compressionStrategy?: CompressionStrategy);
13
+ /**
14
+ * 编码完整状态
15
+ */
16
+ encodeFull(state: any, options?: EncodeOptions): EncodedState;
17
+ /**
18
+ * 编码增量变化
19
+ */
20
+ encodeDelta(patches: Patch[], options?: EncodeOptions): EncodedState;
21
+ /**
22
+ * 获取压缩统计
23
+ */
24
+ getCompressionStats(): {
25
+ compressionRate: number;
26
+ averageSaving: number;
27
+ totalAttempts: number;
28
+ totalCompressed: number;
29
+ totalSaved: number;
30
+ averageRatio: number;
31
+ };
32
+ /**
33
+ * 重置压缩统计
34
+ */
35
+ resetCompressionStats(): void;
36
+ /**
37
+ * 序列化对象
38
+ */
39
+ private serializeObject;
40
+ /**
41
+ * 序列化值
42
+ */
43
+ private serializeValue;
44
+ }
45
+ /**
46
+ * StateDecoder - 状态解码器
47
+ */
48
+ export declare class StateDecoder {
49
+ private compressionStrategy;
50
+ constructor(compressionStrategy?: CompressionStrategy);
51
+ /**
52
+ * 解码二进制数据
53
+ */
54
+ decode<T = any>(data: Uint8Array, options?: DecodeOptions): T;
55
+ /**
56
+ * 应用 Patches 到对象
57
+ */
58
+ applyPatches(target: any, patches: Patch[]): void;
59
+ /**
60
+ * 应用单个 Patch
61
+ */
62
+ private applyPatch;
63
+ /**
64
+ * 反序列化对象
65
+ */
66
+ private deserializeObject;
67
+ }
68
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/encoding/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AAE5E,OAAO,KAAK,EACV,KAAK,EACL,YAAY,EACZ,aAAa,EACb,aAAa,EAEd,MAAM,aAAa,CAAC;AAErB;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,mBAAmB,CAAsB;gBAErC,mBAAmB,CAAC,EAAE,mBAAmB;IAIrD;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,GAAE,aAAkB,GAAG,YAAY;IAuBjE;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,GAAE,aAAkB,GAAG,YAAY;IAoBxE;;OAEG;IACH,mBAAmB;;;;;;;;IAInB;;OAEG;IACH,qBAAqB;IAIrB;;OAEG;IACH,OAAO,CAAC,eAAe;IAoCvB;;OAEG;IACH,OAAO,CAAC,cAAc;CAevB;AAED;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,mBAAmB,CAAsB;gBAErC,mBAAmB,CAAC,EAAE,mBAAmB;IAIrD;;OAEG;IACH,MAAM,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,GAAE,aAAkB,GAAG,CAAC;IAWjE;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,IAAI;IAMjD;;OAEG;IACH,OAAO,CAAC,UAAU;IAoDlB;;OAEG;IACH,OAAO,CAAC,iBAAiB;CA+B1B"}