@colyseus/schema 3.0.51 → 3.0.52

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.
@@ -1,6 +1,6 @@
1
1
  import { OPERATION } from "../encoding/spec";
2
2
  import { TypeContext } from "../types/TypeContext";
3
- import { ChangeTree, setOperationAtIndex, ChangeTreeList, createChangeTreeList, ChangeSetName, Ref } from "./ChangeTree";
3
+ import { ChangeTree, setOperationAtIndex, ChangeTreeList, createChangeTreeList, ChangeSetName, type ChangeTreeNode } from "./ChangeTree";
4
4
 
5
5
  export class Root {
6
6
  protected nextUniqueId: number = 0;
@@ -47,7 +47,7 @@ export class Root {
47
47
 
48
48
  this.refCount[changeTree.refId] = (previousRefCount || 0) + 1;
49
49
 
50
- // console.log("ADD", { refId: changeTree.refId, refCount: this.refCount[changeTree.refId] });
50
+ // console.log("ADD", { refId: changeTree.refId, ref: changeTree.ref.constructor.name, refCount: this.refCount[changeTree.refId], isNewChangeTree });
51
51
 
52
52
  return isNewChangeTree;
53
53
  }
@@ -55,6 +55,8 @@ export class Root {
55
55
  remove(changeTree: ChangeTree) {
56
56
  const refCount = (this.refCount[changeTree.refId]) - 1;
57
57
 
58
+ // console.log("REMOVE", { refId: changeTree.refId, ref: changeTree.ref.constructor.name, refCount, needRemove: refCount <= 0 });
59
+
58
60
  if (refCount <= 0) {
59
61
  //
60
62
  // Only remove "root" reference if it's the last reference
@@ -147,7 +149,36 @@ export class Root {
147
149
  changeSet.tail = node;
148
150
  }
149
151
 
150
- protected removeChangeFromChangeSet(changeSetName: ChangeSetName, changeTree: ChangeTree) {
152
+ public enqueueChangeTree(
153
+ changeTree: ChangeTree,
154
+ changeSet: 'changes' | 'filteredChanges' | 'allFilteredChanges' | 'allChanges',
155
+ queueRootNode = changeTree[changeSet].queueRootNode
156
+ ) {
157
+ // skip
158
+ if (queueRootNode) { return; }
159
+
160
+ // Add to linked list if not already present
161
+ changeTree[changeSet].queueRootNode = this.addToChangeTreeList(this[changeSet], changeTree);
162
+ }
163
+
164
+ protected addToChangeTreeList(list: ChangeTreeList, changeTree: ChangeTree): ChangeTreeNode {
165
+ const node: ChangeTreeNode = { changeTree, next: undefined, prev: undefined };
166
+
167
+ if (!list.next) {
168
+ list.next = node;
169
+ list.tail = node;
170
+ } else {
171
+ node.prev = list.tail;
172
+ list.tail!.next = node;
173
+ list.tail = node;
174
+ }
175
+
176
+ list.length++;
177
+
178
+ return node;
179
+ }
180
+
181
+ public removeChangeFromChangeSet(changeSetName: ChangeSetName, changeTree: ChangeTree) {
151
182
  const changeSet = this[changeSetName];
152
183
  const node = changeTree[changeSetName].queueRootNode;
153
184
 
@@ -1,6 +1,6 @@
1
1
  import { $changes, $childType, $decoder, $deleteByIndex, $onEncodeEnd, $encoder, $filter, $getByIndex, $onDecodeEnd } from "../symbols";
2
2
  import type { Schema } from "../../Schema";
3
- import { ChangeTree, enqueueChangeTree, setOperationAtIndex } from "../../encoder/ChangeTree";
3
+ import { ChangeTree, setOperationAtIndex } from "../../encoder/ChangeTree";
4
4
  import { OPERATION } from "../../encoding/spec";
5
5
  import { registerType } from "../registry";
6
6
  import { Collection } from "../HelperTypes";
@@ -482,10 +482,10 @@ export class ArraySchema<V = any> implements Array<V>, Collection<number, V> {
482
482
  // FIXME: this code block is duplicated on ChangeTree
483
483
  //
484
484
  if (changeTree.filteredChanges !== undefined) {
485
- enqueueChangeTree(changeTree.root, changeTree, 'filteredChanges');
485
+ changeTree.root?.enqueueChangeTree(changeTree, 'filteredChanges');
486
486
 
487
487
  } else {
488
- enqueueChangeTree(changeTree.root, changeTree, 'changes');
488
+ changeTree.root?.enqueueChangeTree(changeTree, 'changes');
489
489
  }
490
490
 
491
491
  return this.items.splice(start, deleteCount, ...insertItems);
@@ -118,6 +118,10 @@ export class MapSchema<V=any, K extends string = string> implements Map<K, V>, C
118
118
  }
119
119
  }
120
120
 
121
+ if (this.deletedItems[index]) {
122
+ delete this.deletedItems[index];
123
+ }
124
+
121
125
  } else {
122
126
  index = changeTree.indexes[$numFields] ?? 0;
123
127
  operation = OPERATION.ADD;