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