@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.
- package/build/cjs/index.js +53 -46
- package/build/cjs/index.js.map +1 -1
- package/build/esm/index.mjs +53 -46
- package/build/esm/index.mjs.map +1 -1
- package/build/umd/index.js +53 -46
- 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/EncodeOperation.js +6 -1
- package/lib/encoder/EncodeOperation.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/EncodeOperation.ts +6 -1
- 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
|
}
|
|
@@ -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
|
-
|
|
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
|
-
|
|
2281
|
+
changeTree.root?.enqueueChangeTree(changeTree, 'filteredChanges');
|
|
2301
2282
|
}
|
|
2302
2283
|
else {
|
|
2303
|
-
|
|
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;
|