@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.
@@ -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
  }
@@ -1586,7 +1562,12 @@ const encodeArray = function (encoder, bytes, changeTree, field, operation, it,
1586
1562
  const useOperationByRefId = hasView && changeTree.isFiltered && (typeof (changeTree.getType(field)) !== "string");
1587
1563
  let refOrIndex;
1588
1564
  if (useOperationByRefId) {
1589
- refOrIndex = ref['tmpItems'][field][$changes].refId;
1565
+ const item = ref['tmpItems'][field];
1566
+ // Skip encoding if item is undefined (e.g. when clear() is called)
1567
+ if (!item) {
1568
+ return;
1569
+ }
1570
+ refOrIndex = item[$changes].refId;
1590
1571
  if (operation === OPERATION.DELETE) {
1591
1572
  operation = OPERATION.DELETE_BY_REFID;
1592
1573
  }
@@ -2297,10 +2278,10 @@ class ArraySchema {
2297
2278
  // FIXME: this code block is duplicated on ChangeTree
2298
2279
  //
2299
2280
  if (changeTree.filteredChanges !== undefined) {
2300
- enqueueChangeTree(changeTree.root, changeTree, 'filteredChanges');
2281
+ changeTree.root?.enqueueChangeTree(changeTree, 'filteredChanges');
2301
2282
  }
2302
2283
  else {
2303
- enqueueChangeTree(changeTree.root, changeTree, 'changes');
2284
+ changeTree.root?.enqueueChangeTree(changeTree, 'changes');
2304
2285
  }
2305
2286
  return this.items.splice(start, deleteCount, ...insertItems);
2306
2287
  }
@@ -2715,6 +2696,9 @@ class MapSchema {
2715
2696
  previousValue[$changes].root?.remove(previousValue[$changes]);
2716
2697
  }
2717
2698
  }
2699
+ if (this.deletedItems[index]) {
2700
+ delete this.deletedItems[index];
2701
+ }
2718
2702
  }
2719
2703
  else {
2720
2704
  index = changeTree.indexes[$numFields] ?? 0;
@@ -3933,11 +3917,12 @@ class Root {
3933
3917
  }
3934
3918
  }
3935
3919
  this.refCount[changeTree.refId] = (previousRefCount || 0) + 1;
3936
- // 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 });
3937
3921
  return isNewChangeTree;
3938
3922
  }
3939
3923
  remove(changeTree) {
3940
3924
  const refCount = (this.refCount[changeTree.refId]) - 1;
3925
+ // console.log("REMOVE", { refId: changeTree.refId, ref: changeTree.ref.constructor.name, refCount, needRemove: refCount <= 0 });
3941
3926
  if (refCount <= 0) {
3942
3927
  //
3943
3928
  // Only remove "root" reference if it's the last reference
@@ -4020,6 +4005,28 @@ class Root {
4020
4005
  }
4021
4006
  changeSet.tail = node;
4022
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
+ }
4023
4030
  removeChangeFromChangeSet(changeSetName, changeTree) {
4024
4031
  const changeSet = this[changeSetName];
4025
4032
  const node = changeTree[changeSetName].queueRootNode;