@colyseus/schema 3.0.50 → 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
  }
@@ -1588,7 +1564,12 @@ const encodeArray = function (encoder, bytes, changeTree, field, operation, it,
1588
1564
  const useOperationByRefId = hasView && changeTree.isFiltered && (typeof (changeTree.getType(field)) !== "string");
1589
1565
  let refOrIndex;
1590
1566
  if (useOperationByRefId) {
1591
- refOrIndex = ref['tmpItems'][field][$changes].refId;
1567
+ const item = ref['tmpItems'][field];
1568
+ // Skip encoding if item is undefined (e.g. when clear() is called)
1569
+ if (!item) {
1570
+ return;
1571
+ }
1572
+ refOrIndex = item[$changes].refId;
1592
1573
  if (operation === exports.OPERATION.DELETE) {
1593
1574
  operation = exports.OPERATION.DELETE_BY_REFID;
1594
1575
  }
@@ -2299,10 +2280,10 @@ class ArraySchema {
2299
2280
  // FIXME: this code block is duplicated on ChangeTree
2300
2281
  //
2301
2282
  if (changeTree.filteredChanges !== undefined) {
2302
- enqueueChangeTree(changeTree.root, changeTree, 'filteredChanges');
2283
+ changeTree.root?.enqueueChangeTree(changeTree, 'filteredChanges');
2303
2284
  }
2304
2285
  else {
2305
- enqueueChangeTree(changeTree.root, changeTree, 'changes');
2286
+ changeTree.root?.enqueueChangeTree(changeTree, 'changes');
2306
2287
  }
2307
2288
  return this.items.splice(start, deleteCount, ...insertItems);
2308
2289
  }
@@ -2717,6 +2698,9 @@ class MapSchema {
2717
2698
  previousValue[$changes].root?.remove(previousValue[$changes]);
2718
2699
  }
2719
2700
  }
2701
+ if (this.deletedItems[index]) {
2702
+ delete this.deletedItems[index];
2703
+ }
2720
2704
  }
2721
2705
  else {
2722
2706
  index = changeTree.indexes[$numFields] ?? 0;
@@ -3935,11 +3919,12 @@ class Root {
3935
3919
  }
3936
3920
  }
3937
3921
  this.refCount[changeTree.refId] = (previousRefCount || 0) + 1;
3938
- // 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 });
3939
3923
  return isNewChangeTree;
3940
3924
  }
3941
3925
  remove(changeTree) {
3942
3926
  const refCount = (this.refCount[changeTree.refId]) - 1;
3927
+ // console.log("REMOVE", { refId: changeTree.refId, ref: changeTree.ref.constructor.name, refCount, needRemove: refCount <= 0 });
3943
3928
  if (refCount <= 0) {
3944
3929
  //
3945
3930
  // Only remove "root" reference if it's the last reference
@@ -4022,6 +4007,28 @@ class Root {
4022
4007
  }
4023
4008
  changeSet.tail = node;
4024
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
+ }
4025
4032
  removeChangeFromChangeSet(changeSetName, changeTree) {
4026
4033
  const changeSet = this[changeSetName];
4027
4034
  const node = changeTree[changeSetName].queueRootNode;