@colyseus/schema 3.0.27 → 3.0.28
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 +39 -24
- package/build/cjs/index.js.map +1 -1
- package/build/esm/index.mjs +39 -24
- package/build/esm/index.mjs.map +1 -1
- package/build/umd/index.js +39 -24
- package/lib/Schema.js +1 -1
- package/lib/Schema.js.map +1 -1
- package/lib/encoder/ChangeTree.d.ts +1 -0
- package/lib/encoder/ChangeTree.js +13 -15
- package/lib/encoder/ChangeTree.js.map +1 -1
- package/lib/encoder/Encoder.js +3 -4
- package/lib/encoder/Encoder.js.map +1 -1
- package/lib/encoder/StateView.d.ts +1 -0
- package/lib/encoder/StateView.js +19 -0
- package/lib/encoder/StateView.js.map +1 -1
- package/lib/types/custom/ArraySchema.js +1 -2
- package/lib/types/custom/ArraySchema.js.map +1 -1
- package/lib/types/custom/CollectionSchema.js +1 -1
- package/lib/types/custom/CollectionSchema.js.map +1 -1
- package/lib/types/custom/MapSchema.js +1 -1
- package/lib/types/custom/MapSchema.js.map +1 -1
- package/package.json +1 -1
- package/src/Schema.ts +1 -1
- package/src/encoder/ChangeTree.ts +20 -17
- package/src/encoder/Encoder.ts +3 -4
- package/src/encoder/StateView.ts +24 -0
- package/src/types/custom/ArraySchema.ts +1 -2
- package/src/types/custom/CollectionSchema.ts +1 -1
- package/src/types/custom/MapSchema.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MapSchema.js","sourceRoot":"","sources":["../../../src/types/custom/MapSchema.ts"],"names":[],"mappings":"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","sourcesContent":["import { $changes, $childType, $decoder, $deleteByIndex, $onEncodeEnd, $encoder, $filter, $getByIndex, $numFields } from \"../symbols\";\nimport { ChangeTree } from \"../../encoder/ChangeTree\";\nimport { OPERATION } from \"../../encoding/spec\";\nimport { registerType } from \"../registry\";\nimport { Collection } from \"../HelperTypes\";\nimport { decodeKeyValueOperation } from \"../../decoder/DecodeOperation\";\nimport { encodeKeyValueOperation } from \"../../encoder/EncodeOperation\";\nimport type { StateView } from \"../../encoder/StateView\";\nimport type { Schema } from \"../../Schema\";\nimport { assertInstanceType } from \"../../encoding/assert\";\n\nexport class MapSchema<V=any, K extends string = string> implements Map<K, V>, Collection<K, V, [K, V]> {\n protected childType: new () => V;\n\n protected $items: Map<K, V> = new Map<K, V>();\n protected $indexes: Map<number, K> = new Map<number, K>();\n protected deletedItems: { [field: string]: V } = {};\n\n protected [$changes]: ChangeTree;\n\n static [$encoder] = encodeKeyValueOperation;\n static [$decoder] = decodeKeyValueOperation;\n\n /**\n * Determine if a property must be filtered.\n * - If returns false, the property is NOT going to be encoded.\n * - If returns true, the property is going to be encoded.\n *\n * Encoding with \"filters\" happens in two steps:\n * - First, the encoder iterates over all \"not owned\" properties and encodes them.\n * - Then, the encoder iterates over all \"owned\" properties per instance and encodes them.\n */\n static [$filter] (ref: MapSchema, index: number, view: StateView) {\n return (\n !view ||\n typeof (ref[$childType]) === \"string\" ||\n view.visible.has((ref[$getByIndex](index) ?? ref.deletedItems[index])[$changes])\n );\n }\n\n static is(type: any) {\n return type['map'] !== undefined;\n }\n\n constructor (initialValues?: Map<K, V> | Record<K, V>) {\n this[$changes] = new ChangeTree(this);\n this[$changes].indexes = {};\n\n if (initialValues) {\n if (\n initialValues instanceof Map ||\n initialValues instanceof MapSchema\n ) {\n initialValues.forEach((v, k) => this.set(k, v));\n\n } else {\n for (const k in initialValues) {\n this.set(k, initialValues[k]);\n }\n }\n }\n\n Object.defineProperty(this, $childType, {\n value: undefined,\n enumerable: false,\n writable: true,\n configurable: true,\n });\n }\n\n /** Iterator */\n [Symbol.iterator](): IterableIterator<[K, V]> { return this.$items[Symbol.iterator](); }\n get [Symbol.toStringTag]() { return this.$items[Symbol.toStringTag] }\n\n static get [Symbol.species]() { return MapSchema; }\n\n set(key: K, value: V) {\n if (value === undefined || value === null) {\n throw new Error(`MapSchema#set('${key}', ${value}): trying to set ${value} value on '${key}'.`);\n\n } else if (typeof(value) === \"object\" && this[$childType]) {\n assertInstanceType(value as any, this[$childType] as typeof Schema, this, key);\n }\n\n // Force \"key\" as string\n // See: https://github.com/colyseus/colyseus/issues/561#issuecomment-1646733468\n key = key.toString() as K;\n\n const changeTree = this[$changes];\n const isRef = (value[$changes]) !== undefined;\n\n let index: number;\n let operation: OPERATION;\n\n // IS REPLACE?\n if (typeof(changeTree.indexes[key]) !== \"undefined\") {\n index = changeTree.indexes[key];\n operation = OPERATION.REPLACE;\n\n const previousValue = this.$items.get(key);\n if (previousValue === value) {\n // if value is the same, avoid re-encoding it.\n return;\n\n } else if (isRef) {\n // if is schema, force ADD operation if value differ from previous one.\n operation = OPERATION.DELETE_AND_ADD;\n\n // remove reference from previous value\n if (previousValue !== undefined) {\n previousValue[$changes].root?.remove(previousValue[$changes]);\n }\n }\n\n } else {\n index = changeTree.indexes[$numFields] ?? 0;\n operation = OPERATION.ADD;\n\n this.$indexes.set(index, key);\n changeTree.indexes[key] = index;\n changeTree.indexes[$numFields] = index + 1;\n }\n\n this.$items.set(key, value);\n\n changeTree.change(index, operation);\n\n //\n // set value's parent after the value is set\n // (to avoid encoding \"refId\" operations before parent's \"ADD\" operation)\n //\n if (isRef) {\n value[$changes].setParent(this, changeTree.root, index);\n }\n\n return this;\n }\n\n get(key: K): V | undefined {\n return this.$items.get(key);\n }\n\n delete(key: K) {\n const index = this[$changes].indexes[key];\n\n this.deletedItems[index] = this[$changes].delete(index);\n\n return this.$items.delete(key);\n }\n\n clear() {\n const changeTree = this[$changes];\n\n // discard previous operations.\n changeTree.discard(true);\n changeTree.indexes = {};\n\n // clear previous indexes\n this.$indexes.clear();\n\n // clear items\n this.$items.clear();\n\n changeTree.operation(OPERATION.CLEAR);\n }\n\n has (key: K) {\n return this.$items.has(key);\n }\n\n forEach(callbackfn: (value: V, key: K, map: Map<K, V>) => void) {\n this.$items.forEach(callbackfn);\n }\n\n entries () {\n return this.$items.entries();\n }\n\n keys () {\n return this.$items.keys();\n }\n\n values() {\n return this.$items.values();\n }\n\n get size () {\n return this.$items.size;\n }\n\n protected setIndex(index: number, key: K) {\n this.$indexes.set(index, key);\n }\n\n protected getIndex(index: number) {\n return this.$indexes.get(index);\n }\n\n protected [$getByIndex](index: number) {\n return this.$items.get(this.$indexes.get(index));\n }\n\n protected [$deleteByIndex](index: number) {\n const key = this.$indexes.get(index);\n this.$items.delete(key);\n this.$indexes.delete(index);\n }\n\n protected [$onEncodeEnd]() {\n this.deletedItems = {};\n }\n\n toJSON() {\n const map: any = {};\n\n this.forEach((value, key) => {\n map[key] = (typeof (value['toJSON']) === \"function\")\n ? value['toJSON']()\n : value;\n });\n\n return map;\n }\n\n //\n // Decoding utilities\n //\n // @ts-ignore\n clone(isDecoding?: boolean): MapSchema<V> {\n let cloned: MapSchema<V>;\n\n if (isDecoding) {\n // client-side\n cloned = Object.assign(new MapSchema(), this);\n\n } else {\n // server-side\n cloned = new MapSchema();\n\n this.forEach((value, key) => {\n if (value[$changes]) {\n cloned.set(key, value['clone']());\n } else {\n cloned.set(key, value);\n }\n })\n\n }\n\n return cloned;\n }\n\n}\n\nregisterType(\"map\", { constructor: MapSchema });"]}
|
|
1
|
+
{"version":3,"file":"MapSchema.js","sourceRoot":"","sources":["../../../src/types/custom/MapSchema.ts"],"names":[],"mappings":"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","sourcesContent":["import { $changes, $childType, $decoder, $deleteByIndex, $onEncodeEnd, $encoder, $filter, $getByIndex, $numFields } from \"../symbols\";\nimport { ChangeTree } from \"../../encoder/ChangeTree\";\nimport { OPERATION } from \"../../encoding/spec\";\nimport { registerType } from \"../registry\";\nimport { Collection } from \"../HelperTypes\";\nimport { decodeKeyValueOperation } from \"../../decoder/DecodeOperation\";\nimport { encodeKeyValueOperation } from \"../../encoder/EncodeOperation\";\nimport type { StateView } from \"../../encoder/StateView\";\nimport type { Schema } from \"../../Schema\";\nimport { assertInstanceType } from \"../../encoding/assert\";\n\nexport class MapSchema<V=any, K extends string = string> implements Map<K, V>, Collection<K, V, [K, V]> {\n protected childType: new () => V;\n\n protected $items: Map<K, V> = new Map<K, V>();\n protected $indexes: Map<number, K> = new Map<number, K>();\n protected deletedItems: { [field: string]: V } = {};\n\n protected [$changes]: ChangeTree;\n\n static [$encoder] = encodeKeyValueOperation;\n static [$decoder] = decodeKeyValueOperation;\n\n /**\n * Determine if a property must be filtered.\n * - If returns false, the property is NOT going to be encoded.\n * - If returns true, the property is going to be encoded.\n *\n * Encoding with \"filters\" happens in two steps:\n * - First, the encoder iterates over all \"not owned\" properties and encodes them.\n * - Then, the encoder iterates over all \"owned\" properties per instance and encodes them.\n */\n static [$filter] (ref: MapSchema, index: number, view: StateView) {\n return (\n !view ||\n typeof (ref[$childType]) === \"string\" ||\n view.isChangeTreeVisible((ref[$getByIndex](index) ?? ref.deletedItems[index])[$changes])\n );\n }\n\n static is(type: any) {\n return type['map'] !== undefined;\n }\n\n constructor (initialValues?: Map<K, V> | Record<K, V>) {\n this[$changes] = new ChangeTree(this);\n this[$changes].indexes = {};\n\n if (initialValues) {\n if (\n initialValues instanceof Map ||\n initialValues instanceof MapSchema\n ) {\n initialValues.forEach((v, k) => this.set(k, v));\n\n } else {\n for (const k in initialValues) {\n this.set(k, initialValues[k]);\n }\n }\n }\n\n Object.defineProperty(this, $childType, {\n value: undefined,\n enumerable: false,\n writable: true,\n configurable: true,\n });\n }\n\n /** Iterator */\n [Symbol.iterator](): IterableIterator<[K, V]> { return this.$items[Symbol.iterator](); }\n get [Symbol.toStringTag]() { return this.$items[Symbol.toStringTag] }\n\n static get [Symbol.species]() { return MapSchema; }\n\n set(key: K, value: V) {\n if (value === undefined || value === null) {\n throw new Error(`MapSchema#set('${key}', ${value}): trying to set ${value} value on '${key}'.`);\n\n } else if (typeof(value) === \"object\" && this[$childType]) {\n assertInstanceType(value as any, this[$childType] as typeof Schema, this, key);\n }\n\n // Force \"key\" as string\n // See: https://github.com/colyseus/colyseus/issues/561#issuecomment-1646733468\n key = key.toString() as K;\n\n const changeTree = this[$changes];\n const isRef = (value[$changes]) !== undefined;\n\n let index: number;\n let operation: OPERATION;\n\n // IS REPLACE?\n if (typeof(changeTree.indexes[key]) !== \"undefined\") {\n index = changeTree.indexes[key];\n operation = OPERATION.REPLACE;\n\n const previousValue = this.$items.get(key);\n if (previousValue === value) {\n // if value is the same, avoid re-encoding it.\n return;\n\n } else if (isRef) {\n // if is schema, force ADD operation if value differ from previous one.\n operation = OPERATION.DELETE_AND_ADD;\n\n // remove reference from previous value\n if (previousValue !== undefined) {\n previousValue[$changes].root?.remove(previousValue[$changes]);\n }\n }\n\n } else {\n index = changeTree.indexes[$numFields] ?? 0;\n operation = OPERATION.ADD;\n\n this.$indexes.set(index, key);\n changeTree.indexes[key] = index;\n changeTree.indexes[$numFields] = index + 1;\n }\n\n this.$items.set(key, value);\n\n changeTree.change(index, operation);\n\n //\n // set value's parent after the value is set\n // (to avoid encoding \"refId\" operations before parent's \"ADD\" operation)\n //\n if (isRef) {\n value[$changes].setParent(this, changeTree.root, index);\n }\n\n return this;\n }\n\n get(key: K): V | undefined {\n return this.$items.get(key);\n }\n\n delete(key: K) {\n const index = this[$changes].indexes[key];\n\n this.deletedItems[index] = this[$changes].delete(index);\n\n return this.$items.delete(key);\n }\n\n clear() {\n const changeTree = this[$changes];\n\n // discard previous operations.\n changeTree.discard(true);\n changeTree.indexes = {};\n\n // clear previous indexes\n this.$indexes.clear();\n\n // clear items\n this.$items.clear();\n\n changeTree.operation(OPERATION.CLEAR);\n }\n\n has (key: K) {\n return this.$items.has(key);\n }\n\n forEach(callbackfn: (value: V, key: K, map: Map<K, V>) => void) {\n this.$items.forEach(callbackfn);\n }\n\n entries () {\n return this.$items.entries();\n }\n\n keys () {\n return this.$items.keys();\n }\n\n values() {\n return this.$items.values();\n }\n\n get size () {\n return this.$items.size;\n }\n\n protected setIndex(index: number, key: K) {\n this.$indexes.set(index, key);\n }\n\n protected getIndex(index: number) {\n return this.$indexes.get(index);\n }\n\n protected [$getByIndex](index: number) {\n return this.$items.get(this.$indexes.get(index));\n }\n\n protected [$deleteByIndex](index: number) {\n const key = this.$indexes.get(index);\n this.$items.delete(key);\n this.$indexes.delete(index);\n }\n\n protected [$onEncodeEnd]() {\n this.deletedItems = {};\n }\n\n toJSON() {\n const map: any = {};\n\n this.forEach((value, key) => {\n map[key] = (typeof (value['toJSON']) === \"function\")\n ? value['toJSON']()\n : value;\n });\n\n return map;\n }\n\n //\n // Decoding utilities\n //\n // @ts-ignore\n clone(isDecoding?: boolean): MapSchema<V> {\n let cloned: MapSchema<V>;\n\n if (isDecoding) {\n // client-side\n cloned = Object.assign(new MapSchema(), this);\n\n } else {\n // server-side\n cloned = new MapSchema();\n\n this.forEach((value, key) => {\n if (value[$changes]) {\n cloned.set(key, value['clone']());\n } else {\n cloned.set(key, value);\n }\n })\n\n }\n\n return cloned;\n }\n\n}\n\nregisterType(\"map\", { constructor: MapSchema });"]}
|
package/package.json
CHANGED
package/src/Schema.ts
CHANGED
|
@@ -122,6 +122,7 @@ export class ChangeTree<T extends Ref=any> {
|
|
|
122
122
|
* Whether this structure is parent of a filtered structure.
|
|
123
123
|
*/
|
|
124
124
|
isFiltered: boolean = false;
|
|
125
|
+
isVisibilitySharedWithParent?: boolean; // See test case: 'should not be required to manually call view.add() items to child arrays without @view() tag'
|
|
125
126
|
|
|
126
127
|
indexedOperations: IndexedOperations = {};
|
|
127
128
|
|
|
@@ -327,20 +328,6 @@ export class ChangeTree<T extends Ref=any> {
|
|
|
327
328
|
for (const key in changeSet.indexes) {
|
|
328
329
|
newIndexes[newKey++] = changeSet.indexes[key];
|
|
329
330
|
}
|
|
330
|
-
|
|
331
|
-
// const newIndexes = {};
|
|
332
|
-
// let newKey = 0;
|
|
333
|
-
// for (const key in changeSet.indexes) {
|
|
334
|
-
// const index = changeSet.indexes[key];
|
|
335
|
-
// newIndexes[newKey++] = changeSet.indexes[key];
|
|
336
|
-
// console.log("...shiftAllChangeIndexes", { index: key, targetIndex: index, startIndex, shiftIndex });
|
|
337
|
-
// if (index > startIndex) {
|
|
338
|
-
// newIndexes[Number(key) + shiftIndex] = index;
|
|
339
|
-
// } else {
|
|
340
|
-
// newIndexes[Number(key)] = index;
|
|
341
|
-
// }
|
|
342
|
-
// }
|
|
343
|
-
|
|
344
331
|
changeSet.indexes = newIndexes;
|
|
345
332
|
|
|
346
333
|
for (let i = 0; i < changeSet.operations.length; i++) {
|
|
@@ -564,10 +551,16 @@ export class ChangeTree<T extends Ref=any> {
|
|
|
564
551
|
? this.ref.constructor
|
|
565
552
|
: this.ref[$childType];
|
|
566
553
|
|
|
567
|
-
|
|
568
|
-
|
|
554
|
+
let parentChangeTree: ChangeTree;
|
|
555
|
+
|
|
556
|
+
let parentIsCollection = !Metadata.isValidInstance(parent);
|
|
557
|
+
if (parentIsCollection) {
|
|
558
|
+
parentChangeTree = parent[$changes];
|
|
569
559
|
parent = parentChangeTree.parent;
|
|
570
560
|
parentIndex = parentChangeTree.parentIndex;
|
|
561
|
+
|
|
562
|
+
} else {
|
|
563
|
+
parentChangeTree = parent[$changes]
|
|
571
564
|
}
|
|
572
565
|
|
|
573
566
|
const parentConstructor = parent.constructor as typeof Schema;
|
|
@@ -578,15 +571,25 @@ export class ChangeTree<T extends Ref=any> {
|
|
|
578
571
|
}
|
|
579
572
|
key += `-${parentIndex}`;
|
|
580
573
|
|
|
574
|
+
const fieldHasViewTag = parentConstructor?.[Symbol.metadata]?.[$viewFieldIndexes]?.includes(parentIndex);
|
|
575
|
+
|
|
581
576
|
this.isFiltered = parent[$changes].isFiltered // in case parent is already filtered
|
|
582
577
|
|| this.root.types.parentFiltered[key]
|
|
583
|
-
||
|
|
578
|
+
|| fieldHasViewTag;
|
|
584
579
|
|
|
585
580
|
//
|
|
586
581
|
// "isFiltered" may not be imedialely available during `change()` due to the instance not being attached to the root yet.
|
|
587
582
|
// when it's available, we need to enqueue the "changes" changeset into the "filteredChanges" changeset.
|
|
588
583
|
//
|
|
589
584
|
if (this.isFiltered) {
|
|
585
|
+
|
|
586
|
+
this.isVisibilitySharedWithParent = (
|
|
587
|
+
parentChangeTree.isFiltered &&
|
|
588
|
+
typeof (refType) !== "string" &&
|
|
589
|
+
!fieldHasViewTag &&
|
|
590
|
+
parentIsCollection
|
|
591
|
+
);
|
|
592
|
+
|
|
590
593
|
if (!this.filteredChanges) {
|
|
591
594
|
this.filteredChanges = createChangeSet();
|
|
592
595
|
this.allFilteredChanges = createChangeSet();
|
package/src/encoder/Encoder.ts
CHANGED
|
@@ -61,13 +61,12 @@ export class Encoder<T extends Schema = any> {
|
|
|
61
61
|
if (!changeTree) { continue; }
|
|
62
62
|
|
|
63
63
|
if (hasView) {
|
|
64
|
-
if (!view.
|
|
64
|
+
if (!view.isChangeTreeVisible(changeTree)) {
|
|
65
|
+
// console.log("MARK AS INVISIBLE:", { ref: changeTree.ref.constructor.name, refId: changeTree.refId, raw: changeTree.ref.toJSON() });
|
|
65
66
|
view.invisible.add(changeTree);
|
|
66
67
|
continue; // skip this change tree
|
|
67
|
-
|
|
68
|
-
} else {
|
|
69
|
-
view.invisible.delete(changeTree); // remove from invisible list
|
|
70
68
|
}
|
|
69
|
+
view.invisible.delete(changeTree); // remove from invisible list
|
|
71
70
|
}
|
|
72
71
|
|
|
73
72
|
const changeSet = changeTree[changeSetName];
|
package/src/encoder/StateView.ts
CHANGED
|
@@ -291,4 +291,28 @@ export class StateView {
|
|
|
291
291
|
// clear items array
|
|
292
292
|
this.items.length = 0;
|
|
293
293
|
}
|
|
294
|
+
|
|
295
|
+
isChangeTreeVisible(changeTree: ChangeTree) {
|
|
296
|
+
let isVisible = this.visible.has(changeTree);
|
|
297
|
+
|
|
298
|
+
//
|
|
299
|
+
// TODO: avoid checking for parent visibility, most of the time it's not needed
|
|
300
|
+
// See test case: 'should not be required to manually call view.add() items to child arrays without @view() tag'
|
|
301
|
+
//
|
|
302
|
+
if (!isVisible && changeTree.isVisibilitySharedWithParent){
|
|
303
|
+
|
|
304
|
+
// console.log("CHECK AGAINST PARENT...", {
|
|
305
|
+
// ref: changeTree.ref.constructor.name,
|
|
306
|
+
// refId: changeTree.refId,
|
|
307
|
+
// parent: changeTree.parent.constructor.name,
|
|
308
|
+
// });
|
|
309
|
+
|
|
310
|
+
if (this.visible.has(changeTree.parent[$changes])) {
|
|
311
|
+
this.visible.add(changeTree);
|
|
312
|
+
isVisible = true;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
return isVisible;
|
|
317
|
+
}
|
|
294
318
|
}
|
|
@@ -41,8 +41,7 @@ export class ArraySchema<V = any> implements Array<V>, Collection<number, V> {
|
|
|
41
41
|
return (
|
|
42
42
|
!view ||
|
|
43
43
|
typeof (ref[$childType]) === "string" ||
|
|
44
|
-
|
|
45
|
-
view.visible.has(ref['tmpItems'][index]?.[$changes])
|
|
44
|
+
view.isChangeTreeVisible(ref['tmpItems'][index]?.[$changes])
|
|
46
45
|
);
|
|
47
46
|
}
|
|
48
47
|
|
|
@@ -33,7 +33,7 @@ export class CollectionSchema<V=any> implements Collection<K, V>{
|
|
|
33
33
|
return (
|
|
34
34
|
!view ||
|
|
35
35
|
typeof (ref[$childType]) === "string" ||
|
|
36
|
-
view.
|
|
36
|
+
view.isChangeTreeVisible((ref[$getByIndex](index) ?? ref.deletedItems[index])[$changes])
|
|
37
37
|
);
|
|
38
38
|
}
|
|
39
39
|
|
|
@@ -34,7 +34,7 @@ export class MapSchema<V=any, K extends string = string> implements Map<K, V>, C
|
|
|
34
34
|
return (
|
|
35
35
|
!view ||
|
|
36
36
|
typeof (ref[$childType]) === "string" ||
|
|
37
|
-
view.
|
|
37
|
+
view.isChangeTreeVisible((ref[$getByIndex](index) ?? ref.deletedItems[index])[$changes])
|
|
38
38
|
);
|
|
39
39
|
}
|
|
40
40
|
|