@colyseus/schema 3.0.11 → 3.0.13
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 +99 -108
- package/build/cjs/index.js.map +1 -1
- package/build/esm/index.mjs +99 -108
- package/build/esm/index.mjs.map +1 -1
- package/build/umd/index.js +99 -108
- package/lib/Metadata.js +1 -2
- package/lib/Metadata.js.map +1 -1
- package/lib/annotations.js +4 -3
- package/lib/annotations.js.map +1 -1
- package/lib/decoder/DecodeOperation.js +0 -13
- package/lib/decoder/DecodeOperation.js.map +1 -1
- package/lib/encoder/ChangeTree.d.ts +1 -1
- package/lib/encoder/ChangeTree.js +1 -0
- package/lib/encoder/ChangeTree.js.map +1 -1
- package/lib/encoder/Encoder.d.ts +0 -1
- package/lib/encoder/Encoder.js +27 -33
- package/lib/encoder/Encoder.js.map +1 -1
- package/lib/encoder/Root.d.ts +1 -1
- package/lib/encoder/Root.js +1 -0
- package/lib/encoder/Root.js.map +1 -1
- package/lib/encoder/StateView.d.ts +4 -4
- package/lib/encoder/StateView.js +33 -21
- package/lib/encoder/StateView.js.map +1 -1
- package/lib/types/custom/ArraySchema.js +5 -1
- package/lib/types/custom/ArraySchema.js.map +1 -1
- package/lib/types/custom/MapSchema.d.ts +3 -0
- package/lib/types/custom/MapSchema.js +28 -35
- package/lib/types/custom/MapSchema.js.map +1 -1
- package/package.json +1 -1
- package/src/Metadata.ts +1 -2
- package/src/annotations.ts +4 -4
- package/src/decoder/DecodeOperation.ts +0 -14
- package/src/encoder/ChangeTree.ts +2 -2
- package/src/encoder/Encoder.ts +31 -44
- package/src/encoder/Root.ts +1 -0
- package/src/encoder/StateView.ts +34 -22
- package/src/types/custom/ArraySchema.ts +8 -1
- package/src/types/custom/MapSchema.ts +29 -43
package/build/umd/index.js
CHANGED
|
@@ -863,14 +863,13 @@
|
|
|
863
863
|
fieldIndex++;
|
|
864
864
|
for (const field in fields) {
|
|
865
865
|
const type = fields[field];
|
|
866
|
-
const normalizedType = getNormalizedType(type);
|
|
867
866
|
// FIXME: this code is duplicated from @type() annotation
|
|
868
867
|
const complexTypeKlass = (Array.isArray(type))
|
|
869
868
|
? getType("array")
|
|
870
869
|
: (typeof (Object.keys(type)[0]) === "string") && getType(Object.keys(type)[0]);
|
|
871
870
|
const childType = (complexTypeKlass)
|
|
872
871
|
? Object.values(type)[0]
|
|
873
|
-
:
|
|
872
|
+
: getNormalizedType(type);
|
|
874
873
|
Metadata.addField(metadata, fieldIndex, field, type, getPropertyDescriptor(`_${field}`, fieldIndex, childType, complexTypeKlass));
|
|
875
874
|
fieldIndex++;
|
|
876
875
|
}
|
|
@@ -1253,6 +1252,7 @@
|
|
|
1253
1252
|
else {
|
|
1254
1253
|
enqueueChangeTree(this.root, this, 'changes');
|
|
1255
1254
|
}
|
|
1255
|
+
return previousValue;
|
|
1256
1256
|
}
|
|
1257
1257
|
endEncode() {
|
|
1258
1258
|
this.indexedOperations = {};
|
|
@@ -1537,19 +1537,6 @@
|
|
|
1537
1537
|
//
|
|
1538
1538
|
if (operation !== exports.OPERATION.DELETE_AND_ADD) {
|
|
1539
1539
|
ref[$deleteByIndex](index);
|
|
1540
|
-
// //
|
|
1541
|
-
// // FIXME: is this in the correct place?
|
|
1542
|
-
// // (This is sounding like a workaround just for ArraySchema, see
|
|
1543
|
-
// // "should splice and move" test on ArraySchema.test.ts)
|
|
1544
|
-
// //
|
|
1545
|
-
// allChanges.push({
|
|
1546
|
-
// ref,
|
|
1547
|
-
// refId: decoder.currentRefId,
|
|
1548
|
-
// op: OPERATION.DELETE,
|
|
1549
|
-
// field: index as unknown as string,
|
|
1550
|
-
// value: undefined,
|
|
1551
|
-
// previousValue,
|
|
1552
|
-
// });
|
|
1553
1540
|
}
|
|
1554
1541
|
value = undefined;
|
|
1555
1542
|
}
|
|
@@ -1897,7 +1884,8 @@
|
|
|
1897
1884
|
else {
|
|
1898
1885
|
if (setValue[$changes]) {
|
|
1899
1886
|
assertInstanceType(setValue, obj[$childType], obj, key);
|
|
1900
|
-
|
|
1887
|
+
const previousValue = obj.items[key];
|
|
1888
|
+
if (previousValue !== undefined) {
|
|
1901
1889
|
if (setValue[$changes].isNew) {
|
|
1902
1890
|
this[$changes].indexedOperation(Number(key), exports.OPERATION.MOVE_AND_ADD);
|
|
1903
1891
|
}
|
|
@@ -1909,10 +1897,13 @@
|
|
|
1909
1897
|
this[$changes].indexedOperation(Number(key), exports.OPERATION.MOVE);
|
|
1910
1898
|
}
|
|
1911
1899
|
}
|
|
1900
|
+
// remove root reference from previous value
|
|
1901
|
+
previousValue[$changes].root?.remove(previousValue[$changes]);
|
|
1912
1902
|
}
|
|
1913
1903
|
else if (setValue[$changes].isNew) {
|
|
1914
1904
|
this[$changes].indexedOperation(Number(key), exports.OPERATION.ADD);
|
|
1915
1905
|
}
|
|
1906
|
+
setValue[$changes].setParent(this, obj[$changes].root, key);
|
|
1916
1907
|
}
|
|
1917
1908
|
else {
|
|
1918
1909
|
obj.$changeAt(Number(key), setValue);
|
|
@@ -2507,7 +2498,7 @@
|
|
|
2507
2498
|
static [(_a$3 = $encoder, _b$3 = $decoder, $filter)](ref, index, view) {
|
|
2508
2499
|
return (!view ||
|
|
2509
2500
|
typeof (ref[$childType]) === "string" ||
|
|
2510
|
-
view.items.has(ref[$getByIndex](index)[$changes]));
|
|
2501
|
+
view.items.has((ref[$getByIndex](index) ?? ref.deletedItems[index])[$changes]));
|
|
2511
2502
|
}
|
|
2512
2503
|
static is(type) {
|
|
2513
2504
|
return type['map'] !== undefined;
|
|
@@ -2515,6 +2506,7 @@
|
|
|
2515
2506
|
constructor(initialValues) {
|
|
2516
2507
|
this.$items = new Map();
|
|
2517
2508
|
this.$indexes = new Map();
|
|
2509
|
+
this.deletedItems = {};
|
|
2518
2510
|
this[$changes] = new ChangeTree(this);
|
|
2519
2511
|
this[$changes].indexes = {};
|
|
2520
2512
|
if (initialValues) {
|
|
@@ -2550,33 +2542,34 @@
|
|
|
2550
2542
|
// See: https://github.com/colyseus/colyseus/issues/561#issuecomment-1646733468
|
|
2551
2543
|
key = key.toString();
|
|
2552
2544
|
const changeTree = this[$changes];
|
|
2553
|
-
// get "index" for this value.
|
|
2554
|
-
const isReplace = typeof (changeTree.indexes[key]) !== "undefined";
|
|
2555
|
-
const index = (isReplace)
|
|
2556
|
-
? changeTree.indexes[key]
|
|
2557
|
-
: changeTree.indexes[$numFields] ?? 0;
|
|
2558
|
-
let operation = (isReplace)
|
|
2559
|
-
? exports.OPERATION.REPLACE
|
|
2560
|
-
: exports.OPERATION.ADD;
|
|
2561
2545
|
const isRef = (value[$changes]) !== undefined;
|
|
2562
|
-
|
|
2563
|
-
|
|
2564
|
-
//
|
|
2565
|
-
|
|
2566
|
-
|
|
2546
|
+
let index;
|
|
2547
|
+
let operation;
|
|
2548
|
+
// IS REPLACE?
|
|
2549
|
+
if (typeof (changeTree.indexes[key]) !== "undefined") {
|
|
2550
|
+
index = changeTree.indexes[key];
|
|
2551
|
+
operation = exports.OPERATION.REPLACE;
|
|
2552
|
+
const previousValue = this.$items.get(key);
|
|
2553
|
+
if (previousValue === value) {
|
|
2554
|
+
// if value is the same, avoid re-encoding it.
|
|
2555
|
+
return;
|
|
2556
|
+
}
|
|
2557
|
+
else if (isRef) {
|
|
2558
|
+
// if is schema, force ADD operation if value differ from previous one.
|
|
2559
|
+
operation = exports.OPERATION.DELETE_AND_ADD;
|
|
2560
|
+
// remove reference from previous value
|
|
2561
|
+
if (previousValue !== undefined) {
|
|
2562
|
+
previousValue[$changes].root?.remove(previousValue[$changes]);
|
|
2563
|
+
}
|
|
2564
|
+
}
|
|
2565
|
+
}
|
|
2566
|
+
else {
|
|
2567
|
+
index = changeTree.indexes[$numFields] ?? 0;
|
|
2568
|
+
operation = exports.OPERATION.ADD;
|
|
2567
2569
|
this.$indexes.set(index, key);
|
|
2568
2570
|
changeTree.indexes[key] = index;
|
|
2569
2571
|
changeTree.indexes[$numFields] = index + 1;
|
|
2570
2572
|
}
|
|
2571
|
-
else if (!isRef &&
|
|
2572
|
-
this.$items.get(key) === value) {
|
|
2573
|
-
// if value is the same, avoid re-encoding it.
|
|
2574
|
-
return;
|
|
2575
|
-
}
|
|
2576
|
-
else if (isRef && // if is schema, force ADD operation if value differ from previous one.
|
|
2577
|
-
this.$items.get(key) !== value) {
|
|
2578
|
-
operation = exports.OPERATION.ADD;
|
|
2579
|
-
}
|
|
2580
2573
|
this.$items.set(key, value);
|
|
2581
2574
|
changeTree.change(index, operation);
|
|
2582
2575
|
//
|
|
@@ -2593,7 +2586,7 @@
|
|
|
2593
2586
|
}
|
|
2594
2587
|
delete(key) {
|
|
2595
2588
|
const index = this[$changes].indexes[key];
|
|
2596
|
-
this[$changes].delete(index);
|
|
2589
|
+
this.deletedItems[index] = this[$changes].delete(index);
|
|
2597
2590
|
return this.$items.delete(key);
|
|
2598
2591
|
}
|
|
2599
2592
|
clear() {
|
|
@@ -2640,17 +2633,7 @@
|
|
|
2640
2633
|
this.$indexes.delete(index);
|
|
2641
2634
|
}
|
|
2642
2635
|
[$onEncodeEnd]() {
|
|
2643
|
-
|
|
2644
|
-
const keys = Object.keys(changeTree.indexedOperations);
|
|
2645
|
-
for (let i = 0, len = keys.length; i < len; i++) {
|
|
2646
|
-
const key = keys[i];
|
|
2647
|
-
const fieldIndex = Number(key);
|
|
2648
|
-
const operation = changeTree.indexedOperations[key];
|
|
2649
|
-
if (operation === exports.OPERATION.DELETE) {
|
|
2650
|
-
const index = this[$getByIndex](fieldIndex);
|
|
2651
|
-
delete changeTree.indexes[index];
|
|
2652
|
-
}
|
|
2653
|
-
}
|
|
2636
|
+
this.deletedItems = {};
|
|
2654
2637
|
}
|
|
2655
2638
|
toJSON() {
|
|
2656
2639
|
const map = {};
|
|
@@ -2948,13 +2931,14 @@
|
|
|
2948
2931
|
const changeTree = this[$changes];
|
|
2949
2932
|
//
|
|
2950
2933
|
// Replacing existing "ref", remove it from root.
|
|
2951
|
-
// TODO: if there are other references to this instance, we should not remove it from root.
|
|
2952
2934
|
//
|
|
2953
2935
|
if (previousValue !== undefined && previousValue[$changes]) {
|
|
2954
2936
|
changeTree.root?.remove(previousValue[$changes]);
|
|
2937
|
+
this.constructor[$track](changeTree, fieldIndex, exports.OPERATION.DELETE_AND_ADD);
|
|
2938
|
+
}
|
|
2939
|
+
else {
|
|
2940
|
+
this.constructor[$track](changeTree, fieldIndex, exports.OPERATION.ADD);
|
|
2955
2941
|
}
|
|
2956
|
-
// flag the change for encoding.
|
|
2957
|
-
this.constructor[$track](changeTree, fieldIndex, exports.OPERATION.ADD);
|
|
2958
2942
|
//
|
|
2959
2943
|
// call setParent() recursively for this and its child
|
|
2960
2944
|
// structures.
|
|
@@ -3777,6 +3761,7 @@
|
|
|
3777
3761
|
if (spliceOne(changeSet, changeSet.indexOf(changeTree))) {
|
|
3778
3762
|
changeTree[changeSetName].queueRootIndex = -1;
|
|
3779
3763
|
// changeSet[index] = undefined;
|
|
3764
|
+
return true;
|
|
3780
3765
|
}
|
|
3781
3766
|
}
|
|
3782
3767
|
clear() {
|
|
@@ -3812,12 +3797,6 @@
|
|
|
3812
3797
|
const changeTrees = this.root[changeSetName];
|
|
3813
3798
|
for (let i = 0, numChangeTrees = changeTrees.length; i < numChangeTrees; i++) {
|
|
3814
3799
|
const changeTree = changeTrees[i];
|
|
3815
|
-
const operations = changeTree[changeSetName];
|
|
3816
|
-
const ref = changeTree.ref;
|
|
3817
|
-
const ctor = ref.constructor;
|
|
3818
|
-
const encoder = ctor[$encoder];
|
|
3819
|
-
const filter = ctor[$filter];
|
|
3820
|
-
const metadata = ctor[Symbol.metadata];
|
|
3821
3800
|
if (hasView) {
|
|
3822
3801
|
if (!view.items.has(changeTree)) {
|
|
3823
3802
|
view.invisible.add(changeTree);
|
|
@@ -3827,13 +3806,24 @@
|
|
|
3827
3806
|
view.invisible.delete(changeTree); // remove from invisible list
|
|
3828
3807
|
}
|
|
3829
3808
|
}
|
|
3809
|
+
const operations = changeTree[changeSetName];
|
|
3810
|
+
const ref = changeTree.ref;
|
|
3811
|
+
// TODO: avoid iterating over change tree if no changes were made
|
|
3812
|
+
const numChanges = operations.operations.length;
|
|
3813
|
+
if (numChanges === 0) {
|
|
3814
|
+
continue;
|
|
3815
|
+
}
|
|
3816
|
+
const ctor = ref.constructor;
|
|
3817
|
+
const encoder = ctor[$encoder];
|
|
3818
|
+
const filter = ctor[$filter];
|
|
3819
|
+
const metadata = ctor[Symbol.metadata];
|
|
3830
3820
|
// skip root `refId` if it's the first change tree
|
|
3831
3821
|
// (unless it "hasView", which will need to revisit the root)
|
|
3832
3822
|
if (hasView || it.offset > initialOffset || changeTree !== rootChangeTree) {
|
|
3833
3823
|
buffer[it.offset++] = SWITCH_TO_STRUCTURE & 255;
|
|
3834
3824
|
encode.number(buffer, changeTree.refId, it);
|
|
3835
3825
|
}
|
|
3836
|
-
for (let j = 0
|
|
3826
|
+
for (let j = 0; j < numChanges; j++) {
|
|
3837
3827
|
const fieldIndex = operations.operations[j];
|
|
3838
3828
|
const operation = (fieldIndex < 0)
|
|
3839
3829
|
? Math.abs(fieldIndex) // "pure" operation without fieldIndex (e.g. CLEAR, REVERSE, etc.)
|
|
@@ -3930,14 +3920,16 @@
|
|
|
3930
3920
|
encodeView(view, sharedOffset, it, bytes = this.sharedBuffer) {
|
|
3931
3921
|
const viewOffset = it.offset;
|
|
3932
3922
|
// encode visibility changes (add/remove for this view)
|
|
3933
|
-
const
|
|
3934
|
-
for (let i = 0, numRefIds = refIds.length; i < numRefIds; i++) {
|
|
3935
|
-
const refId = refIds[i];
|
|
3936
|
-
const changes = view.changes[refId];
|
|
3923
|
+
for (const [refId, changes] of view.changes) {
|
|
3937
3924
|
const changeTree = this.root.changeTrees[refId];
|
|
3938
|
-
if (changeTree === undefined
|
|
3939
|
-
|
|
3940
|
-
|
|
3925
|
+
if (changeTree === undefined) {
|
|
3926
|
+
// detached instance, remove from view and skip.
|
|
3927
|
+
view.changes.delete(refId);
|
|
3928
|
+
continue;
|
|
3929
|
+
}
|
|
3930
|
+
const keys = Object.keys(changes);
|
|
3931
|
+
if (keys.length === 0) {
|
|
3932
|
+
// FIXME: avoid having empty changes if no changes were made
|
|
3941
3933
|
// console.log("changes.size === 0, skip", changeTree.ref.constructor.name);
|
|
3942
3934
|
continue;
|
|
3943
3935
|
}
|
|
@@ -3947,13 +3939,14 @@
|
|
|
3947
3939
|
const metadata = ctor[Symbol.metadata];
|
|
3948
3940
|
bytes[it.offset++] = SWITCH_TO_STRUCTURE & 255;
|
|
3949
3941
|
encode.number(bytes, changeTree.refId, it);
|
|
3950
|
-
const keys = Object.keys(changes);
|
|
3951
3942
|
for (let i = 0, numChanges = keys.length; i < numChanges; i++) {
|
|
3952
|
-
const
|
|
3953
|
-
|
|
3943
|
+
const index = Number(keys[i]);
|
|
3944
|
+
// workaround when using view.add() on item that has been deleted from state (see test "adding to view item that has been removed from state")
|
|
3945
|
+
const value = changeTree.ref[$getByIndex](index);
|
|
3946
|
+
const operation = (value !== undefined && changes[index]) || exports.OPERATION.DELETE;
|
|
3954
3947
|
// isEncodeAll = false
|
|
3955
3948
|
// hasView = true
|
|
3956
|
-
encoder(this, bytes, changeTree,
|
|
3949
|
+
encoder(this, bytes, changeTree, index, operation, it, false, true, metadata);
|
|
3957
3950
|
}
|
|
3958
3951
|
}
|
|
3959
3952
|
//
|
|
@@ -3961,7 +3954,7 @@
|
|
|
3961
3954
|
// (to allow re-using StateView's for multiple clients)
|
|
3962
3955
|
//
|
|
3963
3956
|
// clear "view" changes after encoding
|
|
3964
|
-
view.changes
|
|
3957
|
+
view.changes.clear();
|
|
3965
3958
|
// try to encode "filtered" changes
|
|
3966
3959
|
this.encode(it, view, bytes, "filteredChanges", false, viewOffset);
|
|
3967
3960
|
return Buffer.concat([
|
|
@@ -3969,20 +3962,6 @@
|
|
|
3969
3962
|
bytes.subarray(viewOffset, it.offset)
|
|
3970
3963
|
]);
|
|
3971
3964
|
}
|
|
3972
|
-
onEndEncode(changeTrees = this.root.changes) {
|
|
3973
|
-
// changeTrees.forEach(function(changeTree) {
|
|
3974
|
-
// changeTree.endEncode();
|
|
3975
|
-
// });
|
|
3976
|
-
// for (const refId in changeTrees) {
|
|
3977
|
-
// const changeTree = this.root.changeTrees[refId];
|
|
3978
|
-
// changeTree.endEncode();
|
|
3979
|
-
// // changeTree.changes.clear();
|
|
3980
|
-
// // // ArraySchema and MapSchema have a custom "encode end" method
|
|
3981
|
-
// // changeTree.ref[$onEncodeEnd]?.();
|
|
3982
|
-
// // // Not a new instance anymore
|
|
3983
|
-
// // delete changeTree[$isNew];
|
|
3984
|
-
// }
|
|
3985
|
-
}
|
|
3986
3965
|
discardChanges() {
|
|
3987
3966
|
// discard shared changes
|
|
3988
3967
|
let length = this.root.changes.length;
|
|
@@ -4714,7 +4693,8 @@
|
|
|
4714
4693
|
* Manual "ADD" operations for changes per ChangeTree, specific to this view.
|
|
4715
4694
|
* (This is used to force encoding a property, even if it was not changed)
|
|
4716
4695
|
*/
|
|
4717
|
-
|
|
4696
|
+
// TODO: use map here!? may fix encode ordering issue
|
|
4697
|
+
this.changes = new Map();
|
|
4718
4698
|
}
|
|
4719
4699
|
// TODO: allow to set multiple tags at once
|
|
4720
4700
|
add(obj, tag = DEFAULT_VIEW_TAG, checkIncludeParent = true) {
|
|
@@ -4730,16 +4710,16 @@
|
|
|
4730
4710
|
// - if it was invisible to this view
|
|
4731
4711
|
// - if it were previously filtered out
|
|
4732
4712
|
if (checkIncludeParent && changeTree.parent) {
|
|
4733
|
-
this.
|
|
4713
|
+
this.addParentOf(changeTree, tag);
|
|
4734
4714
|
}
|
|
4735
4715
|
//
|
|
4736
4716
|
// TODO: when adding an item of a MapSchema, the changes may not
|
|
4737
4717
|
// be set (only the parent's changes are set)
|
|
4738
4718
|
//
|
|
4739
|
-
let changes = this.changes
|
|
4719
|
+
let changes = this.changes.get(changeTree.refId);
|
|
4740
4720
|
if (changes === undefined) {
|
|
4741
4721
|
changes = {};
|
|
4742
|
-
this.changes
|
|
4722
|
+
this.changes.set(changeTree.refId, changes);
|
|
4743
4723
|
}
|
|
4744
4724
|
// set tag
|
|
4745
4725
|
if (tag !== DEFAULT_VIEW_TAG) {
|
|
@@ -4795,24 +4775,28 @@
|
|
|
4795
4775
|
});
|
|
4796
4776
|
return this;
|
|
4797
4777
|
}
|
|
4798
|
-
|
|
4799
|
-
|
|
4800
|
-
|
|
4801
|
-
|
|
4802
|
-
|
|
4803
|
-
|
|
4804
|
-
|
|
4805
|
-
|
|
4806
|
-
|
|
4807
|
-
|
|
4808
|
-
|
|
4778
|
+
addParentOf(childChangeTree, tag) {
|
|
4779
|
+
const changeTree = childChangeTree.parent[$changes];
|
|
4780
|
+
const parentIndex = childChangeTree.parentIndex;
|
|
4781
|
+
if (!this.items.has(changeTree)) {
|
|
4782
|
+
// view must have all "changeTree" parent tree
|
|
4783
|
+
this.items.add(changeTree);
|
|
4784
|
+
// add parent's parent
|
|
4785
|
+
const parentChangeTree = changeTree.parent?.[$changes];
|
|
4786
|
+
if (parentChangeTree && (parentChangeTree.filteredChanges !== undefined)) {
|
|
4787
|
+
this.addParentOf(changeTree, tag);
|
|
4788
|
+
}
|
|
4789
|
+
// parent is already available, no need to add it!
|
|
4790
|
+
if (!this.invisible.has(changeTree)) {
|
|
4791
|
+
return;
|
|
4792
|
+
}
|
|
4809
4793
|
}
|
|
4810
4794
|
// add parent's tag properties
|
|
4811
4795
|
if (changeTree.getChange(parentIndex) !== exports.OPERATION.DELETE) {
|
|
4812
|
-
let changes = this.changes
|
|
4796
|
+
let changes = this.changes.get(changeTree.refId);
|
|
4813
4797
|
if (changes === undefined) {
|
|
4814
4798
|
changes = {};
|
|
4815
|
-
this.changes
|
|
4799
|
+
this.changes.set(changeTree.refId, changes);
|
|
4816
4800
|
}
|
|
4817
4801
|
if (!this.tags) {
|
|
4818
4802
|
this.tags = new WeakMap();
|
|
@@ -4838,20 +4822,20 @@
|
|
|
4838
4822
|
this.items.delete(changeTree);
|
|
4839
4823
|
const ref = changeTree.ref;
|
|
4840
4824
|
const metadata = ref.constructor[Symbol.metadata];
|
|
4841
|
-
let changes = this.changes
|
|
4825
|
+
let changes = this.changes.get(changeTree.refId);
|
|
4842
4826
|
if (changes === undefined) {
|
|
4843
4827
|
changes = {};
|
|
4844
|
-
this.changes
|
|
4828
|
+
this.changes.set(changeTree.refId, changes);
|
|
4845
4829
|
}
|
|
4846
4830
|
if (tag === DEFAULT_VIEW_TAG) {
|
|
4847
4831
|
// parent is collection (Map/Array)
|
|
4848
4832
|
const parent = changeTree.parent;
|
|
4849
4833
|
if (!Metadata.isValidInstance(parent)) {
|
|
4850
4834
|
const parentChangeTree = parent[$changes];
|
|
4851
|
-
let changes = this.changes
|
|
4835
|
+
let changes = this.changes.get(parentChangeTree.refId);
|
|
4852
4836
|
if (changes === undefined) {
|
|
4853
4837
|
changes = {};
|
|
4854
|
-
this.changes
|
|
4838
|
+
this.changes.set(parentChangeTree.refId, changes);
|
|
4855
4839
|
}
|
|
4856
4840
|
// DELETE / DELETE BY REF ID
|
|
4857
4841
|
changes[changeTree.parentIndex] = exports.OPERATION.DELETE;
|
|
@@ -4883,6 +4867,13 @@
|
|
|
4883
4867
|
}
|
|
4884
4868
|
return this;
|
|
4885
4869
|
}
|
|
4870
|
+
has(obj) {
|
|
4871
|
+
return this.items.has(obj[$changes]);
|
|
4872
|
+
}
|
|
4873
|
+
hasTag(ob, tag = DEFAULT_VIEW_TAG) {
|
|
4874
|
+
const tags = this.tags?.get(ob[$changes]);
|
|
4875
|
+
return tags?.has(tag) ?? false;
|
|
4876
|
+
}
|
|
4886
4877
|
}
|
|
4887
4878
|
|
|
4888
4879
|
registerType("map", { constructor: MapSchema });
|
package/lib/Metadata.js
CHANGED
|
@@ -128,14 +128,13 @@ exports.Metadata = {
|
|
|
128
128
|
fieldIndex++;
|
|
129
129
|
for (const field in fields) {
|
|
130
130
|
const type = fields[field];
|
|
131
|
-
const normalizedType = getNormalizedType(type);
|
|
132
131
|
// FIXME: this code is duplicated from @type() annotation
|
|
133
132
|
const complexTypeKlass = (Array.isArray(type))
|
|
134
133
|
? (0, registry_1.getType)("array")
|
|
135
134
|
: (typeof (Object.keys(type)[0]) === "string") && (0, registry_1.getType)(Object.keys(type)[0]);
|
|
136
135
|
const childType = (complexTypeKlass)
|
|
137
136
|
? Object.values(type)[0]
|
|
138
|
-
:
|
|
137
|
+
: getNormalizedType(type);
|
|
139
138
|
exports.Metadata.addField(metadata, fieldIndex, field, type, (0, annotations_1.getPropertyDescriptor)(`_${field}`, fieldIndex, childType, complexTypeKlass));
|
|
140
139
|
fieldIndex++;
|
|
141
140
|
}
|
package/lib/Metadata.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Metadata.js","sourceRoot":"","sources":["../src/Metadata.ts"],"names":[],"mappings":"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","sourcesContent":["import { DefinitionType, getPropertyDescriptor } from \"./annotations\";\nimport { Schema } from \"./Schema\";\nimport { getType } from \"./types/registry\";\nimport { $decoder, $descriptors, $encoder, $fieldIndexesByViewTag, $numFields, $refTypeFieldIndexes, $track, $viewFieldIndexes } from \"./types/symbols\";\nimport { TypeContext } from \"./types/TypeContext\";\n\nexport type MetadataField = {\n type: DefinitionType,\n name: string,\n index: number,\n tag?: number,\n unreliable?: boolean,\n deprecated?: boolean,\n};\n\nexport type Metadata =\n { [$numFields]: number; } & // number of fields\n { [$viewFieldIndexes]: number[]; } & // all field indexes with \"view\" tag\n { [$fieldIndexesByViewTag]: {[tag: number]: number[]}; } & // field indexes by \"view\" tag\n { [$refTypeFieldIndexes]: number[]; } & // all field indexes containing Ref types (Schema, ArraySchema, MapSchema, etc)\n { [field: number]: MetadataField; } & // index => field name\n { [field: string]: number; } & // field name => field metadata\n { [$descriptors]: { [field: string]: PropertyDescriptor } } // property descriptors\n\nexport function getNormalizedType(type: DefinitionType): DefinitionType {\n return (Array.isArray(type))\n ? { array: type[0] }\n : (typeof(type['type']) !== \"undefined\")\n ? type['type']\n : type;\n}\n\nexport const Metadata = {\n\n addField(metadata: any, index: number, name: string, type: DefinitionType, descriptor?: PropertyDescriptor) {\n if (index > 64) {\n throw new Error(`Can't define field '${name}'.\\nSchema instances may only have up to 64 fields.`);\n }\n\n metadata[index] = Object.assign(\n metadata[index] || {}, // avoid overwriting previous field metadata (@owned / @deprecated)\n {\n type: getNormalizedType(type),\n index,\n name,\n }\n );\n\n // create \"descriptors\" map\n Object.defineProperty(metadata, $descriptors, {\n value: metadata[$descriptors] || {},\n enumerable: false,\n configurable: true,\n });\n\n if (descriptor) {\n // for encoder\n metadata[$descriptors][name] = descriptor;\n metadata[$descriptors][`_${name}`] = {\n value: undefined,\n writable: true,\n enumerable: false,\n configurable: true,\n };\n } else {\n // for decoder\n metadata[$descriptors][name] = {\n value: undefined,\n writable: true,\n enumerable: true,\n configurable: true,\n };\n }\n\n // map -1 as last field index\n Object.defineProperty(metadata, $numFields, {\n value: index,\n enumerable: false,\n configurable: true\n });\n\n // map field name => index (non enumerable)\n Object.defineProperty(metadata, name, {\n value: index,\n enumerable: false,\n configurable: true,\n });\n\n // if child Ref/complex type, add to -4\n if (typeof (metadata[index].type) !== \"string\") {\n if (metadata[$refTypeFieldIndexes] === undefined) {\n Object.defineProperty(metadata, $refTypeFieldIndexes, {\n value: [],\n enumerable: false,\n configurable: true,\n });\n }\n metadata[$refTypeFieldIndexes].push(index);\n }\n },\n\n setTag(metadata: Metadata, fieldName: string, tag: number) {\n const index = metadata[fieldName];\n const field = metadata[index];\n\n // add 'tag' to the field\n field.tag = tag;\n\n if (!metadata[$viewFieldIndexes]) {\n // -2: all field indexes with \"view\" tag\n Object.defineProperty(metadata, $viewFieldIndexes, {\n value: [],\n enumerable: false,\n configurable: true\n });\n\n // -3: field indexes by \"view\" tag\n Object.defineProperty(metadata, $fieldIndexesByViewTag, {\n value: {},\n enumerable: false,\n configurable: true\n });\n }\n\n metadata[$viewFieldIndexes].push(index);\n\n if (!metadata[$fieldIndexesByViewTag][tag]) {\n metadata[$fieldIndexesByViewTag][tag] = [];\n }\n\n metadata[$fieldIndexesByViewTag][tag].push(index);\n },\n\n setFields(target: any, fields: { [field: string]: DefinitionType }) {\n // for inheritance support\n const constructor = target.prototype.constructor;\n TypeContext.register(constructor);\n\n const parentClass = Object.getPrototypeOf(constructor);\n const parentMetadata = parentClass && parentClass[Symbol.metadata];\n const metadata = Metadata.initialize(constructor);\n\n // Use Schema's methods if not defined in the class\n if (!constructor[$track]) { constructor[$track] = Schema[$track]; }\n if (!constructor[$encoder]) { constructor[$encoder] = Schema[$encoder]; }\n if (!constructor[$decoder]) { constructor[$decoder] = Schema[$decoder]; }\n if (!constructor.prototype.toJSON) { constructor.prototype.toJSON = Schema.prototype.toJSON; }\n\n //\n // detect index for this field, considering inheritance\n //\n let fieldIndex = metadata[$numFields] // current structure already has fields defined\n ?? (parentMetadata && parentMetadata[$numFields]) // parent structure has fields defined\n ?? -1; // no fields defined\n\n fieldIndex++;\n\n for (const field in fields) {\n const type = fields[field];\n const normalizedType = getNormalizedType(type);\n\n // FIXME: this code is duplicated from @type() annotation\n const complexTypeKlass = (Array.isArray(type))\n ? getType(\"array\")\n : (typeof(Object.keys(type)[0]) === \"string\") && getType(Object.keys(type)[0]);\n\n const childType = (complexTypeKlass)\n ? Object.values(type)[0]\n : normalizedType;\n\n Metadata.addField(\n metadata,\n fieldIndex,\n field,\n type,\n getPropertyDescriptor(`_${field}`, fieldIndex, childType, complexTypeKlass)\n );\n\n fieldIndex++;\n }\n\n return target;\n },\n\n isDeprecated(metadata: any, field: string) {\n return metadata[field].deprecated === true;\n },\n\n init(klass: any) {\n //\n // Used only to initialize an empty Schema (Encoder#constructor)\n // TODO: remove/refactor this...\n //\n const metadata = {};\n klass[Symbol.metadata] = metadata;\n Object.defineProperty(metadata, $numFields, {\n value: 0,\n enumerable: false,\n configurable: true,\n });\n },\n\n initialize(constructor: any) {\n const parentClass = Object.getPrototypeOf(constructor);\n const parentMetadata: Metadata = parentClass[Symbol.metadata];\n\n let metadata: Metadata = constructor[Symbol.metadata] ?? Object.create(null);\n\n // make sure inherited classes have their own metadata object.\n if (parentClass !== Schema && metadata === parentMetadata) {\n metadata = Object.create(null);\n\n if (parentMetadata) {\n //\n // assign parent metadata to current\n //\n Object.setPrototypeOf(metadata, parentMetadata);\n\n // $numFields\n Object.defineProperty(metadata, $numFields, {\n value: parentMetadata[$numFields],\n enumerable: false,\n configurable: true,\n writable: true,\n });\n\n // $viewFieldIndexes / $fieldIndexesByViewTag\n if (parentMetadata[$viewFieldIndexes] !== undefined) {\n Object.defineProperty(metadata, $viewFieldIndexes, {\n value: [...parentMetadata[$viewFieldIndexes]],\n enumerable: false,\n configurable: true,\n writable: true,\n });\n Object.defineProperty(metadata, $fieldIndexesByViewTag, {\n value: { ...parentMetadata[$fieldIndexesByViewTag] },\n enumerable: false,\n configurable: true,\n writable: true,\n });\n }\n\n // $refTypeFieldIndexes\n if (parentMetadata[$refTypeFieldIndexes] !== undefined) {\n Object.defineProperty(metadata, $refTypeFieldIndexes, {\n value: [...parentMetadata[$refTypeFieldIndexes]],\n enumerable: false,\n configurable: true,\n writable: true,\n });\n }\n\n // $descriptors\n Object.defineProperty(metadata, $descriptors, {\n value: { ...parentMetadata[$descriptors] },\n enumerable: false,\n configurable: true,\n writable: true,\n });\n }\n }\n\n constructor[Symbol.metadata] = metadata;\n\n return metadata;\n },\n\n isValidInstance(klass: any) {\n return (\n klass.constructor[Symbol.metadata] &&\n Object.prototype.hasOwnProperty.call(klass.constructor[Symbol.metadata], $numFields) as boolean\n );\n },\n\n getFields(klass: any) {\n const metadata: Metadata = klass[Symbol.metadata];\n const fields = {};\n for (let i = 0; i <= metadata[$numFields]; i++) {\n fields[metadata[i].name] = metadata[i].type;\n }\n return fields;\n }\n}"]}
|
|
1
|
+
{"version":3,"file":"Metadata.js","sourceRoot":"","sources":["../src/Metadata.ts"],"names":[],"mappings":"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","sourcesContent":["import { DefinitionType, getPropertyDescriptor } from \"./annotations\";\nimport { Schema } from \"./Schema\";\nimport { getType } from \"./types/registry\";\nimport { $decoder, $descriptors, $encoder, $fieldIndexesByViewTag, $numFields, $refTypeFieldIndexes, $track, $viewFieldIndexes } from \"./types/symbols\";\nimport { TypeContext } from \"./types/TypeContext\";\n\nexport type MetadataField = {\n type: DefinitionType,\n name: string,\n index: number,\n tag?: number,\n unreliable?: boolean,\n deprecated?: boolean,\n};\n\nexport type Metadata =\n { [$numFields]: number; } & // number of fields\n { [$viewFieldIndexes]: number[]; } & // all field indexes with \"view\" tag\n { [$fieldIndexesByViewTag]: {[tag: number]: number[]}; } & // field indexes by \"view\" tag\n { [$refTypeFieldIndexes]: number[]; } & // all field indexes containing Ref types (Schema, ArraySchema, MapSchema, etc)\n { [field: number]: MetadataField; } & // index => field name\n { [field: string]: number; } & // field name => field metadata\n { [$descriptors]: { [field: string]: PropertyDescriptor } } // property descriptors\n\nexport function getNormalizedType(type: DefinitionType): DefinitionType {\n return (Array.isArray(type))\n ? { array: type[0] }\n : (typeof(type['type']) !== \"undefined\")\n ? type['type']\n : type;\n}\n\nexport const Metadata = {\n\n addField(metadata: any, index: number, name: string, type: DefinitionType, descriptor?: PropertyDescriptor) {\n if (index > 64) {\n throw new Error(`Can't define field '${name}'.\\nSchema instances may only have up to 64 fields.`);\n }\n\n metadata[index] = Object.assign(\n metadata[index] || {}, // avoid overwriting previous field metadata (@owned / @deprecated)\n {\n type: getNormalizedType(type),\n index,\n name,\n }\n );\n\n // create \"descriptors\" map\n Object.defineProperty(metadata, $descriptors, {\n value: metadata[$descriptors] || {},\n enumerable: false,\n configurable: true,\n });\n\n if (descriptor) {\n // for encoder\n metadata[$descriptors][name] = descriptor;\n metadata[$descriptors][`_${name}`] = {\n value: undefined,\n writable: true,\n enumerable: false,\n configurable: true,\n };\n } else {\n // for decoder\n metadata[$descriptors][name] = {\n value: undefined,\n writable: true,\n enumerable: true,\n configurable: true,\n };\n }\n\n // map -1 as last field index\n Object.defineProperty(metadata, $numFields, {\n value: index,\n enumerable: false,\n configurable: true\n });\n\n // map field name => index (non enumerable)\n Object.defineProperty(metadata, name, {\n value: index,\n enumerable: false,\n configurable: true,\n });\n\n // if child Ref/complex type, add to -4\n if (typeof (metadata[index].type) !== \"string\") {\n if (metadata[$refTypeFieldIndexes] === undefined) {\n Object.defineProperty(metadata, $refTypeFieldIndexes, {\n value: [],\n enumerable: false,\n configurable: true,\n });\n }\n metadata[$refTypeFieldIndexes].push(index);\n }\n },\n\n setTag(metadata: Metadata, fieldName: string, tag: number) {\n const index = metadata[fieldName];\n const field = metadata[index];\n\n // add 'tag' to the field\n field.tag = tag;\n\n if (!metadata[$viewFieldIndexes]) {\n // -2: all field indexes with \"view\" tag\n Object.defineProperty(metadata, $viewFieldIndexes, {\n value: [],\n enumerable: false,\n configurable: true\n });\n\n // -3: field indexes by \"view\" tag\n Object.defineProperty(metadata, $fieldIndexesByViewTag, {\n value: {},\n enumerable: false,\n configurable: true\n });\n }\n\n metadata[$viewFieldIndexes].push(index);\n\n if (!metadata[$fieldIndexesByViewTag][tag]) {\n metadata[$fieldIndexesByViewTag][tag] = [];\n }\n\n metadata[$fieldIndexesByViewTag][tag].push(index);\n },\n\n setFields(target: any, fields: { [field: string]: DefinitionType }) {\n // for inheritance support\n const constructor = target.prototype.constructor;\n TypeContext.register(constructor);\n\n const parentClass = Object.getPrototypeOf(constructor);\n const parentMetadata = parentClass && parentClass[Symbol.metadata];\n const metadata = Metadata.initialize(constructor);\n\n // Use Schema's methods if not defined in the class\n if (!constructor[$track]) { constructor[$track] = Schema[$track]; }\n if (!constructor[$encoder]) { constructor[$encoder] = Schema[$encoder]; }\n if (!constructor[$decoder]) { constructor[$decoder] = Schema[$decoder]; }\n if (!constructor.prototype.toJSON) { constructor.prototype.toJSON = Schema.prototype.toJSON; }\n\n //\n // detect index for this field, considering inheritance\n //\n let fieldIndex = metadata[$numFields] // current structure already has fields defined\n ?? (parentMetadata && parentMetadata[$numFields]) // parent structure has fields defined\n ?? -1; // no fields defined\n\n fieldIndex++;\n\n for (const field in fields) {\n const type = fields[field];\n\n // FIXME: this code is duplicated from @type() annotation\n const complexTypeKlass = (Array.isArray(type))\n ? getType(\"array\")\n : (typeof(Object.keys(type)[0]) === \"string\") && getType(Object.keys(type)[0]);\n\n const childType = (complexTypeKlass)\n ? Object.values(type)[0]\n : getNormalizedType(type);\n\n Metadata.addField(\n metadata,\n fieldIndex,\n field,\n type,\n getPropertyDescriptor(`_${field}`, fieldIndex, childType, complexTypeKlass)\n );\n\n fieldIndex++;\n }\n\n return target;\n },\n\n isDeprecated(metadata: any, field: string) {\n return metadata[field].deprecated === true;\n },\n\n init(klass: any) {\n //\n // Used only to initialize an empty Schema (Encoder#constructor)\n // TODO: remove/refactor this...\n //\n const metadata = {};\n klass[Symbol.metadata] = metadata;\n Object.defineProperty(metadata, $numFields, {\n value: 0,\n enumerable: false,\n configurable: true,\n });\n },\n\n initialize(constructor: any) {\n const parentClass = Object.getPrototypeOf(constructor);\n const parentMetadata: Metadata = parentClass[Symbol.metadata];\n\n let metadata: Metadata = constructor[Symbol.metadata] ?? Object.create(null);\n\n // make sure inherited classes have their own metadata object.\n if (parentClass !== Schema && metadata === parentMetadata) {\n metadata = Object.create(null);\n\n if (parentMetadata) {\n //\n // assign parent metadata to current\n //\n Object.setPrototypeOf(metadata, parentMetadata);\n\n // $numFields\n Object.defineProperty(metadata, $numFields, {\n value: parentMetadata[$numFields],\n enumerable: false,\n configurable: true,\n writable: true,\n });\n\n // $viewFieldIndexes / $fieldIndexesByViewTag\n if (parentMetadata[$viewFieldIndexes] !== undefined) {\n Object.defineProperty(metadata, $viewFieldIndexes, {\n value: [...parentMetadata[$viewFieldIndexes]],\n enumerable: false,\n configurable: true,\n writable: true,\n });\n Object.defineProperty(metadata, $fieldIndexesByViewTag, {\n value: { ...parentMetadata[$fieldIndexesByViewTag] },\n enumerable: false,\n configurable: true,\n writable: true,\n });\n }\n\n // $refTypeFieldIndexes\n if (parentMetadata[$refTypeFieldIndexes] !== undefined) {\n Object.defineProperty(metadata, $refTypeFieldIndexes, {\n value: [...parentMetadata[$refTypeFieldIndexes]],\n enumerable: false,\n configurable: true,\n writable: true,\n });\n }\n\n // $descriptors\n Object.defineProperty(metadata, $descriptors, {\n value: { ...parentMetadata[$descriptors] },\n enumerable: false,\n configurable: true,\n writable: true,\n });\n }\n }\n\n constructor[Symbol.metadata] = metadata;\n\n return metadata;\n },\n\n isValidInstance(klass: any) {\n return (\n klass.constructor[Symbol.metadata] &&\n Object.prototype.hasOwnProperty.call(klass.constructor[Symbol.metadata], $numFields) as boolean\n );\n },\n\n getFields(klass: any) {\n const metadata: Metadata = klass[Symbol.metadata];\n const fields = {};\n for (let i = 0; i <= metadata[$numFields]; i++) {\n fields[metadata[i].name] = metadata[i].type;\n }\n return fields;\n }\n}"]}
|
package/lib/annotations.js
CHANGED
|
@@ -302,13 +302,14 @@ function getPropertyDescriptor(fieldCached, fieldIndex, type, complexTypeKlass)
|
|
|
302
302
|
const changeTree = this[symbols_1.$changes];
|
|
303
303
|
//
|
|
304
304
|
// Replacing existing "ref", remove it from root.
|
|
305
|
-
// TODO: if there are other references to this instance, we should not remove it from root.
|
|
306
305
|
//
|
|
307
306
|
if (previousValue !== undefined && previousValue[symbols_1.$changes]) {
|
|
308
307
|
changeTree.root?.remove(previousValue[symbols_1.$changes]);
|
|
308
|
+
this.constructor[symbols_1.$track](changeTree, fieldIndex, spec_1.OPERATION.DELETE_AND_ADD);
|
|
309
|
+
}
|
|
310
|
+
else {
|
|
311
|
+
this.constructor[symbols_1.$track](changeTree, fieldIndex, spec_1.OPERATION.ADD);
|
|
309
312
|
}
|
|
310
|
-
// flag the change for encoding.
|
|
311
|
-
this.constructor[symbols_1.$track](changeTree, fieldIndex, spec_1.OPERATION.ADD);
|
|
312
313
|
//
|
|
313
314
|
// call setParent() recursively for this and its child
|
|
314
315
|
// structures.
|