@colyseus/schema 4.0.1 → 4.0.2
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 → index.cjs} +1 -1
- package/build/cjs/index.cjs.map +1 -0
- package/build/esm/index.mjs.map +1 -1
- package/lib/Metadata.js +54 -58
- package/lib/Metadata.js.map +1 -1
- package/lib/Reflection.js +29 -32
- package/lib/Reflection.js.map +1 -1
- package/lib/Schema.js +41 -45
- package/lib/Schema.js.map +1 -1
- package/lib/annotations.d.ts +1 -1
- package/lib/annotations.js +58 -69
- package/lib/annotations.js.map +1 -1
- package/lib/bench_encode.js +24 -59
- package/lib/bench_encode.js.map +1 -1
- package/lib/benchmark.d.ts +1 -0
- package/lib/benchmark.js +218 -0
- package/lib/benchmark.js.map +1 -0
- package/lib/codegen/api.js +10 -41
- package/lib/codegen/api.js.map +1 -1
- package/lib/codegen/argv.js +1 -3
- package/lib/codegen/argv.js.map +1 -1
- package/lib/codegen/cli.js +4 -9
- package/lib/codegen/cli.js.map +1 -1
- package/lib/codegen/languages/cpp.js +5 -8
- package/lib/codegen/languages/cpp.js.map +1 -1
- package/lib/codegen/languages/csharp.js +5 -8
- package/lib/codegen/languages/csharp.js.map +1 -1
- package/lib/codegen/languages/haxe.js +3 -6
- package/lib/codegen/languages/haxe.js.map +1 -1
- package/lib/codegen/languages/java.js +3 -6
- package/lib/codegen/languages/java.js.map +1 -1
- package/lib/codegen/languages/js.js +4 -7
- package/lib/codegen/languages/js.js.map +1 -1
- package/lib/codegen/languages/lua.js +4 -7
- package/lib/codegen/languages/lua.js.map +1 -1
- package/lib/codegen/languages/ts.js +5 -8
- package/lib/codegen/languages/ts.js.map +1 -1
- package/lib/codegen/parser.js +22 -59
- package/lib/codegen/parser.js.map +1 -1
- package/lib/codegen/types.js +12 -51
- package/lib/codegen/types.js.map +1 -1
- package/lib/decoder/DecodeOperation.js +44 -51
- package/lib/decoder/DecodeOperation.js.map +1 -1
- package/lib/decoder/Decoder.js +24 -28
- package/lib/decoder/Decoder.js.map +1 -1
- package/lib/decoder/ReferenceTracker.js +10 -14
- package/lib/decoder/ReferenceTracker.js.map +1 -1
- package/lib/decoder/strategy/Callbacks.js +39 -43
- package/lib/decoder/strategy/Callbacks.js.map +1 -1
- package/lib/decoder/strategy/RawChanges.js +1 -4
- package/lib/decoder/strategy/RawChanges.js.map +1 -1
- package/lib/decoder/strategy/getDecoderStateCallbacks.js +24 -27
- package/lib/decoder/strategy/getDecoderStateCallbacks.js.map +1 -1
- package/lib/encoder/ChangeTree.js +36 -44
- package/lib/encoder/ChangeTree.js.map +1 -1
- package/lib/encoder/EncodeOperation.js +25 -32
- package/lib/encoder/EncodeOperation.js.map +1 -1
- package/lib/encoder/Encoder.js +25 -29
- package/lib/encoder/Encoder.js.map +1 -1
- package/lib/encoder/Root.js +17 -21
- package/lib/encoder/Root.js.map +1 -1
- package/lib/encoder/StateView.js +40 -45
- package/lib/encoder/StateView.js.map +1 -1
- package/lib/encoding/assert.js +3 -9
- package/lib/encoding/assert.js.map +1 -1
- package/lib/encoding/decode.js +2 -6
- package/lib/encoding/decode.js.map +1 -1
- package/lib/encoding/encode.js +1 -4
- package/lib/encoding/encode.js.map +1 -1
- package/lib/encoding/spec.js +4 -7
- package/lib/encoding/spec.js.map +1 -1
- package/lib/index.d.ts +2 -2
- package/lib/index.js +33 -75
- package/lib/index.js.map +1 -1
- package/lib/src/Metadata.d.ts +49 -0
- package/lib/src/Metadata.js +256 -0
- package/lib/src/Metadata.js.map +1 -0
- package/lib/src/Reflection.d.ts +71 -0
- package/lib/src/Reflection.js +179 -0
- package/lib/src/Reflection.js.map +1 -0
- package/lib/src/Schema.d.ts +86 -0
- package/lib/src/Schema.js +352 -0
- package/lib/src/Schema.js.map +1 -0
- package/lib/src/annotations.d.ts +109 -0
- package/lib/src/annotations.js +473 -0
- package/lib/src/annotations.js.map +1 -0
- package/lib/src/bench_encode.d.ts +1 -0
- package/lib/src/bench_encode.js +91 -0
- package/lib/src/bench_encode.js.map +1 -0
- package/lib/src/codegen/api.d.ts +7 -0
- package/lib/src/codegen/api.js +56 -0
- package/lib/src/codegen/api.js.map +1 -0
- package/lib/src/codegen/argv.d.ts +6 -0
- package/lib/src/codegen/argv.js +39 -0
- package/lib/src/codegen/argv.js.map +1 -0
- package/lib/src/codegen/cli.d.ts +1 -0
- package/lib/src/codegen/cli.js +58 -0
- package/lib/src/codegen/cli.js.map +1 -0
- package/lib/src/codegen/languages/cpp.d.ts +3 -0
- package/lib/src/codegen/languages/cpp.js +258 -0
- package/lib/src/codegen/languages/cpp.js.map +1 -0
- package/lib/src/codegen/languages/csharp.d.ts +4 -0
- package/lib/src/codegen/languages/csharp.js +154 -0
- package/lib/src/codegen/languages/csharp.js.map +1 -0
- package/lib/src/codegen/languages/haxe.d.ts +3 -0
- package/lib/src/codegen/languages/haxe.js +100 -0
- package/lib/src/codegen/languages/haxe.js.map +1 -0
- package/lib/src/codegen/languages/java.d.ts +6 -0
- package/lib/src/codegen/languages/java.js +100 -0
- package/lib/src/codegen/languages/java.js.map +1 -0
- package/lib/src/codegen/languages/js.d.ts +3 -0
- package/lib/src/codegen/languages/js.js +101 -0
- package/lib/src/codegen/languages/js.js.map +1 -0
- package/lib/src/codegen/languages/lua.d.ts +3 -0
- package/lib/src/codegen/languages/lua.js +103 -0
- package/lib/src/codegen/languages/lua.js.map +1 -0
- package/lib/src/codegen/languages/ts.d.ts +3 -0
- package/lib/src/codegen/languages/ts.js +116 -0
- package/lib/src/codegen/languages/ts.js.map +1 -0
- package/lib/src/codegen/parser.d.ts +13 -0
- package/lib/src/codegen/parser.js +327 -0
- package/lib/src/codegen/parser.js.map +1 -0
- package/lib/src/codegen/types.d.ts +52 -0
- package/lib/src/codegen/types.js +142 -0
- package/lib/src/codegen/types.js.map +1 -0
- package/lib/src/decoder/DecodeOperation.d.ts +23 -0
- package/lib/src/decoder/DecodeOperation.js +248 -0
- package/lib/src/decoder/DecodeOperation.js.map +1 -0
- package/lib/src/decoder/Decoder.d.ts +21 -0
- package/lib/src/decoder/Decoder.js +114 -0
- package/lib/src/decoder/Decoder.js.map +1 -0
- package/lib/src/decoder/ReferenceTracker.d.ts +25 -0
- package/lib/src/decoder/ReferenceTracker.js +135 -0
- package/lib/src/decoder/ReferenceTracker.js.map +1 -0
- package/lib/src/decoder/strategy/Callbacks.d.ts +154 -0
- package/lib/src/decoder/strategy/Callbacks.js +336 -0
- package/lib/src/decoder/strategy/Callbacks.js.map +1 -0
- package/lib/src/decoder/strategy/RawChanges.d.ts +3 -0
- package/lib/src/decoder/strategy/RawChanges.js +4 -0
- package/lib/src/decoder/strategy/RawChanges.js.map +1 -0
- package/lib/src/decoder/strategy/getDecoderStateCallbacks.d.ts +76 -0
- package/lib/src/decoder/strategy/getDecoderStateCallbacks.js +274 -0
- package/lib/src/decoder/strategy/getDecoderStateCallbacks.js.map +1 -0
- package/lib/src/encoder/ChangeTree.d.ts +135 -0
- package/lib/src/encoder/ChangeTree.js +534 -0
- package/lib/src/encoder/ChangeTree.js.map +1 -0
- package/lib/src/encoder/EncodeOperation.d.ts +22 -0
- package/lib/src/encoder/EncodeOperation.js +132 -0
- package/lib/src/encoder/EncodeOperation.js.map +1 -0
- package/lib/src/encoder/Encoder.d.ts +22 -0
- package/lib/src/encoder/Encoder.js +204 -0
- package/lib/src/encoder/Encoder.js.map +1 -0
- package/lib/src/encoder/Root.d.ts +28 -0
- package/lib/src/encoder/Root.js +229 -0
- package/lib/src/encoder/Root.js.map +1 -0
- package/lib/src/encoder/StateView.d.ts +34 -0
- package/lib/src/encoder/StateView.js +279 -0
- package/lib/src/encoder/StateView.js.map +1 -0
- package/lib/src/encoding/assert.d.ts +10 -0
- package/lib/src/encoding/assert.js +49 -0
- package/lib/src/encoding/assert.js.map +1 -0
- package/lib/src/encoding/decode.d.ts +67 -0
- package/lib/src/encoding/decode.js +217 -0
- package/lib/src/encoding/decode.js.map +1 -0
- package/lib/src/encoding/encode.d.ts +40 -0
- package/lib/src/encoding/encode.js +279 -0
- package/lib/src/encoding/encode.js.map +1 -0
- package/lib/src/encoding/spec.d.ts +24 -0
- package/lib/src/encoding/spec.js +26 -0
- package/lib/src/encoding/spec.js.map +1 -0
- package/lib/src/index.d.ts +32 -0
- package/lib/src/index.js +39 -0
- package/lib/src/index.js.map +1 -0
- package/lib/src/symbol.shim.d.ts +6 -0
- package/lib/src/symbol.shim.js +3 -0
- package/lib/src/symbol.shim.js.map +1 -0
- package/lib/src/types/HelperTypes.d.ts +77 -0
- package/lib/src/types/HelperTypes.js +2 -0
- package/lib/src/types/HelperTypes.js.map +1 -0
- package/lib/src/types/TypeContext.d.ts +31 -0
- package/lib/src/types/TypeContext.js +143 -0
- package/lib/src/types/TypeContext.js.map +1 -0
- package/lib/src/types/custom/ArraySchema.d.ts +270 -0
- package/lib/src/types/custom/ArraySchema.js +733 -0
- package/lib/src/types/custom/ArraySchema.js.map +1 -0
- package/lib/src/types/custom/CollectionSchema.d.ts +51 -0
- package/lib/src/types/custom/CollectionSchema.js +170 -0
- package/lib/src/types/custom/CollectionSchema.js.map +1 -0
- package/lib/src/types/custom/MapSchema.d.ts +51 -0
- package/lib/src/types/custom/MapSchema.js +222 -0
- package/lib/src/types/custom/MapSchema.js.map +1 -0
- package/lib/src/types/custom/SetSchema.d.ts +48 -0
- package/lib/src/types/custom/SetSchema.js +178 -0
- package/lib/src/types/custom/SetSchema.js.map +1 -0
- package/lib/src/types/registry.d.ts +16 -0
- package/lib/src/types/registry.js +30 -0
- package/lib/src/types/registry.js.map +1 -0
- package/lib/src/types/symbols.d.ts +33 -0
- package/lib/src/types/symbols.js +34 -0
- package/lib/src/types/symbols.js.map +1 -0
- package/lib/src/types/utils.d.ts +1 -0
- package/lib/src/types/utils.js +13 -0
- package/lib/src/types/utils.js.map +1 -0
- package/lib/src/utils.d.ts +13 -0
- package/lib/src/utils.js +49 -0
- package/lib/src/utils.js.map +1 -0
- package/lib/src/v3_bench.d.ts +1 -0
- package/lib/src/v3_bench.js +128 -0
- package/lib/src/v3_bench.js.map +1 -0
- package/lib/symbol.shim.js +1 -2
- package/lib/symbol.shim.js.map +1 -1
- package/lib/types/HelperTypes.js +1 -2
- package/lib/types/TypeContext.js +8 -12
- package/lib/types/TypeContext.js.map +1 -1
- package/lib/types/custom/ArraySchema.js +63 -67
- package/lib/types/custom/ArraySchema.js.map +1 -1
- package/lib/types/custom/CollectionSchema.js +27 -31
- package/lib/types/custom/CollectionSchema.js.map +1 -1
- package/lib/types/custom/MapSchema.js +37 -41
- package/lib/types/custom/MapSchema.js.map +1 -1
- package/lib/types/custom/SetSchema.js +28 -32
- package/lib/types/custom/SetSchema.js.map +1 -1
- package/lib/types/registry.js +13 -20
- package/lib/types/registry.js.map +1 -1
- package/lib/types/symbols.js +16 -19
- package/lib/types/symbols.js.map +1 -1
- package/lib/types/utils.js +1 -4
- package/lib/types/utils.js.map +1 -1
- package/lib/utils.js +9 -14
- package/lib/utils.js.map +1 -1
- package/lib/v3_bench.js +17 -19
- package/lib/v3_bench.js.map +1 -1
- package/package.json +9 -7
- package/src/codegen/api.ts +7 -0
- package/src/codegen/parser.ts +2 -2
- package/src/codegen/types.ts +5 -0
- package/src/index.ts +2 -2
- package/build/cjs/index.js.map +0 -1
- package/src/bench_encode.ts +0 -64
|
@@ -0,0 +1 @@
|
|
|
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"]}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import "./symbol.shim";
|
|
2
|
+
import { Schema } from './Schema';
|
|
3
|
+
import { ArraySchema } from './types/custom/ArraySchema';
|
|
4
|
+
import { MapSchema } from './types/custom/MapSchema';
|
|
5
|
+
import { TypeDefinition } from "./types/registry";
|
|
6
|
+
import { OPERATION } from "./encoding/spec";
|
|
7
|
+
import type { InferValueType, InferSchemaInstanceType, AssignableProps } from "./types/HelperTypes";
|
|
8
|
+
import { CollectionSchema } from "./types/custom/CollectionSchema";
|
|
9
|
+
import { SetSchema } from "./types/custom/SetSchema";
|
|
10
|
+
export type RawPrimitiveType = "string" | "number" | "boolean" | "int8" | "uint8" | "int16" | "uint16" | "int32" | "uint32" | "int64" | "uint64" | "float32" | "float64" | "bigint64" | "biguint64";
|
|
11
|
+
export type PrimitiveType = RawPrimitiveType | typeof Schema | object;
|
|
12
|
+
export type DefinitionType<T extends PrimitiveType = PrimitiveType> = T | T[] | {
|
|
13
|
+
type: T;
|
|
14
|
+
default?: InferValueType<T>;
|
|
15
|
+
view?: boolean | number;
|
|
16
|
+
sync?: boolean;
|
|
17
|
+
} | {
|
|
18
|
+
array: T;
|
|
19
|
+
default?: ArraySchema<InferValueType<T>>;
|
|
20
|
+
view?: boolean | number;
|
|
21
|
+
sync?: boolean;
|
|
22
|
+
} | {
|
|
23
|
+
map: T;
|
|
24
|
+
default?: MapSchema<InferValueType<T>>;
|
|
25
|
+
view?: boolean | number;
|
|
26
|
+
sync?: boolean;
|
|
27
|
+
} | {
|
|
28
|
+
collection: T;
|
|
29
|
+
default?: CollectionSchema<InferValueType<T>>;
|
|
30
|
+
view?: boolean | number;
|
|
31
|
+
sync?: boolean;
|
|
32
|
+
} | {
|
|
33
|
+
set: T;
|
|
34
|
+
default?: SetSchema<InferValueType<T>>;
|
|
35
|
+
view?: boolean | number;
|
|
36
|
+
sync?: boolean;
|
|
37
|
+
};
|
|
38
|
+
export type Definition = {
|
|
39
|
+
[field: string]: DefinitionType;
|
|
40
|
+
};
|
|
41
|
+
export interface TypeOptions {
|
|
42
|
+
manual?: boolean;
|
|
43
|
+
}
|
|
44
|
+
export declare const DEFAULT_VIEW_TAG = -1;
|
|
45
|
+
export declare function entity(constructor: any): any;
|
|
46
|
+
/**
|
|
47
|
+
* [See documentation](https://docs.colyseus.io/state/schema/)
|
|
48
|
+
*
|
|
49
|
+
* Annotate a Schema property to be serializeable.
|
|
50
|
+
* \@type()'d fields are automatically flagged as "dirty" for the next patch.
|
|
51
|
+
*
|
|
52
|
+
* @example Standard usage, with automatic change tracking.
|
|
53
|
+
* ```
|
|
54
|
+
* \@type("string") propertyName: string;
|
|
55
|
+
* ```
|
|
56
|
+
*
|
|
57
|
+
* @example You can provide the "manual" option if you'd like to manually control your patches via .setDirty().
|
|
58
|
+
* ```
|
|
59
|
+
* \@type("string", { manual: true })
|
|
60
|
+
* ```
|
|
61
|
+
*/
|
|
62
|
+
export declare function view<T>(tag?: number): (target: T, fieldName: string) => void;
|
|
63
|
+
export declare function unreliable<T>(target: T, field: string): void;
|
|
64
|
+
export declare function type(type: DefinitionType, options?: TypeOptions): PropertyDecorator;
|
|
65
|
+
export declare function getPropertyDescriptor(fieldCached: string, fieldIndex: number, type: DefinitionType, complexTypeKlass: TypeDefinition): {
|
|
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);
|
|
67
|
+
set: (this: Schema, value: any) => void;
|
|
68
|
+
enumerable: boolean;
|
|
69
|
+
configurable: boolean;
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* `@deprecated()` flag a field as deprecated.
|
|
73
|
+
* The previous `@type()` annotation should remain along with this one.
|
|
74
|
+
*/
|
|
75
|
+
export declare function deprecated(throws?: boolean): PropertyDecorator;
|
|
76
|
+
export declare function defineTypes(target: typeof Schema, fields: Definition, options?: TypeOptions): typeof Schema;
|
|
77
|
+
type ExtractInitProps<T> = T extends {
|
|
78
|
+
initialize: (...args: infer P) => void;
|
|
79
|
+
} ? P extends readonly [] ? never : P extends readonly [infer First] ? First extends object ? First : P : P : T extends Definition ? AssignableProps<InferSchemaInstanceType<T>> : never;
|
|
80
|
+
type IsInitPropsRequired<T> = T extends {
|
|
81
|
+
initialize: (props: any) => void;
|
|
82
|
+
} ? true : T extends {
|
|
83
|
+
initialize: (...args: infer P) => void;
|
|
84
|
+
} ? P extends readonly [] ? false : true : false;
|
|
85
|
+
export interface SchemaWithExtends<T extends Definition, P extends typeof Schema> {
|
|
86
|
+
extends: <T2 extends Definition = Definition>(fields: T2 & ThisType<InferSchemaInstanceType<T & T2>>, name?: string) => SchemaWithExtendsConstructor<T & T2, ExtractInitProps<T2>, P>;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Get the type of the schema defined via `schema({...})` method.
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* const Entity = schema({
|
|
93
|
+
* x: "number",
|
|
94
|
+
* y: "number",
|
|
95
|
+
* });
|
|
96
|
+
* type Entity = SchemaType<typeof Entity>;
|
|
97
|
+
*/
|
|
98
|
+
export type SchemaType<T extends {
|
|
99
|
+
'~type': any;
|
|
100
|
+
}> = T['~type'];
|
|
101
|
+
export interface SchemaWithExtendsConstructor<T extends Definition, InitProps, P extends typeof Schema> extends SchemaWithExtends<T, P> {
|
|
102
|
+
'~type': InferSchemaInstanceType<T>;
|
|
103
|
+
new (...args: [InitProps] extends [never] ? [] : InitProps extends readonly any[] ? InitProps : IsInitPropsRequired<T> extends true ? [InitProps] : [InitProps?]): InferSchemaInstanceType<T> & InstanceType<P>;
|
|
104
|
+
prototype: InferSchemaInstanceType<T> & InstanceType<P> & {
|
|
105
|
+
initialize(...args: [InitProps] extends [never] ? [] : InitProps extends readonly any[] ? InitProps : [InitProps]): void;
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
export declare function schema<T extends Record<string, DefinitionType>, P extends typeof Schema = typeof Schema>(fieldsAndMethods: T & ThisType<InferSchemaInstanceType<T>>, name?: string, inherits?: P): SchemaWithExtendsConstructor<T, ExtractInitProps<T>, P>;
|
|
109
|
+
export {};
|
|
@@ -0,0 +1,473 @@
|
|
|
1
|
+
import "./symbol.shim";
|
|
2
|
+
import { Schema } from './Schema';
|
|
3
|
+
import { ArraySchema } from './types/custom/ArraySchema';
|
|
4
|
+
import { MapSchema } from './types/custom/MapSchema';
|
|
5
|
+
import { getNormalizedType, Metadata } from "./Metadata";
|
|
6
|
+
import { $changes, $childType, $descriptors, $numFields, $track } from "./types/symbols";
|
|
7
|
+
import { getType } from "./types/registry";
|
|
8
|
+
import { OPERATION } from "./encoding/spec";
|
|
9
|
+
import { TypeContext } from "./types/TypeContext";
|
|
10
|
+
import { assertInstanceType, assertType } from "./encoding/assert";
|
|
11
|
+
import { CollectionSchema } from "./types/custom/CollectionSchema";
|
|
12
|
+
import { SetSchema } from "./types/custom/SetSchema";
|
|
13
|
+
export const DEFAULT_VIEW_TAG = -1;
|
|
14
|
+
export function entity(constructor) {
|
|
15
|
+
TypeContext.register(constructor);
|
|
16
|
+
return constructor;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* [See documentation](https://docs.colyseus.io/state/schema/)
|
|
20
|
+
*
|
|
21
|
+
* Annotate a Schema property to be serializeable.
|
|
22
|
+
* \@type()'d fields are automatically flagged as "dirty" for the next patch.
|
|
23
|
+
*
|
|
24
|
+
* @example Standard usage, with automatic change tracking.
|
|
25
|
+
* ```
|
|
26
|
+
* \@type("string") propertyName: string;
|
|
27
|
+
* ```
|
|
28
|
+
*
|
|
29
|
+
* @example You can provide the "manual" option if you'd like to manually control your patches via .setDirty().
|
|
30
|
+
* ```
|
|
31
|
+
* \@type("string", { manual: true })
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
// export function type(type: DefinitionType, options?: TypeOptions) {
|
|
35
|
+
// return function ({ get, set }, context: ClassAccessorDecoratorContext): ClassAccessorDecoratorResult<Schema, any> {
|
|
36
|
+
// if (context.kind !== "accessor") {
|
|
37
|
+
// throw new Error("@type() is only supported for class accessor properties");
|
|
38
|
+
// }
|
|
39
|
+
// const field = context.name.toString();
|
|
40
|
+
// //
|
|
41
|
+
// // detect index for this field, considering inheritance
|
|
42
|
+
// //
|
|
43
|
+
// const parent = Object.getPrototypeOf(context.metadata);
|
|
44
|
+
// let fieldIndex: number = context.metadata[$numFields] // current structure already has fields defined
|
|
45
|
+
// ?? (parent && parent[$numFields]) // parent structure has fields defined
|
|
46
|
+
// ?? -1; // no fields defined
|
|
47
|
+
// fieldIndex++;
|
|
48
|
+
// if (
|
|
49
|
+
// !parent && // the parent already initializes the `$changes` property
|
|
50
|
+
// !Metadata.hasFields(context.metadata)
|
|
51
|
+
// ) {
|
|
52
|
+
// context.addInitializer(function (this: Ref) {
|
|
53
|
+
// Object.defineProperty(this, $changes, {
|
|
54
|
+
// value: new ChangeTree(this),
|
|
55
|
+
// enumerable: false,
|
|
56
|
+
// writable: true
|
|
57
|
+
// });
|
|
58
|
+
// });
|
|
59
|
+
// }
|
|
60
|
+
// Metadata.addField(context.metadata, fieldIndex, field, type);
|
|
61
|
+
// const isArray = ArraySchema.is(type);
|
|
62
|
+
// const isMap = !isArray && MapSchema.is(type);
|
|
63
|
+
// // if (options && options.manual) {
|
|
64
|
+
// // // do not declare getter/setter descriptor
|
|
65
|
+
// // definition.descriptors[field] = {
|
|
66
|
+
// // enumerable: true,
|
|
67
|
+
// // configurable: true,
|
|
68
|
+
// // writable: true,
|
|
69
|
+
// // };
|
|
70
|
+
// // return;
|
|
71
|
+
// // }
|
|
72
|
+
// return {
|
|
73
|
+
// init(value) {
|
|
74
|
+
// // TODO: may need to convert ArraySchema/MapSchema here
|
|
75
|
+
// // do not flag change if value is undefined.
|
|
76
|
+
// if (value !== undefined) {
|
|
77
|
+
// this[$changes].change(fieldIndex);
|
|
78
|
+
// // automaticallty transform Array into ArraySchema
|
|
79
|
+
// if (isArray) {
|
|
80
|
+
// if (!(value instanceof ArraySchema)) {
|
|
81
|
+
// value = new ArraySchema(...value);
|
|
82
|
+
// }
|
|
83
|
+
// value[$childType] = Object.values(type)[0];
|
|
84
|
+
// }
|
|
85
|
+
// // automaticallty transform Map into MapSchema
|
|
86
|
+
// if (isMap) {
|
|
87
|
+
// if (!(value instanceof MapSchema)) {
|
|
88
|
+
// value = new MapSchema(value);
|
|
89
|
+
// }
|
|
90
|
+
// value[$childType] = Object.values(type)[0];
|
|
91
|
+
// }
|
|
92
|
+
// // try to turn provided structure into a Proxy
|
|
93
|
+
// if (value['$proxy'] === undefined) {
|
|
94
|
+
// if (isMap) {
|
|
95
|
+
// value = getMapProxy(value);
|
|
96
|
+
// }
|
|
97
|
+
// }
|
|
98
|
+
// }
|
|
99
|
+
// return value;
|
|
100
|
+
// },
|
|
101
|
+
// get() {
|
|
102
|
+
// return get.call(this);
|
|
103
|
+
// },
|
|
104
|
+
// set(value: any) {
|
|
105
|
+
// /**
|
|
106
|
+
// * Create Proxy for array or map items
|
|
107
|
+
// */
|
|
108
|
+
// // skip if value is the same as cached.
|
|
109
|
+
// if (value === get.call(this)) {
|
|
110
|
+
// return;
|
|
111
|
+
// }
|
|
112
|
+
// if (
|
|
113
|
+
// value !== undefined &&
|
|
114
|
+
// value !== null
|
|
115
|
+
// ) {
|
|
116
|
+
// // automaticallty transform Array into ArraySchema
|
|
117
|
+
// if (isArray) {
|
|
118
|
+
// if (!(value instanceof ArraySchema)) {
|
|
119
|
+
// value = new ArraySchema(...value);
|
|
120
|
+
// }
|
|
121
|
+
// value[$childType] = Object.values(type)[0];
|
|
122
|
+
// }
|
|
123
|
+
// // automaticallty transform Map into MapSchema
|
|
124
|
+
// if (isMap) {
|
|
125
|
+
// if (!(value instanceof MapSchema)) {
|
|
126
|
+
// value = new MapSchema(value);
|
|
127
|
+
// }
|
|
128
|
+
// value[$childType] = Object.values(type)[0];
|
|
129
|
+
// }
|
|
130
|
+
// // try to turn provided structure into a Proxy
|
|
131
|
+
// if (value['$proxy'] === undefined) {
|
|
132
|
+
// if (isMap) {
|
|
133
|
+
// value = getMapProxy(value);
|
|
134
|
+
// }
|
|
135
|
+
// }
|
|
136
|
+
// // flag the change for encoding.
|
|
137
|
+
// this[$changes].change(fieldIndex);
|
|
138
|
+
// //
|
|
139
|
+
// // call setParent() recursively for this and its child
|
|
140
|
+
// // structures.
|
|
141
|
+
// //
|
|
142
|
+
// if (value[$changes]) {
|
|
143
|
+
// value[$changes].setParent(
|
|
144
|
+
// this,
|
|
145
|
+
// this[$changes].root,
|
|
146
|
+
// Metadata.getIndex(context.metadata, field),
|
|
147
|
+
// );
|
|
148
|
+
// }
|
|
149
|
+
// } else if (get.call(this)) {
|
|
150
|
+
// //
|
|
151
|
+
// // Setting a field to `null` or `undefined` will delete it.
|
|
152
|
+
// //
|
|
153
|
+
// this[$changes].delete(field);
|
|
154
|
+
// }
|
|
155
|
+
// set.call(this, value);
|
|
156
|
+
// },
|
|
157
|
+
// };
|
|
158
|
+
// }
|
|
159
|
+
// }
|
|
160
|
+
export function view(tag = DEFAULT_VIEW_TAG) {
|
|
161
|
+
return function (target, fieldName) {
|
|
162
|
+
const constructor = target.constructor;
|
|
163
|
+
const parentClass = Object.getPrototypeOf(constructor);
|
|
164
|
+
const parentMetadata = parentClass[Symbol.metadata];
|
|
165
|
+
// TODO: use Metadata.initialize()
|
|
166
|
+
const metadata = (constructor[Symbol.metadata] ??= Object.assign({}, constructor[Symbol.metadata], parentMetadata ?? Object.create(null)));
|
|
167
|
+
// const fieldIndex = metadata[fieldName];
|
|
168
|
+
// if (!metadata[fieldIndex]) {
|
|
169
|
+
// //
|
|
170
|
+
// // detect index for this field, considering inheritance
|
|
171
|
+
// //
|
|
172
|
+
// metadata[fieldIndex] = {
|
|
173
|
+
// type: undefined,
|
|
174
|
+
// index: (metadata[$numFields] // current structure already has fields defined
|
|
175
|
+
// ?? (parentMetadata && parentMetadata[$numFields]) // parent structure has fields defined
|
|
176
|
+
// ?? -1) + 1 // no fields defined
|
|
177
|
+
// }
|
|
178
|
+
// }
|
|
179
|
+
Metadata.setTag(metadata, fieldName, tag);
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
export function unreliable(target, field) {
|
|
183
|
+
//
|
|
184
|
+
// FIXME: the following block of code is repeated across `@type()`, `@deprecated()` and `@unreliable()` decorators.
|
|
185
|
+
//
|
|
186
|
+
const constructor = target.constructor;
|
|
187
|
+
const parentClass = Object.getPrototypeOf(constructor);
|
|
188
|
+
const parentMetadata = parentClass[Symbol.metadata];
|
|
189
|
+
// TODO: use Metadata.initialize()
|
|
190
|
+
const metadata = (constructor[Symbol.metadata] ??= Object.assign({}, constructor[Symbol.metadata], parentMetadata ?? Object.create(null)));
|
|
191
|
+
// if (!metadata[field]) {
|
|
192
|
+
// //
|
|
193
|
+
// // detect index for this field, considering inheritance
|
|
194
|
+
// //
|
|
195
|
+
// metadata[field] = {
|
|
196
|
+
// type: undefined,
|
|
197
|
+
// index: (metadata[$numFields] // current structure already has fields defined
|
|
198
|
+
// ?? (parentMetadata && parentMetadata[$numFields]) // parent structure has fields defined
|
|
199
|
+
// ?? -1) + 1 // no fields defined
|
|
200
|
+
// }
|
|
201
|
+
// }
|
|
202
|
+
// add owned flag to the field
|
|
203
|
+
metadata[metadata[field]].unreliable = true;
|
|
204
|
+
}
|
|
205
|
+
export function type(type, options) {
|
|
206
|
+
return function (target, field) {
|
|
207
|
+
const constructor = target.constructor;
|
|
208
|
+
if (!type) {
|
|
209
|
+
throw new Error(`${constructor.name}: @type() reference provided for "${field}" is undefined. Make sure you don't have any circular dependencies.`);
|
|
210
|
+
}
|
|
211
|
+
// Normalize type (enum/collection/etc)
|
|
212
|
+
type = getNormalizedType(type);
|
|
213
|
+
// for inheritance support
|
|
214
|
+
TypeContext.register(constructor);
|
|
215
|
+
const parentClass = Object.getPrototypeOf(constructor);
|
|
216
|
+
const parentMetadata = parentClass[Symbol.metadata];
|
|
217
|
+
const metadata = Metadata.initialize(constructor);
|
|
218
|
+
let fieldIndex = metadata[field];
|
|
219
|
+
/**
|
|
220
|
+
* skip if descriptor already exists for this field (`@deprecated()`)
|
|
221
|
+
*/
|
|
222
|
+
if (metadata[fieldIndex] !== undefined) {
|
|
223
|
+
if (metadata[fieldIndex].deprecated) {
|
|
224
|
+
// do not create accessors for deprecated properties.
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
else if (metadata[fieldIndex].type !== undefined) {
|
|
228
|
+
// trying to define same property multiple times across inheritance.
|
|
229
|
+
// https://github.com/colyseus/colyseus-unity3d/issues/131#issuecomment-814308572
|
|
230
|
+
try {
|
|
231
|
+
throw new Error(`@colyseus/schema: Duplicate '${field}' definition on '${constructor.name}'.\nCheck @type() annotation`);
|
|
232
|
+
}
|
|
233
|
+
catch (e) {
|
|
234
|
+
const definitionAtLine = e.stack.split("\n")[4].trim();
|
|
235
|
+
throw new Error(`${e.message} ${definitionAtLine}`);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
//
|
|
241
|
+
// detect index for this field, considering inheritance
|
|
242
|
+
//
|
|
243
|
+
fieldIndex = metadata[$numFields] // current structure already has fields defined
|
|
244
|
+
?? (parentMetadata && parentMetadata[$numFields]) // parent structure has fields defined
|
|
245
|
+
?? -1; // no fields defined
|
|
246
|
+
fieldIndex++;
|
|
247
|
+
}
|
|
248
|
+
if (options && options.manual) {
|
|
249
|
+
Metadata.addField(metadata, fieldIndex, field, type, {
|
|
250
|
+
// do not declare getter/setter descriptor
|
|
251
|
+
enumerable: true,
|
|
252
|
+
configurable: true,
|
|
253
|
+
writable: true,
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
const complexTypeKlass = typeof (Object.keys(type)[0]) === "string" && getType(Object.keys(type)[0]);
|
|
258
|
+
const childType = (complexTypeKlass)
|
|
259
|
+
? Object.values(type)[0]
|
|
260
|
+
: type;
|
|
261
|
+
Metadata.addField(metadata, fieldIndex, field, type, getPropertyDescriptor(`_${field}`, fieldIndex, childType, complexTypeKlass));
|
|
262
|
+
}
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
export function getPropertyDescriptor(fieldCached, fieldIndex, type, complexTypeKlass) {
|
|
266
|
+
return {
|
|
267
|
+
get: function () { return this[fieldCached]; },
|
|
268
|
+
set: function (value) {
|
|
269
|
+
const previousValue = this[fieldCached] ?? undefined;
|
|
270
|
+
// skip if value is the same as cached.
|
|
271
|
+
if (value === previousValue) {
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
if (value !== undefined &&
|
|
275
|
+
value !== null) {
|
|
276
|
+
if (complexTypeKlass) {
|
|
277
|
+
// automaticallty transform Array into ArraySchema
|
|
278
|
+
if (complexTypeKlass.constructor === ArraySchema && !(value instanceof ArraySchema)) {
|
|
279
|
+
value = new ArraySchema(...value);
|
|
280
|
+
}
|
|
281
|
+
// automaticallty transform Map into MapSchema
|
|
282
|
+
if (complexTypeKlass.constructor === MapSchema && !(value instanceof MapSchema)) {
|
|
283
|
+
value = new MapSchema(value);
|
|
284
|
+
}
|
|
285
|
+
// // automaticallty transform Array into SetSchema
|
|
286
|
+
// if (complexTypeKlass.constructor === SetSchema && !(value instanceof SetSchema)) {
|
|
287
|
+
// value = new SetSchema(value);
|
|
288
|
+
// }
|
|
289
|
+
value[$childType] = type;
|
|
290
|
+
}
|
|
291
|
+
else if (typeof (type) !== "string") {
|
|
292
|
+
assertInstanceType(value, type, this, fieldCached.substring(1));
|
|
293
|
+
}
|
|
294
|
+
else {
|
|
295
|
+
assertType(value, type, this, fieldCached.substring(1));
|
|
296
|
+
}
|
|
297
|
+
const changeTree = this[$changes];
|
|
298
|
+
//
|
|
299
|
+
// Replacing existing "ref", remove it from root.
|
|
300
|
+
//
|
|
301
|
+
if (previousValue !== undefined && previousValue[$changes]) {
|
|
302
|
+
changeTree.root?.remove(previousValue[$changes]);
|
|
303
|
+
this.constructor[$track](changeTree, fieldIndex, OPERATION.DELETE_AND_ADD);
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
this.constructor[$track](changeTree, fieldIndex, OPERATION.ADD);
|
|
307
|
+
}
|
|
308
|
+
//
|
|
309
|
+
// call setParent() recursively for this and its child
|
|
310
|
+
// structures.
|
|
311
|
+
//
|
|
312
|
+
value[$changes]?.setParent(this, changeTree.root, fieldIndex);
|
|
313
|
+
}
|
|
314
|
+
else if (previousValue !== undefined) {
|
|
315
|
+
//
|
|
316
|
+
// Setting a field to `null` or `undefined` will delete it.
|
|
317
|
+
//
|
|
318
|
+
this[$changes].delete(fieldIndex);
|
|
319
|
+
}
|
|
320
|
+
this[fieldCached] = value;
|
|
321
|
+
},
|
|
322
|
+
enumerable: true,
|
|
323
|
+
configurable: true
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* `@deprecated()` flag a field as deprecated.
|
|
328
|
+
* The previous `@type()` annotation should remain along with this one.
|
|
329
|
+
*/
|
|
330
|
+
export function deprecated(throws = true) {
|
|
331
|
+
return function (klass, field) {
|
|
332
|
+
//
|
|
333
|
+
// FIXME: the following block of code is repeated across `@type()`, `@deprecated()` and `@unreliable()` decorators.
|
|
334
|
+
//
|
|
335
|
+
const constructor = klass.constructor;
|
|
336
|
+
const parentClass = Object.getPrototypeOf(constructor);
|
|
337
|
+
const parentMetadata = parentClass[Symbol.metadata];
|
|
338
|
+
const metadata = (constructor[Symbol.metadata] ??= Object.assign({}, constructor[Symbol.metadata], parentMetadata ?? Object.create(null)));
|
|
339
|
+
const fieldIndex = metadata[field];
|
|
340
|
+
// if (!metadata[field]) {
|
|
341
|
+
// //
|
|
342
|
+
// // detect index for this field, considering inheritance
|
|
343
|
+
// //
|
|
344
|
+
// metadata[field] = {
|
|
345
|
+
// type: undefined,
|
|
346
|
+
// index: (metadata[$numFields] // current structure already has fields defined
|
|
347
|
+
// ?? (parentMetadata && parentMetadata[$numFields]) // parent structure has fields defined
|
|
348
|
+
// ?? -1) + 1 // no fields defined
|
|
349
|
+
// }
|
|
350
|
+
// }
|
|
351
|
+
metadata[fieldIndex].deprecated = true;
|
|
352
|
+
if (throws) {
|
|
353
|
+
metadata[$descriptors] ??= {};
|
|
354
|
+
metadata[$descriptors][field] = {
|
|
355
|
+
get: function () { throw new Error(`${field} is deprecated.`); },
|
|
356
|
+
set: function (value) { },
|
|
357
|
+
enumerable: false,
|
|
358
|
+
configurable: true
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
// flag metadata[field] as non-enumerable
|
|
362
|
+
Object.defineProperty(metadata, fieldIndex, {
|
|
363
|
+
value: metadata[fieldIndex],
|
|
364
|
+
enumerable: false,
|
|
365
|
+
configurable: true
|
|
366
|
+
});
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
export function defineTypes(target, fields, options) {
|
|
370
|
+
for (let field in fields) {
|
|
371
|
+
type(fields[field], options)(target.prototype, field);
|
|
372
|
+
}
|
|
373
|
+
return target;
|
|
374
|
+
}
|
|
375
|
+
export function schema(fieldsAndMethods, name, inherits = Schema) {
|
|
376
|
+
const fields = {};
|
|
377
|
+
const methods = {};
|
|
378
|
+
const defaultValues = {};
|
|
379
|
+
const viewTagFields = {};
|
|
380
|
+
for (let fieldName in fieldsAndMethods) {
|
|
381
|
+
const value = fieldsAndMethods[fieldName];
|
|
382
|
+
if (typeof (value) === "object") {
|
|
383
|
+
if (value['view'] !== undefined) {
|
|
384
|
+
viewTagFields[fieldName] = (typeof (value['view']) === "boolean")
|
|
385
|
+
? DEFAULT_VIEW_TAG
|
|
386
|
+
: value['view'];
|
|
387
|
+
}
|
|
388
|
+
// allow to define a field as not synced
|
|
389
|
+
if (value['sync'] !== false) {
|
|
390
|
+
fields[fieldName] = getNormalizedType(value);
|
|
391
|
+
}
|
|
392
|
+
// If no explicit default provided, handle automatic instantiation for collection types
|
|
393
|
+
if (!Object.prototype.hasOwnProperty.call(value, 'default')) {
|
|
394
|
+
// TODO: remove Array.isArray() check. Use ['array'] !== undefined only.
|
|
395
|
+
if (Array.isArray(value) || value['array'] !== undefined) {
|
|
396
|
+
// Collection: Array → new ArraySchema()
|
|
397
|
+
defaultValues[fieldName] = new ArraySchema();
|
|
398
|
+
}
|
|
399
|
+
else if (value['map'] !== undefined) {
|
|
400
|
+
// Collection: Map → new MapSchema()
|
|
401
|
+
defaultValues[fieldName] = new MapSchema();
|
|
402
|
+
}
|
|
403
|
+
else if (value['collection'] !== undefined) {
|
|
404
|
+
// Collection: Collection → new CollectionSchema()
|
|
405
|
+
defaultValues[fieldName] = new CollectionSchema();
|
|
406
|
+
}
|
|
407
|
+
else if (value['set'] !== undefined) {
|
|
408
|
+
// Collection: Set → new SetSchema()
|
|
409
|
+
defaultValues[fieldName] = new SetSchema();
|
|
410
|
+
}
|
|
411
|
+
else if (value['type'] !== undefined && Schema.is(value['type'])) {
|
|
412
|
+
// Direct Schema type: Type → new Type()
|
|
413
|
+
defaultValues[fieldName] = new value['type']();
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
else {
|
|
417
|
+
defaultValues[fieldName] = value['default'];
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
else if (typeof (value) === "function") {
|
|
421
|
+
if (Schema.is(value)) {
|
|
422
|
+
// Direct Schema type: Type → new Type()
|
|
423
|
+
defaultValues[fieldName] = new value();
|
|
424
|
+
fields[fieldName] = getNormalizedType(value);
|
|
425
|
+
}
|
|
426
|
+
else {
|
|
427
|
+
methods[fieldName] = value;
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
else {
|
|
431
|
+
fields[fieldName] = getNormalizedType(value);
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
const getDefaultValues = () => {
|
|
435
|
+
const defaults = {};
|
|
436
|
+
// use current class default values
|
|
437
|
+
for (const fieldName in defaultValues) {
|
|
438
|
+
const defaultValue = defaultValues[fieldName];
|
|
439
|
+
if (defaultValue && typeof defaultValue.clone === 'function') {
|
|
440
|
+
// complex, cloneable values, e.g. Schema, ArraySchema, MapSchema, CollectionSchema, SetSchema
|
|
441
|
+
defaults[fieldName] = defaultValue.clone();
|
|
442
|
+
}
|
|
443
|
+
else {
|
|
444
|
+
// primitives and non-cloneable values
|
|
445
|
+
defaults[fieldName] = defaultValue;
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
return defaults;
|
|
449
|
+
};
|
|
450
|
+
/** @codegen-ignore */
|
|
451
|
+
const klass = Metadata.setFields(class extends inherits {
|
|
452
|
+
constructor(...args) {
|
|
453
|
+
super(Object.assign({}, getDefaultValues(), args[0] || {}));
|
|
454
|
+
// call initialize method
|
|
455
|
+
if (methods.initialize && typeof methods.initialize === 'function') {
|
|
456
|
+
methods.initialize.apply(this, args);
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
}, fields);
|
|
460
|
+
// Store the getDefaultValues function on the class for inheritance
|
|
461
|
+
klass._getDefaultValues = getDefaultValues;
|
|
462
|
+
// Add methods to the prototype
|
|
463
|
+
Object.assign(klass.prototype, methods);
|
|
464
|
+
for (let fieldName in viewTagFields) {
|
|
465
|
+
view(viewTagFields[fieldName])(klass.prototype, fieldName);
|
|
466
|
+
}
|
|
467
|
+
if (name) {
|
|
468
|
+
Object.defineProperty(klass, "name", { value: name });
|
|
469
|
+
}
|
|
470
|
+
klass.extends = (fields, name) => schema(fields, name, klass);
|
|
471
|
+
return klass;
|
|
472
|
+
}
|
|
473
|
+
//# sourceMappingURL=annotations.js.map
|