@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.
- package/dist/State.d.ts +86 -0
- package/dist/State.d.ts.map +1 -0
- package/dist/State.js +279 -0
- package/dist/State.js.map +1 -0
- package/dist/collections/TrackedArray.d.ts +87 -0
- package/dist/collections/TrackedArray.d.ts.map +1 -0
- package/dist/collections/TrackedArray.js +203 -0
- package/dist/collections/TrackedArray.js.map +1 -0
- package/dist/collections/TrackedMap.d.ts +77 -0
- package/dist/collections/TrackedMap.d.ts.map +1 -0
- package/dist/collections/TrackedMap.js +183 -0
- package/dist/collections/TrackedMap.js.map +1 -0
- package/dist/collections/TrackedSet.d.ts +81 -0
- package/dist/collections/TrackedSet.d.ts.map +1 -0
- package/dist/collections/TrackedSet.js +175 -0
- package/dist/collections/TrackedSet.js.map +1 -0
- package/dist/collections/index.d.ts +9 -0
- package/dist/collections/index.d.ts.map +1 -0
- package/dist/collections/index.js +8 -0
- package/dist/collections/index.js.map +1 -0
- package/dist/compression/CompressionStrategy.d.ts +81 -0
- package/dist/compression/CompressionStrategy.d.ts.map +1 -0
- package/dist/compression/CompressionStrategy.js +195 -0
- package/dist/compression/CompressionStrategy.js.map +1 -0
- package/dist/compression/index.d.ts +5 -0
- package/dist/compression/index.d.ts.map +1 -0
- package/dist/compression/index.js +5 -0
- package/dist/compression/index.js.map +1 -0
- package/dist/decorators/index.d.ts +61 -0
- package/dist/decorators/index.d.ts.map +1 -0
- package/dist/decorators/index.js +136 -0
- package/dist/decorators/index.js.map +1 -0
- package/dist/encoding/index.d.ts +68 -0
- package/dist/encoding/index.d.ts.map +1 -0
- package/dist/encoding/index.js +227 -0
- package/dist/encoding/index.js.map +1 -0
- package/dist/index.js +8 -24
- package/dist/index.js.map +1 -1
- package/dist/optimization/BatchQueue.d.ts +96 -0
- package/dist/optimization/BatchQueue.d.ts.map +1 -0
- package/dist/optimization/BatchQueue.js +231 -0
- package/dist/optimization/BatchQueue.js.map +1 -0
- package/dist/optimization/index.d.ts +5 -0
- package/dist/optimization/index.d.ts.map +1 -0
- package/dist/optimization/index.js +5 -0
- package/dist/optimization/index.js.map +1 -0
- package/dist/tracking/ChangeTracker.d.ts +75 -0
- package/dist/tracking/ChangeTracker.d.ts.map +1 -0
- package/dist/tracking/ChangeTracker.js +341 -0
- package/dist/tracking/ChangeTracker.js.map +1 -0
- package/dist/tracking/deep-tracking.d.ts +22 -0
- package/dist/tracking/deep-tracking.d.ts.map +1 -0
- package/dist/tracking/deep-tracking.js +173 -0
- package/dist/tracking/deep-tracking.js.map +1 -0
- package/dist/types.d.ts +140 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +21 -0
- package/dist/types.js.map +1 -0
- package/package.json +10 -10
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Change Tracking System
|
|
3
|
+
* 使用 Proxy 自动追踪状态变化
|
|
4
|
+
*/
|
|
5
|
+
import type { Patch, TrackingOptions } from '../types.js';
|
|
6
|
+
/**
|
|
7
|
+
* ChangeTracker - 变化追踪器
|
|
8
|
+
* 使用 Proxy 自动捕获状态变化
|
|
9
|
+
*/
|
|
10
|
+
export declare class ChangeTracker {
|
|
11
|
+
private target;
|
|
12
|
+
private options;
|
|
13
|
+
private changes;
|
|
14
|
+
private proxies;
|
|
15
|
+
private originalValues;
|
|
16
|
+
private isStarted;
|
|
17
|
+
constructor(target: any, options?: TrackingOptions);
|
|
18
|
+
/**
|
|
19
|
+
* 开始追踪
|
|
20
|
+
*/
|
|
21
|
+
start(): any;
|
|
22
|
+
/**
|
|
23
|
+
* 钩住对象属性,拦截 setter
|
|
24
|
+
*/
|
|
25
|
+
hookProperties(obj: any): void;
|
|
26
|
+
/**
|
|
27
|
+
* 停止追踪
|
|
28
|
+
*/
|
|
29
|
+
stop(): void;
|
|
30
|
+
/**
|
|
31
|
+
* 包装对象为 Proxy
|
|
32
|
+
*/
|
|
33
|
+
private wrapWithProxy;
|
|
34
|
+
/**
|
|
35
|
+
* 包装普通对象
|
|
36
|
+
*/
|
|
37
|
+
private wrapObject;
|
|
38
|
+
/**
|
|
39
|
+
* 包装 Map
|
|
40
|
+
*/
|
|
41
|
+
private wrapMap;
|
|
42
|
+
/**
|
|
43
|
+
* 包装 Array
|
|
44
|
+
*/
|
|
45
|
+
private wrapArray;
|
|
46
|
+
/**
|
|
47
|
+
* 包装 Set
|
|
48
|
+
*/
|
|
49
|
+
private wrapSet;
|
|
50
|
+
/**
|
|
51
|
+
* 记录外部变化(来自 TrackedCollections)
|
|
52
|
+
*/
|
|
53
|
+
recordExternalChange(patch: Patch): void;
|
|
54
|
+
/**
|
|
55
|
+
* 记录变化
|
|
56
|
+
*/
|
|
57
|
+
private recordChange;
|
|
58
|
+
/**
|
|
59
|
+
* 获取变化列表(JSON Patch 格式)
|
|
60
|
+
*/
|
|
61
|
+
getPatches(): Patch[];
|
|
62
|
+
/**
|
|
63
|
+
* 清除变化记录
|
|
64
|
+
*/
|
|
65
|
+
clearChanges(): void;
|
|
66
|
+
/**
|
|
67
|
+
* 是否有变化
|
|
68
|
+
*/
|
|
69
|
+
hasChanges(): boolean;
|
|
70
|
+
/**
|
|
71
|
+
* 获取变化数量
|
|
72
|
+
*/
|
|
73
|
+
getChangeCount(): number;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=ChangeTracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChangeTracker.d.ts","sourceRoot":"","sources":["../../src/tracking/ChangeTracker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAiB,eAAe,EAAE,MAAM,aAAa,CAAC;AAWzE;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,OAAO,CAAwC;IACvD,OAAO,CAAC,OAAO,CAAoC;IACnD,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,GAAG,EAAE,OAAO,GAAE,eAAoB;IAStD;;OAEG;IACH,KAAK,IAAI,GAAG;IAOZ;;OAEG;IACH,cAAc,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI;IAuC9B;;OAEG;IACH,IAAI,IAAI,IAAI;IAOZ;;OAEG;IACH,OAAO,CAAC,aAAa;IAiCrB;;OAEG;IACH,OAAO,CAAC,UAAU;IA4DlB;;OAEG;IACH,OAAO,CAAC,OAAO;IAsDf;;OAEG;IACH,OAAO,CAAC,SAAS;IAyCjB;;OAEG;IACH,OAAO,CAAC,OAAO;IA+Bf;;OAEG;IACH,oBAAoB,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAYxC;;OAEG;IACH,OAAO,CAAC,YAAY;IAqBpB;;OAEG;IACH,UAAU,IAAI,KAAK,EAAE;IAerB;;OAEG;IACH,YAAY,IAAI,IAAI;IAIpB;;OAEG;IACH,UAAU,IAAI,OAAO;IAIrB;;OAEG;IACH,cAAc,IAAI,MAAM;CAGzB"}
|
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Change Tracking System
|
|
3
|
+
* 使用 Proxy 自动追踪状态变化
|
|
4
|
+
*/
|
|
5
|
+
import { ChangeOp } from '../types.js';
|
|
6
|
+
import { getFieldsMetadata } from '../decorators/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* ChangeTracker - 变化追踪器
|
|
9
|
+
* 使用 Proxy 自动捕获状态变化
|
|
10
|
+
*/
|
|
11
|
+
export class ChangeTracker {
|
|
12
|
+
target;
|
|
13
|
+
options;
|
|
14
|
+
changes = new Map();
|
|
15
|
+
proxies = new WeakMap();
|
|
16
|
+
originalValues = new Map();
|
|
17
|
+
isStarted = false;
|
|
18
|
+
constructor(target, options = {}) {
|
|
19
|
+
this.target = target;
|
|
20
|
+
this.options = {
|
|
21
|
+
patchRate: options.patchRate || 50,
|
|
22
|
+
deep: options.deep !== false,
|
|
23
|
+
maxQueueSize: options.maxQueueSize || 1000,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* 开始追踪
|
|
28
|
+
*/
|
|
29
|
+
start() {
|
|
30
|
+
if (this.isStarted)
|
|
31
|
+
return this.target;
|
|
32
|
+
this.isStarted = true;
|
|
33
|
+
return this.target;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* 钩住对象属性,拦截 setter
|
|
37
|
+
*/
|
|
38
|
+
hookProperties(obj) {
|
|
39
|
+
const fields = getFieldsMetadata(obj);
|
|
40
|
+
fields.forEach((metadata, key) => {
|
|
41
|
+
const propPath = `/${key}`;
|
|
42
|
+
// 保存原始值
|
|
43
|
+
const originalValue = obj[key];
|
|
44
|
+
// 包装集合类型
|
|
45
|
+
if (metadata.isMap && originalValue instanceof Map) {
|
|
46
|
+
obj[key] = this.wrapMap(originalValue, propPath, fields);
|
|
47
|
+
}
|
|
48
|
+
else if (metadata.isArray && Array.isArray(originalValue)) {
|
|
49
|
+
obj[key] = this.wrapArray(originalValue, propPath);
|
|
50
|
+
}
|
|
51
|
+
else if (metadata.isSet && originalValue instanceof Set) {
|
|
52
|
+
obj[key] = this.wrapSet(originalValue, propPath);
|
|
53
|
+
}
|
|
54
|
+
// 使用 Object.defineProperty 拦截普通字段
|
|
55
|
+
if (!metadata.isMap && !metadata.isArray && !metadata.isSet) {
|
|
56
|
+
let internalValue = originalValue;
|
|
57
|
+
Object.defineProperty(obj, key, {
|
|
58
|
+
get() {
|
|
59
|
+
return internalValue;
|
|
60
|
+
},
|
|
61
|
+
set: (newValue) => {
|
|
62
|
+
if (internalValue !== newValue) {
|
|
63
|
+
this.recordChange(propPath, ChangeOp.REPLACE, newValue, internalValue);
|
|
64
|
+
}
|
|
65
|
+
internalValue = newValue;
|
|
66
|
+
},
|
|
67
|
+
enumerable: true,
|
|
68
|
+
configurable: true,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* 停止追踪
|
|
75
|
+
*/
|
|
76
|
+
stop() {
|
|
77
|
+
this.isStarted = false;
|
|
78
|
+
this.changes.clear();
|
|
79
|
+
this.proxies = new WeakMap();
|
|
80
|
+
this.originalValues.clear();
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* 包装对象为 Proxy
|
|
84
|
+
*/
|
|
85
|
+
wrapWithProxy(obj, path) {
|
|
86
|
+
// 如果已经是 Proxy,直接返回
|
|
87
|
+
if (this.proxies.has(obj)) {
|
|
88
|
+
return this.proxies.get(obj);
|
|
89
|
+
}
|
|
90
|
+
// 原始值不需要包装
|
|
91
|
+
if (typeof obj !== 'object' || obj === null) {
|
|
92
|
+
return obj;
|
|
93
|
+
}
|
|
94
|
+
// 获取字段元数据
|
|
95
|
+
const fields = getFieldsMetadata(obj);
|
|
96
|
+
// Map 特殊处理
|
|
97
|
+
if (obj instanceof Map) {
|
|
98
|
+
return this.wrapMap(obj, path, fields);
|
|
99
|
+
}
|
|
100
|
+
// Array 特殊处理
|
|
101
|
+
if (Array.isArray(obj)) {
|
|
102
|
+
return this.wrapArray(obj, path);
|
|
103
|
+
}
|
|
104
|
+
// Set 特殊处理
|
|
105
|
+
if (obj instanceof Set) {
|
|
106
|
+
return this.wrapSet(obj, path);
|
|
107
|
+
}
|
|
108
|
+
// 普通对象
|
|
109
|
+
return this.wrapObject(obj, path, fields);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* 包装普通对象
|
|
113
|
+
*/
|
|
114
|
+
wrapObject(obj, path, fields) {
|
|
115
|
+
const tracker = this;
|
|
116
|
+
const proxy = new Proxy(obj, {
|
|
117
|
+
set(target, prop, value) {
|
|
118
|
+
if (typeof prop === 'symbol') {
|
|
119
|
+
target[prop] = value;
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
const propPath = path ? `${path}/${prop}` : `/${prop}`;
|
|
123
|
+
const oldValue = target[prop];
|
|
124
|
+
// 记录变化
|
|
125
|
+
if (oldValue !== value) {
|
|
126
|
+
tracker.recordChange(propPath, ChangeOp.REPLACE, value, oldValue);
|
|
127
|
+
}
|
|
128
|
+
// 如果是对象且需要深度追踪,包装为 Proxy
|
|
129
|
+
if (tracker.options.deep && typeof value === 'object' && value !== null) {
|
|
130
|
+
target[prop] = tracker.wrapWithProxy(value, propPath);
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
target[prop] = value;
|
|
134
|
+
}
|
|
135
|
+
return true;
|
|
136
|
+
},
|
|
137
|
+
deleteProperty(target, prop) {
|
|
138
|
+
if (typeof prop === 'symbol') {
|
|
139
|
+
delete target[prop];
|
|
140
|
+
return true;
|
|
141
|
+
}
|
|
142
|
+
const propPath = path ? `${path}/${prop}` : `/${prop}`;
|
|
143
|
+
const oldValue = target[prop];
|
|
144
|
+
tracker.recordChange(propPath, ChangeOp.REMOVE, undefined, oldValue);
|
|
145
|
+
delete target[prop];
|
|
146
|
+
return true;
|
|
147
|
+
},
|
|
148
|
+
});
|
|
149
|
+
this.proxies.set(obj, proxy);
|
|
150
|
+
// 深度包装已有属性
|
|
151
|
+
if (this.options.deep) {
|
|
152
|
+
fields.forEach((metadata, key) => {
|
|
153
|
+
const value = obj[key];
|
|
154
|
+
if (typeof value === 'object' && value !== null) {
|
|
155
|
+
const propPath = path ? `${path}/${key}` : `/${key}`;
|
|
156
|
+
obj[key] = this.wrapWithProxy(value, propPath);
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
return proxy;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* 包装 Map
|
|
164
|
+
*/
|
|
165
|
+
wrapMap(map, path, fields) {
|
|
166
|
+
const tracker = this;
|
|
167
|
+
const originalSet = map.set.bind(map);
|
|
168
|
+
const originalDelete = map.delete.bind(map);
|
|
169
|
+
const originalClear = map.clear.bind(map);
|
|
170
|
+
map.set = function (key, value) {
|
|
171
|
+
const keyPath = `${path}/${key}`;
|
|
172
|
+
const oldValue = map.get(key);
|
|
173
|
+
const hasKey = map.has(key);
|
|
174
|
+
// 包装值
|
|
175
|
+
const wrappedValue = tracker.options.deep && typeof value === 'object' && value !== null
|
|
176
|
+
? tracker.wrapWithProxy(value, keyPath)
|
|
177
|
+
: value;
|
|
178
|
+
const result = originalSet(key, wrappedValue);
|
|
179
|
+
// 记录变化
|
|
180
|
+
if (hasKey) {
|
|
181
|
+
tracker.recordChange(keyPath, ChangeOp.REPLACE, wrappedValue, oldValue);
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
tracker.recordChange(keyPath, ChangeOp.ADD, wrappedValue);
|
|
185
|
+
}
|
|
186
|
+
return result;
|
|
187
|
+
};
|
|
188
|
+
map.delete = function (key) {
|
|
189
|
+
const keyPath = `${path}/${key}`;
|
|
190
|
+
const oldValue = map.get(key);
|
|
191
|
+
const result = originalDelete(key);
|
|
192
|
+
if (result) {
|
|
193
|
+
tracker.recordChange(keyPath, ChangeOp.REMOVE, undefined, oldValue);
|
|
194
|
+
}
|
|
195
|
+
return result;
|
|
196
|
+
};
|
|
197
|
+
map.clear = function () {
|
|
198
|
+
map.forEach((value, key) => {
|
|
199
|
+
const keyPath = `${path}/${key}`;
|
|
200
|
+
tracker.recordChange(keyPath, ChangeOp.REMOVE, undefined, value);
|
|
201
|
+
});
|
|
202
|
+
originalClear();
|
|
203
|
+
};
|
|
204
|
+
this.proxies.set(map, map);
|
|
205
|
+
return map;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* 包装 Array
|
|
209
|
+
*/
|
|
210
|
+
wrapArray(arr, path) {
|
|
211
|
+
const tracker = this;
|
|
212
|
+
// 包装数组的修改方法
|
|
213
|
+
const methodsToWrap = ['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse'];
|
|
214
|
+
methodsToWrap.forEach(method => {
|
|
215
|
+
const original = arr[method].bind(arr);
|
|
216
|
+
arr[method] = function (...args) {
|
|
217
|
+
const oldLength = arr.length;
|
|
218
|
+
const result = original(...args);
|
|
219
|
+
// 记录数组变化
|
|
220
|
+
tracker.recordChange(path, ChangeOp.REPLACE, [...arr], undefined);
|
|
221
|
+
return result;
|
|
222
|
+
};
|
|
223
|
+
});
|
|
224
|
+
// 使用 Proxy 捕获索引赋值
|
|
225
|
+
const proxy = new Proxy(arr, {
|
|
226
|
+
set(target, prop, value) {
|
|
227
|
+
if (typeof prop === 'string' && !isNaN(Number(prop))) {
|
|
228
|
+
const index = Number(prop);
|
|
229
|
+
const oldValue = target[index];
|
|
230
|
+
target[prop] = value;
|
|
231
|
+
tracker.recordChange(`${path}/${index}`, ChangeOp.REPLACE, value, oldValue);
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
target[prop] = value;
|
|
235
|
+
}
|
|
236
|
+
return true;
|
|
237
|
+
},
|
|
238
|
+
});
|
|
239
|
+
this.proxies.set(arr, proxy);
|
|
240
|
+
return proxy;
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* 包装 Set
|
|
244
|
+
*/
|
|
245
|
+
wrapSet(set, path) {
|
|
246
|
+
const tracker = this;
|
|
247
|
+
const originalAdd = set.add.bind(set);
|
|
248
|
+
const originalDelete = set.delete.bind(set);
|
|
249
|
+
const originalClear = set.clear.bind(set);
|
|
250
|
+
set.add = function (value) {
|
|
251
|
+
const result = originalAdd(value);
|
|
252
|
+
tracker.recordChange(`${path}/${value}`, ChangeOp.ADD, value);
|
|
253
|
+
return result;
|
|
254
|
+
};
|
|
255
|
+
set.delete = function (value) {
|
|
256
|
+
const result = originalDelete(value);
|
|
257
|
+
if (result) {
|
|
258
|
+
tracker.recordChange(`${path}/${value}`, ChangeOp.REMOVE, undefined, value);
|
|
259
|
+
}
|
|
260
|
+
return result;
|
|
261
|
+
};
|
|
262
|
+
set.clear = function () {
|
|
263
|
+
set.forEach(value => {
|
|
264
|
+
tracker.recordChange(`${path}/${value}`, ChangeOp.REMOVE, undefined, value);
|
|
265
|
+
});
|
|
266
|
+
originalClear();
|
|
267
|
+
};
|
|
268
|
+
this.proxies.set(set, set);
|
|
269
|
+
return set;
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* 记录外部变化(来自 TrackedCollections)
|
|
273
|
+
*/
|
|
274
|
+
recordExternalChange(patch) {
|
|
275
|
+
if (!this.isStarted)
|
|
276
|
+
return;
|
|
277
|
+
this.changes.set(patch.path, {
|
|
278
|
+
path: patch.path,
|
|
279
|
+
op: patch.op,
|
|
280
|
+
value: patch.value,
|
|
281
|
+
oldValue: patch.oldValue,
|
|
282
|
+
timestamp: Date.now(),
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* 记录变化
|
|
287
|
+
*/
|
|
288
|
+
recordChange(path, op, value, oldValue) {
|
|
289
|
+
if (!this.isStarted)
|
|
290
|
+
return;
|
|
291
|
+
// 检查队列大小
|
|
292
|
+
if (this.changes.size >= this.options.maxQueueSize) {
|
|
293
|
+
console.warn('[ChangeTracker] Max queue size reached, dropping oldest changes');
|
|
294
|
+
const firstKey = this.changes.keys().next().value;
|
|
295
|
+
if (firstKey !== undefined) {
|
|
296
|
+
this.changes.delete(firstKey);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
this.changes.set(path, {
|
|
300
|
+
path,
|
|
301
|
+
op,
|
|
302
|
+
value,
|
|
303
|
+
oldValue,
|
|
304
|
+
timestamp: Date.now(),
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* 获取变化列表(JSON Patch 格式)
|
|
309
|
+
*/
|
|
310
|
+
getPatches() {
|
|
311
|
+
const patches = [];
|
|
312
|
+
this.changes.forEach(change => {
|
|
313
|
+
patches.push({
|
|
314
|
+
op: change.op,
|
|
315
|
+
path: change.path,
|
|
316
|
+
value: change.value,
|
|
317
|
+
oldValue: change.oldValue,
|
|
318
|
+
});
|
|
319
|
+
});
|
|
320
|
+
return patches;
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* 清除变化记录
|
|
324
|
+
*/
|
|
325
|
+
clearChanges() {
|
|
326
|
+
this.changes.clear();
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* 是否有变化
|
|
330
|
+
*/
|
|
331
|
+
hasChanges() {
|
|
332
|
+
return this.changes.size > 0;
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* 获取变化数量
|
|
336
|
+
*/
|
|
337
|
+
getChangeCount() {
|
|
338
|
+
return this.changes.size;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
//# sourceMappingURL=ChangeTracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChangeTracker.js","sourceRoot":"","sources":["../../src/tracking/ChangeTracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 深度追踪工具
|
|
3
|
+
* 为嵌套对象创建追踪代理
|
|
4
|
+
*/
|
|
5
|
+
import type { Patch } from '../types.js';
|
|
6
|
+
/**
|
|
7
|
+
* 深度包装对象,使其可追踪
|
|
8
|
+
*/
|
|
9
|
+
export declare function makeTrackable<T extends object>(obj: T, basePath?: string, onChanges?: (patches: Patch[]) => void): T;
|
|
10
|
+
/**
|
|
11
|
+
* 检查对象是否可追踪
|
|
12
|
+
*/
|
|
13
|
+
export declare function isTrackable(obj: any): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* 从对象中提取所有待处理的变化
|
|
16
|
+
*/
|
|
17
|
+
export declare function extractChanges(obj: any, visited?: WeakSet<any>): Patch[];
|
|
18
|
+
/**
|
|
19
|
+
* 清除对象及其嵌套对象的所有变化
|
|
20
|
+
*/
|
|
21
|
+
export declare function clearAllChanges(obj: any, visited?: WeakSet<any>): void;
|
|
22
|
+
//# sourceMappingURL=deep-tracking.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deep-tracking.d.ts","sourceRoot":"","sources":["../../src/tracking/deep-tracking.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC;;GAEG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,EAC5C,GAAG,EAAE,CAAC,EACN,QAAQ,GAAE,MAAW,EACrB,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,IAAI,GACrC,CAAC,CAoDH;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAQ7C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,GAAE,OAAO,CAAC,GAAG,CAAiB,GAAG,KAAK,EAAE,CAiDvF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,GAAE,OAAO,CAAC,GAAG,CAAiB,GAAG,IAAI,CA0CrF"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 深度追踪工具
|
|
3
|
+
* 为嵌套对象创建追踪代理
|
|
4
|
+
*/
|
|
5
|
+
import { TrackedMap } from '../collections/TrackedMap.js';
|
|
6
|
+
import { TrackedArray } from '../collections/TrackedArray.js';
|
|
7
|
+
import { TrackedSet } from '../collections/TrackedSet.js';
|
|
8
|
+
import { getFieldsMetadata } from '../decorators/index.js';
|
|
9
|
+
/**
|
|
10
|
+
* 深度包装对象,使其可追踪
|
|
11
|
+
*/
|
|
12
|
+
export function makeTrackable(obj, basePath = '', onChanges) {
|
|
13
|
+
// 如果已经是 Tracked 集合,直接返回
|
|
14
|
+
if (obj instanceof TrackedMap || obj instanceof TrackedArray || obj instanceof TrackedSet) {
|
|
15
|
+
if (onChanges) {
|
|
16
|
+
obj.onChange(onChanges);
|
|
17
|
+
}
|
|
18
|
+
return obj;
|
|
19
|
+
}
|
|
20
|
+
// Map 类型
|
|
21
|
+
if (obj instanceof Map) {
|
|
22
|
+
const tracked = new TrackedMap(basePath, Array.from(obj.entries()));
|
|
23
|
+
tracked.startTracking();
|
|
24
|
+
if (onChanges) {
|
|
25
|
+
tracked.onChange(onChanges);
|
|
26
|
+
}
|
|
27
|
+
return tracked;
|
|
28
|
+
}
|
|
29
|
+
// Array 类型
|
|
30
|
+
if (Array.isArray(obj)) {
|
|
31
|
+
const tracked = new TrackedArray(basePath, ...obj);
|
|
32
|
+
tracked.startTracking();
|
|
33
|
+
if (onChanges) {
|
|
34
|
+
tracked.onChange(onChanges);
|
|
35
|
+
}
|
|
36
|
+
return tracked;
|
|
37
|
+
}
|
|
38
|
+
// Set 类型
|
|
39
|
+
if (obj instanceof Set) {
|
|
40
|
+
const tracked = new TrackedSet(basePath, Array.from(obj));
|
|
41
|
+
tracked.startTracking();
|
|
42
|
+
if (onChanges) {
|
|
43
|
+
tracked.onChange(onChanges);
|
|
44
|
+
}
|
|
45
|
+
return tracked;
|
|
46
|
+
}
|
|
47
|
+
// 普通对象 - 递归包装字段
|
|
48
|
+
const fields = getFieldsMetadata(obj);
|
|
49
|
+
if (fields.size > 0) {
|
|
50
|
+
fields.forEach((metadata, key) => {
|
|
51
|
+
const value = obj[key];
|
|
52
|
+
if (value && typeof value === 'object') {
|
|
53
|
+
const fieldPath = basePath ? `${basePath}/${key}` : `/${key}`;
|
|
54
|
+
obj[key] = makeTrackable(value, fieldPath, onChanges);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
return obj;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* 检查对象是否可追踪
|
|
62
|
+
*/
|
|
63
|
+
export function isTrackable(obj) {
|
|
64
|
+
return obj instanceof TrackedMap ||
|
|
65
|
+
obj instanceof TrackedArray ||
|
|
66
|
+
obj instanceof TrackedSet ||
|
|
67
|
+
obj instanceof Map ||
|
|
68
|
+
obj instanceof Set ||
|
|
69
|
+
Array.isArray(obj) ||
|
|
70
|
+
(typeof obj === 'object' && obj !== null);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* 从对象中提取所有待处理的变化
|
|
74
|
+
*/
|
|
75
|
+
export function extractChanges(obj, visited = new WeakSet()) {
|
|
76
|
+
const patches = [];
|
|
77
|
+
if (!obj || typeof obj !== 'object')
|
|
78
|
+
return patches;
|
|
79
|
+
// 防止循环引用
|
|
80
|
+
if (visited.has(obj))
|
|
81
|
+
return patches;
|
|
82
|
+
visited.add(obj);
|
|
83
|
+
// Tracked 集合类型
|
|
84
|
+
if (obj instanceof TrackedMap || obj instanceof TrackedArray || obj instanceof TrackedSet) {
|
|
85
|
+
const changes = obj.getChanges();
|
|
86
|
+
if (changes && changes.length > 0) {
|
|
87
|
+
patches.push(...changes);
|
|
88
|
+
}
|
|
89
|
+
// 不再递归进入 Tracked 集合内部,因为它们自己管理变化
|
|
90
|
+
return patches;
|
|
91
|
+
}
|
|
92
|
+
// 递归提取嵌套对象的变化
|
|
93
|
+
if (obj instanceof Map) {
|
|
94
|
+
for (const value of obj.values()) {
|
|
95
|
+
if (value && typeof value === 'object') {
|
|
96
|
+
patches.push(...extractChanges(value, visited));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
else if (Array.isArray(obj)) {
|
|
101
|
+
for (const item of obj) {
|
|
102
|
+
if (item && typeof item === 'object') {
|
|
103
|
+
patches.push(...extractChanges(item, visited));
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
else if (obj instanceof Set) {
|
|
108
|
+
for (const value of obj) {
|
|
109
|
+
if (value && typeof value === 'object') {
|
|
110
|
+
patches.push(...extractChanges(value, visited));
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
// 普通对象
|
|
116
|
+
for (const key in obj) {
|
|
117
|
+
const value = obj[key];
|
|
118
|
+
if (value && typeof value === 'object') {
|
|
119
|
+
patches.push(...extractChanges(value, visited));
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return patches;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* 清除对象及其嵌套对象的所有变化
|
|
127
|
+
*/
|
|
128
|
+
export function clearAllChanges(obj, visited = new WeakSet()) {
|
|
129
|
+
if (!obj || typeof obj !== 'object')
|
|
130
|
+
return;
|
|
131
|
+
// 防止循环引用
|
|
132
|
+
if (visited.has(obj))
|
|
133
|
+
return;
|
|
134
|
+
visited.add(obj);
|
|
135
|
+
// Tracked 集合类型
|
|
136
|
+
if (obj instanceof TrackedMap || obj instanceof TrackedArray || obj instanceof TrackedSet) {
|
|
137
|
+
obj.clearChanges();
|
|
138
|
+
// 不再递归进入 Tracked 集合内部
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
// 递归清除嵌套对象的变化
|
|
142
|
+
if (obj instanceof Map) {
|
|
143
|
+
for (const value of obj.values()) {
|
|
144
|
+
if (value && typeof value === 'object') {
|
|
145
|
+
clearAllChanges(value, visited);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
else if (Array.isArray(obj)) {
|
|
150
|
+
for (const item of obj) {
|
|
151
|
+
if (item && typeof item === 'object') {
|
|
152
|
+
clearAllChanges(item, visited);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
else if (obj instanceof Set) {
|
|
157
|
+
for (const value of obj) {
|
|
158
|
+
if (value && typeof value === 'object') {
|
|
159
|
+
clearAllChanges(value, visited);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
// 普通对象
|
|
165
|
+
for (const key in obj) {
|
|
166
|
+
const value = obj[key];
|
|
167
|
+
if (value && typeof value === 'object') {
|
|
168
|
+
clearAllChanges(value, visited);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=deep-tracking.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deep-tracking.js","sourceRoot":"","sources":["../../src/tracking/deep-tracking.ts"],"names":[],"mappings":"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"}
|