@colyseus/schema 3.0.10 → 3.0.12
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 +95 -88
- package/build/cjs/index.js.map +1 -1
- package/build/esm/index.mjs +95 -88
- package/build/esm/index.mjs.map +1 -1
- package/build/umd/index.js +95 -88
- 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 -0
- package/lib/encoder/ChangeTree.js +2 -1
- package/lib/encoder/ChangeTree.js.map +1 -1
- package/lib/encoder/Encoder.d.ts +0 -1
- package/lib/encoder/Encoder.js +22 -30
- package/lib/encoder/Encoder.js.map +1 -1
- package/lib/encoder/Root.d.ts +1 -1
- package/lib/encoder/Root.js +20 -3
- package/lib/encoder/Root.js.map +1 -1
- package/lib/encoder/StateView.d.ts +2 -4
- package/lib/encoder/StateView.js +19 -13
- 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.js +23 -22
- 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 +3 -4
- package/src/encoder/Encoder.ts +25 -41
- package/src/encoder/Root.ts +21 -4
- package/src/encoder/StateView.ts +22 -15
- package/src/types/custom/ArraySchema.ts +8 -1
- package/src/types/custom/MapSchema.ts +24 -27
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
|
}
|
|
@@ -1242,6 +1241,7 @@
|
|
|
1242
1241
|
//
|
|
1243
1242
|
this.root?.remove(previousValue[$changes]);
|
|
1244
1243
|
}
|
|
1244
|
+
deleteOperationAtIndex(this.allChanges, allChangesIndex);
|
|
1245
1245
|
//
|
|
1246
1246
|
// FIXME: this is looking a ugly and repeated
|
|
1247
1247
|
//
|
|
@@ -1250,7 +1250,6 @@
|
|
|
1250
1250
|
enqueueChangeTree(this.root, this, 'filteredChanges');
|
|
1251
1251
|
}
|
|
1252
1252
|
else {
|
|
1253
|
-
deleteOperationAtIndex(this.allChanges, allChangesIndex);
|
|
1254
1253
|
enqueueChangeTree(this.root, this, 'changes');
|
|
1255
1254
|
}
|
|
1256
1255
|
}
|
|
@@ -1537,19 +1536,6 @@
|
|
|
1537
1536
|
//
|
|
1538
1537
|
if (operation !== exports.OPERATION.DELETE_AND_ADD) {
|
|
1539
1538
|
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
1539
|
}
|
|
1554
1540
|
value = undefined;
|
|
1555
1541
|
}
|
|
@@ -1897,7 +1883,8 @@
|
|
|
1897
1883
|
else {
|
|
1898
1884
|
if (setValue[$changes]) {
|
|
1899
1885
|
assertInstanceType(setValue, obj[$childType], obj, key);
|
|
1900
|
-
|
|
1886
|
+
const previousValue = obj.items[key];
|
|
1887
|
+
if (previousValue !== undefined) {
|
|
1901
1888
|
if (setValue[$changes].isNew) {
|
|
1902
1889
|
this[$changes].indexedOperation(Number(key), exports.OPERATION.MOVE_AND_ADD);
|
|
1903
1890
|
}
|
|
@@ -1909,10 +1896,13 @@
|
|
|
1909
1896
|
this[$changes].indexedOperation(Number(key), exports.OPERATION.MOVE);
|
|
1910
1897
|
}
|
|
1911
1898
|
}
|
|
1899
|
+
// remove root reference from previous value
|
|
1900
|
+
previousValue[$changes].root?.remove(previousValue[$changes]);
|
|
1912
1901
|
}
|
|
1913
1902
|
else if (setValue[$changes].isNew) {
|
|
1914
1903
|
this[$changes].indexedOperation(Number(key), exports.OPERATION.ADD);
|
|
1915
1904
|
}
|
|
1905
|
+
setValue[$changes].setParent(this, obj[$changes].root, key);
|
|
1916
1906
|
}
|
|
1917
1907
|
else {
|
|
1918
1908
|
obj.$changeAt(Number(key), setValue);
|
|
@@ -2550,33 +2540,34 @@
|
|
|
2550
2540
|
// See: https://github.com/colyseus/colyseus/issues/561#issuecomment-1646733468
|
|
2551
2541
|
key = key.toString();
|
|
2552
2542
|
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
2543
|
const isRef = (value[$changes]) !== undefined;
|
|
2562
|
-
|
|
2563
|
-
|
|
2564
|
-
//
|
|
2565
|
-
|
|
2566
|
-
|
|
2544
|
+
let index;
|
|
2545
|
+
let operation;
|
|
2546
|
+
// IS REPLACE?
|
|
2547
|
+
if (typeof (changeTree.indexes[key]) !== "undefined") {
|
|
2548
|
+
index = changeTree.indexes[key];
|
|
2549
|
+
operation = exports.OPERATION.REPLACE;
|
|
2550
|
+
const previousValue = this.$items.get(key);
|
|
2551
|
+
if (previousValue === value) {
|
|
2552
|
+
// if value is the same, avoid re-encoding it.
|
|
2553
|
+
return;
|
|
2554
|
+
}
|
|
2555
|
+
else if (isRef) {
|
|
2556
|
+
// if is schema, force ADD operation if value differ from previous one.
|
|
2557
|
+
operation = exports.OPERATION.DELETE_AND_ADD;
|
|
2558
|
+
// remove reference from previous value
|
|
2559
|
+
if (previousValue !== undefined) {
|
|
2560
|
+
previousValue[$changes].root?.remove(previousValue[$changes]);
|
|
2561
|
+
}
|
|
2562
|
+
}
|
|
2563
|
+
}
|
|
2564
|
+
else {
|
|
2565
|
+
index = changeTree.indexes[$numFields] ?? 0;
|
|
2566
|
+
operation = exports.OPERATION.ADD;
|
|
2567
2567
|
this.$indexes.set(index, key);
|
|
2568
2568
|
changeTree.indexes[key] = index;
|
|
2569
2569
|
changeTree.indexes[$numFields] = index + 1;
|
|
2570
2570
|
}
|
|
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
2571
|
this.$items.set(key, value);
|
|
2581
2572
|
changeTree.change(index, operation);
|
|
2582
2573
|
//
|
|
@@ -2948,13 +2939,14 @@
|
|
|
2948
2939
|
const changeTree = this[$changes];
|
|
2949
2940
|
//
|
|
2950
2941
|
// 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
2942
|
//
|
|
2953
2943
|
if (previousValue !== undefined && previousValue[$changes]) {
|
|
2954
2944
|
changeTree.root?.remove(previousValue[$changes]);
|
|
2945
|
+
this.constructor[$track](changeTree, fieldIndex, exports.OPERATION.DELETE_AND_ADD);
|
|
2946
|
+
}
|
|
2947
|
+
else {
|
|
2948
|
+
this.constructor[$track](changeTree, fieldIndex, exports.OPERATION.ADD);
|
|
2955
2949
|
}
|
|
2956
|
-
// flag the change for encoding.
|
|
2957
|
-
this.constructor[$track](changeTree, fieldIndex, exports.OPERATION.ADD);
|
|
2958
2950
|
//
|
|
2959
2951
|
// call setParent() recursively for this and its child
|
|
2960
2952
|
// structures.
|
|
@@ -3751,16 +3743,33 @@
|
|
|
3751
3743
|
}
|
|
3752
3744
|
else {
|
|
3753
3745
|
this.refCount[changeTree.refId] = refCount;
|
|
3746
|
+
//
|
|
3747
|
+
// When losing a reference to an instance, it is best to move the
|
|
3748
|
+
// ChangeTree to the end of the encoding queue.
|
|
3749
|
+
//
|
|
3750
|
+
// This way, at decoding time, the instance that contains the
|
|
3751
|
+
// ChangeTree will be available before the ChangeTree itself. If the
|
|
3752
|
+
// containing instance is not available, the Decoder will throw
|
|
3753
|
+
// "refId not found" error.
|
|
3754
|
+
//
|
|
3755
|
+
if (changeTree.filteredChanges !== undefined) {
|
|
3756
|
+
this.removeChangeFromChangeSet("filteredChanges", changeTree);
|
|
3757
|
+
enqueueChangeTree(this, changeTree, "filteredChanges");
|
|
3758
|
+
}
|
|
3759
|
+
else {
|
|
3760
|
+
this.removeChangeFromChangeSet("changes", changeTree);
|
|
3761
|
+
enqueueChangeTree(this, changeTree, "changes");
|
|
3762
|
+
}
|
|
3754
3763
|
}
|
|
3755
3764
|
changeTree.forEachChild((child, _) => this.remove(child));
|
|
3756
3765
|
return refCount;
|
|
3757
3766
|
}
|
|
3758
3767
|
removeChangeFromChangeSet(changeSetName, changeTree) {
|
|
3759
3768
|
const changeSet = this[changeSetName];
|
|
3760
|
-
|
|
3761
|
-
|
|
3762
|
-
spliceOne(changeSet, index);
|
|
3769
|
+
if (spliceOne(changeSet, changeSet.indexOf(changeTree))) {
|
|
3770
|
+
changeTree[changeSetName].queueRootIndex = -1;
|
|
3763
3771
|
// changeSet[index] = undefined;
|
|
3772
|
+
return true;
|
|
3764
3773
|
}
|
|
3765
3774
|
}
|
|
3766
3775
|
clear() {
|
|
@@ -3796,12 +3805,6 @@
|
|
|
3796
3805
|
const changeTrees = this.root[changeSetName];
|
|
3797
3806
|
for (let i = 0, numChangeTrees = changeTrees.length; i < numChangeTrees; i++) {
|
|
3798
3807
|
const changeTree = changeTrees[i];
|
|
3799
|
-
const operations = changeTree[changeSetName];
|
|
3800
|
-
const ref = changeTree.ref;
|
|
3801
|
-
const ctor = ref.constructor;
|
|
3802
|
-
const encoder = ctor[$encoder];
|
|
3803
|
-
const filter = ctor[$filter];
|
|
3804
|
-
const metadata = ctor[Symbol.metadata];
|
|
3805
3808
|
if (hasView) {
|
|
3806
3809
|
if (!view.items.has(changeTree)) {
|
|
3807
3810
|
view.invisible.add(changeTree);
|
|
@@ -3811,13 +3814,24 @@
|
|
|
3811
3814
|
view.invisible.delete(changeTree); // remove from invisible list
|
|
3812
3815
|
}
|
|
3813
3816
|
}
|
|
3817
|
+
const operations = changeTree[changeSetName];
|
|
3818
|
+
const ref = changeTree.ref;
|
|
3819
|
+
// TODO: avoid iterating over change tree if no changes were made
|
|
3820
|
+
const numChanges = operations.operations.length;
|
|
3821
|
+
if (numChanges === 0) {
|
|
3822
|
+
continue;
|
|
3823
|
+
}
|
|
3824
|
+
const ctor = ref.constructor;
|
|
3825
|
+
const encoder = ctor[$encoder];
|
|
3826
|
+
const filter = ctor[$filter];
|
|
3827
|
+
const metadata = ctor[Symbol.metadata];
|
|
3814
3828
|
// skip root `refId` if it's the first change tree
|
|
3815
3829
|
// (unless it "hasView", which will need to revisit the root)
|
|
3816
3830
|
if (hasView || it.offset > initialOffset || changeTree !== rootChangeTree) {
|
|
3817
3831
|
buffer[it.offset++] = SWITCH_TO_STRUCTURE & 255;
|
|
3818
3832
|
encode.number(buffer, changeTree.refId, it);
|
|
3819
3833
|
}
|
|
3820
|
-
for (let j = 0
|
|
3834
|
+
for (let j = 0; j < numChanges; j++) {
|
|
3821
3835
|
const fieldIndex = operations.operations[j];
|
|
3822
3836
|
const operation = (fieldIndex < 0)
|
|
3823
3837
|
? Math.abs(fieldIndex) // "pure" operation without fieldIndex (e.g. CLEAR, REVERSE, etc.)
|
|
@@ -3914,14 +3928,16 @@
|
|
|
3914
3928
|
encodeView(view, sharedOffset, it, bytes = this.sharedBuffer) {
|
|
3915
3929
|
const viewOffset = it.offset;
|
|
3916
3930
|
// encode visibility changes (add/remove for this view)
|
|
3917
|
-
const
|
|
3918
|
-
for (let i = 0, numRefIds = refIds.length; i < numRefIds; i++) {
|
|
3919
|
-
const refId = refIds[i];
|
|
3920
|
-
const changes = view.changes[refId];
|
|
3931
|
+
for (const [refId, changes] of view.changes) {
|
|
3921
3932
|
const changeTree = this.root.changeTrees[refId];
|
|
3922
|
-
if (changeTree === undefined
|
|
3923
|
-
|
|
3924
|
-
|
|
3933
|
+
if (changeTree === undefined) {
|
|
3934
|
+
// detached instance, remove from view and skip.
|
|
3935
|
+
view.changes.delete(refId);
|
|
3936
|
+
continue;
|
|
3937
|
+
}
|
|
3938
|
+
const keys = Object.keys(changes);
|
|
3939
|
+
if (keys.length === 0) {
|
|
3940
|
+
// FIXME: avoid having empty changes if no changes were made
|
|
3925
3941
|
// console.log("changes.size === 0, skip", changeTree.ref.constructor.name);
|
|
3926
3942
|
continue;
|
|
3927
3943
|
}
|
|
@@ -3931,7 +3947,6 @@
|
|
|
3931
3947
|
const metadata = ctor[Symbol.metadata];
|
|
3932
3948
|
bytes[it.offset++] = SWITCH_TO_STRUCTURE & 255;
|
|
3933
3949
|
encode.number(bytes, changeTree.refId, it);
|
|
3934
|
-
const keys = Object.keys(changes);
|
|
3935
3950
|
for (let i = 0, numChanges = keys.length; i < numChanges; i++) {
|
|
3936
3951
|
const key = keys[i];
|
|
3937
3952
|
const operation = changes[key];
|
|
@@ -3945,7 +3960,7 @@
|
|
|
3945
3960
|
// (to allow re-using StateView's for multiple clients)
|
|
3946
3961
|
//
|
|
3947
3962
|
// clear "view" changes after encoding
|
|
3948
|
-
view.changes
|
|
3963
|
+
view.changes.clear();
|
|
3949
3964
|
// try to encode "filtered" changes
|
|
3950
3965
|
this.encode(it, view, bytes, "filteredChanges", false, viewOffset);
|
|
3951
3966
|
return Buffer.concat([
|
|
@@ -3953,20 +3968,6 @@
|
|
|
3953
3968
|
bytes.subarray(viewOffset, it.offset)
|
|
3954
3969
|
]);
|
|
3955
3970
|
}
|
|
3956
|
-
onEndEncode(changeTrees = this.root.changes) {
|
|
3957
|
-
// changeTrees.forEach(function(changeTree) {
|
|
3958
|
-
// changeTree.endEncode();
|
|
3959
|
-
// });
|
|
3960
|
-
// for (const refId in changeTrees) {
|
|
3961
|
-
// const changeTree = this.root.changeTrees[refId];
|
|
3962
|
-
// changeTree.endEncode();
|
|
3963
|
-
// // changeTree.changes.clear();
|
|
3964
|
-
// // // ArraySchema and MapSchema have a custom "encode end" method
|
|
3965
|
-
// // changeTree.ref[$onEncodeEnd]?.();
|
|
3966
|
-
// // // Not a new instance anymore
|
|
3967
|
-
// // delete changeTree[$isNew];
|
|
3968
|
-
// }
|
|
3969
|
-
}
|
|
3970
3971
|
discardChanges() {
|
|
3971
3972
|
// discard shared changes
|
|
3972
3973
|
let length = this.root.changes.length;
|
|
@@ -4698,7 +4699,8 @@
|
|
|
4698
4699
|
* Manual "ADD" operations for changes per ChangeTree, specific to this view.
|
|
4699
4700
|
* (This is used to force encoding a property, even if it was not changed)
|
|
4700
4701
|
*/
|
|
4701
|
-
|
|
4702
|
+
// TODO: use map here!? may fix encode ordering issue
|
|
4703
|
+
this.changes = new Map();
|
|
4702
4704
|
}
|
|
4703
4705
|
// TODO: allow to set multiple tags at once
|
|
4704
4706
|
add(obj, tag = DEFAULT_VIEW_TAG, checkIncludeParent = true) {
|
|
@@ -4714,16 +4716,16 @@
|
|
|
4714
4716
|
// - if it was invisible to this view
|
|
4715
4717
|
// - if it were previously filtered out
|
|
4716
4718
|
if (checkIncludeParent && changeTree.parent) {
|
|
4717
|
-
this.
|
|
4719
|
+
this.addParentOf(changeTree, tag);
|
|
4718
4720
|
}
|
|
4719
4721
|
//
|
|
4720
4722
|
// TODO: when adding an item of a MapSchema, the changes may not
|
|
4721
4723
|
// be set (only the parent's changes are set)
|
|
4722
4724
|
//
|
|
4723
|
-
let changes = this.changes
|
|
4725
|
+
let changes = this.changes.get(changeTree.refId);
|
|
4724
4726
|
if (changes === undefined) {
|
|
4725
4727
|
changes = {};
|
|
4726
|
-
this.changes
|
|
4728
|
+
this.changes.set(changeTree.refId, changes);
|
|
4727
4729
|
}
|
|
4728
4730
|
// set tag
|
|
4729
4731
|
if (tag !== DEFAULT_VIEW_TAG) {
|
|
@@ -4779,24 +4781,29 @@
|
|
|
4779
4781
|
});
|
|
4780
4782
|
return this;
|
|
4781
4783
|
}
|
|
4782
|
-
|
|
4784
|
+
addParentOf(childChangeTree, tag) {
|
|
4785
|
+
const changeTree = childChangeTree.parent[$changes];
|
|
4786
|
+
const parentIndex = childChangeTree.parentIndex;
|
|
4783
4787
|
// view must have all "changeTree" parent tree
|
|
4784
4788
|
this.items.add(changeTree);
|
|
4785
4789
|
// add parent's parent
|
|
4786
4790
|
const parentChangeTree = changeTree.parent?.[$changes];
|
|
4787
4791
|
if (parentChangeTree && (parentChangeTree.filteredChanges !== undefined)) {
|
|
4788
|
-
this.
|
|
4792
|
+
this.addParentOf(changeTree, tag);
|
|
4789
4793
|
}
|
|
4794
|
+
if (
|
|
4790
4795
|
// parent is already available, no need to add it!
|
|
4791
|
-
|
|
4796
|
+
!this.invisible.has(changeTree) &&
|
|
4797
|
+
// item is being replaced, no need to add parent
|
|
4798
|
+
changeTree.indexedOperations[parentIndex] !== exports.OPERATION.DELETE_AND_ADD) {
|
|
4792
4799
|
return;
|
|
4793
4800
|
}
|
|
4794
4801
|
// add parent's tag properties
|
|
4795
4802
|
if (changeTree.getChange(parentIndex) !== exports.OPERATION.DELETE) {
|
|
4796
|
-
let changes = this.changes
|
|
4803
|
+
let changes = this.changes.get(changeTree.refId);
|
|
4797
4804
|
if (changes === undefined) {
|
|
4798
4805
|
changes = {};
|
|
4799
|
-
this.changes
|
|
4806
|
+
this.changes.set(changeTree.refId, changes);
|
|
4800
4807
|
}
|
|
4801
4808
|
if (!this.tags) {
|
|
4802
4809
|
this.tags = new WeakMap();
|
|
@@ -4822,20 +4829,20 @@
|
|
|
4822
4829
|
this.items.delete(changeTree);
|
|
4823
4830
|
const ref = changeTree.ref;
|
|
4824
4831
|
const metadata = ref.constructor[Symbol.metadata];
|
|
4825
|
-
let changes = this.changes
|
|
4832
|
+
let changes = this.changes.get(changeTree.refId);
|
|
4826
4833
|
if (changes === undefined) {
|
|
4827
4834
|
changes = {};
|
|
4828
|
-
this.changes
|
|
4835
|
+
this.changes.set(changeTree.refId, changes);
|
|
4829
4836
|
}
|
|
4830
4837
|
if (tag === DEFAULT_VIEW_TAG) {
|
|
4831
4838
|
// parent is collection (Map/Array)
|
|
4832
4839
|
const parent = changeTree.parent;
|
|
4833
4840
|
if (!Metadata.isValidInstance(parent)) {
|
|
4834
4841
|
const parentChangeTree = parent[$changes];
|
|
4835
|
-
let changes = this.changes
|
|
4842
|
+
let changes = this.changes.get(parentChangeTree.refId);
|
|
4836
4843
|
if (changes === undefined) {
|
|
4837
4844
|
changes = {};
|
|
4838
|
-
this.changes
|
|
4845
|
+
this.changes.set(parentChangeTree.refId, changes);
|
|
4839
4846
|
}
|
|
4840
4847
|
// DELETE / DELETE BY REF ID
|
|
4841
4848
|
changes[changeTree.parentIndex] = exports.OPERATION.DELETE;
|
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.
|