@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/cjs/index.js
CHANGED
|
@@ -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
|
-
|
|
1102
|
+
this.root?.enqueueChangeTree(this, 'filteredChanges');
|
|
1128
1103
|
}
|
|
1129
1104
|
else {
|
|
1130
1105
|
this.changes.operations.push(-op);
|
|
1131
|
-
|
|
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
|
-
|
|
1156
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1191
|
+
this.root?.enqueueChangeTree(this, 'filteredChanges');
|
|
1217
1192
|
}
|
|
1218
1193
|
else {
|
|
1219
1194
|
setOperationAtIndex(this.allChanges, allChangesIndex);
|
|
1220
1195
|
setOperationAtIndex(this.changes, index);
|
|
1221
|
-
|
|
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
|
-
|
|
1259
|
+
this.root?.enqueueChangeTree(this, 'filteredChanges');
|
|
1285
1260
|
}
|
|
1286
1261
|
else {
|
|
1287
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1322
|
+
this.root?.enqueueChangeTree(this, 'filteredChanges');
|
|
1347
1323
|
if (isNewChangeTree) {
|
|
1348
|
-
|
|
1324
|
+
this.root?.enqueueChangeTree(this, 'allFilteredChanges');
|
|
1349
1325
|
}
|
|
1350
1326
|
}
|
|
1351
1327
|
}
|
|
1352
1328
|
if (!this.isFiltered) {
|
|
1353
|
-
|
|
1329
|
+
this.root?.enqueueChangeTree(this, 'changes');
|
|
1354
1330
|
if (isNewChangeTree) {
|
|
1355
|
-
|
|
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
|
-
|
|
2283
|
+
changeTree.root?.enqueueChangeTree(changeTree, 'filteredChanges');
|
|
2308
2284
|
}
|
|
2309
2285
|
else {
|
|
2310
|
-
|
|
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;
|