@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.
- package/build/cjs/index.js +47 -45
- package/build/cjs/index.js.map +1 -1
- package/build/esm/index.mjs +47 -45
- package/build/esm/index.mjs.map +1 -1
- package/build/umd/index.js +47 -45
- package/lib/encoder/ChangeTree.d.ts +0 -2
- package/lib/encoder/ChangeTree.js +18 -45
- package/lib/encoder/ChangeTree.js.map +1 -1
- package/lib/encoder/Root.d.ts +4 -2
- package/lib/encoder/Root.js +24 -1
- package/lib/encoder/Root.js.map +1 -1
- package/lib/types/custom/ArraySchema.js +2 -2
- package/lib/types/custom/ArraySchema.js.map +1 -1
- package/lib/types/custom/MapSchema.js +3 -0
- package/lib/types/custom/MapSchema.js.map +1 -1
- package/package.json +1 -1
- package/src/encoder/ChangeTree.ts +20 -50
- package/src/encoder/Root.ts +34 -3
- package/src/types/custom/ArraySchema.ts +3 -3
- package/src/types/custom/MapSchema.ts +4 -0
package/build/esm/index.mjs
CHANGED
|
@@ -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
|
-
|
|
1100
|
+
this.root?.enqueueChangeTree(this, 'filteredChanges');
|
|
1126
1101
|
}
|
|
1127
1102
|
else {
|
|
1128
1103
|
this.changes.operations.push(-op);
|
|
1129
|
-
|
|
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
|
-
|
|
1154
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1189
|
+
this.root?.enqueueChangeTree(this, 'filteredChanges');
|
|
1215
1190
|
}
|
|
1216
1191
|
else {
|
|
1217
1192
|
setOperationAtIndex(this.allChanges, allChangesIndex);
|
|
1218
1193
|
setOperationAtIndex(this.changes, index);
|
|
1219
|
-
|
|
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
|
-
|
|
1257
|
+
this.root?.enqueueChangeTree(this, 'filteredChanges');
|
|
1283
1258
|
}
|
|
1284
1259
|
else {
|
|
1285
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1320
|
+
this.root?.enqueueChangeTree(this, 'filteredChanges');
|
|
1345
1321
|
if (isNewChangeTree) {
|
|
1346
|
-
|
|
1322
|
+
this.root?.enqueueChangeTree(this, 'allFilteredChanges');
|
|
1347
1323
|
}
|
|
1348
1324
|
}
|
|
1349
1325
|
}
|
|
1350
1326
|
if (!this.isFiltered) {
|
|
1351
|
-
|
|
1327
|
+
this.root?.enqueueChangeTree(this, 'changes');
|
|
1352
1328
|
if (isNewChangeTree) {
|
|
1353
|
-
|
|
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
|
-
|
|
2281
|
+
changeTree.root?.enqueueChangeTree(changeTree, 'filteredChanges');
|
|
2306
2282
|
}
|
|
2307
2283
|
else {
|
|
2308
|
-
|
|
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;
|