@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.
@@ -961,27 +961,13 @@ const Metadata = {
961
961
  }
962
962
  };
963
963
 
964
- function createChangeSet() {
965
- return { indexes: {}, operations: [] };
964
+ function createChangeSet(queueRootNode) {
965
+ return { indexes: {}, operations: [], queueRootNode };
966
966
  }
967
967
  // Linked list helper functions
968
968
  function createChangeTreeList() {
969
969
  return { next: undefined, tail: undefined, length: 0 };
970
970
  }
971
- function addToChangeTreeList(list, changeTree) {
972
- const node = { changeTree, next: undefined, prev: undefined };
973
- if (!list.next) {
974
- list.next = node;
975
- list.tail = node;
976
- }
977
- else {
978
- node.prev = list.tail;
979
- list.tail.next = node;
980
- list.tail = node;
981
- }
982
- list.length++;
983
- return node;
984
- }
985
971
  function setOperationAtIndex(changeSet, index) {
986
972
  const operationsIndex = changeSet.indexes[index];
987
973
  if (operationsIndex === undefined) {
@@ -1006,17 +992,6 @@ function deleteOperationAtIndex(changeSet, index) {
1006
992
  changeSet.operations[operationsIndex] = undefined;
1007
993
  delete changeSet.indexes[index];
1008
994
  }
1009
- function enqueueChangeTree(root, changeTree, changeSet, queueRootNode = changeTree[changeSet].queueRootNode) {
1010
- // skip
1011
- if (!root) {
1012
- return;
1013
- }
1014
- if (queueRootNode) ;
1015
- else {
1016
- // Add to linked list if not already present
1017
- changeTree[changeSet].queueRootNode = addToChangeTreeList(root[changeSet], changeTree);
1018
- }
1019
- }
1020
995
  class ChangeTree {
1021
996
  constructor(ref) {
1022
997
  /**
@@ -1122,11 +1097,11 @@ class ChangeTree {
1122
1097
  // this is checked during .encode() time.
1123
1098
  if (this.filteredChanges !== undefined) {
1124
1099
  this.filteredChanges.operations.push(-op);
1125
- enqueueChangeTree(this.root, this, 'filteredChanges');
1100
+ this.root?.enqueueChangeTree(this, 'filteredChanges');
1126
1101
  }
1127
1102
  else {
1128
1103
  this.changes.operations.push(-op);
1129
- enqueueChangeTree(this.root, this, 'changes');
1104
+ this.root?.enqueueChangeTree(this, 'changes');
1130
1105
  }
1131
1106
  }
1132
1107
  change(index, operation = OPERATION.ADD) {
@@ -1150,13 +1125,13 @@ class ChangeTree {
1150
1125
  if (isFiltered) {
1151
1126
  setOperationAtIndex(this.allFilteredChanges, index);
1152
1127
  if (this.root) {
1153
- enqueueChangeTree(this.root, this, 'filteredChanges');
1154
- enqueueChangeTree(this.root, this, 'allFilteredChanges');
1128
+ this.root.enqueueChangeTree(this, 'filteredChanges');
1129
+ this.root.enqueueChangeTree(this, 'allFilteredChanges');
1155
1130
  }
1156
1131
  }
1157
1132
  else {
1158
1133
  setOperationAtIndex(this.allChanges, index);
1159
- enqueueChangeTree(this.root, this, 'changes');
1134
+ this.root?.enqueueChangeTree(this, 'changes');
1160
1135
  }
1161
1136
  }
1162
1137
  shiftChangeIndexes(shiftIndex) {
@@ -1211,12 +1186,12 @@ class ChangeTree {
1211
1186
  if (this.filteredChanges !== undefined) {
1212
1187
  setOperationAtIndex(this.allFilteredChanges, allChangesIndex);
1213
1188
  setOperationAtIndex(this.filteredChanges, index);
1214
- enqueueChangeTree(this.root, this, 'filteredChanges');
1189
+ this.root?.enqueueChangeTree(this, 'filteredChanges');
1215
1190
  }
1216
1191
  else {
1217
1192
  setOperationAtIndex(this.allChanges, allChangesIndex);
1218
1193
  setOperationAtIndex(this.changes, index);
1219
- enqueueChangeTree(this.root, this, 'changes');
1194
+ this.root?.enqueueChangeTree(this, 'changes');
1220
1195
  }
1221
1196
  }
1222
1197
  getType(index) {
@@ -1279,10 +1254,10 @@ class ChangeTree {
1279
1254
  //
1280
1255
  if (this.filteredChanges !== undefined) {
1281
1256
  deleteOperationAtIndex(this.allFilteredChanges, allChangesIndex);
1282
- enqueueChangeTree(this.root, this, 'filteredChanges');
1257
+ this.root?.enqueueChangeTree(this, 'filteredChanges');
1283
1258
  }
1284
1259
  else {
1285
- enqueueChangeTree(this.root, this, 'changes');
1260
+ this.root?.enqueueChangeTree(this, 'changes');
1286
1261
  }
1287
1262
  return previousValue;
1288
1263
  }
@@ -1308,9 +1283,10 @@ class ChangeTree {
1308
1283
  this.filteredChanges = createChangeSet();
1309
1284
  }
1310
1285
  if (discardAll) {
1311
- this.allChanges = createChangeSet();
1286
+ // preserve queueRootNode references
1287
+ this.allChanges = createChangeSet(this.allChanges.queueRootNode);
1312
1288
  if (this.allFilteredChanges !== undefined) {
1313
- this.allFilteredChanges = createChangeSet();
1289
+ this.allFilteredChanges = createChangeSet(this.allFilteredChanges.queueRootNode);
1314
1290
  }
1315
1291
  }
1316
1292
  }
@@ -1341,16 +1317,16 @@ class ChangeTree {
1341
1317
  //
1342
1318
  this._checkFilteredByParent(parent, parentIndex);
1343
1319
  if (this.filteredChanges !== undefined) {
1344
- enqueueChangeTree(this.root, this, 'filteredChanges');
1320
+ this.root?.enqueueChangeTree(this, 'filteredChanges');
1345
1321
  if (isNewChangeTree) {
1346
- enqueueChangeTree(this.root, this, 'allFilteredChanges');
1322
+ this.root?.enqueueChangeTree(this, 'allFilteredChanges');
1347
1323
  }
1348
1324
  }
1349
1325
  }
1350
1326
  if (!this.isFiltered) {
1351
- enqueueChangeTree(this.root, this, 'changes');
1327
+ this.root?.enqueueChangeTree(this, 'changes');
1352
1328
  if (isNewChangeTree) {
1353
- enqueueChangeTree(this.root, this, 'allChanges');
1329
+ this.root?.enqueueChangeTree(this, 'allChanges');
1354
1330
  }
1355
1331
  }
1356
1332
  }
@@ -2302,10 +2278,10 @@ class ArraySchema {
2302
2278
  // FIXME: this code block is duplicated on ChangeTree
2303
2279
  //
2304
2280
  if (changeTree.filteredChanges !== undefined) {
2305
- enqueueChangeTree(changeTree.root, changeTree, 'filteredChanges');
2281
+ changeTree.root?.enqueueChangeTree(changeTree, 'filteredChanges');
2306
2282
  }
2307
2283
  else {
2308
- enqueueChangeTree(changeTree.root, changeTree, 'changes');
2284
+ changeTree.root?.enqueueChangeTree(changeTree, 'changes');
2309
2285
  }
2310
2286
  return this.items.splice(start, deleteCount, ...insertItems);
2311
2287
  }
@@ -2720,6 +2696,9 @@ class MapSchema {
2720
2696
  previousValue[$changes].root?.remove(previousValue[$changes]);
2721
2697
  }
2722
2698
  }
2699
+ if (this.deletedItems[index]) {
2700
+ delete this.deletedItems[index];
2701
+ }
2723
2702
  }
2724
2703
  else {
2725
2704
  index = changeTree.indexes[$numFields] ?? 0;
@@ -3938,11 +3917,12 @@ class Root {
3938
3917
  }
3939
3918
  }
3940
3919
  this.refCount[changeTree.refId] = (previousRefCount || 0) + 1;
3941
- // console.log("ADD", { refId: changeTree.refId, refCount: this.refCount[changeTree.refId] });
3920
+ // console.log("ADD", { refId: changeTree.refId, ref: changeTree.ref.constructor.name, refCount: this.refCount[changeTree.refId], isNewChangeTree });
3942
3921
  return isNewChangeTree;
3943
3922
  }
3944
3923
  remove(changeTree) {
3945
3924
  const refCount = (this.refCount[changeTree.refId]) - 1;
3925
+ // console.log("REMOVE", { refId: changeTree.refId, ref: changeTree.ref.constructor.name, refCount, needRemove: refCount <= 0 });
3946
3926
  if (refCount <= 0) {
3947
3927
  //
3948
3928
  // Only remove "root" reference if it's the last reference
@@ -4025,6 +4005,28 @@ class Root {
4025
4005
  }
4026
4006
  changeSet.tail = node;
4027
4007
  }
4008
+ enqueueChangeTree(changeTree, changeSet, queueRootNode = changeTree[changeSet].queueRootNode) {
4009
+ // skip
4010
+ if (queueRootNode) {
4011
+ return;
4012
+ }
4013
+ // Add to linked list if not already present
4014
+ changeTree[changeSet].queueRootNode = this.addToChangeTreeList(this[changeSet], changeTree);
4015
+ }
4016
+ addToChangeTreeList(list, changeTree) {
4017
+ const node = { changeTree, next: undefined, prev: undefined };
4018
+ if (!list.next) {
4019
+ list.next = node;
4020
+ list.tail = node;
4021
+ }
4022
+ else {
4023
+ node.prev = list.tail;
4024
+ list.tail.next = node;
4025
+ list.tail = node;
4026
+ }
4027
+ list.length++;
4028
+ return node;
4029
+ }
4028
4030
  removeChangeFromChangeSet(changeSetName, changeTree) {
4029
4031
  const changeSet = this[changeSetName];
4030
4032
  const node = changeTree[changeSetName].queueRootNode;