@colyseus/schema 3.0.21 → 3.0.23

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.
@@ -23,7 +23,7 @@ class SetSchema {
23
23
  static [(_a = symbols_1.$encoder, _b = symbols_1.$decoder, symbols_1.$filter)](ref, index, view) {
24
24
  return (!view ||
25
25
  typeof (ref[symbols_1.$childType]) === "string" ||
26
- view.items.has((ref[symbols_1.$getByIndex](index) ?? ref.deletedItems[index])[symbols_1.$changes]));
26
+ view.visible.has((ref[symbols_1.$getByIndex](index) ?? ref.deletedItems[index])[symbols_1.$changes]));
27
27
  }
28
28
  static is(type) {
29
29
  return type['set'] !== undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"SetSchema.js","sourceRoot":"","sources":["../../../src/types/custom/SetSchema.ts"],"names":[],"mappings":"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","sourcesContent":["import { OPERATION } from \"../../encoding/spec\";\nimport { registerType } from \"../registry\";\nimport { $changes, $childType, $decoder, $deleteByIndex, $encoder, $filter, $getByIndex, $onEncodeEnd } from \"../symbols\";\nimport { Collection } from \"../HelperTypes\";\nimport { ChangeTree } from \"../../encoder/ChangeTree\";\nimport { encodeKeyValueOperation } from \"../../encoder/EncodeOperation\";\nimport { decodeKeyValueOperation } from \"../../decoder/DecodeOperation\";\nimport type { StateView } from \"../../encoder/StateView\";\n\nexport class SetSchema<V=any> implements Collection<number, V> {\n\n protected $items: Map<number, V> = new Map<number, V>();\n protected $indexes: Map<number, number> = new Map<number, number>();\n protected deletedItems: { [field: string]: V } = {};\n\n protected $refId: number = 0;\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: SetSchema, index: number, view: StateView) {\n return (\n !view ||\n typeof (ref[$childType]) === \"string\" ||\n view.items.has((ref[$getByIndex](index) ?? ref.deletedItems[index])[$changes])\n );\n }\n\n static is(type: any) {\n return type['set'] !== undefined;\n }\n\n constructor (initialValues?: Array<V>) {\n this[$changes] = new ChangeTree(this);\n this[$changes].indexes = {};\n\n if (initialValues) {\n initialValues.forEach((v) => this.add(v));\n }\n\n Object.defineProperty(this, $childType, {\n value: undefined,\n enumerable: false,\n writable: true,\n configurable: true,\n });\n }\n\n add(value: V) {\n // immediatelly return false if value already added.\n if (this.has(value)) { return false; }\n\n // set \"index\" for reference.\n const index = this.$refId++;\n\n if ((value[$changes]) !== undefined) {\n value[$changes].setParent(this, this[$changes].root, index);\n }\n\n const operation = this[$changes].indexes[index]?.op ?? OPERATION.ADD;\n\n this[$changes].indexes[index] = index;\n\n this.$indexes.set(index, index);\n this.$items.set(index, value);\n\n this[$changes].change(index, operation);\n return index;\n }\n\n entries () {\n return this.$items.entries();\n }\n\n delete(item: V) {\n const entries = this.$items.entries();\n\n let index: number;\n let entry: IteratorResult<[number, V]>;\n while (entry = entries.next()) {\n if (entry.done) { break; }\n\n if (item === entry.value[1]) {\n index = entry.value[0];\n break;\n }\n }\n\n if (index === undefined) {\n return false;\n }\n\n this.deletedItems[index] = this[$changes].delete(index);\n this.$indexes.delete(index);\n\n return this.$items.delete(index);\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 (value: V): boolean {\n const values = this.$items.values();\n\n let has = false;\n let entry: IteratorResult<V>;\n\n while (entry = values.next()) {\n if (entry.done) { break; }\n if (value === entry.value) {\n has = true;\n break;\n }\n }\n\n return has;\n }\n\n forEach(callbackfn: (value: V, key: number, collection: SetSchema<V>) => void) {\n this.$items.forEach((value, key, _) => callbackfn(value, key, this));\n }\n\n values() {\n return this.$items.values();\n }\n\n get size () {\n return this.$items.size;\n }\n\n /** Iterator */\n [Symbol.iterator](): IterableIterator<V> {\n return this.$items.values();\n }\n\n protected setIndex(index: number, key: number) {\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 toArray() {\n return Array.from(this.$items.values());\n }\n\n toJSON() {\n const values: V[] = [];\n\n this.forEach((value, key) => {\n values.push(\n (typeof (value['toJSON']) === \"function\")\n ? value['toJSON']()\n : value\n );\n });\n\n return values;\n }\n\n //\n // Decoding utilities\n //\n clone(isDecoding?: boolean): SetSchema<V> {\n let cloned: SetSchema;\n\n if (isDecoding) {\n // client-side\n cloned = Object.assign(new SetSchema(), this);\n\n } else {\n // server-side\n cloned = new SetSchema();\n this.forEach((value) => {\n if (value[$changes]) {\n cloned.add(value['clone']());\n } else {\n cloned.add(value);\n }\n })\n }\n\n return cloned;\n }\n\n}\n\nregisterType(\"set\", { constructor: SetSchema });"]}
1
+ {"version":3,"file":"SetSchema.js","sourceRoot":"","sources":["../../../src/types/custom/SetSchema.ts"],"names":[],"mappings":"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","sourcesContent":["import { OPERATION } from \"../../encoding/spec\";\nimport { registerType } from \"../registry\";\nimport { $changes, $childType, $decoder, $deleteByIndex, $encoder, $filter, $getByIndex, $onEncodeEnd } from \"../symbols\";\nimport { Collection } from \"../HelperTypes\";\nimport { ChangeTree } from \"../../encoder/ChangeTree\";\nimport { encodeKeyValueOperation } from \"../../encoder/EncodeOperation\";\nimport { decodeKeyValueOperation } from \"../../decoder/DecodeOperation\";\nimport type { StateView } from \"../../encoder/StateView\";\n\nexport class SetSchema<V=any> implements Collection<number, V> {\n\n protected $items: Map<number, V> = new Map<number, V>();\n protected $indexes: Map<number, number> = new Map<number, number>();\n protected deletedItems: { [field: string]: V } = {};\n\n protected $refId: number = 0;\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: SetSchema, 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['set'] !== undefined;\n }\n\n constructor (initialValues?: Array<V>) {\n this[$changes] = new ChangeTree(this);\n this[$changes].indexes = {};\n\n if (initialValues) {\n initialValues.forEach((v) => this.add(v));\n }\n\n Object.defineProperty(this, $childType, {\n value: undefined,\n enumerable: false,\n writable: true,\n configurable: true,\n });\n }\n\n add(value: V) {\n // immediatelly return false if value already added.\n if (this.has(value)) { return false; }\n\n // set \"index\" for reference.\n const index = this.$refId++;\n\n if ((value[$changes]) !== undefined) {\n value[$changes].setParent(this, this[$changes].root, index);\n }\n\n const operation = this[$changes].indexes[index]?.op ?? OPERATION.ADD;\n\n this[$changes].indexes[index] = index;\n\n this.$indexes.set(index, index);\n this.$items.set(index, value);\n\n this[$changes].change(index, operation);\n return index;\n }\n\n entries () {\n return this.$items.entries();\n }\n\n delete(item: V) {\n const entries = this.$items.entries();\n\n let index: number;\n let entry: IteratorResult<[number, V]>;\n while (entry = entries.next()) {\n if (entry.done) { break; }\n\n if (item === entry.value[1]) {\n index = entry.value[0];\n break;\n }\n }\n\n if (index === undefined) {\n return false;\n }\n\n this.deletedItems[index] = this[$changes].delete(index);\n this.$indexes.delete(index);\n\n return this.$items.delete(index);\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 (value: V): boolean {\n const values = this.$items.values();\n\n let has = false;\n let entry: IteratorResult<V>;\n\n while (entry = values.next()) {\n if (entry.done) { break; }\n if (value === entry.value) {\n has = true;\n break;\n }\n }\n\n return has;\n }\n\n forEach(callbackfn: (value: V, key: number, collection: SetSchema<V>) => void) {\n this.$items.forEach((value, key, _) => callbackfn(value, key, this));\n }\n\n values() {\n return this.$items.values();\n }\n\n get size () {\n return this.$items.size;\n }\n\n /** Iterator */\n [Symbol.iterator](): IterableIterator<V> {\n return this.$items.values();\n }\n\n protected setIndex(index: number, key: number) {\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 toArray() {\n return Array.from(this.$items.values());\n }\n\n toJSON() {\n const values: V[] = [];\n\n this.forEach((value, key) => {\n values.push(\n (typeof (value['toJSON']) === \"function\")\n ? value['toJSON']()\n : value\n );\n });\n\n return values;\n }\n\n //\n // Decoding utilities\n //\n clone(isDecoding?: boolean): SetSchema<V> {\n let cloned: SetSchema;\n\n if (isDecoding) {\n // client-side\n cloned = Object.assign(new SetSchema(), this);\n\n } else {\n // server-side\n cloned = new SetSchema();\n this.forEach((value) => {\n if (value[$changes]) {\n cloned.add(value['clone']());\n } else {\n cloned.add(value);\n }\n })\n }\n\n return cloned;\n }\n\n}\n\nregisterType(\"set\", { constructor: SetSchema });"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@colyseus/schema",
3
- "version": "3.0.21",
3
+ "version": "3.0.23",
4
4
  "description": "Binary state serializer with delta encoding for games",
5
5
  "bin": {
6
6
  "schema-codegen": "./bin/schema-codegen",
package/src/Schema.ts CHANGED
@@ -69,7 +69,7 @@ export class Schema {
69
69
 
70
70
  } else if (tag === DEFAULT_VIEW_TAG) {
71
71
  // view pass: default tag
72
- return view.items.has(ref[$changes]);
72
+ return view.visible.has(ref[$changes]);
73
73
 
74
74
  } else {
75
75
  // view pass: custom tag
@@ -98,7 +98,7 @@ export class ReferenceTracker {
98
98
  //
99
99
  // Ensure child schema instances have their references removed as well.
100
100
  //
101
- if (Metadata.isValidInstance(ref)) {
101
+ if (ref.constructor[Symbol.metadata] !== undefined) {
102
102
  const metadata: Metadata = ref.constructor[Symbol.metadata];
103
103
  for (const index in metadata) {
104
104
  const field = metadata[index as any as number].name;
@@ -109,7 +109,7 @@ export class ReferenceTracker {
109
109
  }
110
110
 
111
111
  } else {
112
- if (typeof (Object.values(ref[$childType])[0]) === "function") {
112
+ if (typeof (ref[$childType]) === "function") {
113
113
  Array.from((ref as MapSchema).values())
114
114
  .forEach((child) => {
115
115
  const childRefId = this.refIds.get(child);
@@ -62,7 +62,7 @@ export class Encoder<T extends Schema = any> {
62
62
  const changeTree = changeTrees[i];
63
63
 
64
64
  if (hasView) {
65
- if (!view.items.has(changeTree)) {
65
+ if (!view.visible.has(changeTree)) {
66
66
  view.invisible.add(changeTree);
67
67
  continue; // skip this change tree
68
68
 
@@ -211,6 +211,7 @@ export class Encoder<T extends Schema = any> {
211
211
 
212
212
  if (changeTree === undefined) {
213
213
  // detached instance, remove from view and skip.
214
+ // console.log("detached instance, remove from view and skip.", refId);
214
215
  view.changes.delete(refId);
215
216
  continue;
216
217
  }
@@ -218,7 +219,7 @@ export class Encoder<T extends Schema = any> {
218
219
  const keys = Object.keys(changes);
219
220
  if (keys.length === 0) {
220
221
  // FIXME: avoid having empty changes if no changes were made
221
- // console.log("changes.size === 0, skip", changeTree.ref.constructor.name);
222
+ // console.log("changes.size === 0, skip", refId, changeTree.ref.constructor.name);
222
223
  continue;
223
224
  }
224
225
 
@@ -3,16 +3,23 @@ import { $changes, $fieldIndexesByViewTag, $viewFieldIndexes } from "../types/sy
3
3
  import { DEFAULT_VIEW_TAG } from "../annotations";
4
4
  import { OPERATION } from "../encoding/spec";
5
5
  import { Metadata } from "../Metadata";
6
+ import { spliceOne } from "../types/utils";
6
7
 
7
- export function createView() {
8
- return new StateView();
8
+ export function createView(iterable: boolean = false) {
9
+ return new StateView(iterable);
9
10
  }
10
11
 
11
12
  export class StateView {
13
+ /**
14
+ * Iterable list of items that are visible to this view
15
+ * (Available only if constructed with `iterable: true`)
16
+ */
17
+ items: Ref[];
18
+
12
19
  /**
13
20
  * List of ChangeTree's that are visible to this view
14
21
  */
15
- items: WeakSet<ChangeTree> = new WeakSet<ChangeTree>();
22
+ visible: WeakSet<ChangeTree> = new WeakSet<ChangeTree>();
16
23
 
17
24
  /**
18
25
  * List of ChangeTree's that are invisible to this view
@@ -27,9 +34,15 @@ export class StateView {
27
34
  */
28
35
  changes = new Map<number, IndexedOperations>();
29
36
 
37
+ constructor(public iterable: boolean = false) {
38
+ if (iterable) {
39
+ this.items = [];
40
+ }
41
+ }
42
+
30
43
  // TODO: allow to set multiple tags at once
31
44
  add(obj: Ref, tag: number = DEFAULT_VIEW_TAG, checkIncludeParent: boolean = true) {
32
- if (!obj[$changes]) {
45
+ if (!obj?.[$changes]) {
33
46
  console.warn("StateView#add(), invalid object:", obj);
34
47
  return this;
35
48
  }
@@ -37,7 +50,12 @@ export class StateView {
37
50
  // FIXME: ArraySchema/MapSchema do not have metadata
38
51
  const metadata: Metadata = obj.constructor[Symbol.metadata];
39
52
  const changeTree: ChangeTree = obj[$changes];
40
- this.items.add(changeTree);
53
+ this.visible.add(changeTree);
54
+
55
+ // add to iterable list (only the explicitly added items)
56
+ if (this.iterable && checkIncludeParent) {
57
+ this.items.push(obj);
58
+ }
41
59
 
42
60
  // add parent ChangeTree's
43
61
  // - if it was invisible to this view
@@ -123,9 +141,9 @@ export class StateView {
123
141
  const changeTree = childChangeTree.parent[$changes];
124
142
  const parentIndex = childChangeTree.parentIndex;
125
143
 
126
- if (!this.items.has(changeTree)) {
144
+ if (!this.visible.has(changeTree)) {
127
145
  // view must have all "changeTree" parent tree
128
- this.items.add(changeTree);
146
+ this.visible.add(changeTree);
129
147
 
130
148
  // add parent's parent
131
149
  const parentChangeTree: ChangeTree = changeTree.parent?.[$changes];
@@ -162,17 +180,27 @@ export class StateView {
162
180
  }
163
181
  }
164
182
 
165
- remove(obj: Ref, tag: number = DEFAULT_VIEW_TAG) {
166
- const changeTree = obj[$changes];
183
+ remove(obj: Ref, tag?: number): this; // hide _isClear parameter from public API
184
+ remove(obj: Ref, tag?: number, _isClear?: boolean): this;
185
+ remove(obj: Ref, tag: number = DEFAULT_VIEW_TAG, _isClear: boolean = false): this {
186
+ const changeTree: ChangeTree = obj[$changes];
167
187
  if (!changeTree) {
168
188
  console.warn("StateView#remove(), invalid object:", obj);
169
189
  return this;
170
190
  }
171
191
 
172
- this.items.delete(changeTree);
192
+ this.visible.delete(changeTree);
193
+
194
+ // remove from iterable list
195
+ if (
196
+ this.iterable &&
197
+ !_isClear // no need to remove during clear(), as it will be cleared entirely
198
+ ) {
199
+ spliceOne(this.items, this.items.indexOf(obj));
200
+ }
173
201
 
174
202
  const ref = changeTree.ref;
175
- const metadata: Metadata = ref.constructor[Symbol.metadata];
203
+ const metadata: Metadata = ref.constructor[Symbol.metadata]; // ArraySchema/MapSchema do not have metadata
176
204
 
177
205
  let changes = this.changes.get(changeTree.refId);
178
206
  if (changes === undefined) {
@@ -195,14 +223,14 @@ export class StateView {
195
223
 
196
224
  } else {
197
225
  // delete all "tagged" properties.
198
- metadata[$viewFieldIndexes].forEach((index) =>
226
+ metadata?.[$viewFieldIndexes].forEach((index) =>
199
227
  changes[index] = OPERATION.DELETE);
200
228
  }
201
229
 
202
230
 
203
231
  } else {
204
232
  // delete only tagged properties
205
- metadata[$fieldIndexesByViewTag][tag].forEach((index) =>
233
+ metadata?.[$fieldIndexesByViewTag][tag].forEach((index) =>
206
234
  changes[index] = OPERATION.DELETE);
207
235
  }
208
236
 
@@ -227,11 +255,24 @@ export class StateView {
227
255
  }
228
256
 
229
257
  has(obj: Ref) {
230
- return this.items.has(obj[$changes]);
258
+ return this.visible.has(obj[$changes]);
231
259
  }
232
260
 
233
261
  hasTag(ob: Ref, tag: number = DEFAULT_VIEW_TAG) {
234
262
  const tags = this.tags?.get(ob[$changes]);
235
263
  return tags?.has(tag) ?? false;
236
264
  }
237
- }
265
+
266
+ clear() {
267
+ if (!this.iterable) {
268
+ throw new Error("StateView#clear() is only available for iterable StateView's. Use StateView(iterable: true) constructor.");
269
+ }
270
+
271
+ for (let i = 0, l = this.items.length; i < l; i++) {
272
+ this.remove(this.items[i], DEFAULT_VIEW_TAG, true);
273
+ }
274
+
275
+ // clear items array
276
+ this.items.length = 0;
277
+ }
278
+ }
@@ -42,7 +42,7 @@ export class ArraySchema<V = any> implements Array<V>, Collection<number, V> {
42
42
  !view ||
43
43
  typeof (ref[$childType]) === "string" ||
44
44
  // view.items.has(ref[$getByIndex](index)[$changes])
45
- view.items.has(ref['tmpItems'][index]?.[$changes])
45
+ view.visible.has(ref['tmpItems'][index]?.[$changes])
46
46
  );
47
47
  }
48
48
 
@@ -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.items.has((ref[$getByIndex](index) ?? ref.deletedItems[index])[$changes])
36
+ view.visible.has((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.items.has((ref[$getByIndex](index) ?? ref.deletedItems[index])[$changes])
37
+ view.visible.has((ref[$getByIndex](index) ?? ref.deletedItems[index])[$changes])
38
38
  );
39
39
  }
40
40
 
@@ -31,7 +31,7 @@ export class SetSchema<V=any> implements Collection<number, V> {
31
31
  return (
32
32
  !view ||
33
33
  typeof (ref[$childType]) === "string" ||
34
- view.items.has((ref[$getByIndex](index) ?? ref.deletedItems[index])[$changes])
34
+ view.visible.has((ref[$getByIndex](index) ?? ref.deletedItems[index])[$changes])
35
35
  );
36
36
  }
37
37