@roomkit/state 1.1.1 → 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 +10 -10
@@ -0,0 +1,86 @@
1
+ /**
2
+ * State - 状态基类
3
+ * 所有游戏状态类都应继承此类
4
+ */
5
+ import type { Patch, EncodedState, EncodeOptions, TrackingOptions } from './types.js';
6
+ /**
7
+ * State 基类
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * class GameState extends State {
12
+ * @MapField(Player) players = new Map();
13
+ * @Field('string') status = 'waiting';
14
+ *
15
+ * constructor() {
16
+ * super();
17
+ * this.startTracking(); // 开始自动追踪
18
+ * }
19
+ * }
20
+ * ```
21
+ */
22
+ export declare class State {
23
+ private _tracker?;
24
+ private _encoder;
25
+ private _isTracking;
26
+ constructor();
27
+ /**
28
+ * 开始追踪状态变化
29
+ */
30
+ startTracking(options?: TrackingOptions): void;
31
+ /**
32
+ * 将普通集合转换为 Tracked 集合
33
+ */
34
+ private convertToTrackedCollections;
35
+ /**
36
+ * 停止追踪状态变化
37
+ */
38
+ stopTracking(): void;
39
+ /**
40
+ * 是否正在追踪
41
+ */
42
+ get isTracking(): boolean;
43
+ /**
44
+ * 获取累积的变化(JSON Patch 格式)
45
+ * 包括 Tracked 集合的变化
46
+ */
47
+ getPatches(): Patch[];
48
+ /**
49
+ * 清除累积的变化
50
+ */
51
+ clearChanges(): void;
52
+ /**
53
+ * 是否有变化
54
+ */
55
+ hasChanges(): boolean;
56
+ /**
57
+ * 编码状态为二进制格式
58
+ * @param full 是否编码完整状态(true)或仅编码变化(false)
59
+ */
60
+ encode(full?: boolean, options?: EncodeOptions): EncodedState;
61
+ /**
62
+ * 从编码数据解码
63
+ */
64
+ static decode<T extends State>(this: new () => T, encoded: EncodedState | Uint8Array): T;
65
+ /**
66
+ * 应用 Patch 到状态
67
+ */
68
+ applyPatches(patches: Patch[]): void;
69
+ /**
70
+ * 克隆状态(深拷贝)
71
+ */
72
+ clone(): this;
73
+ /**
74
+ * 转换为普通对象
75
+ */
76
+ toJSON(): any;
77
+ /**
78
+ * 从普通对象恢复状态
79
+ */
80
+ fromJSON(data: any): void;
81
+ /**
82
+ * 获取状态的字段元数据
83
+ */
84
+ getMetadata(): Map<string, import("./types.js").FieldMetadata>;
85
+ }
86
+ //# sourceMappingURL=State.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"State.d.ts","sourceRoot":"","sources":["../src/State.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEtF;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,KAAK;IAChB,OAAO,CAAC,QAAQ,CAAC,CAAgB;IACjC,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,WAAW,CAAS;;IAM5B;;OAEG;IACH,aAAa,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,IAAI;IAa9C;;OAEG;IACH,OAAO,CAAC,2BAA2B;IA0CnC;;OAEG;IACH,YAAY,IAAI,IAAI;IAOpB;;OAEG;IACH,IAAI,UAAU,IAAI,OAAO,CAExB;IAED;;;OAGG;IACH,UAAU,IAAI,KAAK,EAAE;IAsBrB;;OAEG;IACH,YAAY,IAAI,IAAI;IAgBpB;;OAEG;IACH,UAAU,IAAI,OAAO;IAerB;;;OAGG;IACH,MAAM,CAAC,IAAI,GAAE,OAAe,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,YAAY;IASpE;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,KAAK,EAC3B,IAAI,EAAE,UAAU,CAAC,EACjB,OAAO,EAAE,YAAY,GAAG,UAAU,GACjC,CAAC;IAUJ;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,IAAI;IAKpC;;OAEG;IACH,KAAK,IAAI,IAAI;IAgCb;;OAEG;IACH,MAAM,IAAI,GAAG;IA0Bb;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI;IAkBzB;;OAEG;IACH,WAAW;CAGZ"}
package/dist/State.js ADDED
@@ -0,0 +1,279 @@
1
+ /**
2
+ * State - 状态基类
3
+ * 所有游戏状态类都应继承此类
4
+ */
5
+ import { getFieldsMetadata } from './decorators/index.js';
6
+ import { ChangeTracker } from './tracking/ChangeTracker.js';
7
+ import { StateEncoder, StateDecoder } from './encoding/index.js';
8
+ import { extractChanges, clearAllChanges } from './tracking/deep-tracking.js';
9
+ import { TrackedMap } from './collections/TrackedMap.js';
10
+ import { TrackedArray } from './collections/TrackedArray.js';
11
+ import { TrackedSet } from './collections/TrackedSet.js';
12
+ /**
13
+ * State 基类
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * class GameState extends State {
18
+ * @MapField(Player) players = new Map();
19
+ * @Field('string') status = 'waiting';
20
+ *
21
+ * constructor() {
22
+ * super();
23
+ * this.startTracking(); // 开始自动追踪
24
+ * }
25
+ * }
26
+ * ```
27
+ */
28
+ export class State {
29
+ _tracker;
30
+ _encoder;
31
+ _isTracking = false;
32
+ constructor() {
33
+ this._encoder = new StateEncoder();
34
+ }
35
+ /**
36
+ * 开始追踪状态变化
37
+ */
38
+ startTracking(options) {
39
+ if (this._isTracking)
40
+ return;
41
+ this._tracker = new ChangeTracker(this, options);
42
+ this._tracker.start();
43
+ this._tracker.hookProperties(this);
44
+ // 将集合类型转换为 Tracked 版本
45
+ this.convertToTrackedCollections();
46
+ this._isTracking = true;
47
+ }
48
+ /**
49
+ * 将普通集合转换为 Tracked 集合
50
+ */
51
+ convertToTrackedCollections() {
52
+ const fields = getFieldsMetadata(this);
53
+ fields.forEach((metadata, key) => {
54
+ const value = this[key];
55
+ if (!value)
56
+ return;
57
+ const basePath = `/${key}`;
58
+ // 转换为 Tracked 版本并开始追踪
59
+ if (metadata.isMap && value instanceof Map && !(value instanceof TrackedMap)) {
60
+ const tracked = new TrackedMap(basePath, Array.from(value.entries()));
61
+ tracked.startTracking();
62
+ tracked.onChange((patches) => {
63
+ // 收集来自集合的变化
64
+ patches.forEach(patch => {
65
+ this._tracker?.recordExternalChange(patch);
66
+ });
67
+ });
68
+ this[key] = tracked;
69
+ }
70
+ else if (metadata.isArray && Array.isArray(value) && !(value instanceof TrackedArray)) {
71
+ const tracked = new TrackedArray(basePath, ...value);
72
+ tracked.startTracking();
73
+ tracked.onChange((patches) => {
74
+ patches.forEach(patch => {
75
+ this._tracker?.recordExternalChange(patch);
76
+ });
77
+ });
78
+ this[key] = tracked;
79
+ }
80
+ else if (metadata.isSet && value instanceof Set && !(value instanceof TrackedSet)) {
81
+ const tracked = new TrackedSet(basePath, Array.from(value));
82
+ tracked.startTracking();
83
+ tracked.onChange((patches) => {
84
+ patches.forEach(patch => {
85
+ this._tracker?.recordExternalChange(patch);
86
+ });
87
+ });
88
+ this[key] = tracked;
89
+ }
90
+ });
91
+ }
92
+ /**
93
+ * 停止追踪状态变化
94
+ */
95
+ stopTracking() {
96
+ if (!this._isTracking)
97
+ return;
98
+ this._tracker?.stop();
99
+ this._isTracking = false;
100
+ }
101
+ /**
102
+ * 是否正在追踪
103
+ */
104
+ get isTracking() {
105
+ return this._isTracking;
106
+ }
107
+ /**
108
+ * 获取累积的变化(JSON Patch 格式)
109
+ * 包括 Tracked 集合的变化
110
+ */
111
+ getPatches() {
112
+ if (!this._tracker)
113
+ return [];
114
+ const patches = this._tracker.getPatches();
115
+ // 收集 Tracked 集合的变化
116
+ const fields = getFieldsMetadata(this);
117
+ fields.forEach((metadata, key) => {
118
+ const value = this[key];
119
+ if (value instanceof TrackedMap || value instanceof TrackedArray || value instanceof TrackedSet) {
120
+ const collectionChanges = value.getChanges();
121
+ patches.push(...collectionChanges);
122
+ }
123
+ });
124
+ // 递归收集嵌套对象的变化
125
+ const deepChanges = extractChanges(this);
126
+ patches.push(...deepChanges);
127
+ return patches;
128
+ }
129
+ /**
130
+ * 清除累积的变化
131
+ */
132
+ clearChanges() {
133
+ this._tracker?.clearChanges();
134
+ // 清除 Tracked 集合的变化
135
+ const fields = getFieldsMetadata(this);
136
+ fields.forEach((metadata, key) => {
137
+ const value = this[key];
138
+ if (value instanceof TrackedMap || value instanceof TrackedArray || value instanceof TrackedSet) {
139
+ value.clearChanges();
140
+ }
141
+ });
142
+ // 递归清除嵌套对象的变化
143
+ clearAllChanges(this);
144
+ }
145
+ /**
146
+ * 是否有变化
147
+ */
148
+ hasChanges() {
149
+ if (this._tracker?.hasChanges())
150
+ return true;
151
+ // 检查 Tracked 集合是否有变化
152
+ const fields = getFieldsMetadata(this);
153
+ for (const [key, metadata] of fields) {
154
+ const value = this[key];
155
+ if (value instanceof TrackedMap || value instanceof TrackedArray || value instanceof TrackedSet) {
156
+ if (value.getChanges().length > 0)
157
+ return true;
158
+ }
159
+ }
160
+ return false;
161
+ }
162
+ /**
163
+ * 编码状态为二进制格式
164
+ * @param full 是否编码完整状态(true)或仅编码变化(false)
165
+ */
166
+ encode(full = false, options) {
167
+ if (full) {
168
+ return this._encoder.encodeFull(this, options);
169
+ }
170
+ else {
171
+ const patches = this.getPatches();
172
+ return this._encoder.encodeDelta(patches, options);
173
+ }
174
+ }
175
+ /**
176
+ * 从编码数据解码
177
+ */
178
+ static decode(encoded) {
179
+ const decoder = new StateDecoder();
180
+ const data = encoded instanceof Uint8Array ? encoded : encoded.data;
181
+ const decompressed = encoded instanceof Uint8Array
182
+ ? false
183
+ : encoded.compressed;
184
+ return decoder.decode(data, { decompress: decompressed });
185
+ }
186
+ /**
187
+ * 应用 Patch 到状态
188
+ */
189
+ applyPatches(patches) {
190
+ const decoder = new StateDecoder();
191
+ decoder.applyPatches(this, patches);
192
+ }
193
+ /**
194
+ * 克隆状态(深拷贝)
195
+ */
196
+ clone() {
197
+ const Constructor = this.constructor;
198
+ const cloned = new Constructor();
199
+ const fields = getFieldsMetadata(this);
200
+ fields.forEach((metadata, key) => {
201
+ const value = this[key];
202
+ if (value === undefined || value === null) {
203
+ cloned[key] = value;
204
+ return;
205
+ }
206
+ // 处理不同类型的字段
207
+ if (metadata.isMap && value instanceof Map) {
208
+ cloned[key] = new Map(value);
209
+ }
210
+ else if (metadata.isArray && Array.isArray(value)) {
211
+ cloned[key] = [...value];
212
+ }
213
+ else if (metadata.isSet && value instanceof Set) {
214
+ cloned[key] = new Set(value);
215
+ }
216
+ else if (typeof value === 'object') {
217
+ // 深拷贝对象
218
+ cloned[key] = JSON.parse(JSON.stringify(value));
219
+ }
220
+ else {
221
+ cloned[key] = value;
222
+ }
223
+ });
224
+ return cloned;
225
+ }
226
+ /**
227
+ * 转换为普通对象
228
+ */
229
+ toJSON() {
230
+ const fields = getFieldsMetadata(this);
231
+ const result = {};
232
+ fields.forEach((metadata, key) => {
233
+ const value = this[key];
234
+ if (value === undefined) {
235
+ if (!metadata.optional) {
236
+ result[key] = null;
237
+ }
238
+ return;
239
+ }
240
+ if (metadata.isMap && value instanceof Map) {
241
+ result[key] = Object.fromEntries(value);
242
+ }
243
+ else if (metadata.isSet && value instanceof Set) {
244
+ result[key] = Array.from(value);
245
+ }
246
+ else {
247
+ result[key] = value;
248
+ }
249
+ });
250
+ return result;
251
+ }
252
+ /**
253
+ * 从普通对象恢复状态
254
+ */
255
+ fromJSON(data) {
256
+ const fields = getFieldsMetadata(this);
257
+ fields.forEach((metadata, key) => {
258
+ if (!(key in data))
259
+ return;
260
+ const value = data[key];
261
+ if (metadata.isMap) {
262
+ this[key] = new Map(Object.entries(value || {}));
263
+ }
264
+ else if (metadata.isSet) {
265
+ this[key] = new Set(value || []);
266
+ }
267
+ else {
268
+ this[key] = value;
269
+ }
270
+ });
271
+ }
272
+ /**
273
+ * 获取状态的字段元数据
274
+ */
275
+ getMetadata() {
276
+ return getFieldsMetadata(this);
277
+ }
278
+ }
279
+ //# sourceMappingURL=State.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"State.js","sourceRoot":"","sources":["../src/State.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * TrackedArray - 自动追踪变化的 Array 集合
3
+ * 类似 Colyseus 的 ArraySchema
4
+ */
5
+ import type { Patch } from '../types.js';
6
+ export interface ChangeCallback {
7
+ (patches: Patch[]): void;
8
+ }
9
+ /**
10
+ * TrackedArray - 自动追踪所有修改操作的 Array
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * const items = new TrackedArray<Item>();
15
+ *
16
+ * items.onChange((patches) => {
17
+ * console.log('Changes:', patches);
18
+ * });
19
+ *
20
+ * items.push(new Item()); // 触发 onChange
21
+ * ```
22
+ */
23
+ export declare class TrackedArray<T = any> extends Array<T> {
24
+ private basePath;
25
+ private changeCallbacks;
26
+ private pendingChanges;
27
+ private tracking;
28
+ constructor(basePath?: string, ...items: T[]);
29
+ /**
30
+ * 开始追踪变化
31
+ */
32
+ startTracking(): void;
33
+ /**
34
+ * 停止追踪变化
35
+ */
36
+ stopTracking(): void;
37
+ /**
38
+ * 注册变化回调
39
+ */
40
+ onChange(callback: ChangeCallback): () => void;
41
+ /**
42
+ * 记录整个数组的替换
43
+ */
44
+ private recordArrayChange;
45
+ /**
46
+ * 记录单个元素的变化
47
+ */
48
+ private recordElementChange;
49
+ /**
50
+ * 触发变化回调
51
+ */
52
+ private emitChanges;
53
+ /**
54
+ * 获取待处理的变化
55
+ */
56
+ getChanges(): Patch[];
57
+ /**
58
+ * 清除待处理的变化
59
+ */
60
+ clearChanges(): void;
61
+ push(...items: T[]): number;
62
+ pop(): T | undefined;
63
+ shift(): T | undefined;
64
+ unshift(...items: T[]): number;
65
+ splice(start: number, deleteCount?: number, ...items: T[]): T[];
66
+ sort(compareFn?: (a: T, b: T) => number): this;
67
+ reverse(): this;
68
+ fill(value: T, start?: number, end?: number): this;
69
+ copyWithin(target: number, start: number, end?: number): this;
70
+ /**
71
+ * 批量更新(不触发中间变化)
72
+ */
73
+ batch(fn: () => void): void;
74
+ /**
75
+ * 克隆
76
+ */
77
+ clone(): TrackedArray<T>;
78
+ /**
79
+ * 转换为普通数组
80
+ */
81
+ toArray(): T[];
82
+ /**
83
+ * 从普通数组创建
84
+ */
85
+ static fromArray<T>(arr: T[], basePath?: string): TrackedArray<T>;
86
+ }
87
+ //# sourceMappingURL=TrackedArray.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TrackedArray.d.ts","sourceRoot":"","sources":["../../src/collections/TrackedArray.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,WAAW,cAAc;IAC7B,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;CAC1B;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,YAAY,CAAC,CAAC,GAAG,GAAG,CAAE,SAAQ,KAAK,CAAC,CAAC,CAAC;IACjD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,eAAe,CAAkC;IACzD,OAAO,CAAC,cAAc,CAAiC;IACvD,OAAO,CAAC,QAAQ,CAAS;gBAEb,QAAQ,GAAE,MAAW,EAAE,GAAG,KAAK,EAAE,CAAC,EAAE;IAMhD;;OAEG;IACH,aAAa,IAAI,IAAI;IAIrB;;OAEG;IACH,YAAY,IAAI,IAAI;IAIpB;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,IAAI;IAO9C;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAYzB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAyB3B;;OAEG;IACH,OAAO,CAAC,WAAW;IAenB;;OAEG;IACH,UAAU,IAAI,KAAK,EAAE;IAIrB;;OAEG;IACH,YAAY,IAAI,IAAI;IAMpB,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,GAAG,MAAM;IAM3B,GAAG,IAAI,CAAC,GAAG,SAAS;IAMpB,KAAK,IAAI,CAAC,GAAG,SAAS;IAMtB,OAAO,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,GAAG,MAAM;IAM9B,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE;IAM/D,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,MAAM,GAAG,IAAI;IAM9C,OAAO,IAAI,IAAI;IAMf,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;IAMlD,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;IAM7D;;OAEG;IACH,KAAK,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI;IAc3B;;OAEG;IACH,KAAK,IAAI,YAAY,CAAC,CAAC,CAAC;IAMxB;;OAEG;IACH,OAAO,IAAI,CAAC,EAAE;IAId;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,QAAQ,GAAE,MAAW,GAAG,YAAY,CAAC,CAAC,CAAC;CAGtE"}
@@ -0,0 +1,203 @@
1
+ /**
2
+ * TrackedArray - 自动追踪变化的 Array 集合
3
+ * 类似 Colyseus 的 ArraySchema
4
+ */
5
+ import { ChangeOp } from '../types.js';
6
+ /**
7
+ * TrackedArray - 自动追踪所有修改操作的 Array
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * const items = new TrackedArray<Item>();
12
+ *
13
+ * items.onChange((patches) => {
14
+ * console.log('Changes:', patches);
15
+ * });
16
+ *
17
+ * items.push(new Item()); // 触发 onChange
18
+ * ```
19
+ */
20
+ export class TrackedArray extends Array {
21
+ basePath;
22
+ changeCallbacks = new Set();
23
+ pendingChanges = new Map();
24
+ tracking = false;
25
+ constructor(basePath = '', ...items) {
26
+ super(...items);
27
+ this.basePath = basePath;
28
+ Object.setPrototypeOf(this, TrackedArray.prototype);
29
+ }
30
+ /**
31
+ * 开始追踪变化
32
+ */
33
+ startTracking() {
34
+ this.tracking = true;
35
+ }
36
+ /**
37
+ * 停止追踪变化
38
+ */
39
+ stopTracking() {
40
+ this.tracking = false;
41
+ }
42
+ /**
43
+ * 注册变化回调
44
+ */
45
+ onChange(callback) {
46
+ this.changeCallbacks.add(callback);
47
+ return () => {
48
+ this.changeCallbacks.delete(callback);
49
+ };
50
+ }
51
+ /**
52
+ * 记录整个数组的替换
53
+ */
54
+ recordArrayChange() {
55
+ if (!this.tracking)
56
+ return;
57
+ const patch = {
58
+ op: ChangeOp.REPLACE,
59
+ path: this.basePath || '/',
60
+ value: [...this],
61
+ };
62
+ this.pendingChanges.set(this.basePath || '/', patch);
63
+ }
64
+ /**
65
+ * 记录单个元素的变化
66
+ */
67
+ recordElementChange(index, op, value, oldValue) {
68
+ if (!this.tracking)
69
+ return;
70
+ const path = this.basePath ? `${this.basePath}/${index}` : `/${index}`;
71
+ const patch = {
72
+ op,
73
+ path,
74
+ value,
75
+ oldValue,
76
+ };
77
+ this.pendingChanges.set(path, patch);
78
+ // 如果有 onChange 回调,立即通知
79
+ if (this.changeCallbacks.size > 0) {
80
+ const patches = [patch];
81
+ this.changeCallbacks.forEach(callback => {
82
+ try {
83
+ callback(patches);
84
+ }
85
+ catch (e) {
86
+ console.error('[TrackedArray] Error in change callback:', e);
87
+ }
88
+ });
89
+ }
90
+ }
91
+ /**
92
+ * 触发变化回调
93
+ */
94
+ emitChanges() {
95
+ if (this.pendingChanges.size === 0)
96
+ return;
97
+ const patches = Array.from(this.pendingChanges.values());
98
+ this.changeCallbacks.forEach(callback => {
99
+ try {
100
+ callback(patches);
101
+ }
102
+ catch (e) {
103
+ console.error('[TrackedArray] Error in change callback:', e);
104
+ }
105
+ });
106
+ this.pendingChanges.clear();
107
+ }
108
+ /**
109
+ * 获取待处理的变化
110
+ */
111
+ getChanges() {
112
+ return Array.from(this.pendingChanges.values());
113
+ }
114
+ /**
115
+ * 清除待处理的变化
116
+ */
117
+ clearChanges() {
118
+ this.pendingChanges.clear();
119
+ }
120
+ // ============ Array 方法重写 ============
121
+ push(...items) {
122
+ const result = super.push(...items);
123
+ this.recordArrayChange();
124
+ return result;
125
+ }
126
+ pop() {
127
+ const result = super.pop();
128
+ this.recordArrayChange();
129
+ return result;
130
+ }
131
+ shift() {
132
+ const result = super.shift();
133
+ this.recordArrayChange();
134
+ return result;
135
+ }
136
+ unshift(...items) {
137
+ const result = super.unshift(...items);
138
+ this.recordArrayChange();
139
+ return result;
140
+ }
141
+ splice(start, deleteCount, ...items) {
142
+ const result = super.splice(start, deleteCount, ...items);
143
+ this.recordArrayChange();
144
+ return result;
145
+ }
146
+ sort(compareFn) {
147
+ super.sort(compareFn);
148
+ this.recordArrayChange();
149
+ return this;
150
+ }
151
+ reverse() {
152
+ super.reverse();
153
+ this.recordArrayChange();
154
+ return this;
155
+ }
156
+ fill(value, start, end) {
157
+ super.fill(value, start, end);
158
+ this.recordArrayChange();
159
+ return this;
160
+ }
161
+ copyWithin(target, start, end) {
162
+ super.copyWithin(target, start, end);
163
+ this.recordArrayChange();
164
+ return this;
165
+ }
166
+ /**
167
+ * 批量更新(不触发中间变化)
168
+ */
169
+ batch(fn) {
170
+ const wasTracking = this.tracking;
171
+ this.tracking = false;
172
+ try {
173
+ fn();
174
+ }
175
+ finally {
176
+ this.tracking = wasTracking;
177
+ if (wasTracking) {
178
+ this.emitChanges();
179
+ }
180
+ }
181
+ }
182
+ /**
183
+ * 克隆
184
+ */
185
+ clone() {
186
+ const cloned = new TrackedArray(this.basePath, ...this);
187
+ cloned.tracking = this.tracking;
188
+ return cloned;
189
+ }
190
+ /**
191
+ * 转换为普通数组
192
+ */
193
+ toArray() {
194
+ return [...this];
195
+ }
196
+ /**
197
+ * 从普通数组创建
198
+ */
199
+ static fromArray(arr, basePath = '') {
200
+ return new TrackedArray(basePath, ...arr);
201
+ }
202
+ }
203
+ //# sourceMappingURL=TrackedArray.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TrackedArray.js","sourceRoot":"","sources":["../../src/collections/TrackedArray.ts"],"names":[],"mappings":"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"}