@colyseus/schema 3.0.76 → 4.0.1
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 +781 -434
- package/build/cjs/index.js.map +1 -1
- package/build/esm/index.mjs +779 -435
- package/build/esm/index.mjs.map +1 -1
- package/build/umd/index.js +781 -434
- package/lib/Metadata.js +1 -5
- package/lib/Metadata.js.map +1 -1
- package/lib/Reflection.d.ts +50 -17
- package/lib/Reflection.js +151 -202
- package/lib/Reflection.js.map +1 -1
- package/lib/Schema.d.ts +13 -1
- package/lib/Schema.js +73 -9
- package/lib/Schema.js.map +1 -1
- package/lib/annotations.d.ts +6 -1
- package/lib/annotations.js +8 -34
- package/lib/annotations.js.map +1 -1
- package/lib/bench_encode.js +34 -1
- package/lib/bench_encode.js.map +1 -1
- package/lib/codegen/api.js +35 -2
- package/lib/codegen/api.js.map +1 -1
- package/lib/codegen/cli.js +4 -1
- package/lib/codegen/cli.js.map +1 -1
- package/lib/codegen/parser.js +35 -2
- package/lib/codegen/parser.js.map +1 -1
- package/lib/codegen/types.js +34 -1
- package/lib/codegen/types.js.map +1 -1
- package/lib/decoder/DecodeOperation.d.ts +2 -2
- package/lib/decoder/DecodeOperation.js +3 -3
- package/lib/decoder/DecodeOperation.js.map +1 -1
- package/lib/decoder/Decoder.d.ts +3 -3
- package/lib/decoder/Decoder.js +2 -2
- package/lib/decoder/Decoder.js.map +1 -1
- package/lib/decoder/ReferenceTracker.d.ts +0 -1
- package/lib/decoder/ReferenceTracker.js +9 -7
- package/lib/decoder/ReferenceTracker.js.map +1 -1
- package/lib/decoder/strategy/Callbacks.d.ts +154 -0
- package/lib/decoder/strategy/Callbacks.js +340 -0
- package/lib/decoder/strategy/Callbacks.js.map +1 -0
- package/lib/decoder/strategy/{StateCallbacks.d.ts → getDecoderStateCallbacks.d.ts} +6 -0
- package/lib/decoder/strategy/{StateCallbacks.js → getDecoderStateCallbacks.js} +17 -10
- package/lib/decoder/strategy/getDecoderStateCallbacks.js.map +1 -0
- package/lib/encoder/ChangeTree.d.ts +2 -2
- package/lib/encoder/ChangeTree.js.map +1 -1
- package/lib/encoder/EncodeOperation.d.ts +2 -2
- package/lib/encoder/EncodeOperation.js +3 -3
- package/lib/encoder/EncodeOperation.js.map +1 -1
- package/lib/encoder/Encoder.d.ts +6 -6
- package/lib/encoder/Encoder.js +19 -18
- package/lib/encoder/Encoder.js.map +1 -1
- package/lib/encoder/Root.js +17 -14
- package/lib/encoder/Root.js.map +1 -1
- package/lib/encoder/StateView.js +13 -12
- package/lib/encoder/StateView.js.map +1 -1
- package/lib/encoding/decode.d.ts +2 -2
- package/lib/encoding/encode.d.ts +3 -1
- package/lib/encoding/encode.js.map +1 -1
- package/lib/index.d.ts +3 -2
- package/lib/index.js +7 -3
- package/lib/index.js.map +1 -1
- package/lib/types/HelperTypes.d.ts +7 -14
- package/lib/types/HelperTypes.js.map +1 -1
- package/lib/types/custom/ArraySchema.d.ts +2 -1
- package/lib/types/custom/ArraySchema.js.map +1 -1
- package/lib/types/custom/CollectionSchema.d.ts +2 -1
- package/lib/types/custom/CollectionSchema.js.map +1 -1
- package/lib/types/custom/MapSchema.d.ts +3 -2
- package/lib/types/custom/MapSchema.js.map +1 -1
- package/lib/types/custom/SetSchema.d.ts +2 -1
- 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/lib/utils.js +1 -1
- package/lib/utils.js.map +1 -1
- package/package.json +12 -16
- package/src/Metadata.ts +1 -5
- package/src/Reflection.ts +185 -174
- package/src/Schema.ts +81 -13
- package/src/annotations.ts +14 -40
- package/src/codegen/parser.ts +1 -1
- package/src/decoder/DecodeOperation.ts +9 -9
- package/src/decoder/Decoder.ts +6 -6
- package/src/decoder/ReferenceTracker.ts +10 -8
- package/src/decoder/strategy/Callbacks.ts +547 -0
- package/src/decoder/strategy/{StateCallbacks.ts → getDecoderStateCallbacks.ts} +17 -11
- package/src/encoder/ChangeTree.ts +4 -7
- package/src/encoder/EncodeOperation.ts +9 -9
- package/src/encoder/Encoder.ts +47 -22
- package/src/encoder/Root.ts +20 -15
- package/src/encoder/StateView.ts +15 -13
- package/src/encoding/encode.ts +1 -1
- package/src/index.ts +3 -2
- package/src/types/HelperTypes.ts +13 -11
- package/src/types/custom/ArraySchema.ts +2 -1
- package/src/types/custom/CollectionSchema.ts +4 -2
- package/src/types/custom/MapSchema.ts +4 -2
- package/src/types/custom/SetSchema.ts +3 -1
- package/src/types/symbols.ts +1 -0
- package/src/utils.ts +2 -2
- package/lib/Decoder.d.ts +0 -16
- package/lib/Decoder.js +0 -182
- package/lib/Decoder.js.map +0 -1
- package/lib/Encoder.d.ts +0 -13
- package/lib/Encoder.js +0 -79
- package/lib/Encoder.js.map +0 -1
- package/lib/changes/ChangeSet.d.ts +0 -12
- package/lib/changes/ChangeSet.js +0 -35
- package/lib/changes/ChangeSet.js.map +0 -1
- package/lib/changes/ChangeTree.d.ts +0 -53
- package/lib/changes/ChangeTree.js +0 -202
- package/lib/changes/ChangeTree.js.map +0 -1
- package/lib/changes/DecodeOperation.d.ts +0 -15
- package/lib/changes/DecodeOperation.js +0 -186
- package/lib/changes/DecodeOperation.js.map +0 -1
- package/lib/changes/EncodeOperation.d.ts +0 -18
- package/lib/changes/EncodeOperation.js +0 -130
- package/lib/changes/EncodeOperation.js.map +0 -1
- package/lib/changes/ReferenceTracker.d.ts +0 -14
- package/lib/changes/ReferenceTracker.js +0 -83
- package/lib/changes/ReferenceTracker.js.map +0 -1
- package/lib/changes/consts.d.ts +0 -14
- package/lib/changes/consts.js +0 -18
- package/lib/changes/consts.js.map +0 -1
- package/lib/decoder/strategy/StateCallbacks.js.map +0 -1
- package/lib/decoding/decode.d.ts +0 -48
- package/lib/decoding/decode.js +0 -267
- package/lib/decoding/decode.js.map +0 -1
- package/lib/ecs.d.ts +0 -11
- package/lib/ecs.js +0 -160
- package/lib/ecs.js.map +0 -1
- package/lib/filters/index.d.ts +0 -8
- package/lib/filters/index.js +0 -24
- package/lib/filters/index.js.map +0 -1
- package/lib/spec.d.ts +0 -13
- package/lib/spec.js +0 -42
- package/lib/spec.js.map +0 -1
- package/lib/types/ArraySchema.d.ts +0 -238
- package/lib/types/ArraySchema.js +0 -555
- package/lib/types/ArraySchema.js.map +0 -1
- package/lib/types/CollectionSchema.d.ts +0 -35
- package/lib/types/CollectionSchema.js +0 -150
- package/lib/types/CollectionSchema.js.map +0 -1
- package/lib/types/MapSchema.d.ts +0 -38
- package/lib/types/MapSchema.js +0 -215
- package/lib/types/MapSchema.js.map +0 -1
- package/lib/types/SetSchema.d.ts +0 -32
- package/lib/types/SetSchema.js +0 -162
- package/lib/types/SetSchema.js.map +0 -1
- package/lib/types/typeRegistry.d.ts +0 -5
- package/lib/types/typeRegistry.js +0 -13
- package/lib/types/typeRegistry.js.map +0 -1
- package/lib/usage.d.ts +0 -1
- package/lib/usage.js +0 -22
- package/lib/usage.js.map +0 -1
- package/lib/v3.d.ts +0 -1
- package/lib/v3.js +0 -427
- package/lib/v3.js.map +0 -1
- package/lib/v3_experiment.d.ts +0 -1
- package/lib/v3_experiment.js +0 -407
- package/lib/v3_experiment.js.map +0 -1
package/lib/Reflection.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Reflection.js","sourceRoot":"","sources":["../src/Reflection.ts"],"names":[],"mappings":"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","sourcesContent":["import { type, PrimitiveType } from \"./annotations\";\nimport { TypeContext } from \"./types/TypeContext\";\nimport { Metadata } from \"./Metadata\";\nimport { ArraySchema } from \"./types/custom/ArraySchema\";\nimport { Iterator } from \"./encoding/decode\";\nimport { Encoder } from \"./encoder/Encoder\";\nimport { Decoder } from \"./decoder/Decoder\";\nimport { Schema } from \"./Schema\";\n\n/**\n * Reflection\n */\nexport class ReflectionField extends Schema {\n @type(\"string\") name: string;\n @type(\"string\") type: string;\n @type(\"number\") referencedType: number;\n}\n\nexport class ReflectionType extends Schema {\n @type(\"number\") id: number;\n @type(\"number\") extendsId: number;\n @type([ ReflectionField ]) fields = new ArraySchema<ReflectionField>();\n}\n\nexport class Reflection extends Schema {\n @type([ReflectionType]) types: ArraySchema<ReflectionType> = new ArraySchema<ReflectionType>();\n @type(\"number\") rootType: number;\n\n /**\n * Encodes the TypeContext of an Encoder into a buffer.\n *\n * @param encoder Encoder instance\n * @param it\n * @returns\n */\n static encode(encoder: Encoder, it: Iterator = { offset: 0 }) {\n const context = encoder.context;\n\n const reflection = new Reflection();\n const reflectionEncoder = new Encoder(reflection);\n\n // rootType is usually the first schema passed to the Encoder\n // (unless it inherits from another schema)\n const rootType = context.schemas.get(encoder.state.constructor);\n if (rootType > 0) { reflection.rootType = rootType; }\n\n const includedTypeIds = new Set<number>();\n const pendingReflectionTypes: { [typeid: number]: ReflectionType[] } = {};\n\n // add type to reflection in a way that respects inheritance\n // (parent types should be added before their children)\n const addType = (type: ReflectionType) => {\n if (type.extendsId === undefined || includedTypeIds.has(type.extendsId)) {\n includedTypeIds.add(type.id);\n\n reflection.types.push(type);\n\n const deps = pendingReflectionTypes[type.id];\n if (deps !== undefined) {\n delete pendingReflectionTypes[type.id];\n deps.forEach((childType) => addType(childType));\n }\n } else {\n if (pendingReflectionTypes[type.extendsId] === undefined) {\n pendingReflectionTypes[type.extendsId] = [];\n }\n pendingReflectionTypes[type.extendsId].push(type);\n }\n };\n\n context.schemas.forEach((typeid, klass) => {\n const type = new ReflectionType();\n type.id = Number(typeid);\n\n // support inheritance\n const inheritFrom = Object.getPrototypeOf(klass);\n if (inheritFrom !== Schema) {\n type.extendsId = context.schemas.get(inheritFrom);\n }\n\n const metadata = klass[Symbol.metadata];\n\n //\n // FIXME: this is a workaround for inherited types without additional fields\n // if metadata is the same reference as the parent class - it means the class has no own metadata\n //\n if (metadata !== inheritFrom[Symbol.metadata]) {\n for (const fieldIndex in metadata) {\n const index = Number(fieldIndex);\n const fieldName = metadata[index].name;\n\n // skip fields from parent classes\n if (!Object.prototype.hasOwnProperty.call(metadata, fieldName)) {\n continue;\n }\n\n const reflectionField = new ReflectionField();\n reflectionField.name = fieldName;\n\n let fieldType: string;\n\n const field = metadata[index];\n\n if (typeof (field.type) === \"string\") {\n fieldType = field.type;\n\n } else {\n let childTypeSchema: typeof Schema;\n\n //\n // TODO: refactor below.\n //\n if (Schema.is(field.type)) {\n fieldType = \"ref\";\n childTypeSchema = field.type as typeof Schema;\n\n } else {\n fieldType = Object.keys(field.type)[0];\n\n if (typeof (field.type[fieldType as keyof typeof field.type]) === \"string\") {\n fieldType += \":\" + field.type[fieldType as keyof typeof field.type]; // array:string\n\n } else {\n childTypeSchema = field.type[fieldType as keyof typeof field.type];\n }\n }\n\n reflectionField.referencedType = (childTypeSchema)\n ? context.getTypeId(childTypeSchema)\n : -1;\n }\n\n reflectionField.type = fieldType;\n type.fields.push(reflectionField);\n }\n }\n\n addType(type);\n });\n\n // in case there are types that were not added due to inheritance\n for (const typeid in pendingReflectionTypes) {\n pendingReflectionTypes[typeid].forEach((type) =>\n reflection.types.push(type))\n }\n\n const buf = reflectionEncoder.encodeAll(it);\n return buf.slice(0, it.offset)\n // return Buffer.from(buf, 0, it.offset);\n }\n\n /**\n * Decodes the TypeContext from a buffer into a Decoder instance.\n *\n * @param bytes Reflection.encode() output\n * @param it\n * @returns Decoder instance\n */\n static decode<T extends Schema = Schema>(bytes: Buffer, it?: Iterator): Decoder<T> {\n const reflection = new Reflection();\n\n const reflectionDecoder = new Decoder(reflection);\n reflectionDecoder.decode(bytes, it);\n\n const typeContext = new TypeContext();\n\n // 1st pass, initialize metadata + inheritance\n reflection.types.forEach((reflectionType) => {\n const parentClass: typeof Schema = typeContext.get(reflectionType.extendsId) ?? Schema;\n const schema: typeof Schema = class _ extends parentClass {};\n\n // register for inheritance support\n TypeContext.register(schema);\n\n // // for inheritance support\n // Metadata.initialize(schema);\n\n typeContext.add(schema, reflectionType.id);\n }, {});\n\n // define fields\n const addFields = (metadata: Metadata, reflectionType: ReflectionType, parentFieldIndex: number) => {\n reflectionType.fields.forEach((field, i) => {\n const fieldIndex = parentFieldIndex + i;\n\n if (field.referencedType !== undefined) {\n let fieldType = field.type;\n let refType: PrimitiveType = typeContext.get(field.referencedType);\n\n // map or array of primitive type (-1)\n if (!refType) {\n const typeInfo = field.type.split(\":\");\n fieldType = typeInfo[0];\n refType = typeInfo[1] as PrimitiveType; // string\n }\n\n if (fieldType === \"ref\") {\n Metadata.addField(metadata, fieldIndex, field.name, refType);\n\n } else {\n Metadata.addField(metadata, fieldIndex, field.name, { [fieldType]: refType });\n }\n\n } else {\n Metadata.addField(metadata, fieldIndex, field.name, field.type as PrimitiveType);\n }\n });\n };\n\n // 2nd pass, set fields\n reflection.types.forEach((reflectionType) => {\n const schema = typeContext.get(reflectionType.id);\n\n // for inheritance support\n const metadata = Metadata.initialize(schema);\n\n const inheritedTypes: ReflectionType[] = [];\n\n let parentType: ReflectionType = reflectionType;\n do {\n inheritedTypes.push(parentType);\n parentType = reflection.types.find((t) => t.id === parentType.extendsId);\n } while (parentType);\n\n let parentFieldIndex = 0;\n\n inheritedTypes.reverse().forEach((reflectionType) => {\n // add fields from all inherited classes\n // TODO: refactor this to avoid adding fields from parent classes\n addFields(metadata, reflectionType, parentFieldIndex);\n parentFieldIndex += reflectionType.fields.length;\n });\n });\n\n const state: T = new (typeContext.get(reflection.rootType || 0) as unknown as any)();\n\n return new Decoder<T>(state, typeContext);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Reflection.js","sourceRoot":"","sources":["../src/Reflection.ts"],"names":[],"mappings":"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","sourcesContent":["import { PrimitiveType, schema, SchemaType } from \"./annotations\";\nimport { TypeContext } from \"./types/TypeContext\";\nimport { Metadata } from \"./Metadata\";\nimport { Iterator } from \"./encoding/decode\";\nimport { Encoder } from \"./encoder/Encoder\";\nimport { Decoder } from \"./decoder/Decoder\";\nimport { Schema } from \"./Schema\";\n\n/**\n * Static methods available on Reflection\n */\ninterface ReflectionStatic {\n /**\n * Encodes the TypeContext of an Encoder into a buffer.\n *\n * @param encoder Encoder instance\n * @param it\n * @returns\n */\n encode: (encoder: Encoder, it?: Iterator) => Uint8Array;\n\n /**\n * Decodes the TypeContext from a buffer into a Decoder instance.\n *\n * @param bytes Reflection.encode() output\n * @param it\n * @returns Decoder instance\n */\n decode: <T extends Schema = Schema>(bytes: Uint8Array, it?: Iterator) => Decoder<T>;\n}\n\n/**\n * Reflection\n */\nexport const ReflectionField = schema({\n name: \"string\",\n type: \"string\",\n referencedType: \"number\",\n})\nexport type ReflectionField = SchemaType<typeof ReflectionField>;\n\nexport const ReflectionType = schema({\n id: \"number\",\n extendsId: \"number\",\n fields: [ ReflectionField ],\n})\nexport type ReflectionType = SchemaType<typeof ReflectionType>;\n\nexport const Reflection = schema({\n types: [ ReflectionType ],\n rootType: \"number\",\n}) as ReturnType<typeof schema<{\n types: [typeof ReflectionType];\n rootType: \"number\";\n}>> & ReflectionStatic;\n\nexport type Reflection = SchemaType<typeof Reflection>;\n\nReflection.encode = function (encoder: Encoder, it: Iterator = { offset: 0 }) {\n const context = encoder.context;\n\n const reflection = new Reflection();\n const reflectionEncoder = new Encoder(reflection);\n\n // rootType is usually the first schema passed to the Encoder\n // (unless it inherits from another schema)\n const rootType = context.schemas.get(encoder.state.constructor);\n if (rootType > 0) { reflection.rootType = rootType; }\n\n const includedTypeIds = new Set<number>();\n const pendingReflectionTypes: { [typeid: number]: ReflectionType[] } = {};\n\n // add type to reflection in a way that respects inheritance\n // (parent types should be added before their children)\n const addType = (type: ReflectionType) => {\n if (type.extendsId === undefined || includedTypeIds.has(type.extendsId)) {\n includedTypeIds.add(type.id);\n\n reflection.types.push(type);\n\n const deps = pendingReflectionTypes[type.id];\n if (deps !== undefined) {\n delete pendingReflectionTypes[type.id];\n deps.forEach((childType) => addType(childType));\n }\n } else {\n if (pendingReflectionTypes[type.extendsId] === undefined) {\n pendingReflectionTypes[type.extendsId] = [];\n }\n pendingReflectionTypes[type.extendsId].push(type);\n }\n };\n\n context.schemas.forEach((typeid, klass) => {\n const type = new ReflectionType();\n type.id = Number(typeid);\n\n // support inheritance\n const inheritFrom = Object.getPrototypeOf(klass);\n if (inheritFrom !== Schema) {\n type.extendsId = context.schemas.get(inheritFrom);\n }\n\n const metadata = klass[Symbol.metadata];\n\n //\n // FIXME: this is a workaround for inherited types without additional fields\n // if metadata is the same reference as the parent class - it means the class has no own metadata\n //\n if (metadata !== inheritFrom[Symbol.metadata]) {\n for (const fieldIndex in metadata) {\n const index = Number(fieldIndex);\n const fieldName = metadata[index].name;\n\n // skip fields from parent classes\n if (!Object.prototype.hasOwnProperty.call(metadata, fieldName)) {\n continue;\n }\n\n const reflectionField = new ReflectionField();\n reflectionField.name = fieldName;\n\n let fieldType: string;\n\n const field = metadata[index];\n\n if (typeof (field.type) === \"string\") {\n fieldType = field.type;\n\n } else {\n let childTypeSchema: typeof Schema;\n\n //\n // TODO: refactor below.\n //\n if (Schema.is(field.type)) {\n fieldType = \"ref\";\n childTypeSchema = field.type as typeof Schema;\n\n } else {\n fieldType = Object.keys(field.type)[0];\n\n if (typeof (field.type[fieldType as keyof typeof field.type]) === \"string\") {\n fieldType += \":\" + field.type[fieldType as keyof typeof field.type]; // array:string\n\n } else {\n childTypeSchema = field.type[fieldType as keyof typeof field.type];\n }\n }\n\n reflectionField.referencedType = (childTypeSchema)\n ? context.getTypeId(childTypeSchema)\n : -1;\n }\n\n reflectionField.type = fieldType;\n type.fields.push(reflectionField);\n }\n }\n\n addType(type);\n });\n\n // in case there are types that were not added due to inheritance\n for (const typeid in pendingReflectionTypes) {\n pendingReflectionTypes[typeid].forEach((type) =>\n reflection.types.push(type))\n }\n\n const buf = reflectionEncoder.encodeAll(it);\n return buf.slice(0, it.offset);\n};\n\nReflection.decode = function <T extends Schema = Schema>(bytes: Uint8Array, it?: Iterator): Decoder<T> {\n const reflection = new Reflection();\n\n const reflectionDecoder = new Decoder(reflection);\n reflectionDecoder.decode(bytes, it);\n\n const typeContext = new TypeContext();\n\n // 1st pass, initialize metadata + inheritance\n reflection.types.forEach((reflectionType) => {\n const parentClass: typeof Schema = typeContext.get(reflectionType.extendsId) ?? Schema;\n const schema: typeof Schema = class _ extends parentClass { };\n\n // register for inheritance support\n TypeContext.register(schema);\n\n typeContext.add(schema, reflectionType.id);\n }, {});\n\n // define fields\n const addFields = (metadata: Metadata, reflectionType: ReflectionType, parentFieldIndex: number) => {\n reflectionType.fields.forEach((field, i) => {\n const fieldIndex = parentFieldIndex + i;\n\n if (field.referencedType !== undefined) {\n let fieldType = field.type;\n let refType: PrimitiveType = typeContext.get(field.referencedType);\n\n // map or array of primitive type (-1)\n if (!refType) {\n const typeInfo = field.type.split(\":\");\n fieldType = typeInfo[0];\n refType = typeInfo[1] as PrimitiveType; // string\n }\n\n if (fieldType === \"ref\") {\n Metadata.addField(metadata, fieldIndex, field.name, refType);\n\n } else {\n Metadata.addField(metadata, fieldIndex, field.name, { [fieldType]: refType });\n }\n\n } else {\n Metadata.addField(metadata, fieldIndex, field.name, field.type as PrimitiveType);\n }\n });\n };\n\n // 2nd pass, set fields\n reflection.types.forEach((reflectionType) => {\n const schema = typeContext.get(reflectionType.id);\n\n // for inheritance support\n const metadata = Metadata.initialize(schema);\n\n const inheritedTypes: ReflectionType[] = [];\n\n let parentType: ReflectionType = reflectionType;\n do {\n inheritedTypes.push(parentType);\n parentType = reflection.types.find((t) => t.id === parentType.extendsId);\n } while (parentType);\n\n let parentFieldIndex = 0;\n\n inheritedTypes.reverse().forEach((reflectionType) => {\n // add fields from all inherited classes\n // TODO: refactor this to avoid adding fields from parent classes\n addFields(metadata, reflectionType, parentFieldIndex);\n parentFieldIndex += reflectionType.fields.length;\n });\n });\n\n const state: T = new (typeContext.get(reflection.rootType || 0) as unknown as any)();\n\n return new Decoder<T>(state, typeContext);\n}"]}
|
package/lib/Schema.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { OPERATION } from './encoding/spec';
|
|
|
2
2
|
import { type DefinitionType } from "./annotations";
|
|
3
3
|
import { AssignableProps, NonFunctionPropNames, ToJSON } from './types/HelperTypes';
|
|
4
4
|
import { ChangeSetName, ChangeTree, IRef, Ref } from './encoder/ChangeTree';
|
|
5
|
-
import { $decoder, $deleteByIndex, $encoder, $filter, $getByIndex, $track } from './types/symbols';
|
|
5
|
+
import { $decoder, $deleteByIndex, $encoder, $filter, $getByIndex, $refId, $track } from './types/symbols';
|
|
6
6
|
import { StateView } from './encoder/StateView';
|
|
7
7
|
import type { Decoder } from './decoder/Decoder';
|
|
8
8
|
import type { Metadata } from './Metadata';
|
|
@@ -13,6 +13,7 @@ export declare class Schema<C = any> implements IRef {
|
|
|
13
13
|
static [Symbol.metadata]: Metadata;
|
|
14
14
|
static [$encoder]: import("./encoder/EncodeOperation").EncodeOperation<any>;
|
|
15
15
|
static [$decoder]: import("./decoder/DecodeOperation").DecodeOperation<any>;
|
|
16
|
+
[$refId]?: number;
|
|
16
17
|
/**
|
|
17
18
|
* Assign the property descriptors required to track changes on this instance.
|
|
18
19
|
* @param instance
|
|
@@ -34,7 +35,18 @@ export declare class Schema<C = any> implements IRef {
|
|
|
34
35
|
*/
|
|
35
36
|
static [$filter](ref: Schema, index: number, view: StateView): boolean;
|
|
36
37
|
constructor(arg?: C);
|
|
38
|
+
/**
|
|
39
|
+
* Assign properties to the instance.
|
|
40
|
+
* @param props Properties to assign to the instance
|
|
41
|
+
* @returns
|
|
42
|
+
*/
|
|
37
43
|
assign<T extends Partial<this>>(props: AssignableProps<T>): this;
|
|
44
|
+
/**
|
|
45
|
+
* Restore the instance from JSON data.
|
|
46
|
+
* @param jsonData JSON data to restore the instance from
|
|
47
|
+
* @returns
|
|
48
|
+
*/
|
|
49
|
+
restore(jsonData: ToJSON<this>): this;
|
|
38
50
|
/**
|
|
39
51
|
* (Server-side): Flag a property to be encoded for the next patch.
|
|
40
52
|
* @param instance Schema instance
|
package/lib/Schema.js
CHANGED
|
@@ -80,10 +80,74 @@ class Schema {
|
|
|
80
80
|
Object.assign(this, arg);
|
|
81
81
|
}
|
|
82
82
|
}
|
|
83
|
+
/**
|
|
84
|
+
* Assign properties to the instance.
|
|
85
|
+
* @param props Properties to assign to the instance
|
|
86
|
+
* @returns
|
|
87
|
+
*/
|
|
83
88
|
assign(props) {
|
|
84
89
|
Object.assign(this, props);
|
|
85
90
|
return this;
|
|
86
91
|
}
|
|
92
|
+
/**
|
|
93
|
+
* Restore the instance from JSON data.
|
|
94
|
+
* @param jsonData JSON data to restore the instance from
|
|
95
|
+
* @returns
|
|
96
|
+
*/
|
|
97
|
+
restore(jsonData) {
|
|
98
|
+
const metadata = this.constructor[Symbol.metadata];
|
|
99
|
+
for (const fieldIndex in metadata) {
|
|
100
|
+
const field = metadata[fieldIndex];
|
|
101
|
+
const fieldName = field.name;
|
|
102
|
+
const fieldType = field.type;
|
|
103
|
+
const value = jsonData[fieldName];
|
|
104
|
+
if (value === undefined || value === null) {
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
if (typeof fieldType === "string") {
|
|
108
|
+
// Primitive type: assign directly
|
|
109
|
+
this[fieldName] = value;
|
|
110
|
+
}
|
|
111
|
+
else if (Schema.is(fieldType)) {
|
|
112
|
+
// Schema type: create instance and restore
|
|
113
|
+
const instance = new fieldType();
|
|
114
|
+
instance.restore(value);
|
|
115
|
+
this[fieldName] = instance;
|
|
116
|
+
}
|
|
117
|
+
else if (typeof fieldType === "object") {
|
|
118
|
+
// Collection types: { map: ... }, { array: ... }, etc.
|
|
119
|
+
const collectionType = Object.keys(fieldType)[0];
|
|
120
|
+
const childType = fieldType[collectionType];
|
|
121
|
+
if (collectionType === "map") {
|
|
122
|
+
const mapSchema = this[fieldName];
|
|
123
|
+
for (const key in value) {
|
|
124
|
+
if (Schema.is(childType)) {
|
|
125
|
+
const childInstance = new childType();
|
|
126
|
+
childInstance.restore(value[key]);
|
|
127
|
+
mapSchema.set(key, childInstance);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
mapSchema.set(key, value[key]);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
else if (collectionType === "array") {
|
|
135
|
+
const arraySchema = this[fieldName];
|
|
136
|
+
for (let i = 0; i < value.length; i++) {
|
|
137
|
+
if (Schema.is(childType)) {
|
|
138
|
+
const childInstance = new childType();
|
|
139
|
+
childInstance.restore(value[i]);
|
|
140
|
+
arraySchema.push(childInstance);
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
arraySchema.push(value[i]);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return this;
|
|
150
|
+
}
|
|
87
151
|
/**
|
|
88
152
|
* (Server-side): Flag a property to be encoded for the next patch.
|
|
89
153
|
* @param instance Schema instance
|
|
@@ -156,7 +220,7 @@ class Schema {
|
|
|
156
220
|
static debugRefIds(ref, showContents = false, level = 0, decoder, keyPrefix = "") {
|
|
157
221
|
const contents = (showContents) ? ` - ${JSON.stringify(ref.toJSON())}` : "";
|
|
158
222
|
const changeTree = ref[symbols_1.$changes];
|
|
159
|
-
const refId =
|
|
223
|
+
const refId = ref[symbols_1.$refId];
|
|
160
224
|
const root = (decoder) ? decoder.root : changeTree.root;
|
|
161
225
|
// log reference count if > 1
|
|
162
226
|
const refCount = (root?.refCount?.[refId] > 1)
|
|
@@ -179,7 +243,7 @@ class Schema {
|
|
|
179
243
|
let current = ref[symbols_1.$changes].root[changeSet].next;
|
|
180
244
|
while (current) {
|
|
181
245
|
if (current.changeTree) {
|
|
182
|
-
encodeOrder.push(current.changeTree.refId);
|
|
246
|
+
encodeOrder.push(current.changeTree.ref[symbols_1.$refId]);
|
|
183
247
|
}
|
|
184
248
|
current = current.next;
|
|
185
249
|
}
|
|
@@ -200,7 +264,7 @@ class Schema {
|
|
|
200
264
|
const changeTree = instance[symbols_1.$changes];
|
|
201
265
|
const changeSet = (isEncodeAll) ? changeTree.allChanges : changeTree.changes;
|
|
202
266
|
const changeSetName = (isEncodeAll) ? "allChanges" : "changes";
|
|
203
|
-
let output = `${instance.constructor.name} (${
|
|
267
|
+
let output = `${instance.constructor.name} (${instance[symbols_1.$refId]}) -> .${changeSetName}:\n`;
|
|
204
268
|
function dumpChangeSet(changeSet) {
|
|
205
269
|
changeSet.operations
|
|
206
270
|
.filter(op => op)
|
|
@@ -214,14 +278,14 @@ class Schema {
|
|
|
214
278
|
if (!isEncodeAll &&
|
|
215
279
|
changeTree.filteredChanges &&
|
|
216
280
|
(changeTree.filteredChanges.operations).filter(op => op).length > 0) {
|
|
217
|
-
output += `${instance.constructor.name} (${
|
|
281
|
+
output += `${instance.constructor.name} (${instance[symbols_1.$refId]}) -> .filteredChanges:\n`;
|
|
218
282
|
dumpChangeSet(changeTree.filteredChanges);
|
|
219
283
|
}
|
|
220
284
|
// display filtered changes
|
|
221
285
|
if (isEncodeAll &&
|
|
222
286
|
changeTree.allFilteredChanges &&
|
|
223
287
|
(changeTree.allFilteredChanges.operations).filter(op => op).length > 0) {
|
|
224
|
-
output += `${instance.constructor.name} (${
|
|
288
|
+
output += `${instance.constructor.name} (${instance[symbols_1.$refId]}) -> .allFilteredChanges:\n`;
|
|
225
289
|
dumpChangeSet(changeTree.allFilteredChanges);
|
|
226
290
|
}
|
|
227
291
|
return output;
|
|
@@ -256,13 +320,13 @@ class Schema {
|
|
|
256
320
|
}
|
|
257
321
|
}
|
|
258
322
|
if (includeChangeTree) {
|
|
259
|
-
instanceRefIds.push(changeTree.refId);
|
|
323
|
+
instanceRefIds.push(changeTree.ref[symbols_1.$refId]);
|
|
260
324
|
totalOperations += Object.keys(changes).length;
|
|
261
325
|
changeTrees.set(changeTree, parentChangeTrees.reverse());
|
|
262
326
|
}
|
|
263
327
|
}
|
|
264
328
|
output += "---\n";
|
|
265
|
-
output += `root refId: ${rootChangeTree.refId}\n`;
|
|
329
|
+
output += `root refId: ${rootChangeTree.ref[symbols_1.$refId]}\n`;
|
|
266
330
|
output += `Total instances: ${instanceRefIds.length} (refIds: ${instanceRefIds.join(", ")})\n`;
|
|
267
331
|
output += `Total changes: ${totalOperations}\n`;
|
|
268
332
|
output += "---\n";
|
|
@@ -271,7 +335,7 @@ class Schema {
|
|
|
271
335
|
for (const [changeTree, parentChangeTrees] of changeTrees.entries()) {
|
|
272
336
|
parentChangeTrees.forEach((parentChangeTree, level) => {
|
|
273
337
|
if (!visitedParents.has(parentChangeTree)) {
|
|
274
|
-
output += `${(0, utils_1.getIndent)(level)}${parentChangeTree.ref.constructor.name} (refId: ${parentChangeTree.refId})\n`;
|
|
338
|
+
output += `${(0, utils_1.getIndent)(level)}${parentChangeTree.ref.constructor.name} (refId: ${parentChangeTree.ref[symbols_1.$refId]})\n`;
|
|
275
339
|
visitedParents.add(parentChangeTree);
|
|
276
340
|
}
|
|
277
341
|
});
|
|
@@ -279,7 +343,7 @@ class Schema {
|
|
|
279
343
|
const level = parentChangeTrees.length;
|
|
280
344
|
const indent = (0, utils_1.getIndent)(level);
|
|
281
345
|
const parentIndex = (level > 0) ? `(${changeTree.parentIndex}) ` : "";
|
|
282
|
-
output += `${indent}${parentIndex}${changeTree.ref.constructor.name} (refId: ${changeTree.refId}) - changes: ${Object.keys(changes).length}\n`;
|
|
346
|
+
output += `${indent}${parentIndex}${changeTree.ref.constructor.name} (refId: ${changeTree.ref[symbols_1.$refId]}) - changes: ${Object.keys(changes).length}\n`;
|
|
283
347
|
for (const index in changes) {
|
|
284
348
|
const operation = changes[index];
|
|
285
349
|
output += `${(0, utils_1.getIndent)(level + 1)}${spec_1.OPERATION[operation]}: ${index}\n`;
|
package/lib/Schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Schema.js","sourceRoot":"","sources":["../src/Schema.ts"],"names":[],"mappings":";;;;AAAA,0CAA4C;AAC5C,+CAAsE;AAItE,qDAAuF;AACvF,6CAA2H;AAG3H,+DAAkE;AAClE,+DAAkE;AAIlE,mCAAoC;AAEpC;;GAEG;AACH,MAAa,MAAM;aAER,QAAU,GAAG,uCAAqB,CAAC;aACnC,QAAU,GAAG,uCAAqB,CAAC;IAE1C;;;OAGG;IACH,MAAM,CAAC,UAAU,CAAC,QAAa;QAC3B,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,kBAAQ,EAAE;YACtC,KAAK,EAAE,IAAI,uBAAU,CAAC,QAAQ,CAAC;YAC/B,UAAU,EAAE,KAAK;YACjB,QAAQ,EAAE,IAAI;SACjB,CAAC,CAAC;QAEH,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,sBAAY,CAAC,IAAI,EAAE,CAAC,CAAC;IACnG,CAAC;IAED,MAAM,CAAC,EAAE,CAAC,IAAoB;QAC1B,OAAO,OAAM,CAAE,IAAsB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,QAAQ,CAAC;IACzE,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,EAzBC,MAAM,CAAC,QAAQ,OACf,kBAAQ,OACR,kBAAQ,EAuBR,gBAAM,EAAC,CAAE,UAAsB,EAAE,KAAa,EAAE,YAAuB,gBAAS,CAAC,GAAG;QACxF,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IACxC,CAAC;IAED;;;;;;;;OAQG;IACH,MAAM,CAAC,CAAC,iBAAO,CAAC,CAAE,GAAW,EAAE,KAAa,EAAE,IAAe;QACzD,MAAM,QAAQ,GAAc,GAAG,CAAC,WAA6B,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/E,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC;QAEjC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACrB,mDAAmD;YACnD,OAAO,GAAG,KAAK,SAAS,CAAC;QAE7B,CAAC;aAAM,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YAC3B,oBAAoB;YACpB,OAAO,IAAI,CAAC;QAEhB,CAAC;aAAM,IAAI,GAAG,KAAK,8BAAgB,EAAE,CAAC;YAClC,yBAAyB;YACzB,OAAO,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,kBAAQ,CAAC,CAAC,CAAC;QAEnD,CAAC;aAAM,CAAC;YACJ,wBAAwB;YACxB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,kBAAQ,CAAC,CAAC,CAAC;YAC3C,OAAO,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjC,CAAC;IACL,CAAC;IAED,gDAAgD;IAChD,YAAY,GAAO;QACf,EAAE;QACF,SAAS;QACT,2BAA2B;QAC3B,EAAE;QACF,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAExB,EAAE;QACF,wBAAwB;QACxB,EAAE;QACF,IAAI,GAAG,EAAE,CAAC;YACN,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC7B,CAAC;IACL,CAAC;IAEM,MAAM,CACT,KAAyB;QAEzB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC3B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;OAKG;IACI,QAAQ,CAAuC,QAAoB,EAAE,SAAqB;QAC7F,MAAM,QAAQ,GAAc,IAAI,CAAC,WAA6B,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAChF,IAAI,CAAC,kBAAQ,CAAC,CAAC,MAAM,CACjB,QAAQ,CAAC,QAAQ,CAAC,QAAkB,CAAC,CAAC,CAAC,KAAK,EAC5C,SAAS,CACZ,CAAC;IACN,CAAC;IAED,KAAK;QACD,qDAAqD;QACrD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QACzD,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAE1B,MAAM,QAAQ,GAAc,IAAI,CAAC,WAA6B,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAEhF,EAAE;QACF,sDAAsD;QACtD,EAAE;QACF,8BAA8B;QAC9B,KAAK,MAAM,UAAU,IAAI,QAAQ,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,QAAQ,CAAC,UAA2B,CAAC,CAAC,IAAkB,CAAC;YAEvE,IACI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,QAAQ;gBACjC,OAAO,CAAE,IAAI,CAAC,KAAK,CAAS,EAAE,KAAK,CAAC,KAAK,UAAU,EACrD,CAAC;gBACC,aAAa;gBACb,MAAM,CAAC,KAAK,CAAC,GAAI,IAAI,CAAC,KAAK,CAAS,CAAC,KAAK,EAAE,CAAC;YAEjD,CAAC;iBAAM,CAAC;gBACJ,mBAAmB;gBACnB,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;QACL,CAAC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,MAAM;QACF,MAAM,GAAG,GAAQ,EAAE,CAAC;QACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACnD,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAkB,CAAC;YAC/C,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC;YAC7B,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,WAAW,EAAE,CAAC;gBAC5F,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,UAAU,CAAC;oBAChE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,EAAE;oBAC7B,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC1B,CAAC;QACL,CAAC;QACD,OAAO,GAAG,CAAC;IACf,CAAC;IAED;;;OAGG;IACH,iBAAiB;QACb,IAAI,CAAC,kBAAQ,CAAC,CAAC,UAAU,EAAE,CAAC;IAChC,CAAC;IAED,CAAC,qBAAW,CAAC,CAAC,KAAa;QACvB,MAAM,QAAQ,GAAc,IAAI,CAAC,WAA6B,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAChF,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAkB,CAAC,CAAC;IACpD,CAAC;IAED,CAAC,wBAAc,CAAC,CAAC,KAAa;QAC1B,MAAM,QAAQ,GAAc,IAAI,CAAC,WAA6B,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAChF,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAkB,CAAC,GAAG,SAAS,CAAC;IACzD,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,WAAW,CAAmB,GAAM,EAAE,eAAwB,KAAK,EAAE,QAAgB,CAAC,EAAE,OAAiB,EAAE,YAAoB,EAAE;QACpI,MAAM,QAAQ,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,MAAM,UAAU,GAAe,GAAG,CAAC,kBAAQ,CAAC,CAAC;QAE7C,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC;QAC1E,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;QAEvD,6BAA6B;QAC9B,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC1C,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG;YAC/B,CAAC,CAAC,EAAE,CAAC;QAET,IAAI,MAAM,GAAG,GAAG,IAAA,iBAAS,EAAC,KAAK,CAAC,GAAG,SAAS,GAAG,GAAG,CAAC,WAAW,CAAC,IAAI,YAAY,KAAK,IAAI,QAAQ,GAAG,QAAQ,IAAI,CAAC;QAEhH,UAAU,CAAC,YAAY,CAAC,CAAC,eAAe,EAAE,UAAU,EAAE,EAAE;YACpD,IAAI,GAAG,GAAG,UAAU,CAAC;YACrB,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAK,GAAW,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC7D,YAAY;gBACZ,GAAG,GAAI,GAAW,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC;YACjE,CAAC;YACD,MAAM,SAAS,GAAG,CAAE,GAAW,CAAC,SAAS,CAAC,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YACrG,MAAM,IAAI,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,GAAG,EAAE,YAAY,EAAE,KAAK,GAAG,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QACjG,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,uBAAuB,CAAgB,GAAM,EAAE,YAA2B,YAAY;QACzF,IAAI,WAAW,GAAa,EAAE,CAAC;QAC/B,IAAI,OAAO,GAAG,GAAG,CAAC,kBAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC;QACjD,OAAO,OAAO,EAAE,CAAC;YACb,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;gBACrB,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAC/C,CAAC;YACD,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;QAC3B,CAAC;QACD,OAAO,WAAW,CAAC;IACvB,CAAC;IAED,MAAM,CAAC,sBAAsB,CAAC,OAAgB;QAC1C,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;IAC9D,CAAC;IAED;;;;;;;OAOG;IACH,MAAM,CAAC,YAAY,CAAgB,QAAW,EAAE,cAAuB,KAAK;QACxE,MAAM,UAAU,GAAe,QAAQ,CAAC,kBAAQ,CAAC,CAAC;QAElD,MAAM,SAAS,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC;QAC7E,MAAM,aAAa,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;QAE/D,IAAI,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK,UAAU,CAAC,KAAK,SAAS,aAAa,KAAK,CAAC;QAE1F,SAAS,aAAa,CAAC,SAAoB;YACvC,SAAS,CAAC,UAAU;iBACf,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;iBAChB,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;gBACf,MAAM,SAAS,GAAG,UAAU,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;gBACtD,MAAM,IAAI,MAAM,KAAK,MAAM,gBAAS,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,CAAC,KAAK,CAAA;YAC5H,CAAC,CAAC,CAAC;QACX,CAAC;QAED,aAAa,CAAC,SAAS,CAAC,CAAC;QAEzB,2BAA2B;QAC3B,IACI,CAAC,WAAW;YACZ,UAAU,CAAC,eAAe;YAC1B,CAAC,UAAU,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,EACrE,CAAC;YACC,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK,UAAU,CAAC,KAAK,0BAA0B,CAAC;YACtF,aAAa,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;QAC9C,CAAC;QAED,2BAA2B;QAC3B,IACI,WAAW;YACX,UAAU,CAAC,kBAAkB;YAC7B,CAAC,UAAU,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,EACxE,CAAC;YACC,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK,UAAU,CAAC,KAAK,6BAA6B,CAAC;YACzF,aAAa,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;QACjD,CAAC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,gBAAgB,CAAmB,GAAM,EAAE,gBAAqF,SAAS;QAC5I,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,MAAM,cAAc,GAAe,GAAG,CAAC,kBAAQ,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC;QACjC,MAAM,WAAW,GAAkC,IAAI,GAAG,EAAE,CAAC;QAE7D,MAAM,cAAc,GAAG,EAAE,CAAC;QAC1B,IAAI,eAAe,GAAG,CAAC,CAAC;QAExB,sDAAsD;QACtD,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;YACjE,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,KAAsB,CAAC,CAAC;YAC5D,IAAI,CAAC,UAAU,EAAE,CAAC;gBAAC,SAAS;YAAC,CAAC;YAE9B,IAAI,iBAAiB,GAAG,KAAK,CAAC;YAC9B,IAAI,iBAAiB,GAAiB,EAAE,CAAC;YACzC,IAAI,gBAAgB,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,kBAAQ,CAAC,CAAC;YAErD,IAAI,UAAU,KAAK,cAAc,EAAE,CAAC;gBAChC,iBAAiB,GAAG,IAAI,CAAC;YAE7B,CAAC;iBAAM,CAAC;gBACJ,OAAO,gBAAgB,KAAK,SAAS,EAAE,CAAC;oBACpC,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;oBACzC,IAAI,gBAAgB,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;wBAC/B,iBAAiB,GAAG,IAAI,CAAC;wBACzB,MAAM;oBACV,CAAC;oBACD,gBAAgB,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC,kBAAQ,CAAC,CAAC;gBAC3D,CAAC;YACL,CAAC;YAED,IAAI,iBAAiB,EAAE,CAAC;gBACpB,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBACtC,eAAe,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;gBAC/C,WAAW,CAAC,GAAG,CAAC,UAAU,EAAE,iBAAiB,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7D,CAAC;QACL,CAAC;QAED,MAAM,IAAI,OAAO,CAAA;QACjB,MAAM,IAAI,eAAe,cAAc,CAAC,KAAK,IAAI,CAAC;QAClD,MAAM,IAAI,oBAAoB,cAAc,CAAC,MAAM,aAAa,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;QAC/F,MAAM,IAAI,kBAAkB,eAAe,IAAI,CAAC;QAChD,MAAM,IAAI,OAAO,CAAA;QAEjB,yFAAyF;QACzF,MAAM,cAAc,GAAG,IAAI,OAAO,EAAc,CAAC;QACjD,KAAK,MAAM,CAAC,UAAU,EAAE,iBAAiB,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;YAClE,iBAAiB,CAAC,OAAO,CAAC,CAAC,gBAAgB,EAAE,KAAK,EAAE,EAAE;gBAClD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;oBACxC,MAAM,IAAI,GAAG,IAAA,iBAAS,EAAC,KAAK,CAAC,GAAG,gBAAgB,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,YAAY,gBAAgB,CAAC,KAAK,KAAK,CAAC;oBAC7G,cAAc,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;gBACzC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,UAAU,CAAC,iBAAiB,CAAC;YAC7C,MAAM,KAAK,GAAG,iBAAiB,CAAC,MAAM,CAAC;YACvC,MAAM,MAAM,GAAG,IAAA,iBAAS,EAAC,KAAK,CAAC,CAAC;YAEhC,MAAM,WAAW,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACtE,MAAM,IAAI,GAAG,MAAM,GAAG,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,YAAY,UAAU,CAAC,KAAK,gBAAgB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,IAAI,CAAC;YAE/I,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC1B,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;gBACjC,MAAM,IAAI,GAAG,IAAA,iBAAS,EAAC,KAAK,GAAG,CAAC,CAAC,GAAG,gBAAS,CAAC,SAAS,CAAC,KAAK,KAAK,IAAI,CAAC;YAC3E,CAAC;QACL,CAAC;QAED,OAAO,GAAG,MAAM,EAAE,CAAC;IACvB,CAAC;;AA5UL,wBA+UC","sourcesContent":["import { OPERATION } from './encoding/spec';\nimport { DEFAULT_VIEW_TAG, type DefinitionType } from \"./annotations\";\n\nimport { AssignableProps, NonFunctionPropNames, ToJSON } from './types/HelperTypes';\n\nimport { ChangeSet, ChangeSetName, ChangeTree, IRef, Ref } from './encoder/ChangeTree';\nimport { $changes, $decoder, $deleteByIndex, $descriptors, $encoder, $filter, $getByIndex, $track } from './types/symbols';\nimport { StateView } from './encoder/StateView';\n\nimport { encodeSchemaOperation } from './encoder/EncodeOperation';\nimport { decodeSchemaOperation } from './decoder/DecodeOperation';\n\nimport type { Decoder } from './decoder/Decoder';\nimport type { Metadata, MetadataField } from './Metadata';\nimport { getIndent } from './utils';\n\n/**\n * Schema encoder / decoder\n */\nexport class Schema<C = any> implements IRef {\n static [Symbol.metadata]: Metadata;\n static [$encoder] = encodeSchemaOperation;\n static [$decoder] = decodeSchemaOperation;\n\n /**\n * Assign the property descriptors required to track changes on this instance.\n * @param instance\n */\n static initialize(instance: any) {\n Object.defineProperty(instance, $changes, {\n value: new ChangeTree(instance),\n enumerable: false,\n writable: true\n });\n\n Object.defineProperties(instance, instance.constructor[Symbol.metadata]?.[$descriptors] || {});\n }\n\n static is(type: DefinitionType) {\n return typeof((type as typeof Schema)[Symbol.metadata]) === \"object\";\n }\n\n /**\n * Track property changes\n */\n static [$track] (changeTree: ChangeTree, index: number, operation: OPERATION = OPERATION.ADD) {\n changeTree.change(index, operation);\n }\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: Schema, index: number, view: StateView) {\n const metadata: Metadata = (ref.constructor as typeof Schema)[Symbol.metadata];\n const tag = metadata[index]?.tag;\n\n if (view === undefined) {\n // shared pass/encode: encode if doesn't have a tag\n return tag === undefined;\n\n } else if (tag === undefined) {\n // view pass: no tag\n return true;\n\n } else if (tag === DEFAULT_VIEW_TAG) {\n // view pass: default tag\n return view.isChangeTreeVisible(ref[$changes]);\n\n } else {\n // view pass: custom tag\n const tags = view.tags?.get(ref[$changes]);\n return tags && tags.has(tag);\n }\n }\n\n // allow inherited classes to have a constructor\n constructor(arg?: C) {\n //\n // inline\n // Schema.initialize(this);\n //\n Schema.initialize(this);\n\n //\n // Assign initial values\n //\n if (arg) {\n Object.assign(this, arg);\n }\n }\n\n public assign<T extends Partial<this>>(\n props: AssignableProps<T>,\n ): this {\n Object.assign(this, props);\n return this;\n }\n\n /**\n * (Server-side): Flag a property to be encoded for the next patch.\n * @param instance Schema instance\n * @param property string representing the property name, or number representing the index of the property.\n * @param operation OPERATION to perform (detected automatically)\n */\n public setDirty<K extends NonFunctionPropNames<this>>(property: K | number, operation?: OPERATION) {\n const metadata: Metadata = (this.constructor as typeof Schema)[Symbol.metadata];\n this[$changes].change(\n metadata[metadata[property as string]].index,\n operation\n );\n }\n\n clone (): this {\n // Create instance without calling custom constructor\n const cloned = Object.create(this.constructor.prototype);\n Schema.initialize(cloned);\n\n const metadata: Metadata = (this.constructor as typeof Schema)[Symbol.metadata];\n\n //\n // TODO: clone all properties, not only annotated ones\n //\n // for (const field in this) {\n for (const fieldIndex in metadata) {\n const field = metadata[fieldIndex as any as number].name as keyof this;\n\n if (\n typeof (this[field]) === \"object\" &&\n typeof ((this[field] as any)?.clone) === \"function\"\n ) {\n // deep clone\n cloned[field] = (this[field] as any).clone();\n\n } else {\n // primitive values\n cloned[field] = this[field];\n }\n }\n\n return cloned;\n }\n\n toJSON (this: any): ToJSON<this> {\n const obj: any = {};\n const metadata = this.constructor[Symbol.metadata];\n for (const index in metadata) {\n const field = metadata[index] as MetadataField;\n const fieldName = field.name;\n if (!field.deprecated && this[fieldName] !== null && typeof (this[fieldName]) !== \"undefined\") {\n obj[fieldName] = (typeof (this[fieldName]['toJSON']) === \"function\")\n ? this[fieldName]['toJSON']()\n : this[fieldName];\n }\n }\n return obj;\n }\n\n /**\n * Used in tests only\n * @internal\n */\n discardAllChanges() {\n this[$changes].discardAll();\n }\n\n [$getByIndex](index: number): any {\n const metadata: Metadata = (this.constructor as typeof Schema)[Symbol.metadata];\n return this[metadata[index].name as keyof this];\n }\n\n [$deleteByIndex](index: number): void {\n const metadata: Metadata = (this.constructor as typeof Schema)[Symbol.metadata];\n this[metadata[index].name as keyof this] = undefined;\n }\n\n /**\n * Inspect the `refId` of all Schema instances in the tree. Optionally display the contents of the instance.\n *\n * @param ref Schema instance\n * @param showContents display JSON contents of the instance\n * @returns\n */\n static debugRefIds<T extends Schema>(ref: T, showContents: boolean = false, level: number = 0, decoder?: Decoder, keyPrefix: string = \"\") {\n const contents = (showContents) ? ` - ${JSON.stringify(ref.toJSON())}` : \"\";\n const changeTree: ChangeTree = ref[$changes];\n\n const refId = (decoder) ? decoder.root.refIds.get(ref) : changeTree.refId;\n const root = (decoder) ? decoder.root : changeTree.root;\n\n // log reference count if > 1\n const refCount = (root?.refCount?.[refId] > 1)\n ? ` [×${root.refCount[refId]}]`\n : '';\n\n let output = `${getIndent(level)}${keyPrefix}${ref.constructor.name} (refId: ${refId})${refCount}${contents}\\n`;\n\n changeTree.forEachChild((childChangeTree, indexOrKey) => {\n let key = indexOrKey;\n if (typeof indexOrKey === 'number' && (ref as any)['$indexes']) {\n // MapSchema\n key = (ref as any)['$indexes'].get(indexOrKey) ?? indexOrKey;\n }\n const keyPrefix = ((ref as any)['forEach'] !== undefined && key !== undefined) ? `[\"${key}\"]: ` : \"\";\n output += this.debugRefIds(childChangeTree.ref, showContents, level + 1, decoder, keyPrefix);\n });\n\n return output;\n }\n\n static debugRefIdEncodingOrder<T extends Ref>(ref: T, changeSet: ChangeSetName = 'allChanges') {\n let encodeOrder: number[] = [];\n let current = ref[$changes].root[changeSet].next;\n while (current) {\n if (current.changeTree) {\n encodeOrder.push(current.changeTree.refId);\n }\n current = current.next;\n }\n return encodeOrder;\n }\n\n static debugRefIdsFromDecoder(decoder: Decoder) {\n return this.debugRefIds(decoder.state, false, 0, decoder);\n }\n\n /**\n * Return a string representation of the changes on a Schema instance.\n * The list of changes is cleared after each encode.\n *\n * @param instance Schema instance\n * @param isEncodeAll Return \"full encode\" instead of current change set.\n * @returns\n */\n static debugChanges<T extends Ref>(instance: T, isEncodeAll: boolean = false) {\n const changeTree: ChangeTree = instance[$changes];\n\n const changeSet = (isEncodeAll) ? changeTree.allChanges : changeTree.changes;\n const changeSetName = (isEncodeAll) ? \"allChanges\" : \"changes\";\n\n let output = `${instance.constructor.name} (${changeTree.refId}) -> .${changeSetName}:\\n`;\n\n function dumpChangeSet(changeSet: ChangeSet) {\n changeSet.operations\n .filter(op => op)\n .forEach((index) => {\n const operation = changeTree.indexedOperations[index];\n output += `- [${index}]: ${OPERATION[operation]} (${JSON.stringify(changeTree.getValue(Number(index), isEncodeAll))})\\n`\n });\n }\n\n dumpChangeSet(changeSet);\n\n // display filtered changes\n if (\n !isEncodeAll &&\n changeTree.filteredChanges &&\n (changeTree.filteredChanges.operations).filter(op => op).length > 0\n ) {\n output += `${instance.constructor.name} (${changeTree.refId}) -> .filteredChanges:\\n`;\n dumpChangeSet(changeTree.filteredChanges);\n }\n\n // display filtered changes\n if (\n isEncodeAll &&\n changeTree.allFilteredChanges &&\n (changeTree.allFilteredChanges.operations).filter(op => op).length > 0\n ) {\n output += `${instance.constructor.name} (${changeTree.refId}) -> .allFilteredChanges:\\n`;\n dumpChangeSet(changeTree.allFilteredChanges);\n }\n\n return output;\n }\n\n static debugChangesDeep<T extends Schema>(ref: T, changeSetName: \"changes\" | \"allChanges\" | \"allFilteredChanges\" | \"filteredChanges\" = \"changes\") {\n let output = \"\";\n\n const rootChangeTree: ChangeTree = ref[$changes];\n const root = rootChangeTree.root;\n const changeTrees: Map<ChangeTree, ChangeTree[]> = new Map();\n\n const instanceRefIds = [];\n let totalOperations = 0;\n\n // TODO: FIXME: this method is not working as expected\n for (const [refId, changes] of Object.entries(root[changeSetName])) {\n const changeTree = root.changeTrees[refId as any as number];\n if (!changeTree) { continue; }\n\n let includeChangeTree = false;\n let parentChangeTrees: ChangeTree[] = [];\n let parentChangeTree = changeTree.parent?.[$changes];\n\n if (changeTree === rootChangeTree) {\n includeChangeTree = true;\n\n } else {\n while (parentChangeTree !== undefined) {\n parentChangeTrees.push(parentChangeTree);\n if (parentChangeTree.ref === ref) {\n includeChangeTree = true;\n break;\n }\n parentChangeTree = parentChangeTree.parent?.[$changes];\n }\n }\n\n if (includeChangeTree) {\n instanceRefIds.push(changeTree.refId);\n totalOperations += Object.keys(changes).length;\n changeTrees.set(changeTree, parentChangeTrees.reverse());\n }\n }\n\n output += \"---\\n\"\n output += `root refId: ${rootChangeTree.refId}\\n`;\n output += `Total instances: ${instanceRefIds.length} (refIds: ${instanceRefIds.join(\", \")})\\n`;\n output += `Total changes: ${totalOperations}\\n`;\n output += \"---\\n\"\n\n // based on root.changes, display a tree of changes that has the \"ref\" instance as parent\n const visitedParents = new WeakSet<ChangeTree>();\n for (const [changeTree, parentChangeTrees] of changeTrees.entries()) {\n parentChangeTrees.forEach((parentChangeTree, level) => {\n if (!visitedParents.has(parentChangeTree)) {\n output += `${getIndent(level)}${parentChangeTree.ref.constructor.name} (refId: ${parentChangeTree.refId})\\n`;\n visitedParents.add(parentChangeTree);\n }\n });\n\n const changes = changeTree.indexedOperations;\n const level = parentChangeTrees.length;\n const indent = getIndent(level);\n\n const parentIndex = (level > 0) ? `(${changeTree.parentIndex}) ` : \"\";\n output += `${indent}${parentIndex}${changeTree.ref.constructor.name} (refId: ${changeTree.refId}) - changes: ${Object.keys(changes).length}\\n`;\n\n for (const index in changes) {\n const operation = changes[index];\n output += `${getIndent(level + 1)}${OPERATION[operation]}: ${index}\\n`;\n }\n }\n\n return `${output}`;\n }\n\n\n}\n\n"]}
|
|
1
|
+
{"version":3,"file":"Schema.js","sourceRoot":"","sources":["../src/Schema.ts"],"names":[],"mappings":"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","sourcesContent":["import { OPERATION } from './encoding/spec';\nimport { DEFAULT_VIEW_TAG, type DefinitionType } from \"./annotations\";\n\nimport { AssignableProps, NonFunctionPropNames, ToJSON } from './types/HelperTypes';\n\nimport { ChangeSet, ChangeSetName, ChangeTree, IRef, Ref } from './encoder/ChangeTree';\nimport { $changes, $decoder, $deleteByIndex, $descriptors, $encoder, $filter, $getByIndex, $refId, $track } from './types/symbols';\nimport { StateView } from './encoder/StateView';\n\nimport { encodeSchemaOperation } from './encoder/EncodeOperation';\nimport { decodeSchemaOperation } from './decoder/DecodeOperation';\n\nimport type { Decoder } from './decoder/Decoder';\nimport type { Metadata, MetadataField } from './Metadata';\nimport { getIndent } from './utils';\n\n/**\n * Schema encoder / decoder\n */\nexport class Schema<C = any> implements IRef {\n static [Symbol.metadata]: Metadata;\n static [$encoder] = encodeSchemaOperation;\n static [$decoder] = decodeSchemaOperation;\n\n [$refId]?: number;\n\n /**\n * Assign the property descriptors required to track changes on this instance.\n * @param instance\n */\n static initialize(instance: any) {\n Object.defineProperty(instance, $changes, {\n value: new ChangeTree(instance),\n enumerable: false,\n writable: true\n });\n\n Object.defineProperties(instance, instance.constructor[Symbol.metadata]?.[$descriptors] || {});\n }\n\n static is(type: DefinitionType) {\n return typeof((type as typeof Schema)[Symbol.metadata]) === \"object\";\n }\n\n /**\n * Track property changes\n */\n static [$track] (changeTree: ChangeTree, index: number, operation: OPERATION = OPERATION.ADD) {\n changeTree.change(index, operation);\n }\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: Schema, index: number, view: StateView) {\n const metadata: Metadata = (ref.constructor as typeof Schema)[Symbol.metadata];\n const tag = metadata[index]?.tag;\n\n if (view === undefined) {\n // shared pass/encode: encode if doesn't have a tag\n return tag === undefined;\n\n } else if (tag === undefined) {\n // view pass: no tag\n return true;\n\n } else if (tag === DEFAULT_VIEW_TAG) {\n // view pass: default tag\n return view.isChangeTreeVisible(ref[$changes]);\n\n } else {\n // view pass: custom tag\n const tags = view.tags?.get(ref[$changes]);\n return tags && tags.has(tag);\n }\n }\n\n // allow inherited classes to have a constructor\n constructor(arg?: C) {\n //\n // inline\n // Schema.initialize(this);\n //\n Schema.initialize(this);\n\n //\n // Assign initial values\n //\n if (arg) {\n Object.assign(this, arg);\n }\n }\n\n /**\n * Assign properties to the instance.\n * @param props Properties to assign to the instance\n * @returns\n */\n public assign<T extends Partial<this>>(props: AssignableProps<T>,): this {\n Object.assign(this, props);\n return this;\n }\n\n /**\n * Restore the instance from JSON data.\n * @param jsonData JSON data to restore the instance from\n * @returns\n */\n public restore(jsonData: ToJSON<this>): this {\n const metadata: Metadata = (this.constructor as typeof Schema)[Symbol.metadata];\n\n for (const fieldIndex in metadata) {\n const field = metadata[fieldIndex as any as number];\n const fieldName = field.name as keyof this;\n const fieldType = field.type;\n const value = (jsonData as any)[fieldName];\n\n if (value === undefined || value === null) {\n continue;\n }\n\n if (typeof fieldType === \"string\") {\n // Primitive type: assign directly\n this[fieldName] = value;\n\n } else if (Schema.is(fieldType)) {\n // Schema type: create instance and restore\n const instance = new (fieldType as typeof Schema)();\n instance.restore(value);\n this[fieldName] = instance as any;\n\n } else if (typeof fieldType === \"object\") {\n // Collection types: { map: ... }, { array: ... }, etc.\n const collectionType = Object.keys(fieldType)[0] as string;\n const childType = (fieldType as any)[collectionType];\n\n if (collectionType === \"map\") {\n const mapSchema = this[fieldName] as any;\n for (const key in value) {\n if (Schema.is(childType)) {\n const childInstance = new (childType as typeof Schema)();\n childInstance.restore(value[key]);\n mapSchema.set(key, childInstance);\n } else {\n mapSchema.set(key, value[key]);\n }\n }\n\n } else if (collectionType === \"array\") {\n const arraySchema = this[fieldName] as any;\n for (let i = 0; i < value.length; i++) {\n if (Schema.is(childType)) {\n const childInstance = new (childType as typeof Schema)();\n childInstance.restore(value[i]);\n arraySchema.push(childInstance);\n } else {\n arraySchema.push(value[i]);\n }\n }\n }\n }\n }\n\n return this;\n }\n\n /**\n * (Server-side): Flag a property to be encoded for the next patch.\n * @param instance Schema instance\n * @param property string representing the property name, or number representing the index of the property.\n * @param operation OPERATION to perform (detected automatically)\n */\n public setDirty<K extends NonFunctionPropNames<this>>(property: K | number, operation?: OPERATION) {\n const metadata: Metadata = (this.constructor as typeof Schema)[Symbol.metadata];\n this[$changes].change(\n metadata[metadata[property as string]].index,\n operation\n );\n }\n\n clone (): this {\n // Create instance without calling custom constructor\n const cloned = Object.create(this.constructor.prototype);\n Schema.initialize(cloned);\n\n const metadata: Metadata = (this.constructor as typeof Schema)[Symbol.metadata];\n\n //\n // TODO: clone all properties, not only annotated ones\n //\n // for (const field in this) {\n for (const fieldIndex in metadata) {\n const field = metadata[fieldIndex as any as number].name as keyof this;\n\n if (\n typeof (this[field]) === \"object\" &&\n typeof ((this[field] as any)?.clone) === \"function\"\n ) {\n // deep clone\n cloned[field] = (this[field] as any).clone();\n\n } else {\n // primitive values\n cloned[field] = this[field];\n }\n }\n\n return cloned;\n }\n\n toJSON (this: any): ToJSON<this> {\n const obj: any = {};\n const metadata = this.constructor[Symbol.metadata];\n for (const index in metadata) {\n const field = metadata[index] as MetadataField;\n const fieldName = field.name;\n if (!field.deprecated && this[fieldName] !== null && typeof (this[fieldName]) !== \"undefined\") {\n obj[fieldName] = (typeof (this[fieldName]['toJSON']) === \"function\")\n ? this[fieldName]['toJSON']()\n : this[fieldName];\n }\n }\n return obj;\n }\n\n /**\n * Used in tests only\n * @internal\n */\n discardAllChanges() {\n this[$changes].discardAll();\n }\n\n [$getByIndex](index: number): any {\n const metadata: Metadata = (this.constructor as typeof Schema)[Symbol.metadata];\n return this[metadata[index].name as keyof this];\n }\n\n [$deleteByIndex](index: number): void {\n const metadata: Metadata = (this.constructor as typeof Schema)[Symbol.metadata];\n this[metadata[index].name as keyof this] = undefined;\n }\n\n /**\n * Inspect the `refId` of all Schema instances in the tree. Optionally display the contents of the instance.\n *\n * @param ref Schema instance\n * @param showContents display JSON contents of the instance\n * @returns\n */\n static debugRefIds<T extends Schema>(ref: T, showContents: boolean = false, level: number = 0, decoder?: Decoder, keyPrefix: string = \"\") {\n const contents = (showContents) ? ` - ${JSON.stringify(ref.toJSON())}` : \"\";\n const changeTree: ChangeTree = ref[$changes];\n\n const refId = (ref as IRef)[$refId];\n const root = (decoder) ? decoder.root : changeTree.root;\n\n // log reference count if > 1\n const refCount = (root?.refCount?.[refId] > 1)\n ? ` [×${root.refCount[refId]}]`\n : '';\n\n let output = `${getIndent(level)}${keyPrefix}${ref.constructor.name} (refId: ${refId})${refCount}${contents}\\n`;\n\n changeTree.forEachChild((childChangeTree, indexOrKey) => {\n let key = indexOrKey;\n if (typeof indexOrKey === 'number' && (ref as any)['$indexes']) {\n // MapSchema\n key = (ref as any)['$indexes'].get(indexOrKey) ?? indexOrKey;\n }\n const keyPrefix = ((ref as any)['forEach'] !== undefined && key !== undefined) ? `[\"${key}\"]: ` : \"\";\n output += this.debugRefIds(childChangeTree.ref, showContents, level + 1, decoder, keyPrefix);\n });\n\n return output;\n }\n\n static debugRefIdEncodingOrder<T extends Ref>(ref: T, changeSet: ChangeSetName = 'allChanges') {\n let encodeOrder: number[] = [];\n let current = ref[$changes].root[changeSet].next;\n while (current) {\n if (current.changeTree) {\n encodeOrder.push(current.changeTree.ref[$refId]);\n }\n current = current.next;\n }\n return encodeOrder;\n }\n\n static debugRefIdsFromDecoder(decoder: Decoder) {\n return this.debugRefIds(decoder.state, false, 0, decoder);\n }\n\n /**\n * Return a string representation of the changes on a Schema instance.\n * The list of changes is cleared after each encode.\n *\n * @param instance Schema instance\n * @param isEncodeAll Return \"full encode\" instead of current change set.\n * @returns\n */\n static debugChanges<T extends Ref>(instance: T, isEncodeAll: boolean = false) {\n const changeTree: ChangeTree = instance[$changes];\n\n const changeSet = (isEncodeAll) ? changeTree.allChanges : changeTree.changes;\n const changeSetName = (isEncodeAll) ? \"allChanges\" : \"changes\";\n\n let output = `${instance.constructor.name} (${instance[$refId]}) -> .${changeSetName}:\\n`;\n\n function dumpChangeSet(changeSet: ChangeSet) {\n changeSet.operations\n .filter(op => op)\n .forEach((index) => {\n const operation = changeTree.indexedOperations[index];\n output += `- [${index}]: ${OPERATION[operation]} (${JSON.stringify(changeTree.getValue(Number(index), isEncodeAll))})\\n`\n });\n }\n\n dumpChangeSet(changeSet);\n\n // display filtered changes\n if (\n !isEncodeAll &&\n changeTree.filteredChanges &&\n (changeTree.filteredChanges.operations).filter(op => op).length > 0\n ) {\n output += `${instance.constructor.name} (${instance[$refId]}) -> .filteredChanges:\\n`;\n dumpChangeSet(changeTree.filteredChanges);\n }\n\n // display filtered changes\n if (\n isEncodeAll &&\n changeTree.allFilteredChanges &&\n (changeTree.allFilteredChanges.operations).filter(op => op).length > 0\n ) {\n output += `${instance.constructor.name} (${instance[$refId]}) -> .allFilteredChanges:\\n`;\n dumpChangeSet(changeTree.allFilteredChanges);\n }\n\n return output;\n }\n\n static debugChangesDeep<T extends Schema>(ref: T, changeSetName: \"changes\" | \"allChanges\" | \"allFilteredChanges\" | \"filteredChanges\" = \"changes\") {\n let output = \"\";\n\n const rootChangeTree: ChangeTree = ref[$changes];\n const root = rootChangeTree.root;\n const changeTrees: Map<ChangeTree, ChangeTree[]> = new Map();\n\n const instanceRefIds = [];\n let totalOperations = 0;\n\n // TODO: FIXME: this method is not working as expected\n for (const [refId, changes] of Object.entries(root[changeSetName])) {\n const changeTree = root.changeTrees[refId as any as number];\n if (!changeTree) { continue; }\n\n let includeChangeTree = false;\n let parentChangeTrees: ChangeTree[] = [];\n let parentChangeTree = changeTree.parent?.[$changes];\n\n if (changeTree === rootChangeTree) {\n includeChangeTree = true;\n\n } else {\n while (parentChangeTree !== undefined) {\n parentChangeTrees.push(parentChangeTree);\n if (parentChangeTree.ref === ref) {\n includeChangeTree = true;\n break;\n }\n parentChangeTree = parentChangeTree.parent?.[$changes];\n }\n }\n\n if (includeChangeTree) {\n instanceRefIds.push(changeTree.ref[$refId]);\n totalOperations += Object.keys(changes).length;\n changeTrees.set(changeTree, parentChangeTrees.reverse());\n }\n }\n\n output += \"---\\n\"\n output += `root refId: ${rootChangeTree.ref[$refId]}\\n`;\n output += `Total instances: ${instanceRefIds.length} (refIds: ${instanceRefIds.join(\", \")})\\n`;\n output += `Total changes: ${totalOperations}\\n`;\n output += \"---\\n\"\n\n // based on root.changes, display a tree of changes that has the \"ref\" instance as parent\n const visitedParents = new WeakSet<ChangeTree>();\n for (const [changeTree, parentChangeTrees] of changeTrees.entries()) {\n parentChangeTrees.forEach((parentChangeTree, level) => {\n if (!visitedParents.has(parentChangeTree)) {\n output += `${getIndent(level)}${parentChangeTree.ref.constructor.name} (refId: ${parentChangeTree.ref[$refId]})\\n`;\n visitedParents.add(parentChangeTree);\n }\n });\n\n const changes = changeTree.indexedOperations;\n const level = parentChangeTrees.length;\n const indent = getIndent(level);\n\n const parentIndex = (level > 0) ? `(${changeTree.parentIndex}) ` : \"\";\n output += `${indent}${parentIndex}${changeTree.ref.constructor.name} (refId: ${changeTree.ref[$refId]}) - changes: ${Object.keys(changes).length}\\n`;\n\n for (const index in changes) {\n const operation = changes[index];\n output += `${getIndent(level + 1)}${OPERATION[operation]}: ${index}\\n`;\n }\n }\n\n return `${output}`;\n }\n\n\n}\n\n"]}
|
package/lib/annotations.d.ts
CHANGED
|
@@ -13,22 +13,27 @@ export type DefinitionType<T extends PrimitiveType = PrimitiveType> = T | T[] |
|
|
|
13
13
|
type: T;
|
|
14
14
|
default?: InferValueType<T>;
|
|
15
15
|
view?: boolean | number;
|
|
16
|
+
sync?: boolean;
|
|
16
17
|
} | {
|
|
17
18
|
array: T;
|
|
18
19
|
default?: ArraySchema<InferValueType<T>>;
|
|
19
20
|
view?: boolean | number;
|
|
21
|
+
sync?: boolean;
|
|
20
22
|
} | {
|
|
21
23
|
map: T;
|
|
22
24
|
default?: MapSchema<InferValueType<T>>;
|
|
23
25
|
view?: boolean | number;
|
|
26
|
+
sync?: boolean;
|
|
24
27
|
} | {
|
|
25
28
|
collection: T;
|
|
26
29
|
default?: CollectionSchema<InferValueType<T>>;
|
|
27
30
|
view?: boolean | number;
|
|
31
|
+
sync?: boolean;
|
|
28
32
|
} | {
|
|
29
33
|
set: T;
|
|
30
34
|
default?: SetSchema<InferValueType<T>>;
|
|
31
35
|
view?: boolean | number;
|
|
36
|
+
sync?: boolean;
|
|
32
37
|
};
|
|
33
38
|
export type Definition = {
|
|
34
39
|
[field: string]: DefinitionType;
|
|
@@ -58,7 +63,7 @@ export declare function view<T>(tag?: number): (target: T, fieldName: string) =>
|
|
|
58
63
|
export declare function unreliable<T>(target: T, field: string): void;
|
|
59
64
|
export declare function type(type: DefinitionType, options?: TypeOptions): PropertyDecorator;
|
|
60
65
|
export declare function getPropertyDescriptor(fieldCached: string, fieldIndex: number, type: DefinitionType, complexTypeKlass: TypeDefinition): {
|
|
61
|
-
get: (this: Schema) => ((index: number) => any) | ((index: number) => void) | (() => Schema<any>) | (<T extends Partial<Schema<any>>>(props: AssignableProps<T>) => Schema<any>) | (<K extends
|
|
66
|
+
get: (this: Schema) => number | ((index: number) => any) | ((index: number) => void) | (() => Schema<any>) | (<T extends Partial<Schema<any>>>(props: AssignableProps<T>) => Schema<any>) | ((jsonData: import("./types/HelperTypes").ToJSON<Schema<any>>) => Schema<any>) | (<K extends "~refId">(property: number | K, operation?: OPERATION) => void) | ((this: any) => import("./types/HelperTypes").ToJSON<Schema<any>>) | (() => void);
|
|
62
67
|
set: (this: Schema, value: any) => void;
|
|
63
68
|
enumerable: boolean;
|
|
64
69
|
configurable: boolean;
|
package/lib/annotations.js
CHANGED
|
@@ -396,7 +396,10 @@ function schema(fieldsAndMethods, name, inherits = Schema_1.Schema) {
|
|
|
396
396
|
? exports.DEFAULT_VIEW_TAG
|
|
397
397
|
: value['view'];
|
|
398
398
|
}
|
|
399
|
-
|
|
399
|
+
// allow to define a field as not synced
|
|
400
|
+
if (value['sync'] !== false) {
|
|
401
|
+
fields[fieldName] = (0, Metadata_1.getNormalizedType)(value);
|
|
402
|
+
}
|
|
400
403
|
// If no explicit default provided, handle automatic instantiation for collection types
|
|
401
404
|
if (!Object.prototype.hasOwnProperty.call(value, 'default')) {
|
|
402
405
|
// TODO: remove Array.isArray() check. Use ['array'] !== undefined only.
|
|
@@ -418,12 +421,7 @@ function schema(fieldsAndMethods, name, inherits = Schema_1.Schema) {
|
|
|
418
421
|
}
|
|
419
422
|
else if (value['type'] !== undefined && Schema_1.Schema.is(value['type'])) {
|
|
420
423
|
// Direct Schema type: Type → new Type()
|
|
421
|
-
|
|
422
|
-
// only auto-initialize Schema instances if:
|
|
423
|
-
// - they don't have an initialize method
|
|
424
|
-
// - or initialize method doesn't accept any parameters
|
|
425
|
-
defaultValues[fieldName] = new value['type']();
|
|
426
|
-
}
|
|
424
|
+
defaultValues[fieldName] = new value['type']();
|
|
427
425
|
}
|
|
428
426
|
}
|
|
429
427
|
else {
|
|
@@ -433,12 +431,7 @@ function schema(fieldsAndMethods, name, inherits = Schema_1.Schema) {
|
|
|
433
431
|
else if (typeof (value) === "function") {
|
|
434
432
|
if (Schema_1.Schema.is(value)) {
|
|
435
433
|
// Direct Schema type: Type → new Type()
|
|
436
|
-
|
|
437
|
-
// only auto-initialize Schema instances if:
|
|
438
|
-
// - they don't have an initialize method
|
|
439
|
-
// - or initialize method doesn't accept any parameters
|
|
440
|
-
defaultValues[fieldName] = new value();
|
|
441
|
-
}
|
|
434
|
+
defaultValues[fieldName] = new value();
|
|
442
435
|
fields[fieldName] = (0, Metadata_1.getNormalizedType)(value);
|
|
443
436
|
}
|
|
444
437
|
else {
|
|
@@ -465,32 +458,13 @@ function schema(fieldsAndMethods, name, inherits = Schema_1.Schema) {
|
|
|
465
458
|
}
|
|
466
459
|
return defaults;
|
|
467
460
|
};
|
|
468
|
-
const getParentProps = (props) => {
|
|
469
|
-
const fieldNames = Object.keys(fields);
|
|
470
|
-
const parentProps = {};
|
|
471
|
-
for (const key in props) {
|
|
472
|
-
if (!fieldNames.includes(key)) {
|
|
473
|
-
parentProps[key] = props[key];
|
|
474
|
-
}
|
|
475
|
-
}
|
|
476
|
-
return parentProps;
|
|
477
|
-
};
|
|
478
461
|
/** @codegen-ignore */
|
|
479
462
|
const klass = Metadata_1.Metadata.setFields(class extends inherits {
|
|
480
463
|
constructor(...args) {
|
|
464
|
+
super(Object.assign({}, getDefaultValues(), args[0] || {}));
|
|
481
465
|
// call initialize method
|
|
482
466
|
if (methods.initialize && typeof methods.initialize === 'function') {
|
|
483
|
-
|
|
484
|
-
/**
|
|
485
|
-
* only call initialize() in the current class, not the parent ones.
|
|
486
|
-
* see "should not call initialize automatically when creating an instance of inherited Schema"
|
|
487
|
-
*/
|
|
488
|
-
if (new.target === klass) {
|
|
489
|
-
methods.initialize.apply(this, args);
|
|
490
|
-
}
|
|
491
|
-
}
|
|
492
|
-
else {
|
|
493
|
-
super(Object.assign({}, getDefaultValues(), args[0] || {}));
|
|
467
|
+
methods.initialize.apply(this, args);
|
|
494
468
|
}
|
|
495
469
|
}
|
|
496
470
|
}, fields);
|