@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,77 @@
1
+ /**
2
+ * TrackedMap - 自动追踪变化的 Map 集合
3
+ * 类似 Colyseus 的 MapSchema
4
+ */
5
+ import type { Patch } from '../types.js';
6
+ export interface ChangeCallback {
7
+ (patches: Patch[]): void;
8
+ }
9
+ /**
10
+ * TrackedMap - 自动追踪所有修改操作的 Map
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * const players = new TrackedMap<string, Player>();
15
+ *
16
+ * players.onChange((patches) => {
17
+ * console.log('Changes:', patches);
18
+ * });
19
+ *
20
+ * players.set('p1', new Player()); // 触发 onChange
21
+ * ```
22
+ */
23
+ export declare class TrackedMap<K = any, V = any> extends Map<K, V> {
24
+ private basePath;
25
+ private changeCallbacks;
26
+ private pendingChanges;
27
+ private tracking;
28
+ constructor(basePath?: string, entries?: readonly (readonly [K, V])[] | null);
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 recordChange;
45
+ /**
46
+ * 触发变化回调
47
+ */
48
+ private emitChanges;
49
+ /**
50
+ * 获取待处理的变化
51
+ */
52
+ getChanges(): Patch[];
53
+ /**
54
+ * 清除待处理的变化
55
+ */
56
+ clearChanges(): void;
57
+ set(key: K, value: V): this;
58
+ delete(key: K): boolean;
59
+ clear(): void;
60
+ /**
61
+ * 批量更新(不触发中间变化)
62
+ */
63
+ batch(fn: () => void): void;
64
+ /**
65
+ * 克隆
66
+ */
67
+ clone(): TrackedMap<K, V>;
68
+ /**
69
+ * 转换为普通对象
70
+ */
71
+ toJSON(): Record<string, V>;
72
+ /**
73
+ * 从普通对象创建
74
+ */
75
+ static fromJSON<K, V>(obj: Record<string, V>, basePath?: string): TrackedMap<K, V>;
76
+ }
77
+ //# sourceMappingURL=TrackedMap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TrackedMap.d.ts","sourceRoot":"","sources":["../../src/collections/TrackedMap.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,UAAU,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,CAAE,SAAQ,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IACzD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,eAAe,CAAkC;IACzD,OAAO,CAAC,cAAc,CAAiC;IACvD,OAAO,CAAC,QAAQ,CAAS;gBAEb,QAAQ,GAAE,MAAW,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI;IAKhF;;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,YAAY;IA2BpB;;OAEG;IACH,OAAO,CAAC,WAAW;IAenB;;OAEG;IACH,UAAU,IAAI,KAAK,EAAE;IAIrB;;OAEG;IACH,YAAY,IAAI,IAAI;IAMpB,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAe3B,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO;IAavB,KAAK,IAAI,IAAI;IASb;;OAEG;IACH,KAAK,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI;IAgB3B;;OAEG;IACH,KAAK,IAAI,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC;IAMzB;;OAEG;IACH,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAQ3B;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,QAAQ,GAAE,MAAW,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC;CAOvF"}
@@ -0,0 +1,183 @@
1
+ /**
2
+ * TrackedMap - 自动追踪变化的 Map 集合
3
+ * 类似 Colyseus 的 MapSchema
4
+ */
5
+ import { ChangeOp } from '../types.js';
6
+ /**
7
+ * TrackedMap - 自动追踪所有修改操作的 Map
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * const players = new TrackedMap<string, Player>();
12
+ *
13
+ * players.onChange((patches) => {
14
+ * console.log('Changes:', patches);
15
+ * });
16
+ *
17
+ * players.set('p1', new Player()); // 触发 onChange
18
+ * ```
19
+ */
20
+ export class TrackedMap extends Map {
21
+ basePath;
22
+ changeCallbacks = new Set();
23
+ pendingChanges = new Map();
24
+ tracking = false;
25
+ constructor(basePath = '', entries) {
26
+ super(entries);
27
+ this.basePath = basePath;
28
+ }
29
+ /**
30
+ * 开始追踪变化
31
+ */
32
+ startTracking() {
33
+ this.tracking = true;
34
+ }
35
+ /**
36
+ * 停止追踪变化
37
+ */
38
+ stopTracking() {
39
+ this.tracking = false;
40
+ }
41
+ /**
42
+ * 注册变化回调
43
+ */
44
+ onChange(callback) {
45
+ this.changeCallbacks.add(callback);
46
+ return () => {
47
+ this.changeCallbacks.delete(callback);
48
+ };
49
+ }
50
+ /**
51
+ * 记录变化
52
+ */
53
+ recordChange(key, op, value, oldValue) {
54
+ if (!this.tracking)
55
+ return;
56
+ const path = this.basePath ? `${this.basePath}/${String(key)}` : `/${String(key)}`;
57
+ const patch = {
58
+ op,
59
+ path,
60
+ value,
61
+ oldValue,
62
+ };
63
+ this.pendingChanges.set(path, patch);
64
+ // 如果有 onChange 回调,立即通知
65
+ if (this.changeCallbacks.size > 0) {
66
+ const patches = [patch];
67
+ this.changeCallbacks.forEach(callback => {
68
+ try {
69
+ callback(patches);
70
+ }
71
+ catch (e) {
72
+ console.error('[TrackedMap] Error in change callback:', e);
73
+ }
74
+ });
75
+ }
76
+ }
77
+ /**
78
+ * 触发变化回调
79
+ */
80
+ emitChanges() {
81
+ if (this.pendingChanges.size === 0)
82
+ return;
83
+ const patches = Array.from(this.pendingChanges.values());
84
+ this.changeCallbacks.forEach(callback => {
85
+ try {
86
+ callback(patches);
87
+ }
88
+ catch (e) {
89
+ console.error('[TrackedMap] Error in change callback:', e);
90
+ }
91
+ });
92
+ this.pendingChanges.clear();
93
+ }
94
+ /**
95
+ * 获取待处理的变化
96
+ */
97
+ getChanges() {
98
+ return Array.from(this.pendingChanges.values());
99
+ }
100
+ /**
101
+ * 清除待处理的变化
102
+ */
103
+ clearChanges() {
104
+ this.pendingChanges.clear();
105
+ }
106
+ // ============ Map 方法重写 ============
107
+ set(key, value) {
108
+ const hadKey = super.has(key);
109
+ const oldValue = super.get(key);
110
+ super.set(key, value);
111
+ if (hadKey) {
112
+ this.recordChange(key, ChangeOp.REPLACE, value, oldValue);
113
+ }
114
+ else {
115
+ this.recordChange(key, ChangeOp.ADD, value);
116
+ }
117
+ return this;
118
+ }
119
+ delete(key) {
120
+ if (!super.has(key))
121
+ return false;
122
+ const oldValue = super.get(key);
123
+ const result = super.delete(key);
124
+ if (result) {
125
+ this.recordChange(key, ChangeOp.REMOVE, undefined, oldValue);
126
+ }
127
+ return result;
128
+ }
129
+ clear() {
130
+ // 记录所有删除操作
131
+ for (const [key, value] of this) {
132
+ this.recordChange(key, ChangeOp.REMOVE, undefined, value);
133
+ }
134
+ super.clear();
135
+ }
136
+ /**
137
+ * 批量更新(不触发中间变化)
138
+ */
139
+ batch(fn) {
140
+ const wasTracking = this.tracking;
141
+ this.tracking = false;
142
+ const initialChanges = this.pendingChanges.size;
143
+ try {
144
+ fn();
145
+ }
146
+ finally {
147
+ this.tracking = wasTracking;
148
+ // 如果有新变化,立即发出
149
+ if (wasTracking && this.pendingChanges.size > initialChanges) {
150
+ this.emitChanges();
151
+ }
152
+ }
153
+ }
154
+ /**
155
+ * 克隆
156
+ */
157
+ clone() {
158
+ const cloned = new TrackedMap(this.basePath, Array.from(this.entries()));
159
+ cloned.tracking = this.tracking;
160
+ return cloned;
161
+ }
162
+ /**
163
+ * 转换为普通对象
164
+ */
165
+ toJSON() {
166
+ const obj = {};
167
+ for (const [key, value] of this) {
168
+ obj[String(key)] = value;
169
+ }
170
+ return obj;
171
+ }
172
+ /**
173
+ * 从普通对象创建
174
+ */
175
+ static fromJSON(obj, basePath = '') {
176
+ const map = new TrackedMap(basePath);
177
+ for (const [key, value] of Object.entries(obj)) {
178
+ map.set(key, value);
179
+ }
180
+ return map;
181
+ }
182
+ }
183
+ //# sourceMappingURL=TrackedMap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TrackedMap.js","sourceRoot":"","sources":["../../src/collections/TrackedMap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * TrackedSet - 自动追踪变化的 Set 集合
3
+ * 类似 Colyseus 的 SetSchema
4
+ */
5
+ import type { Patch } from '../types.js';
6
+ export interface ChangeCallback {
7
+ (patches: Patch[]): void;
8
+ }
9
+ /**
10
+ * TrackedSet - 自动追踪所有修改操作的 Set
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * const tags = new TrackedSet<string>();
15
+ *
16
+ * tags.onChange((patches) => {
17
+ * console.log('Changes:', patches);
18
+ * });
19
+ *
20
+ * tags.add('tag1'); // 触发 onChange
21
+ * ```
22
+ */
23
+ export declare class TrackedSet<T = any> extends Set<T> {
24
+ private basePath;
25
+ private changeCallbacks;
26
+ private pendingChanges;
27
+ private tracking;
28
+ constructor(basePath?: string, values?: readonly T[] | null);
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 recordChange;
45
+ /**
46
+ * 触发变化回调
47
+ */
48
+ private emitChanges;
49
+ /**
50
+ * 获取待处理的变化
51
+ */
52
+ getChanges(): Patch[];
53
+ /**
54
+ * 清除待处理的变化
55
+ */
56
+ clearChanges(): void;
57
+ add(value: T): this;
58
+ delete(value: T): boolean;
59
+ clear(): void;
60
+ /**
61
+ * 批量更新(不触发中间变化)
62
+ */
63
+ batch(fn: () => void): void;
64
+ /**
65
+ * 克隆
66
+ */
67
+ clone(): TrackedSet<T>;
68
+ /**
69
+ * 转换为数组
70
+ */
71
+ toArray(): T[];
72
+ /**
73
+ * 转换为普通对象(用于序列化)
74
+ */
75
+ toJSON(): T[];
76
+ /**
77
+ * 从数组创建
78
+ */
79
+ static fromArray<T>(arr: T[], basePath?: string): TrackedSet<T>;
80
+ }
81
+ //# sourceMappingURL=TrackedSet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TrackedSet.d.ts","sourceRoot":"","sources":["../../src/collections/TrackedSet.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,UAAU,CAAC,CAAC,GAAG,GAAG,CAAE,SAAQ,GAAG,CAAC,CAAC,CAAC;IAC7C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,eAAe,CAAkC;IACzD,OAAO,CAAC,cAAc,CAAiC;IACvD,OAAO,CAAC,QAAQ,CAAS;gBAEb,QAAQ,GAAE,MAAW,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,EAAE,GAAG,IAAI;IAK/D;;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,YAAY;IA4BpB;;OAEG;IACH,OAAO,CAAC,WAAW;IAenB;;OAEG;IACH,UAAU,IAAI,KAAK,EAAE;IAIrB;;OAEG;IACH,YAAY,IAAI,IAAI;IAMpB,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI;IAYnB,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO;IAYzB,KAAK,IAAI,IAAI;IASb;;OAEG;IACH,KAAK,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI;IAc3B;;OAEG;IACH,KAAK,IAAI,UAAU,CAAC,CAAC,CAAC;IAMtB;;OAEG;IACH,OAAO,IAAI,CAAC,EAAE;IAId;;OAEG;IACH,MAAM,IAAI,CAAC,EAAE;IAIb;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,QAAQ,GAAE,MAAW,GAAG,UAAU,CAAC,CAAC,CAAC;CAGpE"}
@@ -0,0 +1,175 @@
1
+ /**
2
+ * TrackedSet - 自动追踪变化的 Set 集合
3
+ * 类似 Colyseus 的 SetSchema
4
+ */
5
+ import { ChangeOp } from '../types.js';
6
+ /**
7
+ * TrackedSet - 自动追踪所有修改操作的 Set
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * const tags = new TrackedSet<string>();
12
+ *
13
+ * tags.onChange((patches) => {
14
+ * console.log('Changes:', patches);
15
+ * });
16
+ *
17
+ * tags.add('tag1'); // 触发 onChange
18
+ * ```
19
+ */
20
+ export class TrackedSet extends Set {
21
+ basePath;
22
+ changeCallbacks = new Set();
23
+ pendingChanges = new Map();
24
+ tracking = false;
25
+ constructor(basePath = '', values) {
26
+ super(values);
27
+ this.basePath = basePath;
28
+ }
29
+ /**
30
+ * 开始追踪变化
31
+ */
32
+ startTracking() {
33
+ this.tracking = true;
34
+ }
35
+ /**
36
+ * 停止追踪变化
37
+ */
38
+ stopTracking() {
39
+ this.tracking = false;
40
+ }
41
+ /**
42
+ * 注册变化回调
43
+ */
44
+ onChange(callback) {
45
+ this.changeCallbacks.add(callback);
46
+ return () => {
47
+ this.changeCallbacks.delete(callback);
48
+ };
49
+ }
50
+ /**
51
+ * 记录变化
52
+ */
53
+ recordChange(value, op, _unused, oldValue) {
54
+ if (!this.tracking)
55
+ return;
56
+ // Set 使用值本身作为路径的一部分
57
+ const path = this.basePath ? `${this.basePath}/${String(value)}` : `/${String(value)}`;
58
+ const patch = {
59
+ op,
60
+ path,
61
+ value,
62
+ oldValue,
63
+ };
64
+ this.pendingChanges.set(path, patch);
65
+ // 如果有 onChange 回调,立即通知
66
+ if (this.changeCallbacks.size > 0) {
67
+ const patches = [patch];
68
+ this.changeCallbacks.forEach(callback => {
69
+ try {
70
+ callback(patches);
71
+ }
72
+ catch (e) {
73
+ console.error('[TrackedSet] Error in change callback:', e);
74
+ }
75
+ });
76
+ }
77
+ }
78
+ /**
79
+ * 触发变化回调
80
+ */
81
+ emitChanges() {
82
+ if (this.pendingChanges.size === 0)
83
+ return;
84
+ const patches = Array.from(this.pendingChanges.values());
85
+ this.changeCallbacks.forEach(callback => {
86
+ try {
87
+ callback(patches);
88
+ }
89
+ catch (e) {
90
+ console.error('[TrackedSet] Error in change callback:', e);
91
+ }
92
+ });
93
+ this.pendingChanges.clear();
94
+ }
95
+ /**
96
+ * 获取待处理的变化
97
+ */
98
+ getChanges() {
99
+ return Array.from(this.pendingChanges.values());
100
+ }
101
+ /**
102
+ * 清除待处理的变化
103
+ */
104
+ clearChanges() {
105
+ this.pendingChanges.clear();
106
+ }
107
+ // ============ Set 方法重写 ============
108
+ add(value) {
109
+ const hadValue = super.has(value);
110
+ super.add(value);
111
+ if (!hadValue) {
112
+ this.recordChange(value, ChangeOp.ADD);
113
+ }
114
+ return this;
115
+ }
116
+ delete(value) {
117
+ if (!super.has(value))
118
+ return false;
119
+ const result = super.delete(value);
120
+ if (result) {
121
+ this.recordChange(value, ChangeOp.REMOVE, undefined, value);
122
+ }
123
+ return result;
124
+ }
125
+ clear() {
126
+ // 记录所有删除操作
127
+ for (const value of this) {
128
+ this.recordChange(value, ChangeOp.REMOVE, undefined, value);
129
+ }
130
+ super.clear();
131
+ }
132
+ /**
133
+ * 批量更新(不触发中间变化)
134
+ */
135
+ batch(fn) {
136
+ const wasTracking = this.tracking;
137
+ this.tracking = false;
138
+ try {
139
+ fn();
140
+ }
141
+ finally {
142
+ this.tracking = wasTracking;
143
+ if (wasTracking) {
144
+ this.emitChanges();
145
+ }
146
+ }
147
+ }
148
+ /**
149
+ * 克隆
150
+ */
151
+ clone() {
152
+ const cloned = new TrackedSet(this.basePath, Array.from(this));
153
+ cloned.tracking = this.tracking;
154
+ return cloned;
155
+ }
156
+ /**
157
+ * 转换为数组
158
+ */
159
+ toArray() {
160
+ return Array.from(this);
161
+ }
162
+ /**
163
+ * 转换为普通对象(用于序列化)
164
+ */
165
+ toJSON() {
166
+ return Array.from(this);
167
+ }
168
+ /**
169
+ * 从数组创建
170
+ */
171
+ static fromArray(arr, basePath = '') {
172
+ return new TrackedSet(basePath, arr);
173
+ }
174
+ }
175
+ //# sourceMappingURL=TrackedSet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TrackedSet.js","sourceRoot":"","sources":["../../src/collections/TrackedSet.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Tracked Collections
3
+ * 自动追踪变化的集合类型
4
+ */
5
+ export { TrackedMap } from './TrackedMap.js';
6
+ export { TrackedArray } from './TrackedArray.js';
7
+ export { TrackedSet } from './TrackedSet.js';
8
+ export type { ChangeCallback } from './TrackedMap.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/collections/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Tracked Collections
3
+ * 自动追踪变化的集合类型
4
+ */
5
+ export { TrackedMap } from './TrackedMap.js';
6
+ export { TrackedArray } from './TrackedArray.js';
7
+ export { TrackedSet } from './TrackedSet.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/collections/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * 压缩策略管理器
3
+ * 根据数据大小和类型智能选择压缩方案
4
+ */
5
+ export interface CompressionResult {
6
+ data: Uint8Array;
7
+ compressed: boolean;
8
+ originalSize: number;
9
+ compressedSize: number;
10
+ compressionRatio: number;
11
+ }
12
+ export interface CompressionOptions {
13
+ /**
14
+ * 压缩阈值(字节),小于此值不压缩
15
+ */
16
+ threshold?: number;
17
+ /**
18
+ * 最小压缩率,低于此值不使用压缩结果
19
+ */
20
+ minCompressionRatio?: number;
21
+ /**
22
+ * 压缩级别 (1-9)
23
+ */
24
+ level?: number;
25
+ /**
26
+ * 是否强制压缩
27
+ */
28
+ force?: boolean;
29
+ /**
30
+ * 是否启用自适应压缩
31
+ */
32
+ adaptive?: boolean;
33
+ }
34
+ /**
35
+ * 压缩策略
36
+ */
37
+ export declare class CompressionStrategy {
38
+ private defaultOptions;
39
+ private stats;
40
+ constructor(options?: CompressionOptions);
41
+ /**
42
+ * 压缩数据
43
+ */
44
+ compress(data: Uint8Array, options?: CompressionOptions): CompressionResult;
45
+ /**
46
+ * 解压数据
47
+ */
48
+ decompress(data: Uint8Array, compressed: boolean): Uint8Array;
49
+ /**
50
+ * 批量压缩(用于多个小对象)
51
+ */
52
+ compressBatch(dataArray: Uint8Array[]): CompressionResult;
53
+ /**
54
+ * 获取压缩统计
55
+ */
56
+ getStats(): {
57
+ compressionRate: number;
58
+ averageSaving: number;
59
+ totalAttempts: number;
60
+ totalCompressed: number;
61
+ totalSaved: number;
62
+ averageRatio: number;
63
+ };
64
+ /**
65
+ * 重置统计
66
+ */
67
+ resetStats(): void;
68
+ /**
69
+ * 根据数据类型建议压缩级别
70
+ */
71
+ static suggestLevel(dataType: 'text' | 'binary' | 'mixed'): number;
72
+ /**
73
+ * 估算压缩后大小(不实际压缩)
74
+ */
75
+ static estimateSize(data: Uint8Array): number;
76
+ }
77
+ /**
78
+ * 全局压缩策略实例
79
+ */
80
+ export declare const globalCompressionStrategy: CompressionStrategy;
81
+ //# sourceMappingURL=CompressionStrategy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CompressionStrategy.d.ts","sourceRoot":"","sources":["../../src/compression/CompressionStrategy.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,UAAU,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,cAAc,CAMpB;IAGF,OAAO,CAAC,KAAK,CAKX;gBAEU,OAAO,CAAC,EAAE,kBAAkB;IAMxC;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,iBAAiB;IA8E3E;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,GAAG,UAAU;IAW7D;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,UAAU,EAAE,GAAG,iBAAiB;IAezD;;OAEG;IACH,QAAQ;;;;;;;;IAYR;;OAEG;IACH,UAAU,IAAI,IAAI;IASlB;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM;IAYlE;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM;CAsB9C;AAED;;GAEG;AACH,eAAO,MAAM,yBAAyB,qBAA4B,CAAC"}