@colyseus/schema 3.0.0-alpha.30 → 3.0.0-alpha.32
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 +389 -354
- package/build/cjs/index.js.map +1 -1
- package/build/esm/index.mjs +389 -354
- package/build/esm/index.mjs.map +1 -1
- package/build/umd/index.js +389 -354
- package/lib/Metadata.d.ts +14 -5
- package/lib/Metadata.js +49 -20
- package/lib/Metadata.js.map +1 -1
- package/lib/Reflection.js +4 -13
- package/lib/Reflection.js.map +1 -1
- package/lib/Schema.js +26 -39
- package/lib/Schema.js.map +1 -1
- package/lib/annotations.d.ts +1 -2
- package/lib/annotations.js +58 -52
- package/lib/annotations.js.map +1 -1
- package/lib/bench_encode.js +25 -22
- package/lib/bench_encode.js.map +1 -1
- package/lib/decoder/DecodeOperation.js +7 -9
- package/lib/decoder/DecodeOperation.js.map +1 -1
- package/lib/decoder/ReferenceTracker.js +3 -2
- package/lib/decoder/ReferenceTracker.js.map +1 -1
- package/lib/decoder/strategy/StateCallbacks.js +4 -3
- package/lib/decoder/strategy/StateCallbacks.js.map +1 -1
- package/lib/encoder/ChangeTree.d.ts +8 -7
- package/lib/encoder/ChangeTree.js +135 -117
- package/lib/encoder/ChangeTree.js.map +1 -1
- package/lib/encoder/EncodeOperation.d.ts +1 -4
- package/lib/encoder/EncodeOperation.js +17 -47
- package/lib/encoder/EncodeOperation.js.map +1 -1
- package/lib/encoder/Encoder.js +18 -6
- package/lib/encoder/Encoder.js.map +1 -1
- package/lib/encoder/Root.d.ts +2 -2
- package/lib/encoder/Root.js +18 -6
- package/lib/encoder/Root.js.map +1 -1
- package/lib/encoder/StateView.js +3 -3
- package/lib/encoder/StateView.js.map +1 -1
- package/lib/encoding/assert.d.ts +2 -1
- package/lib/encoding/assert.js +2 -2
- package/lib/encoding/assert.js.map +1 -1
- package/lib/index.d.ts +1 -2
- package/lib/index.js +11 -10
- package/lib/index.js.map +1 -1
- package/lib/types/TypeContext.js +7 -14
- package/lib/types/TypeContext.js.map +1 -1
- package/lib/types/custom/ArraySchema.js +6 -0
- package/lib/types/custom/ArraySchema.js.map +1 -1
- package/lib/types/custom/CollectionSchema.js +1 -0
- package/lib/types/custom/CollectionSchema.js.map +1 -1
- package/lib/types/custom/MapSchema.js +5 -0
- package/lib/types/custom/MapSchema.js.map +1 -1
- package/lib/types/custom/SetSchema.js +1 -0
- package/lib/types/custom/SetSchema.js.map +1 -1
- package/lib/types/symbols.d.ts +1 -0
- package/lib/types/symbols.js +2 -1
- package/lib/types/symbols.js.map +1 -1
- package/package.json +1 -1
- package/src/Metadata.ts +60 -29
- package/src/Reflection.ts +5 -15
- package/src/Schema.ts +33 -45
- package/src/annotations.ts +75 -67
- package/src/bench_encode.ts +29 -27
- package/src/decoder/DecodeOperation.ts +12 -11
- package/src/decoder/ReferenceTracker.ts +3 -2
- package/src/decoder/strategy/StateCallbacks.ts +4 -3
- package/src/encoder/ChangeTree.ts +154 -138
- package/src/encoder/EncodeOperation.ts +42 -62
- package/src/encoder/Encoder.ts +25 -8
- package/src/encoder/Root.ts +23 -6
- package/src/encoder/StateView.ts +4 -4
- package/src/encoding/assert.ts +4 -3
- package/src/index.ts +1 -4
- package/src/types/TypeContext.ts +10 -15
- package/src/types/custom/ArraySchema.ts +8 -0
- package/src/types/custom/CollectionSchema.ts +1 -0
- package/src/types/custom/MapSchema.ts +6 -0
- package/src/types/custom/SetSchema.ts +1 -0
- package/src/types/symbols.ts +2 -0
package/lib/annotations.js
CHANGED
|
@@ -16,6 +16,7 @@ const symbols_1 = require("./types/symbols");
|
|
|
16
16
|
const registry_1 = require("./types/registry");
|
|
17
17
|
const spec_1 = require("./encoding/spec");
|
|
18
18
|
const TypeContext_1 = require("./types/TypeContext");
|
|
19
|
+
const assert_1 = require("./encoding/assert");
|
|
19
20
|
exports.DEFAULT_VIEW_TAG = -1;
|
|
20
21
|
function entity(constructor, context) {
|
|
21
22
|
if (!constructor._definition) {
|
|
@@ -173,17 +174,18 @@ function view(tag = exports.DEFAULT_VIEW_TAG) {
|
|
|
173
174
|
const parentMetadata = parentClass[Symbol.metadata];
|
|
174
175
|
// TODO: use Metadata.initialize()
|
|
175
176
|
const metadata = (constructor[Symbol.metadata] ??= Object.assign({}, constructor[Symbol.metadata], parentMetadata ?? Object.create(null)));
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
}
|
|
177
|
+
// const fieldIndex = metadata[fieldName];
|
|
178
|
+
// if (!metadata[fieldIndex]) {
|
|
179
|
+
// //
|
|
180
|
+
// // detect index for this field, considering inheritance
|
|
181
|
+
// //
|
|
182
|
+
// metadata[fieldIndex] = {
|
|
183
|
+
// type: undefined,
|
|
184
|
+
// index: (metadata[-1] // current structure already has fields defined
|
|
185
|
+
// ?? (parentMetadata && parentMetadata[-1]) // parent structure has fields defined
|
|
186
|
+
// ?? -1) + 1 // no fields defined
|
|
187
|
+
// }
|
|
188
|
+
// }
|
|
187
189
|
Metadata_1.Metadata.setTag(metadata, fieldName, tag);
|
|
188
190
|
};
|
|
189
191
|
}
|
|
@@ -196,19 +198,19 @@ function unreliable(target, field) {
|
|
|
196
198
|
const parentMetadata = parentClass[Symbol.metadata];
|
|
197
199
|
// TODO: use Metadata.initialize()
|
|
198
200
|
const metadata = (constructor[Symbol.metadata] ??= Object.assign({}, constructor[Symbol.metadata], parentMetadata ?? Object.create(null)));
|
|
199
|
-
if (!metadata[field]) {
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
}
|
|
201
|
+
// if (!metadata[field]) {
|
|
202
|
+
// //
|
|
203
|
+
// // detect index for this field, considering inheritance
|
|
204
|
+
// //
|
|
205
|
+
// metadata[field] = {
|
|
206
|
+
// type: undefined,
|
|
207
|
+
// index: (metadata[-1] // current structure already has fields defined
|
|
208
|
+
// ?? (parentMetadata && parentMetadata[-1]) // parent structure has fields defined
|
|
209
|
+
// ?? -1) + 1 // no fields defined
|
|
210
|
+
// }
|
|
211
|
+
// }
|
|
210
212
|
// add owned flag to the field
|
|
211
|
-
metadata[field].unreliable = true;
|
|
213
|
+
metadata[metadata[field]].unreliable = true;
|
|
212
214
|
}
|
|
213
215
|
function type(type, options) {
|
|
214
216
|
return function (target, field) {
|
|
@@ -221,16 +223,16 @@ function type(type, options) {
|
|
|
221
223
|
const parentClass = Object.getPrototypeOf(constructor);
|
|
222
224
|
const parentMetadata = parentClass && parentClass[Symbol.metadata];
|
|
223
225
|
const metadata = Metadata_1.Metadata.initialize(constructor, parentMetadata);
|
|
224
|
-
let fieldIndex;
|
|
226
|
+
let fieldIndex = metadata[field];
|
|
225
227
|
/**
|
|
226
228
|
* skip if descriptor already exists for this field (`@deprecated()`)
|
|
227
229
|
*/
|
|
228
|
-
if (metadata[
|
|
229
|
-
if (metadata[
|
|
230
|
+
if (metadata[fieldIndex]) {
|
|
231
|
+
if (metadata[fieldIndex].deprecated) {
|
|
230
232
|
// do not create accessors for deprecated properties.
|
|
231
233
|
return;
|
|
232
234
|
}
|
|
233
|
-
else if (metadata[
|
|
235
|
+
else if (metadata[fieldIndex].type !== undefined) {
|
|
234
236
|
// trying to define same property multiple times across inheritance.
|
|
235
237
|
// https://github.com/colyseus/colyseus-unity3d/issues/131#issuecomment-814308572
|
|
236
238
|
try {
|
|
@@ -241,9 +243,6 @@ function type(type, options) {
|
|
|
241
243
|
throw new Error(`${e.message} ${definitionAtLine}`);
|
|
242
244
|
}
|
|
243
245
|
}
|
|
244
|
-
else {
|
|
245
|
-
fieldIndex = metadata[field].index;
|
|
246
|
-
}
|
|
247
246
|
}
|
|
248
247
|
else {
|
|
249
248
|
//
|
|
@@ -269,11 +268,11 @@ function type(type, options) {
|
|
|
269
268
|
const childType = (complexTypeKlass)
|
|
270
269
|
? Object.values(type)[0]
|
|
271
270
|
: type;
|
|
272
|
-
Metadata_1.Metadata.addField(metadata, fieldIndex, field, type, getPropertyDescriptor(`_${field}`, fieldIndex, childType, complexTypeKlass
|
|
271
|
+
Metadata_1.Metadata.addField(metadata, fieldIndex, field, type, getPropertyDescriptor(`_${field}`, fieldIndex, childType, complexTypeKlass));
|
|
273
272
|
}
|
|
274
273
|
};
|
|
275
274
|
}
|
|
276
|
-
function getPropertyDescriptor(fieldCached, fieldIndex, type, complexTypeKlass
|
|
275
|
+
function getPropertyDescriptor(fieldCached, fieldIndex, type, complexTypeKlass) {
|
|
277
276
|
return {
|
|
278
277
|
get: function () { return this[fieldCached]; },
|
|
279
278
|
set: function (value) {
|
|
@@ -295,22 +294,27 @@ function getPropertyDescriptor(fieldCached, fieldIndex, type, complexTypeKlass,
|
|
|
295
294
|
}
|
|
296
295
|
value[symbols_1.$childType] = type;
|
|
297
296
|
}
|
|
297
|
+
else if (typeof (type) !== "string") {
|
|
298
|
+
(0, assert_1.assertInstanceType)(value, type, this, fieldCached.substring(1));
|
|
299
|
+
}
|
|
300
|
+
else {
|
|
301
|
+
(0, assert_1.assertType)(value, type, this, fieldCached.substring(1));
|
|
302
|
+
}
|
|
303
|
+
const changeTree = this[symbols_1.$changes];
|
|
298
304
|
//
|
|
299
305
|
// Replacing existing "ref", remove it from root.
|
|
300
306
|
// TODO: if there are other references to this instance, we should not remove it from root.
|
|
301
307
|
//
|
|
302
308
|
if (previousValue !== undefined && previousValue[symbols_1.$changes]) {
|
|
303
|
-
|
|
309
|
+
changeTree.root?.remove(previousValue[symbols_1.$changes]);
|
|
304
310
|
}
|
|
305
311
|
// flag the change for encoding.
|
|
306
|
-
this.constructor[symbols_1.$track](
|
|
312
|
+
this.constructor[symbols_1.$track](changeTree, fieldIndex, spec_1.OPERATION.ADD);
|
|
307
313
|
//
|
|
308
314
|
// call setParent() recursively for this and its child
|
|
309
315
|
// structures.
|
|
310
316
|
//
|
|
311
|
-
|
|
312
|
-
value[symbols_1.$changes].setParent(this, this[symbols_1.$changes].root, metadata[field].index);
|
|
313
|
-
}
|
|
317
|
+
value[symbols_1.$changes]?.setParent(this, changeTree.root, fieldIndex);
|
|
314
318
|
}
|
|
315
319
|
else if (previousValue !== undefined) {
|
|
316
320
|
//
|
|
@@ -337,20 +341,22 @@ function deprecated(throws = true) {
|
|
|
337
341
|
const parentClass = Object.getPrototypeOf(constructor);
|
|
338
342
|
const parentMetadata = parentClass[Symbol.metadata];
|
|
339
343
|
const metadata = (constructor[Symbol.metadata] ??= Object.assign({}, constructor[Symbol.metadata], parentMetadata ?? Object.create(null)));
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
}
|
|
351
|
-
|
|
344
|
+
const fieldIndex = metadata[field];
|
|
345
|
+
// if (!metadata[field]) {
|
|
346
|
+
// //
|
|
347
|
+
// // detect index for this field, considering inheritance
|
|
348
|
+
// //
|
|
349
|
+
// metadata[field] = {
|
|
350
|
+
// type: undefined,
|
|
351
|
+
// index: (metadata[-1] // current structure already has fields defined
|
|
352
|
+
// ?? (parentMetadata && parentMetadata[-1]) // parent structure has fields defined
|
|
353
|
+
// ?? -1) + 1 // no fields defined
|
|
354
|
+
// }
|
|
355
|
+
// }
|
|
356
|
+
metadata[fieldIndex].deprecated = true;
|
|
352
357
|
if (throws) {
|
|
353
|
-
metadata[
|
|
358
|
+
metadata[symbols_1.$descriptors] ??= {};
|
|
359
|
+
metadata[symbols_1.$descriptors][field] = {
|
|
354
360
|
get: function () { throw new Error(`${field} is deprecated.`); },
|
|
355
361
|
set: function (value) { },
|
|
356
362
|
enumerable: false,
|
|
@@ -358,8 +364,8 @@ function deprecated(throws = true) {
|
|
|
358
364
|
};
|
|
359
365
|
}
|
|
360
366
|
// flag metadata[field] as non-enumerable
|
|
361
|
-
Object.defineProperty(metadata,
|
|
362
|
-
value: metadata[
|
|
367
|
+
Object.defineProperty(metadata, fieldIndex, {
|
|
368
|
+
value: metadata[fieldIndex],
|
|
363
369
|
enumerable: false,
|
|
364
370
|
configurable: true
|
|
365
371
|
});
|
package/lib/annotations.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"annotations.js","sourceRoot":"","sources":["../src/annotations.ts"],"names":[],"mappings":"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","sourcesContent":["import \"./symbol.shim\";\nimport { Schema } from './Schema';\nimport { ArraySchema } from './types/custom/ArraySchema';\nimport { MapSchema } from './types/custom/MapSchema';\nimport { Metadata } from \"./Metadata\";\nimport { $changes, $childType, $track } from \"./types/symbols\";\nimport { TypeDefinition, getType } from \"./types/registry\";\nimport { OPERATION } from \"./encoding/spec\";\nimport { TypeContext } from \"./types/TypeContext\";\n\n/**\n * Data types\n */\nexport type PrimitiveType =\n \"string\" |\n \"number\" |\n \"boolean\" |\n \"int8\" |\n \"uint8\" |\n \"int16\" |\n \"uint16\" |\n \"int32\" |\n \"uint32\" |\n \"int64\" |\n \"uint64\" |\n \"float32\" |\n \"float64\" |\n typeof Schema |\n object;\n\nexport type DefinitionType = PrimitiveType\n | PrimitiveType[]\n | { array: PrimitiveType }\n | { map: PrimitiveType }\n | { collection: PrimitiveType }\n | { set: PrimitiveType };\n\nexport type Definition = { [field: string]: DefinitionType };\n\nexport interface TypeOptions {\n manual?: boolean,\n}\n\nexport const DEFAULT_VIEW_TAG = -1;\n\nexport function entity(constructor, context: ClassDecoratorContext) {\n if (!constructor._definition) {\n // for inheritance support\n TypeContext.register(constructor);\n }\n\n return constructor;\n}\n\n/**\n * [See documentation](https://docs.colyseus.io/state/schema/)\n *\n * Annotate a Schema property to be serializeable.\n * \\@type()'d fields are automatically flagged as \"dirty\" for the next patch.\n *\n * @example Standard usage, with automatic change tracking.\n * ```\n * \\@type(\"string\") propertyName: string;\n * ```\n *\n * @example You can provide the \"manual\" option if you'd like to manually control your patches via .setDirty().\n * ```\n * \\@type(\"string\", { manual: true })\n * ```\n */\n// export function type(type: DefinitionType, options?: TypeOptions) {\n// return function ({ get, set }, context: ClassAccessorDecoratorContext): ClassAccessorDecoratorResult<Schema, any> {\n// if (context.kind !== \"accessor\") {\n// throw new Error(\"@type() is only supported for class accessor properties\");\n// }\n\n// const field = context.name.toString();\n\n// //\n// // detect index for this field, considering inheritance\n// //\n// const parent = Object.getPrototypeOf(context.metadata);\n// let fieldIndex: number = context.metadata[-1] // current structure already has fields defined\n// ?? (parent && parent[-1]) // parent structure has fields defined\n// ?? -1; // no fields defined\n// fieldIndex++;\n\n// if (\n// !parent && // the parent already initializes the `$changes` property\n// !Metadata.hasFields(context.metadata)\n// ) {\n// context.addInitializer(function (this: Ref) {\n// Object.defineProperty(this, $changes, {\n// value: new ChangeTree(this),\n// enumerable: false,\n// writable: true\n// });\n// });\n// }\n\n// Metadata.addField(context.metadata, fieldIndex, field, type);\n\n// const isArray = ArraySchema.is(type);\n// const isMap = !isArray && MapSchema.is(type);\n\n// // if (options && options.manual) {\n// // // do not declare getter/setter descriptor\n// // definition.descriptors[field] = {\n// // enumerable: true,\n// // configurable: true,\n// // writable: true,\n// // };\n// // return;\n// // }\n\n// return {\n// init(value) {\n// // TODO: may need to convert ArraySchema/MapSchema here\n\n// // do not flag change if value is undefined.\n// if (value !== undefined) {\n// this[$changes].change(fieldIndex);\n\n// // automaticallty transform Array into ArraySchema\n// if (isArray) {\n// if (!(value instanceof ArraySchema)) {\n// value = new ArraySchema(...value);\n// }\n// value[$childType] = Object.values(type)[0];\n// }\n\n// // automaticallty transform Map into MapSchema\n// if (isMap) {\n// if (!(value instanceof MapSchema)) {\n// value = new MapSchema(value);\n// }\n// value[$childType] = Object.values(type)[0];\n// }\n\n// // try to turn provided structure into a Proxy\n// if (value['$proxy'] === undefined) {\n// if (isMap) {\n// value = getMapProxy(value);\n// }\n// }\n\n// }\n\n// return value;\n// },\n\n// get() {\n// return get.call(this);\n// },\n\n// set(value: any) {\n// /**\n// * Create Proxy for array or map items\n// */\n\n// // skip if value is the same as cached.\n// if (value === get.call(this)) {\n// return;\n// }\n\n// if (\n// value !== undefined &&\n// value !== null\n// ) {\n// // automaticallty transform Array into ArraySchema\n// if (isArray) {\n// if (!(value instanceof ArraySchema)) {\n// value = new ArraySchema(...value);\n// }\n// value[$childType] = Object.values(type)[0];\n// }\n\n// // automaticallty transform Map into MapSchema\n// if (isMap) {\n// if (!(value instanceof MapSchema)) {\n// value = new MapSchema(value);\n// }\n// value[$childType] = Object.values(type)[0];\n// }\n\n// // try to turn provided structure into a Proxy\n// if (value['$proxy'] === undefined) {\n// if (isMap) {\n// value = getMapProxy(value);\n// }\n// }\n\n// // flag the change for encoding.\n// this[$changes].change(fieldIndex);\n\n// //\n// // call setParent() recursively for this and its child\n// // structures.\n// //\n// if (value[$changes]) {\n// value[$changes].setParent(\n// this,\n// this[$changes].root,\n// Metadata.getIndex(context.metadata, field),\n// );\n// }\n\n// } else if (get.call(this)) {\n// //\n// // Setting a field to `null` or `undefined` will delete it.\n// //\n// this[$changes].delete(field);\n// }\n\n// set.call(this, value);\n// },\n// };\n// }\n// }\n\nexport function view<T> (tag: number = DEFAULT_VIEW_TAG) {\n return function(target: T, fieldName: string) {\n const constructor = target.constructor as typeof Schema;\n\n const parentClass = Object.getPrototypeOf(constructor);\n const parentMetadata = parentClass[Symbol.metadata];\n\n // TODO: use Metadata.initialize()\n const metadata: Metadata = (constructor[Symbol.metadata] ??= Object.assign({}, constructor[Symbol.metadata], parentMetadata ?? Object.create(null)));\n\n if (!metadata[fieldName]) {\n //\n // detect index for this field, considering inheritance\n //\n metadata[fieldName] = {\n type: undefined,\n index: (metadata[-1] // current structure already has fields defined\n ?? (parentMetadata && parentMetadata[-1]) // parent structure has fields defined\n ?? -1) + 1 // no fields defined\n }\n }\n\n Metadata.setTag(metadata, fieldName, tag);\n }\n}\n\nexport function unreliable<T> (target: T, field: string) {\n //\n // FIXME: the following block of code is repeated across `@type()`, `@deprecated()` and `@unreliable()` decorators.\n //\n const constructor = target.constructor as typeof Schema;\n\n const parentClass = Object.getPrototypeOf(constructor);\n const parentMetadata = parentClass[Symbol.metadata];\n\n // TODO: use Metadata.initialize()\n const metadata: Metadata = (constructor[Symbol.metadata] ??= Object.assign({}, constructor[Symbol.metadata], parentMetadata ?? Object.create(null)));\n\n if (!metadata[field]) {\n //\n // detect index for this field, considering inheritance\n //\n metadata[field] = {\n type: undefined,\n index: (metadata[-1] // current structure already has fields defined\n ?? (parentMetadata && parentMetadata[-1]) // parent structure has fields defined\n ?? -1) + 1 // no fields defined\n }\n }\n\n // add owned flag to the field\n metadata[field].unreliable = true;\n}\n\nexport function type (\n type: DefinitionType,\n options?: TypeOptions\n): PropertyDecorator {\n return function (target: typeof Schema, field: string) {\n const constructor = target.constructor as typeof Schema;\n\n if (!type) {\n throw new Error(`${constructor.name}: @type() reference provided for \"${field}\" is undefined. Make sure you don't have any circular dependencies.`);\n }\n\n // for inheritance support\n TypeContext.register(constructor);\n\n const parentClass = Object.getPrototypeOf(constructor);\n const parentMetadata = parentClass && parentClass[Symbol.metadata];\n const metadata = Metadata.initialize(constructor, parentMetadata);\n\n let fieldIndex: number;\n\n /**\n * skip if descriptor already exists for this field (`@deprecated()`)\n */\n if (metadata[field]) {\n if (metadata[field].deprecated) {\n // do not create accessors for deprecated properties.\n return;\n\n } else if (metadata[field].descriptor !== undefined) {\n // trying to define same property multiple times across inheritance.\n // https://github.com/colyseus/colyseus-unity3d/issues/131#issuecomment-814308572\n try {\n throw new Error(`@colyseus/schema: Duplicate '${field}' definition on '${constructor.name}'.\\nCheck @type() annotation`);\n\n } catch (e) {\n const definitionAtLine = e.stack.split(\"\\n\")[4].trim();\n throw new Error(`${e.message} ${definitionAtLine}`);\n }\n\n } else {\n fieldIndex = metadata[field].index;\n }\n\n } else {\n //\n // detect index for this field, considering inheritance\n //\n fieldIndex = metadata[-1] // current structure already has fields defined\n ?? (parentMetadata && parentMetadata[-1]) // parent structure has fields defined\n ?? -1; // no fields defined\n fieldIndex++;\n }\n\n if (options && options.manual) {\n Metadata.addField(metadata, fieldIndex, field, type, {\n // do not declare getter/setter descriptor\n enumerable: true,\n configurable: true,\n writable: true,\n });\n\n } else {\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 : type;\n\n Metadata.addField(\n metadata,\n fieldIndex,\n field,\n type,\n getPropertyDescriptor(`_${field}`, fieldIndex, childType, complexTypeKlass, metadata, field)\n );\n }\n }\n}\n\nexport function getPropertyDescriptor(\n fieldCached: string,\n fieldIndex: number,\n type: DefinitionType,\n complexTypeKlass: TypeDefinition,\n metadata: Metadata,\n field: string,\n) {\n return {\n get: function () { return this[fieldCached]; },\n set: function (this: Schema, value: any) {\n const previousValue = this[fieldCached] || undefined;\n\n // skip if value is the same as cached.\n if (value === previousValue) { return; }\n\n if (\n value !== undefined &&\n value !== null\n ) {\n if (complexTypeKlass) {\n // automaticallty transform Array into ArraySchema\n if (complexTypeKlass.constructor === ArraySchema && !(value instanceof ArraySchema)) {\n value = new ArraySchema(...value);\n }\n\n // automaticallty transform Map into MapSchema\n if (complexTypeKlass.constructor === MapSchema && !(value instanceof MapSchema)) {\n value = new MapSchema(value);\n }\n\n value[$childType] = type;\n }\n\n //\n // Replacing existing \"ref\", remove it from root.\n // TODO: if there are other references to this instance, we should not remove it from root.\n //\n if (previousValue !== undefined && previousValue[$changes]) {\n this[$changes].root?.remove(previousValue[$changes]);\n }\n\n // flag the change for encoding.\n this.constructor[$track](this[$changes], fieldIndex, OPERATION.ADD);\n\n //\n // call setParent() recursively for this and its child\n // structures.\n //\n if (value[$changes]) {\n value[$changes].setParent(\n this,\n this[$changes].root,\n metadata[field].index,\n );\n }\n\n } else if (previousValue !== undefined) {\n //\n // Setting a field to `null` or `undefined` will delete it.\n //\n this[$changes].delete(fieldIndex);\n }\n\n this[fieldCached] = value;\n },\n\n enumerable: true,\n configurable: true\n };\n}\n\n/**\n * `@deprecated()` flag a field as deprecated.\n * The previous `@type()` annotation should remain along with this one.\n */\n\nexport function deprecated(throws: boolean = true): PropertyDecorator {\n return function (klass: typeof Schema, field: string) {\n //\n // FIXME: the following block of code is repeated across `@type()`, `@deprecated()` and `@unreliable()` decorators.\n //\n const constructor = klass.constructor as typeof Schema;\n\n const parentClass = Object.getPrototypeOf(constructor);\n const parentMetadata = parentClass[Symbol.metadata];\n const metadata: Metadata = (constructor[Symbol.metadata] ??= Object.assign({}, constructor[Symbol.metadata], parentMetadata ?? Object.create(null)));\n\n if (!metadata[field]) {\n //\n // detect index for this field, considering inheritance\n //\n metadata[field] = {\n type: undefined,\n index: (metadata[-1] // current structure already has fields defined\n ?? (parentMetadata && parentMetadata[-1]) // parent structure has fields defined\n ?? -1) + 1 // no fields defined\n }\n }\n\n metadata[field].deprecated = true;\n\n if (throws) {\n metadata[field].descriptor = {\n get: function () { throw new Error(`${field} is deprecated.`); },\n set: function (this: Schema, value: any) { /* throw new Error(`${field} is deprecated.`); */ },\n enumerable: false,\n configurable: true\n };\n }\n\n // flag metadata[field] as non-enumerable\n Object.defineProperty(metadata, field, {\n value: metadata[field],\n enumerable: false,\n configurable: true\n });\n }\n}\n\nexport function defineTypes(\n target: typeof Schema,\n fields: { [property: string]: DefinitionType },\n options?: TypeOptions\n) {\n for (let field in fields) {\n type(fields[field], options)(target.prototype, field);\n }\n return target;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"annotations.js","sourceRoot":"","sources":["../src/annotations.ts"],"names":[],"mappings":"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","sourcesContent":["import \"./symbol.shim\";\nimport { Schema } from './Schema';\nimport { ArraySchema } from './types/custom/ArraySchema';\nimport { MapSchema } from './types/custom/MapSchema';\nimport { Metadata } from \"./Metadata\";\nimport { $changes, $childType, $descriptors, $track } from \"./types/symbols\";\nimport { TypeDefinition, getType } from \"./types/registry\";\nimport { OPERATION } from \"./encoding/spec\";\nimport { TypeContext } from \"./types/TypeContext\";\nimport { assertInstanceType, assertType } from \"./encoding/assert\";\nimport type { Ref } from \"./encoder/ChangeTree\";\n\n/**\n * Data types\n */\nexport type PrimitiveType =\n \"string\" |\n \"number\" |\n \"boolean\" |\n \"int8\" |\n \"uint8\" |\n \"int16\" |\n \"uint16\" |\n \"int32\" |\n \"uint32\" |\n \"int64\" |\n \"uint64\" |\n \"float32\" |\n \"float64\" |\n typeof Schema |\n object;\n\nexport type DefinitionType = PrimitiveType\n | PrimitiveType[]\n | { array: PrimitiveType }\n | { map: PrimitiveType }\n | { collection: PrimitiveType }\n | { set: PrimitiveType };\n\nexport type Definition = { [field: string]: DefinitionType };\n\nexport interface TypeOptions {\n manual?: boolean,\n}\n\nexport const DEFAULT_VIEW_TAG = -1;\n\nexport function entity(constructor, context: ClassDecoratorContext) {\n if (!constructor._definition) {\n // for inheritance support\n TypeContext.register(constructor);\n }\n\n return constructor;\n}\n\n/**\n * [See documentation](https://docs.colyseus.io/state/schema/)\n *\n * Annotate a Schema property to be serializeable.\n * \\@type()'d fields are automatically flagged as \"dirty\" for the next patch.\n *\n * @example Standard usage, with automatic change tracking.\n * ```\n * \\@type(\"string\") propertyName: string;\n * ```\n *\n * @example You can provide the \"manual\" option if you'd like to manually control your patches via .setDirty().\n * ```\n * \\@type(\"string\", { manual: true })\n * ```\n */\n// export function type(type: DefinitionType, options?: TypeOptions) {\n// return function ({ get, set }, context: ClassAccessorDecoratorContext): ClassAccessorDecoratorResult<Schema, any> {\n// if (context.kind !== \"accessor\") {\n// throw new Error(\"@type() is only supported for class accessor properties\");\n// }\n\n// const field = context.name.toString();\n\n// //\n// // detect index for this field, considering inheritance\n// //\n// const parent = Object.getPrototypeOf(context.metadata);\n// let fieldIndex: number = context.metadata[-1] // current structure already has fields defined\n// ?? (parent && parent[-1]) // parent structure has fields defined\n// ?? -1; // no fields defined\n// fieldIndex++;\n\n// if (\n// !parent && // the parent already initializes the `$changes` property\n// !Metadata.hasFields(context.metadata)\n// ) {\n// context.addInitializer(function (this: Ref) {\n// Object.defineProperty(this, $changes, {\n// value: new ChangeTree(this),\n// enumerable: false,\n// writable: true\n// });\n// });\n// }\n\n// Metadata.addField(context.metadata, fieldIndex, field, type);\n\n// const isArray = ArraySchema.is(type);\n// const isMap = !isArray && MapSchema.is(type);\n\n// // if (options && options.manual) {\n// // // do not declare getter/setter descriptor\n// // definition.descriptors[field] = {\n// // enumerable: true,\n// // configurable: true,\n// // writable: true,\n// // };\n// // return;\n// // }\n\n// return {\n// init(value) {\n// // TODO: may need to convert ArraySchema/MapSchema here\n\n// // do not flag change if value is undefined.\n// if (value !== undefined) {\n// this[$changes].change(fieldIndex);\n\n// // automaticallty transform Array into ArraySchema\n// if (isArray) {\n// if (!(value instanceof ArraySchema)) {\n// value = new ArraySchema(...value);\n// }\n// value[$childType] = Object.values(type)[0];\n// }\n\n// // automaticallty transform Map into MapSchema\n// if (isMap) {\n// if (!(value instanceof MapSchema)) {\n// value = new MapSchema(value);\n// }\n// value[$childType] = Object.values(type)[0];\n// }\n\n// // try to turn provided structure into a Proxy\n// if (value['$proxy'] === undefined) {\n// if (isMap) {\n// value = getMapProxy(value);\n// }\n// }\n\n// }\n\n// return value;\n// },\n\n// get() {\n// return get.call(this);\n// },\n\n// set(value: any) {\n// /**\n// * Create Proxy for array or map items\n// */\n\n// // skip if value is the same as cached.\n// if (value === get.call(this)) {\n// return;\n// }\n\n// if (\n// value !== undefined &&\n// value !== null\n// ) {\n// // automaticallty transform Array into ArraySchema\n// if (isArray) {\n// if (!(value instanceof ArraySchema)) {\n// value = new ArraySchema(...value);\n// }\n// value[$childType] = Object.values(type)[0];\n// }\n\n// // automaticallty transform Map into MapSchema\n// if (isMap) {\n// if (!(value instanceof MapSchema)) {\n// value = new MapSchema(value);\n// }\n// value[$childType] = Object.values(type)[0];\n// }\n\n// // try to turn provided structure into a Proxy\n// if (value['$proxy'] === undefined) {\n// if (isMap) {\n// value = getMapProxy(value);\n// }\n// }\n\n// // flag the change for encoding.\n// this[$changes].change(fieldIndex);\n\n// //\n// // call setParent() recursively for this and its child\n// // structures.\n// //\n// if (value[$changes]) {\n// value[$changes].setParent(\n// this,\n// this[$changes].root,\n// Metadata.getIndex(context.metadata, field),\n// );\n// }\n\n// } else if (get.call(this)) {\n// //\n// // Setting a field to `null` or `undefined` will delete it.\n// //\n// this[$changes].delete(field);\n// }\n\n// set.call(this, value);\n// },\n// };\n// }\n// }\n\nexport function view<T> (tag: number = DEFAULT_VIEW_TAG) {\n return function(target: T, fieldName: string) {\n const constructor = target.constructor as typeof Schema;\n\n const parentClass = Object.getPrototypeOf(constructor);\n const parentMetadata = parentClass[Symbol.metadata];\n\n // TODO: use Metadata.initialize()\n const metadata: Metadata = (constructor[Symbol.metadata] ??= Object.assign({}, constructor[Symbol.metadata], parentMetadata ?? Object.create(null)));\n // const fieldIndex = metadata[fieldName];\n\n // if (!metadata[fieldIndex]) {\n // //\n // // detect index for this field, considering inheritance\n // //\n // metadata[fieldIndex] = {\n // type: undefined,\n // index: (metadata[-1] // current structure already has fields defined\n // ?? (parentMetadata && parentMetadata[-1]) // parent structure has fields defined\n // ?? -1) + 1 // no fields defined\n // }\n // }\n\n Metadata.setTag(metadata, fieldName, tag);\n }\n}\n\nexport function unreliable<T> (target: T, field: string) {\n //\n // FIXME: the following block of code is repeated across `@type()`, `@deprecated()` and `@unreliable()` decorators.\n //\n const constructor = target.constructor as typeof Schema;\n\n const parentClass = Object.getPrototypeOf(constructor);\n const parentMetadata = parentClass[Symbol.metadata];\n\n // TODO: use Metadata.initialize()\n const metadata: Metadata = (constructor[Symbol.metadata] ??= Object.assign({}, constructor[Symbol.metadata], parentMetadata ?? Object.create(null)));\n\n // if (!metadata[field]) {\n // //\n // // detect index for this field, considering inheritance\n // //\n // metadata[field] = {\n // type: undefined,\n // index: (metadata[-1] // current structure already has fields defined\n // ?? (parentMetadata && parentMetadata[-1]) // parent structure has fields defined\n // ?? -1) + 1 // no fields defined\n // }\n // }\n\n // add owned flag to the field\n metadata[metadata[field]].unreliable = true;\n}\n\nexport function type (\n type: DefinitionType,\n options?: TypeOptions\n): PropertyDecorator {\n return function (target: typeof Schema, field: string) {\n const constructor = target.constructor as typeof Schema;\n\n if (!type) {\n throw new Error(`${constructor.name}: @type() reference provided for \"${field}\" is undefined. Make sure you don't have any circular dependencies.`);\n }\n\n // for inheritance support\n TypeContext.register(constructor);\n\n const parentClass = Object.getPrototypeOf(constructor);\n const parentMetadata = parentClass && parentClass[Symbol.metadata];\n const metadata = Metadata.initialize(constructor, parentMetadata);\n\n let fieldIndex: number = metadata[field];\n\n /**\n * skip if descriptor already exists for this field (`@deprecated()`)\n */\n if (metadata[fieldIndex]) {\n if (metadata[fieldIndex].deprecated) {\n // do not create accessors for deprecated properties.\n return;\n\n } else if (metadata[fieldIndex].type !== undefined) {\n // trying to define same property multiple times across inheritance.\n // https://github.com/colyseus/colyseus-unity3d/issues/131#issuecomment-814308572\n try {\n throw new Error(`@colyseus/schema: Duplicate '${field}' definition on '${constructor.name}'.\\nCheck @type() annotation`);\n\n } catch (e) {\n const definitionAtLine = e.stack.split(\"\\n\")[4].trim();\n throw new Error(`${e.message} ${definitionAtLine}`);\n }\n }\n\n } else {\n //\n // detect index for this field, considering inheritance\n //\n fieldIndex = metadata[-1] // current structure already has fields defined\n ?? (parentMetadata && parentMetadata[-1]) // parent structure has fields defined\n ?? -1; // no fields defined\n fieldIndex++;\n }\n\n if (options && options.manual) {\n Metadata.addField(\n metadata,\n fieldIndex,\n field,\n type,\n {\n // do not declare getter/setter descriptor\n enumerable: true,\n configurable: true,\n writable: true,\n }\n );\n\n } else {\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 : type;\n\n Metadata.addField(\n metadata,\n fieldIndex,\n field,\n type,\n getPropertyDescriptor(`_${field}`, fieldIndex, childType, complexTypeKlass)\n );\n }\n }\n}\n\nexport function getPropertyDescriptor(\n fieldCached: string,\n fieldIndex: number,\n type: DefinitionType,\n complexTypeKlass: TypeDefinition,\n) {\n return {\n get: function () { return this[fieldCached]; },\n set: function (this: Schema, value: any) {\n const previousValue = this[fieldCached] || undefined;\n\n // skip if value is the same as cached.\n if (value === previousValue) { return; }\n\n if (\n value !== undefined &&\n value !== null\n ) {\n if (complexTypeKlass) {\n // automaticallty transform Array into ArraySchema\n if (complexTypeKlass.constructor === ArraySchema && !(value instanceof ArraySchema)) {\n value = new ArraySchema(...value);\n }\n\n // automaticallty transform Map into MapSchema\n if (complexTypeKlass.constructor === MapSchema && !(value instanceof MapSchema)) {\n value = new MapSchema(value);\n }\n\n value[$childType] = type;\n\n } else if (typeof (type) !== \"string\") {\n assertInstanceType(value, type as typeof Schema, this, fieldCached.substring(1));\n\n } else {\n assertType(value, type, this, fieldCached.substring(1));\n }\n\n const changeTree = this[$changes];\n\n //\n // Replacing existing \"ref\", remove it from root.\n // TODO: if there are other references to this instance, we should not remove it from root.\n //\n if (previousValue !== undefined && previousValue[$changes]) {\n changeTree.root?.remove(previousValue[$changes]);\n }\n\n // flag the change for encoding.\n this.constructor[$track](changeTree, fieldIndex, OPERATION.ADD);\n\n //\n // call setParent() recursively for this and its child\n // structures.\n //\n (value as Ref)[$changes]?.setParent(this, changeTree.root, fieldIndex);\n\n } else if (previousValue !== undefined) {\n //\n // Setting a field to `null` or `undefined` will delete it.\n //\n this[$changes].delete(fieldIndex);\n }\n\n this[fieldCached] = value;\n },\n\n enumerable: true,\n configurable: true\n };\n}\n\n/**\n * `@deprecated()` flag a field as deprecated.\n * The previous `@type()` annotation should remain along with this one.\n */\n\nexport function deprecated(throws: boolean = true): PropertyDecorator {\n return function (klass: typeof Schema, field: string) {\n //\n // FIXME: the following block of code is repeated across `@type()`, `@deprecated()` and `@unreliable()` decorators.\n //\n const constructor = klass.constructor as typeof Schema;\n\n const parentClass = Object.getPrototypeOf(constructor);\n const parentMetadata = parentClass[Symbol.metadata];\n const metadata: Metadata = (constructor[Symbol.metadata] ??= Object.assign({}, constructor[Symbol.metadata], parentMetadata ?? Object.create(null)));\n const fieldIndex = metadata[field];\n\n // if (!metadata[field]) {\n // //\n // // detect index for this field, considering inheritance\n // //\n // metadata[field] = {\n // type: undefined,\n // index: (metadata[-1] // current structure already has fields defined\n // ?? (parentMetadata && parentMetadata[-1]) // parent structure has fields defined\n // ?? -1) + 1 // no fields defined\n // }\n // }\n\n metadata[fieldIndex].deprecated = true;\n\n if (throws) {\n metadata[$descriptors] ??= {};\n metadata[$descriptors][field] = {\n get: function () { throw new Error(`${field} is deprecated.`); },\n set: function (this: Schema, value: any) { /* throw new Error(`${field} is deprecated.`); */ },\n enumerable: false,\n configurable: true\n };\n }\n\n // flag metadata[field] as non-enumerable\n Object.defineProperty(metadata, fieldIndex, {\n value: metadata[fieldIndex],\n enumerable: false,\n configurable: true\n });\n }\n}\n\nexport function defineTypes(\n target: typeof Schema,\n fields: { [property: string]: DefinitionType },\n options?: TypeOptions\n) {\n for (let field in fields) {\n type(fields[field], options)(target.prototype, field);\n }\n return target;\n}\n"]}
|
package/lib/bench_encode.js
CHANGED
|
@@ -64,31 +64,34 @@ __decorate([
|
|
|
64
64
|
(0, _1.type)("string")
|
|
65
65
|
], State.prototype, "currentTurn", void 0);
|
|
66
66
|
const state = new State();
|
|
67
|
-
for (let i = 0; i < 50; i++) {
|
|
68
|
-
const player = new Player();
|
|
69
|
-
state.players.set(`p-${(0, nanoid_1.nanoid)()}`, player);
|
|
70
|
-
player.position.x = (i + 1) * 100;
|
|
71
|
-
player.position.y = (i + 1) * 100;
|
|
72
|
-
for (let j = 0; j < 10; j++) {
|
|
73
|
-
const item = new Item();
|
|
74
|
-
item.price = (i + 1) * 50;
|
|
75
|
-
for (let k = 0; k < 5; k++) {
|
|
76
|
-
const attr = new Attribute();
|
|
77
|
-
attr.name = `Attribute ${k}`;
|
|
78
|
-
attr.value = k;
|
|
79
|
-
item.attributes.push(attr);
|
|
80
|
-
}
|
|
81
|
-
player.items.set(`item-${j}`, item);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
67
|
_1.Encoder.BUFFER_SIZE = 4096 * 4096;
|
|
85
68
|
const encoder = new _1.Encoder(state);
|
|
86
|
-
// measure time to .encodeAll()
|
|
87
69
|
let now = Date.now();
|
|
88
|
-
for (let i = 0; i <
|
|
89
|
-
|
|
90
|
-
}
|
|
91
|
-
|
|
70
|
+
// for (let i = 0; i < 10000; i++) {
|
|
71
|
+
// const player = new Player();
|
|
72
|
+
// state.players.set(`p-${nanoid()}`, player);
|
|
73
|
+
//
|
|
74
|
+
// player.position.x = (i + 1) * 100;
|
|
75
|
+
// player.position.y = (i + 1) * 100;
|
|
76
|
+
// for (let j = 0; j < 10; j++) {
|
|
77
|
+
// const item = new Item();
|
|
78
|
+
// player.items.set(`item-${j}`, item);
|
|
79
|
+
// item.price = (i + 1) * 50;
|
|
80
|
+
// for (let k = 0; k < 5; k++) {
|
|
81
|
+
// const attr = new Attribute();
|
|
82
|
+
// attr.name = `Attribute ${k}`;
|
|
83
|
+
// attr.value = k;
|
|
84
|
+
// item.attributes.push(attr);
|
|
85
|
+
// }
|
|
86
|
+
// }
|
|
87
|
+
// }
|
|
88
|
+
// console.log("time to make changes:", Date.now() - now);
|
|
89
|
+
// measure time to .encodeAll()
|
|
90
|
+
now = Date.now();
|
|
91
|
+
// for (let i = 0; i < 1000; i++) {
|
|
92
|
+
// encoder.encodeAll();
|
|
93
|
+
// }
|
|
94
|
+
// console.log(Date.now() - now);
|
|
92
95
|
const allEncodes = Date.now();
|
|
93
96
|
for (let i = 0; i < 100; i++) {
|
|
94
97
|
now = Date.now();
|
package/lib/bench_encode.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bench_encode.js","sourceRoot":"","sources":["../src/bench_encode.ts"],"names":[],"mappings":";;;;;;;;AAAA,mCAAgC;AAChC,wBAAkE;AAClE,uCAAuC;AAEvC,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;AAEpC,MAAM,SAAU,SAAQ,SAAM;CAG7B;AAFmB;IAAf,IAAA,OAAI,EAAC,QAAQ,CAAC;uCAAc;AACb;IAAf,IAAA,OAAI,EAAC,QAAQ,CAAC;wCAAe;AAGlC,MAAM,IAAK,SAAQ,SAAM;IAAzB;;QAEyB,eAAU,GAAG,IAAI,cAAW,EAAa,CAAC;IACnE,CAAC;CAAA;AAFmB;IAAf,IAAA,OAAI,EAAC,QAAQ,CAAC;mCAAe;AACT;IAApB,IAAA,OAAI,EAAC,CAAE,SAAS,CAAE,CAAC;wCAA2C;AAGnE,MAAM,QAAS,SAAQ,SAAM;CAG5B;AAFmB;IAAf,IAAA,OAAI,EAAC,QAAQ,CAAC;mCAAW;AACV;IAAf,IAAA,OAAI,EAAC,QAAQ,CAAC;mCAAW;AAG9B,MAAM,MAAO,SAAQ,SAAM;IAA3B;;QACoB,aAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;QACrB,UAAK,GAAG,IAAI,YAAS,EAAQ,CAAC;IACvD,CAAC;CAAA;AAFmB;IAAf,IAAA,OAAI,EAAC,QAAQ,CAAC;wCAA2B;AACrB;IAApB,IAAA,OAAI,EAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;qCAA+B;AAGvD,MAAM,KAAM,SAAQ,SAAM;IAA1B;;QAC2B,YAAO,GAAG,IAAI,YAAS,EAAU,CAAC;IAE7D,CAAC;CAAA;AAF0B;IAAtB,IAAA,OAAI,EAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;sCAAmC;AACzC;IAAf,IAAA,OAAI,EAAC,QAAQ,CAAC;0CAAa;AAGhC,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;AAE1B,
|
|
1
|
+
{"version":3,"file":"bench_encode.js","sourceRoot":"","sources":["../src/bench_encode.ts"],"names":[],"mappings":"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","sourcesContent":["import { nanoid } from \"nanoid\";\nimport { Schema, type, MapSchema, ArraySchema, Encoder } from \".\";\nimport * as benchmark from \"benchmark\";\n\nconst suite = new benchmark.Suite();\n\nclass Attribute extends Schema {\n @type(\"string\") name: string;\n @type(\"number\") value: number;\n}\n\nclass Item extends Schema {\n @type(\"number\") price: number;\n @type([ Attribute ]) attributes = new ArraySchema<Attribute>();\n}\n\nclass Position extends Schema {\n @type(\"number\") x: number;\n @type(\"number\") y: number;\n}\n\nclass Player extends Schema {\n @type(Position) position = new Position();\n @type({ map: Item }) items = new MapSchema<Item>();\n}\n\nclass State extends Schema {\n @type({ map: Player }) players = new MapSchema<Player>();\n @type(\"string\") currentTurn;\n}\n\nconst state = new State();\n\nEncoder.BUFFER_SIZE = 4096 * 4096;\nconst encoder = new Encoder(state);\n\n\nlet now = Date.now();\n\n// for (let i = 0; i < 10000; i++) {\n// const player = new Player();\n// state.players.set(`p-${nanoid()}`, player);\n//\n// player.position.x = (i + 1) * 100;\n// player.position.y = (i + 1) * 100;\n// for (let j = 0; j < 10; j++) {\n// const item = new Item();\n// player.items.set(`item-${j}`, item);\n// item.price = (i + 1) * 50;\n// for (let k = 0; k < 5; k++) {\n// const attr = new Attribute();\n// attr.name = `Attribute ${k}`;\n// attr.value = k;\n// item.attributes.push(attr);\n// }\n// }\n// }\n// console.log(\"time to make changes:\", Date.now() - now);\n\n\n// measure time to .encodeAll()\n\nnow = Date.now();\n// for (let i = 0; i < 1000; i++) {\n// encoder.encodeAll();\n// }\n// console.log(Date.now() - now);\n\nconst allEncodes = Date.now();\nfor (let i = 0; i < 100; i++) {\n now = Date.now();\n for (let j = 0; j < 50; j++) {\n const player = new Player();\n state.players.set(`p-${nanoid()}`, player);\n\n player.position.x = (j + 1) * 100;\n player.position.y = (j + 1) * 100;\n for (let k = 0; k < 10; k++) {\n const item = new Item();\n item.price = (j + 1) * 50;\n for (let l = 0; l < 5; l++) {\n const attr = new Attribute();\n attr.name = `Attribute ${l}`;\n attr.value = l;\n item.attributes.push(attr);\n }\n player.items.set(`item-${k}`, item);\n }\n }\n console.log(\"time to make changes:\", Date.now() - now);\n\n now = Date.now();\n encoder.encode();\n encoder.discardChanges();\n console.log(\"time to encode:\", Date.now() - now);\n}\nconsole.log(\"time for all encodes:\", Date.now() - allEncodes);\n\nconsole.log(Array.from(encoder.encodeAll()).length, \"bytes\");\n"]}
|
|
@@ -61,7 +61,9 @@ function decodeValue(decoder, operation, ref, index, type, bytes, it, allChanges
|
|
|
61
61
|
if (!value) {
|
|
62
62
|
value = decoder.createInstanceOfType(childType);
|
|
63
63
|
}
|
|
64
|
-
$root.addRef(refId, value, (value !== previousValue
|
|
64
|
+
$root.addRef(refId, value, (value !== previousValue || // increment ref count if value has changed
|
|
65
|
+
(operation === spec_1.OPERATION.DELETE_AND_ADD && value === previousValue) // increment ref count if the same instance is being added again
|
|
66
|
+
));
|
|
65
67
|
}
|
|
66
68
|
}
|
|
67
69
|
else if (typeof (type) === "string") {
|
|
@@ -112,7 +114,7 @@ function decodeValue(decoder, operation, ref, index, type, bytes, it, allChanges
|
|
|
112
114
|
}
|
|
113
115
|
const decodeSchemaOperation = function (decoder, bytes, it, ref, allChanges) {
|
|
114
116
|
const first_byte = bytes[it.offset++];
|
|
115
|
-
const metadata = ref
|
|
117
|
+
const metadata = ref.constructor[Symbol.metadata];
|
|
116
118
|
// "compressed" index + operation
|
|
117
119
|
const operation = (first_byte >> 6) << 6;
|
|
118
120
|
const index = first_byte % (operation || 255);
|
|
@@ -122,9 +124,9 @@ const decodeSchemaOperation = function (decoder, bytes, it, ref, allChanges) {
|
|
|
122
124
|
console.warn("@colyseus/schema: field not defined at", { index, ref: ref.constructor.name, metadata });
|
|
123
125
|
return exports.DEFINITION_MISMATCH;
|
|
124
126
|
}
|
|
125
|
-
const { value, previousValue } = decodeValue(decoder, operation, ref, index,
|
|
127
|
+
const { value, previousValue } = decodeValue(decoder, operation, ref, index, field.type, bytes, it, allChanges);
|
|
126
128
|
if (value !== null && value !== undefined) {
|
|
127
|
-
ref[field] = value;
|
|
129
|
+
ref[field.name] = value;
|
|
128
130
|
}
|
|
129
131
|
// add change
|
|
130
132
|
if (previousValue !== value) {
|
|
@@ -132,7 +134,7 @@ const decodeSchemaOperation = function (decoder, bytes, it, ref, allChanges) {
|
|
|
132
134
|
ref,
|
|
133
135
|
refId: decoder.currentRefId,
|
|
134
136
|
op: operation,
|
|
135
|
-
field: field,
|
|
137
|
+
field: field.name,
|
|
136
138
|
value,
|
|
137
139
|
previousValue,
|
|
138
140
|
});
|
|
@@ -203,7 +205,6 @@ exports.decodeKeyValueOperation = decodeKeyValueOperation;
|
|
|
203
205
|
const decodeArray = function (decoder, bytes, it, ref, allChanges) {
|
|
204
206
|
// "uncompressed" index + operation (array/map items)
|
|
205
207
|
let operation = bytes[it.offset++];
|
|
206
|
-
let isSchemaChild;
|
|
207
208
|
let index;
|
|
208
209
|
if (operation === spec_1.OPERATION.CLEAR) {
|
|
209
210
|
//
|
|
@@ -233,8 +234,6 @@ const decodeArray = function (decoder, bytes, it, ref, allChanges) {
|
|
|
233
234
|
return;
|
|
234
235
|
}
|
|
235
236
|
else if (operation === spec_1.OPERATION.ADD_BY_REFID) {
|
|
236
|
-
isSchemaChild = true;
|
|
237
|
-
// operation = OPERATION.ADD;
|
|
238
237
|
const refId = decode.number(bytes, it);
|
|
239
238
|
const itemByRefId = decoder.root.refs.get(refId);
|
|
240
239
|
// use existing index, or push new value
|
|
@@ -243,7 +242,6 @@ const decodeArray = function (decoder, bytes, it, ref, allChanges) {
|
|
|
243
242
|
: ref.length;
|
|
244
243
|
}
|
|
245
244
|
else {
|
|
246
|
-
isSchemaChild = false;
|
|
247
245
|
index = decode.number(bytes, it);
|
|
248
246
|
}
|
|
249
247
|
const type = ref[symbols_1.$childType];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DecodeOperation.js","sourceRoot":"","sources":["../../src/decoder/DecodeOperation.ts"],"names":[],"mappings":"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","sourcesContent":["import { OPERATION } from \"../encoding/spec\";\nimport { Metadata } from \"../Metadata\";\nimport { Schema } from \"../Schema\";\nimport type { Ref } from \"../encoder/ChangeTree\";\nimport type { Decoder } from \"./Decoder\";\nimport * as decode from \"../encoding/decode\";\nimport { $childType, $deleteByIndex, $getByIndex } from \"../types/symbols\";\n\nimport type { MapSchema } from \"../types/custom/MapSchema\";\nimport type { ArraySchema } from \"../types/custom/ArraySchema\";\nimport type { CollectionSchema } from \"../types/custom/CollectionSchema\";\n\nimport { getType } from \"../types/registry\";\nimport { Collection } from \"../types/HelperTypes\";\n\nexport interface DataChange<T = any, F = string> {\n ref: Ref,\n refId: number,\n op: OPERATION,\n field: F;\n dynamicIndex?: number | string;\n value: T;\n previousValue: T;\n}\n\nexport const DEFINITION_MISMATCH = -1;\n\nexport type DecodeOperation<T extends Schema = any> = (\n decoder: Decoder<T>,\n bytes: Buffer,\n it: decode.Iterator,\n ref: Ref,\n allChanges: DataChange[],\n) => number | void;\n\nexport function decodeValue(\n decoder: Decoder,\n operation: OPERATION,\n ref: Ref,\n index: number,\n type: any,\n bytes: Buffer,\n it: decode.Iterator,\n allChanges: DataChange[],\n) {\n const $root = decoder.root;\n const previousValue = ref[$getByIndex](index);\n\n let value: any;\n\n if ((operation & OPERATION.DELETE) === OPERATION.DELETE)\n {\n // Flag `refId` for garbage collection.\n const previousRefId = $root.refIds.get(previousValue);\n if (previousRefId !== undefined) { $root.removeRef(previousRefId); }\n\n //\n // Delete operations\n //\n if (operation !== OPERATION.DELETE_AND_ADD) {\n ref[$deleteByIndex](index);\n\n // //\n // // FIXME: is this in the correct place?\n // // (This is sounding like a workaround just for ArraySchema, see\n // // \"should splice and move\" test on ArraySchema.test.ts)\n // //\n // allChanges.push({\n // ref,\n // refId: decoder.currentRefId,\n // op: OPERATION.DELETE,\n // field: index as unknown as string,\n // value: undefined,\n // previousValue,\n // });\n }\n\n value = null;\n }\n\n if (operation === OPERATION.DELETE) {\n //\n // Don't do anything\n //\n\n } else if (Schema.is(type)) {\n const refId = decode.number(bytes, it);\n value = $root.refs.get(refId);\n\n if (previousValue) {\n const previousRefId = $root.refIds.get(previousValue);\n if (\n previousRefId &&\n refId !== previousRefId &&\n // FIXME: we may need to check for REPLACE operation as well\n ((operation & OPERATION.DELETE) === OPERATION.DELETE)\n ) {\n $root.removeRef(previousRefId);\n }\n }\n\n if ((operation & OPERATION.ADD) === OPERATION.ADD) {\n const childType = decoder.getInstanceType(bytes, it, type);\n if (!value) {\n value = decoder.createInstanceOfType(childType);\n }\n\n $root.addRef(refId, value, (value !== previousValue));\n }\n\n\n } else if (typeof(type) === \"string\") {\n //\n // primitive value (number, string, boolean, etc)\n //\n value = decode[type as string](bytes, it);\n\n } else {\n const typeDef = getType(Object.keys(type)[0]);\n const refId = decode.number(bytes, it);\n\n const valueRef: Ref = ($root.refs.has(refId))\n ? previousValue || $root.refs.get(refId)\n : new typeDef.constructor();\n\n value = valueRef.clone(true);\n value[$childType] = Object.values(type)[0]; // cache childType for ArraySchema and MapSchema\n\n if (previousValue) {\n let previousRefId = $root.refIds.get(previousValue);\n\n if (previousRefId !== undefined && refId !== previousRefId) {\n $root.removeRef(previousRefId);\n\n //\n // enqueue onRemove if structure has been replaced.\n //\n const entries: IterableIterator<[any, any]> = previousValue.entries();\n let iter: IteratorResult<[any, any]>;\n while ((iter = entries.next()) && !iter.done) {\n const [key, value] = iter.value;\n\n // if value is a schema, remove its reference\n // FIXME: not sure if this is necessary, add more tests to confirm\n if (typeof(value) === \"object\") {\n previousRefId = $root.refIds.get(value);\n $root.removeRef(previousRefId);\n }\n\n allChanges.push({\n ref: previousValue,\n refId: previousRefId,\n op: OPERATION.DELETE,\n field: key,\n value: undefined,\n previousValue: value,\n });\n }\n\n }\n }\n\n $root.addRef(refId, value, (valueRef !== previousValue));\n }\n\n return { value, previousValue };\n}\n\nexport const decodeSchemaOperation: DecodeOperation = function (\n decoder: Decoder<any>,\n bytes: Buffer,\n it: decode.Iterator,\n ref: Ref,\n allChanges: DataChange[],\n) {\n const first_byte = bytes[it.offset++];\n const metadata: Metadata = ref['constructor'][Symbol.metadata];\n\n // \"compressed\" index + operation\n const operation = (first_byte >> 6) << 6\n const index = first_byte % (operation || 255);\n\n // skip early if field is not defined\n const field = metadata[index];\n if (field === undefined) {\n console.warn(\"@colyseus/schema: field not defined at\", { index, ref: ref.constructor.name, metadata });\n return DEFINITION_MISMATCH;\n }\n\n const { value, previousValue } = decodeValue(\n decoder,\n operation,\n ref,\n index,\n metadata[field].type,\n bytes,\n it,\n allChanges,\n );\n\n if (value !== null && value !== undefined) {\n ref[field] = value;\n }\n\n // add change\n if (previousValue !== value) {\n allChanges.push({\n ref,\n refId: decoder.currentRefId,\n op: operation,\n field: field,\n value,\n previousValue,\n });\n }\n}\n\nexport const decodeKeyValueOperation: DecodeOperation = function (\n decoder: Decoder<any>,\n bytes: Buffer,\n it: decode.Iterator,\n ref: Ref,\n allChanges: DataChange[]\n) {\n // \"uncompressed\" index + operation (array/map items)\n const operation = bytes[it.offset++];\n\n if (operation === OPERATION.CLEAR) {\n //\n // When decoding:\n // - enqueue items for DELETE callback.\n // - flag child items for garbage collection.\n //\n decoder.removeChildRefs(ref as unknown as Collection, allChanges);\n\n (ref as any).clear();\n return;\n }\n\n const index = decode.number(bytes, it);\n const type = ref[$childType];\n\n let dynamicIndex: number | string;\n\n if ((operation & OPERATION.ADD) === OPERATION.ADD) { // ADD or DELETE_AND_ADD\n if (typeof(ref['set']) === \"function\") {\n dynamicIndex = decode.string(bytes, it); // MapSchema\n ref['setIndex'](index, dynamicIndex);\n } else {\n dynamicIndex = index; // ArraySchema\n }\n } else {\n // get dynamic index from \"ref\"\n dynamicIndex = ref['getIndex'](index);\n }\n\n\n const { value, previousValue } = decodeValue(\n decoder,\n operation,\n ref,\n index,\n type,\n bytes,\n it,\n allChanges,\n );\n\n if (value !== null && value !== undefined) {\n if (typeof(ref['set']) === \"function\") {\n // MapSchema\n (ref as MapSchema)['$items'].set(dynamicIndex as string, value);\n\n } else if (typeof(ref['$setAt']) === \"function\") {\n // ArraySchema\n (ref as ArraySchema)['$setAt'](index, value, operation);\n\n } else if (typeof(ref['add']) === \"function\") {\n // CollectionSchema && SetSchema\n const index = (ref as CollectionSchema).add(value);\n\n if (typeof(index) === \"number\") {\n ref['setIndex'](index, index);\n }\n }\n }\n\n // add change\n if (previousValue !== value) {\n allChanges.push({\n ref,\n refId: decoder.currentRefId,\n op: operation,\n field: \"\", // FIXME: remove this\n dynamicIndex,\n value,\n previousValue,\n });\n }\n}\n\nexport const decodeArray: DecodeOperation = function (\n decoder: Decoder<any>,\n bytes: Buffer,\n it: decode.Iterator,\n ref: ArraySchema,\n allChanges: DataChange[]\n) {\n // \"uncompressed\" index + operation (array/map items)\n let operation = bytes[it.offset++];\n\n let isSchemaChild: boolean;\n let index: number;\n\n if (operation === OPERATION.CLEAR) {\n //\n // When decoding:\n // - enqueue items for DELETE callback.\n // - flag child items for garbage collection.\n //\n decoder.removeChildRefs(ref as unknown as Collection, allChanges);\n (ref as ArraySchema).clear();\n return;\n\n } else if (operation === OPERATION.DELETE_BY_REFID) {\n // TODO: refactor here, try to follow same flow as below\n const refId = decode.number(bytes, it);\n const previousValue = decoder.root.refs.get(refId);\n index = ref.findIndex((value) => value === previousValue);\n ref[$deleteByIndex](index);\n allChanges.push({\n ref,\n refId: decoder.currentRefId,\n op: OPERATION.DELETE,\n field: \"\", // FIXME: remove this\n dynamicIndex: index,\n value: undefined,\n previousValue,\n });\n\n return;\n\n } else if (operation === OPERATION.ADD_BY_REFID) {\n isSchemaChild = true;\n // operation = OPERATION.ADD;\n\n const refId = decode.number(bytes, it);\n const itemByRefId = decoder.root.refs.get(refId);\n\n // use existing index, or push new value\n index = (itemByRefId)\n ? ref.findIndex((value) => value === itemByRefId)\n : ref.length;\n\n } else {\n isSchemaChild = false;\n index = decode.number(bytes, it);\n }\n\n const type = ref[$childType];\n\n let dynamicIndex: number | string = index;\n\n const { value, previousValue } = decodeValue(\n decoder,\n operation,\n ref,\n index,\n type,\n bytes,\n it,\n allChanges,\n );\n\n if (\n value !== null && value !== undefined &&\n value !== previousValue // avoid setting same value twice (if index === 0 it will result in a \"unshift\" for ArraySchema)\n ) {\n // ArraySchema\n (ref as ArraySchema)['$setAt'](index, value, operation);\n }\n\n // add change\n if (previousValue !== value) {\n allChanges.push({\n ref,\n refId: decoder.currentRefId,\n op: operation,\n field: \"\", // FIXME: remove this\n dynamicIndex,\n value,\n previousValue,\n });\n }\n}"]}
|
|
1
|
+
{"version":3,"file":"DecodeOperation.js","sourceRoot":"","sources":["../../src/decoder/DecodeOperation.ts"],"names":[],"mappings":"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","sourcesContent":["import { OPERATION } from \"../encoding/spec\";\nimport { Metadata } from \"../Metadata\";\nimport { Schema } from \"../Schema\";\nimport type { Ref } from \"../encoder/ChangeTree\";\nimport type { Decoder } from \"./Decoder\";\nimport * as decode from \"../encoding/decode\";\nimport { $childType, $deleteByIndex, $getByIndex } from \"../types/symbols\";\n\nimport type { MapSchema } from \"../types/custom/MapSchema\";\nimport type { ArraySchema } from \"../types/custom/ArraySchema\";\nimport type { CollectionSchema } from \"../types/custom/CollectionSchema\";\n\nimport { getType } from \"../types/registry\";\nimport { Collection } from \"../types/HelperTypes\";\n\nexport interface DataChange<T = any, F = string> {\n ref: Ref,\n refId: number,\n op: OPERATION,\n field: F;\n dynamicIndex?: number | string;\n value: T;\n previousValue: T;\n}\n\nexport const DEFINITION_MISMATCH = -1;\n\nexport type DecodeOperation<T extends Schema = any> = (\n decoder: Decoder<T>,\n bytes: Buffer,\n it: decode.Iterator,\n ref: Ref,\n allChanges: DataChange[],\n) => number | void;\n\nexport function decodeValue(\n decoder: Decoder,\n operation: OPERATION,\n ref: Ref,\n index: number,\n type: any,\n bytes: Buffer,\n it: decode.Iterator,\n allChanges: DataChange[],\n) {\n const $root = decoder.root;\n const previousValue = ref[$getByIndex](index);\n\n let value: any;\n\n if ((operation & OPERATION.DELETE) === OPERATION.DELETE)\n {\n // Flag `refId` for garbage collection.\n const previousRefId = $root.refIds.get(previousValue);\n if (previousRefId !== undefined) { $root.removeRef(previousRefId); }\n\n //\n // Delete operations\n //\n if (operation !== OPERATION.DELETE_AND_ADD) {\n ref[$deleteByIndex](index);\n\n // //\n // // FIXME: is this in the correct place?\n // // (This is sounding like a workaround just for ArraySchema, see\n // // \"should splice and move\" test on ArraySchema.test.ts)\n // //\n // allChanges.push({\n // ref,\n // refId: decoder.currentRefId,\n // op: OPERATION.DELETE,\n // field: index as unknown as string,\n // value: undefined,\n // previousValue,\n // });\n }\n\n value = null;\n }\n\n if (operation === OPERATION.DELETE) {\n //\n // Don't do anything\n //\n\n } else if (Schema.is(type)) {\n const refId = decode.number(bytes, it);\n value = $root.refs.get(refId);\n\n if (previousValue) {\n const previousRefId = $root.refIds.get(previousValue);\n if (\n previousRefId &&\n refId !== previousRefId &&\n // FIXME: we may need to check for REPLACE operation as well\n ((operation & OPERATION.DELETE) === OPERATION.DELETE)\n ) {\n $root.removeRef(previousRefId);\n }\n }\n\n if ((operation & OPERATION.ADD) === OPERATION.ADD) {\n const childType = decoder.getInstanceType(bytes, it, type);\n if (!value) {\n value = decoder.createInstanceOfType(childType);\n }\n\n $root.addRef(\n refId,\n value,\n (\n value !== previousValue || // increment ref count if value has changed\n (operation === OPERATION.DELETE_AND_ADD && value === previousValue) // increment ref count if the same instance is being added again\n )\n );\n }\n\n\n } else if (typeof(type) === \"string\") {\n //\n // primitive value (number, string, boolean, etc)\n //\n value = decode[type as string](bytes, it);\n\n } else {\n const typeDef = getType(Object.keys(type)[0]);\n const refId = decode.number(bytes, it);\n\n const valueRef: Ref = ($root.refs.has(refId))\n ? previousValue || $root.refs.get(refId)\n : new typeDef.constructor();\n\n value = valueRef.clone(true);\n value[$childType] = Object.values(type)[0]; // cache childType for ArraySchema and MapSchema\n\n if (previousValue) {\n let previousRefId = $root.refIds.get(previousValue);\n\n if (previousRefId !== undefined && refId !== previousRefId) {\n $root.removeRef(previousRefId);\n\n //\n // enqueue onRemove if structure has been replaced.\n //\n const entries: IterableIterator<[any, any]> = previousValue.entries();\n let iter: IteratorResult<[any, any]>;\n while ((iter = entries.next()) && !iter.done) {\n const [key, value] = iter.value;\n\n // if value is a schema, remove its reference\n // FIXME: not sure if this is necessary, add more tests to confirm\n if (typeof(value) === \"object\") {\n previousRefId = $root.refIds.get(value);\n $root.removeRef(previousRefId);\n }\n\n allChanges.push({\n ref: previousValue,\n refId: previousRefId,\n op: OPERATION.DELETE,\n field: key,\n value: undefined,\n previousValue: value,\n });\n }\n\n }\n }\n\n $root.addRef(refId, value, (valueRef !== previousValue));\n }\n\n return { value, previousValue };\n}\n\nexport const decodeSchemaOperation: DecodeOperation = function (\n decoder: Decoder<any>,\n bytes: Buffer,\n it: decode.Iterator,\n ref: Ref,\n allChanges: DataChange[],\n) {\n const first_byte = bytes[it.offset++];\n const metadata: Metadata = ref.constructor[Symbol.metadata];\n\n // \"compressed\" index + operation\n const operation = (first_byte >> 6) << 6\n const index = first_byte % (operation || 255);\n\n // skip early if field is not defined\n const field = metadata[index];\n if (field === undefined) {\n console.warn(\"@colyseus/schema: field not defined at\", { index, ref: ref.constructor.name, metadata });\n return DEFINITION_MISMATCH;\n }\n\n const { value, previousValue } = decodeValue(\n decoder,\n operation,\n ref,\n index,\n field.type,\n bytes,\n it,\n allChanges,\n );\n\n if (value !== null && value !== undefined) {\n ref[field.name] = value;\n }\n\n // add change\n if (previousValue !== value) {\n allChanges.push({\n ref,\n refId: decoder.currentRefId,\n op: operation,\n field: field.name,\n value,\n previousValue,\n });\n }\n}\n\nexport const decodeKeyValueOperation: DecodeOperation = function (\n decoder: Decoder<any>,\n bytes: Buffer,\n it: decode.Iterator,\n ref: Ref,\n allChanges: DataChange[]\n) {\n // \"uncompressed\" index + operation (array/map items)\n const operation = bytes[it.offset++];\n\n if (operation === OPERATION.CLEAR) {\n //\n // When decoding:\n // - enqueue items for DELETE callback.\n // - flag child items for garbage collection.\n //\n decoder.removeChildRefs(ref as unknown as Collection, allChanges);\n\n (ref as any).clear();\n return;\n }\n\n const index = decode.number(bytes, it);\n const type = ref[$childType];\n\n let dynamicIndex: number | string;\n\n if ((operation & OPERATION.ADD) === OPERATION.ADD) { // ADD or DELETE_AND_ADD\n if (typeof(ref['set']) === \"function\") {\n dynamicIndex = decode.string(bytes, it); // MapSchema\n ref['setIndex'](index, dynamicIndex);\n } else {\n dynamicIndex = index; // ArraySchema\n }\n } else {\n // get dynamic index from \"ref\"\n dynamicIndex = ref['getIndex'](index);\n }\n\n\n const { value, previousValue } = decodeValue(\n decoder,\n operation,\n ref,\n index,\n type,\n bytes,\n it,\n allChanges,\n );\n\n if (value !== null && value !== undefined) {\n if (typeof(ref['set']) === \"function\") {\n // MapSchema\n (ref as MapSchema)['$items'].set(dynamicIndex as string, value);\n\n } else if (typeof(ref['$setAt']) === \"function\") {\n // ArraySchema\n (ref as ArraySchema)['$setAt'](index, value, operation);\n\n } else if (typeof(ref['add']) === \"function\") {\n // CollectionSchema && SetSchema\n const index = (ref as CollectionSchema).add(value);\n\n if (typeof(index) === \"number\") {\n ref['setIndex'](index, index);\n }\n }\n }\n\n // add change\n if (previousValue !== value) {\n allChanges.push({\n ref,\n refId: decoder.currentRefId,\n op: operation,\n field: \"\", // FIXME: remove this\n dynamicIndex,\n value,\n previousValue,\n });\n }\n}\n\nexport const decodeArray: DecodeOperation = function (\n decoder: Decoder<any>,\n bytes: Buffer,\n it: decode.Iterator,\n ref: ArraySchema,\n allChanges: DataChange[]\n) {\n // \"uncompressed\" index + operation (array/map items)\n let operation = bytes[it.offset++];\n let index: number;\n\n if (operation === OPERATION.CLEAR) {\n //\n // When decoding:\n // - enqueue items for DELETE callback.\n // - flag child items for garbage collection.\n //\n decoder.removeChildRefs(ref as unknown as Collection, allChanges);\n (ref as ArraySchema).clear();\n return;\n\n } else if (operation === OPERATION.DELETE_BY_REFID) {\n // TODO: refactor here, try to follow same flow as below\n const refId = decode.number(bytes, it);\n const previousValue = decoder.root.refs.get(refId);\n index = ref.findIndex((value) => value === previousValue);\n ref[$deleteByIndex](index);\n allChanges.push({\n ref,\n refId: decoder.currentRefId,\n op: OPERATION.DELETE,\n field: \"\", // FIXME: remove this\n dynamicIndex: index,\n value: undefined,\n previousValue,\n });\n\n return;\n\n } else if (operation === OPERATION.ADD_BY_REFID) {\n const refId = decode.number(bytes, it);\n const itemByRefId = decoder.root.refs.get(refId);\n\n // use existing index, or push new value\n index = (itemByRefId)\n ? ref.findIndex((value) => value === itemByRefId)\n : ref.length;\n\n } else {\n index = decode.number(bytes, it);\n }\n\n const type = ref[$childType];\n\n let dynamicIndex: number | string = index;\n\n const { value, previousValue } = decodeValue(\n decoder,\n operation,\n ref,\n index,\n type,\n bytes,\n it,\n allChanges,\n );\n\n if (\n value !== null && value !== undefined &&\n value !== previousValue // avoid setting same value twice (if index === 0 it will result in a \"unshift\" for ArraySchema)\n ) {\n // ArraySchema\n (ref as ArraySchema)['$setAt'](index, value, operation);\n }\n\n // add change\n if (previousValue !== value) {\n allChanges.push({\n ref,\n refId: decoder.currentRefId,\n op: operation,\n field: \"\", // FIXME: remove this\n dynamicIndex,\n value,\n previousValue,\n });\n }\n}"]}
|
|
@@ -83,8 +83,9 @@ class ReferenceTracker {
|
|
|
83
83
|
// Ensure child schema instances have their references removed as well.
|
|
84
84
|
//
|
|
85
85
|
if (Metadata_1.Metadata.isValidInstance(ref)) {
|
|
86
|
-
const metadata = ref
|
|
87
|
-
for (const
|
|
86
|
+
const metadata = ref.constructor[Symbol.metadata];
|
|
87
|
+
for (const index in metadata) {
|
|
88
|
+
const field = metadata[index].name;
|
|
88
89
|
const childRefId = typeof (ref[field]) === "object" && this.refIds.get(ref[field]);
|
|
89
90
|
if (childRefId) {
|
|
90
91
|
this.removeRef(childRefId);
|