@colyseus/schema 4.0.0 → 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.d.ts +5 -5
- 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/encoder/Encoder.ts +24 -7
- package/src/index.ts +2 -2
- package/build/cjs/index.js.map +0 -1
- package/src/bench_encode.ts +0 -64
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Callbacks.js","sourceRoot":"","sources":["../../../src/decoder/strategy/Callbacks.ts"],"names":[],"mappings":"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","sourcesContent":["import { Metadata } from \"../../Metadata\";\nimport { Collection, NonFunctionPropNames } from \"../../types/HelperTypes\";\nimport { Ref } from \"../../encoder/ChangeTree\";\nimport { Decoder } from \"../Decoder\";\nimport { DataChange } from \"../DecodeOperation\";\nimport { OPERATION } from \"../../encoding/spec\";\nimport { Schema } from \"../../Schema\";\nimport { $refId } from \"../../types/symbols\";\nimport { MapSchema } from \"../../types/custom/MapSchema\";\nimport { ArraySchema } from \"../../types/custom/ArraySchema\";\nimport { getDecoderStateCallbacks, type SchemaCallbackProxy } from \"./getDecoderStateCallbacks\";\nimport { getRawChangesCallback } from \"./RawChanges\";\n\n//\n// C#-style Callbacks API\n// Matches the API from: https://docs.colyseus.io/state/callbacks\n//\n// Key features:\n// - Uses string property names with TypeScript auto-completion\n// - Consistent parameter order (key, value) for collection callbacks\n// - Overloaded methods for nested instance callbacks\n//\n\ntype PropertyChangeCallback<K> = (currentValue: K, previousValue: K) => void;\ntype KeyValueCallback<K, V> = (key: K, value: V) => void;\ntype InstanceChangeCallback = () => void;\n\n// Exclude internal properties from valid property names\ntype PublicPropNames<T> = Exclude<NonFunctionPropNames<T>, typeof $refId> & string;\n\n// Extract only properties that extend Collection\ntype CollectionPropNames<T> = Exclude<{\n [K in keyof T]: T[K] extends Collection<any, any> ? K : never\n}[keyof T] & string, typeof $refId>;\n\n// Infer the value type of a collection property\ntype CollectionValueType<T, K extends keyof T> =\n T[K] extends MapSchema<infer V, any> ? V :\n T[K] extends ArraySchema<infer V> ? V :\n T[K] extends Collection<any, infer V, any> ? V : never;\n\n// Infer the key type of a collection property\ntype CollectionKeyType<T, K extends keyof T> =\n T[K] extends MapSchema<any, infer Key> ? Key :\n T[K] extends ArraySchema<any> ? number :\n T[K] extends Collection<infer Key, any, any> ? Key : never;\n\n/**\n * State Callbacks handler\n *\n * Usage:\n * ```ts\n * const $ = Callbacks.get(decoder);\n *\n * // Listen to property changes\n * $.listen(\"currentTurn\", (currentValue, previousValue) => { ... });\n *\n * // Listen to collection additions\n * $.onAdd(\"entities\", (sessionId, entity) => {\n * // Nested property listening\n * $.listen(entity, \"hp\", (currentHp, previousHp) => { ... });\n * });\n *\n * // Listen to collection removals\n * $.onRemove(\"entities\", (sessionId, entity) => { ... });\n *\n * // Listen to any property change on an instance\n * $.onChange(entity, () => { ... });\n *\n * // Bind properties to another object\n * $.bindTo(player, playerVisual);\n * ```\n */\nexport class StateCallbackStrategy<TState extends Schema> {\n protected decoder: Decoder<TState>;\n protected uniqueRefIds: Set<number> = new Set();\n protected isTriggering: boolean = false;\n\n constructor(decoder: Decoder<TState>) {\n this.decoder = decoder;\n this.decoder.triggerChanges = this.triggerChanges.bind(this);\n }\n\n protected get callbacks() {\n return this.decoder.root.callbacks;\n }\n\n protected get state() {\n return this.decoder.state;\n }\n\n protected addCallback(\n refId: number,\n operationOrProperty: OPERATION | string,\n handler: Function\n ): () => void {\n const $root = this.decoder.root;\n return $root.addCallback(refId, operationOrProperty, handler);\n }\n\n protected addCallbackOrWaitCollectionAvailable<TInstance extends Schema, TReturn extends Ref>(\n instance: TInstance,\n propertyName: string,\n operation: OPERATION,\n handler: Function,\n immediate: boolean = true\n ): () => void {\n let removeHandler: () => void = () => {};\n const removeOnAdd = () => removeHandler();\n\n const collection = (instance as any)[propertyName] as TReturn;\n\n // Collection not available yet. Listen for its availability before attaching the handler.\n if (collection === null || collection === undefined) {\n removeHandler = this.addCallback(\n instance[$refId],\n propertyName,\n (value: TReturn, _: TReturn) => {\n if (value !== null && value !== undefined) {\n removeHandler = this.addCallback(value[$refId], operation, handler);\n }\n }\n );\n return removeOnAdd;\n\n } else {\n //\n // Call immediately if collection is already available, if it's an ADD operation.\n //\n immediate = immediate && this.isTriggering === false;\n\n if (operation === OPERATION.ADD && immediate) {\n (collection as Collection<any, any>).forEach((value: any, key: any) => {\n handler(key, value);\n });\n }\n\n return this.addCallback(collection[$refId], operation, handler);\n }\n }\n\n /**\n * Listen to property changes on the root state.\n */\n listen<K extends PublicPropNames<TState>>(\n property: K,\n handler: PropertyChangeCallback<TState[K]>,\n immediate?: boolean\n ): () => void;\n\n /**\n * Listen to property changes on a nested instance.\n */\n listen<TInstance extends Schema, K extends PublicPropNames<TInstance>>(\n instance: TInstance,\n property: K,\n handler: PropertyChangeCallback<TInstance[K]>,\n immediate?: boolean\n ): () => void;\n\n listen(...args: any[]): () => void {\n if (typeof args[0] === 'string') {\n // listen(property, handler, immediate?)\n return this.listenInstance(this.state, args[0], args[1], args[2]);\n } else {\n // listen(instance, property, handler, immediate?)\n return this.listenInstance(args[0], args[1], args[2], args[3]);\n }\n }\n\n protected listenInstance<TInstance extends Schema>(\n instance: TInstance,\n propertyName: string,\n handler: PropertyChangeCallback<any>,\n immediate: boolean = true\n ): () => void {\n immediate = immediate && this.isTriggering === false;\n\n //\n // Call handler immediately if property is already available.\n //\n const currentValue = (instance as any)[propertyName];\n if (immediate && currentValue !== null && currentValue !== undefined) {\n handler(currentValue, undefined as any);\n }\n\n return this.addCallback(instance[$refId], propertyName, handler);\n }\n\n /**\n * Listen to any property change on an instance.\n */\n onChange<TInstance extends Schema>(\n instance: TInstance,\n handler: InstanceChangeCallback\n ): () => void;\n\n /**\n * Listen to item changes in a collection on root state.\n */\n onChange<K extends CollectionPropNames<TState>>(\n property: K,\n handler: KeyValueCallback<CollectionKeyType<TState, K>, CollectionValueType<TState, K>>\n ): () => void;\n\n /**\n * Listen to item changes in a nested collection.\n */\n onChange<TInstance extends Schema, K extends CollectionPropNames<TInstance>>(\n instance: TInstance,\n property: K,\n handler: KeyValueCallback<CollectionKeyType<TInstance, K>, CollectionValueType<TInstance, K>>\n ): () => void;\n\n onChange(...args: any[]): () => void {\n if (args.length === 2 && typeof args[0] !== 'string') {\n // onChange(instance, handler) - instance change\n const instance = args[0] as Schema;\n const handler = args[1] as InstanceChangeCallback;\n return this.addCallback(instance[$refId], OPERATION.REPLACE, handler);\n }\n\n if (typeof args[0] === 'string') {\n // onChange(property, handler) - collection on root state\n return this.addCallbackOrWaitCollectionAvailable(\n this.state,\n args[0],\n OPERATION.REPLACE,\n args[1]\n );\n } else {\n // onChange(instance, property, handler) - nested collection\n return this.addCallbackOrWaitCollectionAvailable(\n args[0],\n args[1],\n OPERATION.REPLACE,\n args[2]\n );\n }\n }\n\n /**\n * Listen to items added to a collection on root state.\n */\n onAdd<K extends CollectionPropNames<TState>>(\n property: K,\n handler: KeyValueCallback<CollectionKeyType<TState, K>, CollectionValueType<TState, K>>,\n immediate?: boolean\n ): () => void;\n\n /**\n * Listen to items added to a nested collection.\n */\n onAdd<TInstance extends Schema, K extends CollectionPropNames<TInstance>>(\n instance: TInstance,\n property: K,\n handler: KeyValueCallback<CollectionKeyType<TInstance, K>, CollectionValueType<TInstance, K>>,\n immediate?: boolean\n ): () => void;\n\n onAdd(...args: any[]): () => void {\n if (typeof args[0] === 'string') {\n // onAdd(property, handler, immediate?) - collection on root state\n return this.addCallbackOrWaitCollectionAvailable(\n this.state,\n args[0],\n OPERATION.ADD,\n args[1],\n args[2] !== false\n );\n } else {\n // onAdd(instance, property, handler, immediate?) - nested collection\n return this.addCallbackOrWaitCollectionAvailable(\n args[0],\n args[1],\n OPERATION.ADD,\n args[2],\n args[3] !== false\n );\n }\n }\n\n /**\n * Listen to items removed from a collection on root state.\n */\n onRemove<K extends CollectionPropNames<TState>>(\n property: K,\n handler: KeyValueCallback<CollectionKeyType<TState, K>, CollectionValueType<TState, K>>\n ): () => void;\n\n /**\n * Listen to items removed from a nested collection.\n */\n onRemove<TInstance extends Schema, K extends CollectionPropNames<TInstance>>(\n instance: TInstance,\n property: K,\n handler: KeyValueCallback<CollectionKeyType<TInstance, K>, CollectionValueType<TInstance, K>>\n ): () => void;\n\n onRemove(...args: any[]): () => void {\n if (typeof args[0] === 'string') {\n // onRemove(property, handler) - collection on root state\n return this.addCallbackOrWaitCollectionAvailable(\n this.state,\n args[0],\n OPERATION.DELETE,\n args[1]\n );\n } else {\n // onRemove(instance, property, handler) - nested collection\n return this.addCallbackOrWaitCollectionAvailable(\n args[0],\n args[1],\n OPERATION.DELETE,\n args[2]\n );\n }\n }\n\n /**\n * Bind properties from a Schema instance to a target object.\n * Changes will be automatically reflected on the target object.\n */\n bindTo<TInstance extends Schema, TTarget>(\n from: TInstance,\n to: TTarget,\n properties?: string[],\n immediate: boolean = true\n ): () => void {\n const metadata: Metadata = (from.constructor as typeof Schema)[Symbol.metadata];\n\n // If no properties specified, bind all properties\n if (!properties) {\n properties = Object.keys(metadata)\n .filter(key => !isNaN(Number(key)))\n .map((index) => metadata[index as any as number].name);\n }\n\n const action = () => {\n for (const prop of properties!) {\n const fromValue = (from as any)[prop];\n if (fromValue !== undefined) {\n (to as any)[prop] = fromValue;\n }\n }\n };\n\n if (immediate) {\n action();\n }\n\n return this.addCallback(from[$refId], OPERATION.REPLACE, action);\n }\n\n protected triggerChanges(allChanges: DataChange[]): void {\n this.uniqueRefIds.clear();\n\n for (let i = 0, l = allChanges.length; i < l; i++) {\n const change = allChanges[i];\n const refId = change.refId;\n const ref = change.ref;\n\n const $callbacks = this.callbacks[refId];\n if (!$callbacks) {\n continue;\n }\n\n //\n // trigger onRemove on child structure.\n //\n if (\n (change.op & OPERATION.DELETE) === OPERATION.DELETE &&\n change.previousValue instanceof Schema\n ) {\n const childRefId = (change.previousValue as Ref)[$refId];\n const deleteCallbacks = this.callbacks[childRefId]?.[OPERATION.DELETE];\n if (deleteCallbacks) {\n for (let j = deleteCallbacks.length - 1; j >= 0; j--) {\n deleteCallbacks[j]();\n }\n }\n }\n\n if (ref instanceof Schema) {\n //\n // Handle Schema instance\n //\n\n if (!this.uniqueRefIds.has(refId)) {\n // trigger onChange\n const replaceCallbacks = $callbacks[OPERATION.REPLACE];\n if (replaceCallbacks) {\n for (let j = replaceCallbacks.length - 1; j >= 0; j--) {\n try {\n replaceCallbacks[j]();\n } catch (e) {\n console.error(e);\n }\n }\n }\n }\n\n // trigger field callbacks\n const fieldCallbacks = $callbacks[change.field];\n if (fieldCallbacks) {\n for (let j = fieldCallbacks.length - 1; j >= 0; j--) {\n try {\n this.isTriggering = true;\n fieldCallbacks[j](change.value, change.previousValue);\n } catch (e) {\n console.error(e);\n } finally {\n this.isTriggering = false;\n }\n }\n }\n\n } else {\n //\n // Handle collection of items\n //\n const dynamicIndex = change.dynamicIndex ?? change.field;\n\n if ((change.op & OPERATION.DELETE) === OPERATION.DELETE) {\n //\n // FIXME: `previousValue` should always be available.\n //\n if (change.previousValue !== undefined) {\n // trigger onRemove (key, value)\n const deleteCallbacks = $callbacks[OPERATION.DELETE];\n if (deleteCallbacks) {\n for (let j = deleteCallbacks.length - 1; j >= 0; j--) {\n deleteCallbacks[j](dynamicIndex, change.previousValue);\n }\n }\n }\n\n // Handle DELETE_AND_ADD operation\n if ((change.op & OPERATION.ADD) === OPERATION.ADD) {\n const addCallbacks = $callbacks[OPERATION.ADD];\n if (addCallbacks) {\n this.isTriggering = true;\n for (let j = addCallbacks.length - 1; j >= 0; j--) {\n addCallbacks[j](dynamicIndex, change.value);\n }\n this.isTriggering = false;\n }\n }\n\n } else if (\n (change.op & OPERATION.ADD) === OPERATION.ADD &&\n change.previousValue !== change.value\n ) {\n // trigger onAdd (key, value)\n const addCallbacks = $callbacks[OPERATION.ADD];\n if (addCallbacks) {\n this.isTriggering = true;\n for (let j = addCallbacks.length - 1; j >= 0; j--) {\n addCallbacks[j](dynamicIndex, change.value);\n }\n this.isTriggering = false;\n }\n }\n\n // trigger onChange (key, value)\n if (change.value !== change.previousValue) {\n const replaceCallbacks = $callbacks[OPERATION.REPLACE];\n if (replaceCallbacks) {\n for (let j = replaceCallbacks.length - 1; j >= 0; j--) {\n replaceCallbacks[j](dynamicIndex, change.value);\n }\n }\n }\n }\n\n this.uniqueRefIds.add(refId);\n }\n }\n}\n\n/**\n * Factory class for retrieving the callbacks API.\n */\nexport const Callbacks = {\n /**\n * Get the new callbacks standard API.\n *\n * Usage:\n * ```ts\n * const callbacks = Callbacks.get(roomOrDecoder);\n *\n * // Listen to property changes\n * callbacks.listen(\"currentTurn\", (currentValue, previousValue) => { ... });\n *\n * // Listen to collection additions\n * callbacks.onAdd(\"entities\", (sessionId, entity) => {\n * // Nested property listening\n * callbacks.listen(entity, \"hp\", (currentHp, previousHp) => { ... });\n * });\n *\n * // Listen to collection removals\n * callbacks.onRemove(\"entities\", (sessionId, entity) => { ... });\n *\n * // Listen to any property change on an instance\n * callbacks.onChange(entity, () => { ... });\n *\n * // Bind properties to another object\n * callbacks.bindTo(player, playerVisual);\n * ```\n *\n * @param roomOrDecoder - Room or Decoder instance to get the callbacks for.\n * @returns the new callbacks standard API.\n */\n get<T extends Schema>(roomOrDecoder: Decoder<T> | { serializer: { decoder: Decoder<T> } }): StateCallbackStrategy<T> {\n if (roomOrDecoder instanceof Decoder) {\n return new StateCallbackStrategy<T>(roomOrDecoder);\n\n } else if (roomOrDecoder.serializer.decoder) {\n return new StateCallbackStrategy<T>(roomOrDecoder.serializer.decoder);\n\n } else {\n throw new Error('Invalid room or decoder');\n }\n },\n\n /**\n * Get the legacy callbacks API.\n *\n * We aim to deprecate this API on 1.0, and iterate on improving Callbacks.get() API.\n *\n * @param roomOrDecoder - Room or Decoder instance to get the legacy callbacks for.\n * @returns the legacy callbacks API.\n */\n getLegacy<T extends Schema>(roomOrDecoder: Decoder<T> | { serializer: { decoder: Decoder<T> } }): SchemaCallbackProxy<T> {\n if (roomOrDecoder instanceof Decoder) {\n return getDecoderStateCallbacks(roomOrDecoder);\n\n } else if (roomOrDecoder.serializer.decoder) {\n return getDecoderStateCallbacks(roomOrDecoder.serializer.decoder);\n }\n },\n\n getRawChanges(decoder: Decoder, callback: (changes: DataChange[]) => void) {\n return getRawChangesCallback(decoder, callback);\n }\n};\n\n"]}
|
|
1
|
+
{"version":3,"file":"Callbacks.js","sourceRoot":"","sources":["../../../src/decoder/strategy/Callbacks.ts"],"names":[],"mappings":"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","sourcesContent":["import { Metadata } from \"../../Metadata\";\nimport { Collection, NonFunctionPropNames } from \"../../types/HelperTypes\";\nimport { Ref } from \"../../encoder/ChangeTree\";\nimport { Decoder } from \"../Decoder\";\nimport { DataChange } from \"../DecodeOperation\";\nimport { OPERATION } from \"../../encoding/spec\";\nimport { Schema } from \"../../Schema\";\nimport { $refId } from \"../../types/symbols\";\nimport { MapSchema } from \"../../types/custom/MapSchema\";\nimport { ArraySchema } from \"../../types/custom/ArraySchema\";\nimport { getDecoderStateCallbacks, type SchemaCallbackProxy } from \"./getDecoderStateCallbacks\";\nimport { getRawChangesCallback } from \"./RawChanges\";\n\n//\n// C#-style Callbacks API\n// Matches the API from: https://docs.colyseus.io/state/callbacks\n//\n// Key features:\n// - Uses string property names with TypeScript auto-completion\n// - Consistent parameter order (key, value) for collection callbacks\n// - Overloaded methods for nested instance callbacks\n//\n\ntype PropertyChangeCallback<K> = (currentValue: K, previousValue: K) => void;\ntype KeyValueCallback<K, V> = (key: K, value: V) => void;\ntype InstanceChangeCallback = () => void;\n\n// Exclude internal properties from valid property names\ntype PublicPropNames<T> = Exclude<NonFunctionPropNames<T>, typeof $refId> & string;\n\n// Extract only properties that extend Collection\ntype CollectionPropNames<T> = Exclude<{\n [K in keyof T]: T[K] extends Collection<any, any> ? K : never\n}[keyof T] & string, typeof $refId>;\n\n// Infer the value type of a collection property\ntype CollectionValueType<T, K extends keyof T> =\n T[K] extends MapSchema<infer V, any> ? V :\n T[K] extends ArraySchema<infer V> ? V :\n T[K] extends Collection<any, infer V, any> ? V : never;\n\n// Infer the key type of a collection property\ntype CollectionKeyType<T, K extends keyof T> =\n T[K] extends MapSchema<any, infer Key> ? Key :\n T[K] extends ArraySchema<any> ? number :\n T[K] extends Collection<infer Key, any, any> ? Key : never;\n\n/**\n * State Callbacks handler\n *\n * Usage:\n * ```ts\n * const $ = Callbacks.get(decoder);\n *\n * // Listen to property changes\n * $.listen(\"currentTurn\", (currentValue, previousValue) => { ... });\n *\n * // Listen to collection additions\n * $.onAdd(\"entities\", (sessionId, entity) => {\n * // Nested property listening\n * $.listen(entity, \"hp\", (currentHp, previousHp) => { ... });\n * });\n *\n * // Listen to collection removals\n * $.onRemove(\"entities\", (sessionId, entity) => { ... });\n *\n * // Listen to any property change on an instance\n * $.onChange(entity, () => { ... });\n *\n * // Bind properties to another object\n * $.bindTo(player, playerVisual);\n * ```\n */\nexport class StateCallbackStrategy<TState extends Schema> {\n protected decoder: Decoder<TState>;\n protected uniqueRefIds: Set<number> = new Set();\n protected isTriggering: boolean = false;\n\n constructor(decoder: Decoder<TState>) {\n this.decoder = decoder;\n this.decoder.triggerChanges = this.triggerChanges.bind(this);\n }\n\n protected get callbacks() {\n return this.decoder.root.callbacks;\n }\n\n protected get state() {\n return this.decoder.state;\n }\n\n protected addCallback(\n refId: number,\n operationOrProperty: OPERATION | string,\n handler: Function\n ): () => void {\n const $root = this.decoder.root;\n return $root.addCallback(refId, operationOrProperty, handler);\n }\n\n protected addCallbackOrWaitCollectionAvailable<TInstance extends Schema, TReturn extends Ref>(\n instance: TInstance,\n propertyName: string,\n operation: OPERATION,\n handler: Function,\n immediate: boolean = true\n ): () => void {\n let removeHandler: () => void = () => {};\n const removeOnAdd = () => removeHandler();\n\n const collection = (instance as any)[propertyName] as TReturn;\n\n // Collection not available yet. Listen for its availability before attaching the handler.\n if (collection === null || collection === undefined) {\n removeHandler = this.addCallback(\n instance[$refId],\n propertyName,\n (value: TReturn, _: TReturn) => {\n if (value !== null && value !== undefined) {\n removeHandler = this.addCallback(value[$refId], operation, handler);\n }\n }\n );\n return removeOnAdd;\n\n } else {\n //\n // Call immediately if collection is already available, if it's an ADD operation.\n //\n immediate = immediate && this.isTriggering === false;\n\n if (operation === OPERATION.ADD && immediate) {\n (collection as Collection<any, any>).forEach((value: any, key: any) => {\n handler(key, value);\n });\n }\n\n return this.addCallback(collection[$refId], operation, handler);\n }\n }\n\n /**\n * Listen to property changes on the root state.\n */\n listen<K extends PublicPropNames<TState>>(\n property: K,\n handler: PropertyChangeCallback<TState[K]>,\n immediate?: boolean\n ): () => void;\n\n /**\n * Listen to property changes on a nested instance.\n */\n listen<TInstance extends Schema, K extends PublicPropNames<TInstance>>(\n instance: TInstance,\n property: K,\n handler: PropertyChangeCallback<TInstance[K]>,\n immediate?: boolean\n ): () => void;\n\n listen(...args: any[]): () => void {\n if (typeof args[0] === 'string') {\n // listen(property, handler, immediate?)\n return this.listenInstance(this.state, args[0], args[1], args[2]);\n } else {\n // listen(instance, property, handler, immediate?)\n return this.listenInstance(args[0], args[1], args[2], args[3]);\n }\n }\n\n protected listenInstance<TInstance extends Schema>(\n instance: TInstance,\n propertyName: string,\n handler: PropertyChangeCallback<any>,\n immediate: boolean = true\n ): () => void {\n immediate = immediate && this.isTriggering === false;\n\n //\n // Call handler immediately if property is already available.\n //\n const currentValue = (instance as any)[propertyName];\n if (immediate && currentValue !== null && currentValue !== undefined) {\n handler(currentValue, undefined as any);\n }\n\n return this.addCallback(instance[$refId], propertyName, handler);\n }\n\n /**\n * Listen to any property change on an instance.\n */\n onChange<TInstance extends Schema>(\n instance: TInstance,\n handler: InstanceChangeCallback\n ): () => void;\n\n /**\n * Listen to item changes in a collection on root state.\n */\n onChange<K extends CollectionPropNames<TState>>(\n property: K,\n handler: KeyValueCallback<CollectionKeyType<TState, K>, CollectionValueType<TState, K>>\n ): () => void;\n\n /**\n * Listen to item changes in a nested collection.\n */\n onChange<TInstance extends Schema, K extends CollectionPropNames<TInstance>>(\n instance: TInstance,\n property: K,\n handler: KeyValueCallback<CollectionKeyType<TInstance, K>, CollectionValueType<TInstance, K>>\n ): () => void;\n\n onChange(...args: any[]): () => void {\n if (args.length === 2 && typeof args[0] !== 'string') {\n // onChange(instance, handler) - instance change\n const instance = args[0] as Schema;\n const handler = args[1] as InstanceChangeCallback;\n return this.addCallback(instance[$refId], OPERATION.REPLACE, handler);\n }\n\n if (typeof args[0] === 'string') {\n // onChange(property, handler) - collection on root state\n return this.addCallbackOrWaitCollectionAvailable(\n this.state,\n args[0],\n OPERATION.REPLACE,\n args[1]\n );\n } else {\n // onChange(instance, property, handler) - nested collection\n return this.addCallbackOrWaitCollectionAvailable(\n args[0],\n args[1],\n OPERATION.REPLACE,\n args[2]\n );\n }\n }\n\n /**\n * Listen to items added to a collection on root state.\n */\n onAdd<K extends CollectionPropNames<TState>>(\n property: K,\n handler: KeyValueCallback<CollectionKeyType<TState, K>, CollectionValueType<TState, K>>,\n immediate?: boolean\n ): () => void;\n\n /**\n * Listen to items added to a nested collection.\n */\n onAdd<TInstance extends Schema, K extends CollectionPropNames<TInstance>>(\n instance: TInstance,\n property: K,\n handler: KeyValueCallback<CollectionKeyType<TInstance, K>, CollectionValueType<TInstance, K>>,\n immediate?: boolean\n ): () => void;\n\n onAdd(...args: any[]): () => void {\n if (typeof args[0] === 'string') {\n // onAdd(property, handler, immediate?) - collection on root state\n return this.addCallbackOrWaitCollectionAvailable(\n this.state,\n args[0],\n OPERATION.ADD,\n args[1],\n args[2] !== false\n );\n } else {\n // onAdd(instance, property, handler, immediate?) - nested collection\n return this.addCallbackOrWaitCollectionAvailable(\n args[0],\n args[1],\n OPERATION.ADD,\n args[2],\n args[3] !== false\n );\n }\n }\n\n /**\n * Listen to items removed from a collection on root state.\n */\n onRemove<K extends CollectionPropNames<TState>>(\n property: K,\n handler: KeyValueCallback<CollectionKeyType<TState, K>, CollectionValueType<TState, K>>\n ): () => void;\n\n /**\n * Listen to items removed from a nested collection.\n */\n onRemove<TInstance extends Schema, K extends CollectionPropNames<TInstance>>(\n instance: TInstance,\n property: K,\n handler: KeyValueCallback<CollectionKeyType<TInstance, K>, CollectionValueType<TInstance, K>>\n ): () => void;\n\n onRemove(...args: any[]): () => void {\n if (typeof args[0] === 'string') {\n // onRemove(property, handler) - collection on root state\n return this.addCallbackOrWaitCollectionAvailable(\n this.state,\n args[0],\n OPERATION.DELETE,\n args[1]\n );\n } else {\n // onRemove(instance, property, handler) - nested collection\n return this.addCallbackOrWaitCollectionAvailable(\n args[0],\n args[1],\n OPERATION.DELETE,\n args[2]\n );\n }\n }\n\n /**\n * Bind properties from a Schema instance to a target object.\n * Changes will be automatically reflected on the target object.\n */\n bindTo<TInstance extends Schema, TTarget>(\n from: TInstance,\n to: TTarget,\n properties?: string[],\n immediate: boolean = true\n ): () => void {\n const metadata: Metadata = (from.constructor as typeof Schema)[Symbol.metadata];\n\n // If no properties specified, bind all properties\n if (!properties) {\n properties = Object.keys(metadata)\n .filter(key => !isNaN(Number(key)))\n .map((index) => metadata[index as any as number].name);\n }\n\n const action = () => {\n for (const prop of properties!) {\n const fromValue = (from as any)[prop];\n if (fromValue !== undefined) {\n (to as any)[prop] = fromValue;\n }\n }\n };\n\n if (immediate) {\n action();\n }\n\n return this.addCallback(from[$refId], OPERATION.REPLACE, action);\n }\n\n protected triggerChanges(allChanges: DataChange[]): void {\n this.uniqueRefIds.clear();\n\n for (let i = 0, l = allChanges.length; i < l; i++) {\n const change = allChanges[i];\n const refId = change.refId;\n const ref = change.ref;\n\n const $callbacks = this.callbacks[refId];\n if (!$callbacks) {\n continue;\n }\n\n //\n // trigger onRemove on child structure.\n //\n if (\n (change.op & OPERATION.DELETE) === OPERATION.DELETE &&\n change.previousValue instanceof Schema\n ) {\n const childRefId = (change.previousValue as Ref)[$refId];\n const deleteCallbacks = this.callbacks[childRefId]?.[OPERATION.DELETE];\n if (deleteCallbacks) {\n for (let j = deleteCallbacks.length - 1; j >= 0; j--) {\n deleteCallbacks[j]();\n }\n }\n }\n\n if (ref instanceof Schema) {\n //\n // Handle Schema instance\n //\n\n if (!this.uniqueRefIds.has(refId)) {\n // trigger onChange\n const replaceCallbacks = $callbacks[OPERATION.REPLACE];\n if (replaceCallbacks) {\n for (let j = replaceCallbacks.length - 1; j >= 0; j--) {\n try {\n replaceCallbacks[j]();\n } catch (e) {\n console.error(e);\n }\n }\n }\n }\n\n // trigger field callbacks\n const fieldCallbacks = $callbacks[change.field];\n if (fieldCallbacks) {\n for (let j = fieldCallbacks.length - 1; j >= 0; j--) {\n try {\n this.isTriggering = true;\n fieldCallbacks[j](change.value, change.previousValue);\n } catch (e) {\n console.error(e);\n } finally {\n this.isTriggering = false;\n }\n }\n }\n\n } else {\n //\n // Handle collection of items\n //\n const dynamicIndex = change.dynamicIndex ?? change.field;\n\n if ((change.op & OPERATION.DELETE) === OPERATION.DELETE) {\n //\n // FIXME: `previousValue` should always be available.\n //\n if (change.previousValue !== undefined) {\n // trigger onRemove (key, value)\n const deleteCallbacks = $callbacks[OPERATION.DELETE];\n if (deleteCallbacks) {\n for (let j = deleteCallbacks.length - 1; j >= 0; j--) {\n deleteCallbacks[j](dynamicIndex, change.previousValue);\n }\n }\n }\n\n // Handle DELETE_AND_ADD operation\n if ((change.op & OPERATION.ADD) === OPERATION.ADD) {\n const addCallbacks = $callbacks[OPERATION.ADD];\n if (addCallbacks) {\n this.isTriggering = true;\n for (let j = addCallbacks.length - 1; j >= 0; j--) {\n addCallbacks[j](dynamicIndex, change.value);\n }\n this.isTriggering = false;\n }\n }\n\n } else if (\n (change.op & OPERATION.ADD) === OPERATION.ADD &&\n change.previousValue !== change.value\n ) {\n // trigger onAdd (key, value)\n const addCallbacks = $callbacks[OPERATION.ADD];\n if (addCallbacks) {\n this.isTriggering = true;\n for (let j = addCallbacks.length - 1; j >= 0; j--) {\n addCallbacks[j](dynamicIndex, change.value);\n }\n this.isTriggering = false;\n }\n }\n\n // trigger onChange (key, value)\n if (change.value !== change.previousValue) {\n const replaceCallbacks = $callbacks[OPERATION.REPLACE];\n if (replaceCallbacks) {\n for (let j = replaceCallbacks.length - 1; j >= 0; j--) {\n replaceCallbacks[j](dynamicIndex, change.value);\n }\n }\n }\n }\n\n this.uniqueRefIds.add(refId);\n }\n }\n}\n\n/**\n * Factory class for retrieving the callbacks API.\n */\nexport const Callbacks = {\n /**\n * Get the new callbacks standard API.\n *\n * Usage:\n * ```ts\n * const callbacks = Callbacks.get(roomOrDecoder);\n *\n * // Listen to property changes\n * callbacks.listen(\"currentTurn\", (currentValue, previousValue) => { ... });\n *\n * // Listen to collection additions\n * callbacks.onAdd(\"entities\", (sessionId, entity) => {\n * // Nested property listening\n * callbacks.listen(entity, \"hp\", (currentHp, previousHp) => { ... });\n * });\n *\n * // Listen to collection removals\n * callbacks.onRemove(\"entities\", (sessionId, entity) => { ... });\n *\n * // Listen to any property change on an instance\n * callbacks.onChange(entity, () => { ... });\n *\n * // Bind properties to another object\n * callbacks.bindTo(player, playerVisual);\n * ```\n *\n * @param roomOrDecoder - Room or Decoder instance to get the callbacks for.\n * @returns the new callbacks standard API.\n */\n get<T extends Schema>(roomOrDecoder: Decoder<T> | { serializer: { decoder: Decoder<T> } }): StateCallbackStrategy<T> {\n if (roomOrDecoder instanceof Decoder) {\n return new StateCallbackStrategy<T>(roomOrDecoder);\n\n } else if (roomOrDecoder.serializer.decoder) {\n return new StateCallbackStrategy<T>(roomOrDecoder.serializer.decoder);\n\n } else {\n throw new Error('Invalid room or decoder');\n }\n },\n\n /**\n * Get the legacy callbacks API.\n *\n * We aim to deprecate this API on 1.0, and iterate on improving Callbacks.get() API.\n *\n * @param roomOrDecoder - Room or Decoder instance to get the legacy callbacks for.\n * @returns the legacy callbacks API.\n */\n getLegacy<T extends Schema>(roomOrDecoder: Decoder<T> | { serializer: { decoder: Decoder<T> } }): SchemaCallbackProxy<T> {\n if (roomOrDecoder instanceof Decoder) {\n return getDecoderStateCallbacks(roomOrDecoder);\n\n } else if (roomOrDecoder.serializer.decoder) {\n return getDecoderStateCallbacks(roomOrDecoder.serializer.decoder);\n }\n },\n\n getRawChanges(decoder: Decoder, callback: (changes: DataChange[]) => void) {\n return getRawChangesCallback(decoder, callback);\n }\n};\n\n"]}
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getRawChangesCallback = getRawChangesCallback;
|
|
4
|
-
function getRawChangesCallback(decoder, callback) {
|
|
1
|
+
export function getRawChangesCallback(decoder, callback) {
|
|
5
2
|
decoder.triggerChanges = callback;
|
|
6
3
|
}
|
|
7
4
|
//# sourceMappingURL=RawChanges.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RawChanges.js","sourceRoot":"","sources":["../../../src/decoder/strategy/RawChanges.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"RawChanges.js","sourceRoot":"","sources":["../../../src/decoder/strategy/RawChanges.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,qBAAqB,CACjC,OAAgB,EAChB,QAAyC;IAEzC,OAAO,CAAC,cAAc,GAAG,QAAQ,CAAC;AACtC,CAAC","sourcesContent":["import { DataChange } from \"../DecodeOperation\";\nimport { Decoder } from \"../Decoder\";\n\nexport function getRawChangesCallback(\n decoder: Decoder,\n callback: (changes: DataChange[]) => void\n) {\n decoder.triggerChanges = callback;\n}"]}
|
|
@@ -1,16 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const spec_1 = require("../../encoding/spec");
|
|
5
|
-
const Schema_1 = require("../../Schema");
|
|
6
|
-
const symbols_1 = require("../../types/symbols");
|
|
1
|
+
import { OPERATION } from "../../encoding/spec";
|
|
2
|
+
import { Schema } from "../../Schema";
|
|
3
|
+
import { $refId } from "../../types/symbols";
|
|
7
4
|
/**
|
|
8
5
|
* Legacy callback system
|
|
9
6
|
*
|
|
10
7
|
* @param decoder
|
|
11
8
|
* @returns
|
|
12
9
|
*/
|
|
13
|
-
function getDecoderStateCallbacks(decoder) {
|
|
10
|
+
export function getDecoderStateCallbacks(decoder) {
|
|
14
11
|
const $root = decoder.root;
|
|
15
12
|
const callbacks = $root.callbacks;
|
|
16
13
|
const onAddCalls = new WeakMap();
|
|
@@ -28,20 +25,20 @@ function getDecoderStateCallbacks(decoder) {
|
|
|
28
25
|
//
|
|
29
26
|
// trigger onRemove on child structure.
|
|
30
27
|
//
|
|
31
|
-
if ((change.op &
|
|
32
|
-
change.previousValue instanceof
|
|
33
|
-
const deleteCallbacks = callbacks[change.previousValue[
|
|
28
|
+
if ((change.op & OPERATION.DELETE) === OPERATION.DELETE &&
|
|
29
|
+
change.previousValue instanceof Schema) {
|
|
30
|
+
const deleteCallbacks = callbacks[change.previousValue[$refId]]?.[OPERATION.DELETE];
|
|
34
31
|
for (let i = deleteCallbacks?.length - 1; i >= 0; i--) {
|
|
35
32
|
deleteCallbacks[i]();
|
|
36
33
|
}
|
|
37
34
|
}
|
|
38
|
-
if (ref instanceof
|
|
35
|
+
if (ref instanceof Schema) {
|
|
39
36
|
//
|
|
40
37
|
// Handle schema instance
|
|
41
38
|
//
|
|
42
39
|
if (!uniqueRefIds.has(refId)) {
|
|
43
40
|
// trigger onChange
|
|
44
|
-
const replaceCallbacks = $callbacks?.[
|
|
41
|
+
const replaceCallbacks = $callbacks?.[OPERATION.REPLACE];
|
|
45
42
|
for (let i = replaceCallbacks?.length - 1; i >= 0; i--) {
|
|
46
43
|
replaceCallbacks[i]();
|
|
47
44
|
// try {
|
|
@@ -65,29 +62,29 @@ function getDecoderStateCallbacks(decoder) {
|
|
|
65
62
|
//
|
|
66
63
|
// Handle collection of items
|
|
67
64
|
//
|
|
68
|
-
if ((change.op &
|
|
65
|
+
if ((change.op & OPERATION.DELETE) === OPERATION.DELETE) {
|
|
69
66
|
//
|
|
70
67
|
// FIXME: `previousValue` should always be available.
|
|
71
68
|
//
|
|
72
69
|
if (change.previousValue !== undefined) {
|
|
73
70
|
// triger onRemove
|
|
74
|
-
const deleteCallbacks = $callbacks[
|
|
71
|
+
const deleteCallbacks = $callbacks[OPERATION.DELETE];
|
|
75
72
|
for (let i = deleteCallbacks?.length - 1; i >= 0; i--) {
|
|
76
73
|
deleteCallbacks[i](change.previousValue, change.dynamicIndex ?? change.field);
|
|
77
74
|
}
|
|
78
75
|
}
|
|
79
76
|
// Handle DELETE_AND_ADD operations
|
|
80
|
-
if ((change.op &
|
|
81
|
-
const addCallbacks = $callbacks[
|
|
77
|
+
if ((change.op & OPERATION.ADD) === OPERATION.ADD) {
|
|
78
|
+
const addCallbacks = $callbacks[OPERATION.ADD];
|
|
82
79
|
for (let i = addCallbacks?.length - 1; i >= 0; i--) {
|
|
83
80
|
addCallbacks[i](change.value, change.dynamicIndex ?? change.field);
|
|
84
81
|
}
|
|
85
82
|
}
|
|
86
83
|
}
|
|
87
|
-
else if ((change.op &
|
|
84
|
+
else if ((change.op & OPERATION.ADD) === OPERATION.ADD &&
|
|
88
85
|
change.previousValue !== change.value) {
|
|
89
86
|
// triger onAdd
|
|
90
|
-
const addCallbacks = $callbacks[
|
|
87
|
+
const addCallbacks = $callbacks[OPERATION.ADD];
|
|
91
88
|
for (let i = addCallbacks?.length - 1; i >= 0; i--) {
|
|
92
89
|
addCallbacks[i](change.value, change.dynamicIndex ?? change.field);
|
|
93
90
|
}
|
|
@@ -97,7 +94,7 @@ function getDecoderStateCallbacks(decoder) {
|
|
|
97
94
|
// FIXME: see "should not encode item if added and removed at the same patch" test case.
|
|
98
95
|
// some "ADD" + "DELETE" operations on same patch are being encoded as "DELETE"
|
|
99
96
|
(change.value !== undefined || change.previousValue !== undefined)) {
|
|
100
|
-
const replaceCallbacks = $callbacks[
|
|
97
|
+
const replaceCallbacks = $callbacks[OPERATION.REPLACE];
|
|
101
98
|
for (let i = replaceCallbacks?.length - 1; i >= 0; i--) {
|
|
102
99
|
replaceCallbacks[i](change.value, change.dynamicIndex ?? change.field);
|
|
103
100
|
}
|
|
@@ -119,7 +116,7 @@ function getDecoderStateCallbacks(decoder) {
|
|
|
119
116
|
) {
|
|
120
117
|
callback(context.instance[prop], undefined);
|
|
121
118
|
}
|
|
122
|
-
return $root.addCallback(ref[
|
|
119
|
+
return $root.addCallback(ref[$refId], prop, callback);
|
|
123
120
|
};
|
|
124
121
|
/**
|
|
125
122
|
* Schema instances
|
|
@@ -139,7 +136,7 @@ function getDecoderStateCallbacks(decoder) {
|
|
|
139
136
|
}
|
|
140
137
|
},
|
|
141
138
|
onChange: function onChange(callback) {
|
|
142
|
-
return $root.addCallback(context.instance[
|
|
139
|
+
return $root.addCallback(context.instance[$refId], OPERATION.REPLACE, callback);
|
|
143
140
|
},
|
|
144
141
|
//
|
|
145
142
|
// TODO: refactor `bindTo()` implementation.
|
|
@@ -149,7 +146,7 @@ function getDecoderStateCallbacks(decoder) {
|
|
|
149
146
|
if (!properties) {
|
|
150
147
|
properties = Object.keys(metadata).map((index) => metadata[index].name);
|
|
151
148
|
}
|
|
152
|
-
return $root.addCallback(context.instance[
|
|
149
|
+
return $root.addCallback(context.instance[$refId], OPERATION.REPLACE, () => {
|
|
153
150
|
properties.forEach((prop) => targetObject[prop] = context.instance[prop]);
|
|
154
151
|
});
|
|
155
152
|
}
|
|
@@ -168,13 +165,13 @@ function getDecoderStateCallbacks(decoder) {
|
|
|
168
165
|
unbind?.();
|
|
169
166
|
}, false);
|
|
170
167
|
// has existing value
|
|
171
|
-
if (instance?.[
|
|
168
|
+
if (instance?.[$refId] !== undefined) {
|
|
172
169
|
callback(instance, true);
|
|
173
170
|
}
|
|
174
171
|
});
|
|
175
172
|
return getProxy(metadataField.type, {
|
|
176
173
|
// make sure refId is available, otherwise need to wait for the instance to be available.
|
|
177
|
-
instance: (instance?.[
|
|
174
|
+
instance: (instance?.[$refId] !== undefined && instance),
|
|
178
175
|
parentInstance: context.instance,
|
|
179
176
|
onInstanceAvailable,
|
|
180
177
|
});
|
|
@@ -198,7 +195,7 @@ function getDecoderStateCallbacks(decoder) {
|
|
|
198
195
|
if (immediate) {
|
|
199
196
|
ref.forEach((v, k) => callback(v, k));
|
|
200
197
|
}
|
|
201
|
-
return $root.addCallback(ref[
|
|
198
|
+
return $root.addCallback(ref[$refId], OPERATION.ADD, (value, key) => {
|
|
202
199
|
onAddCalls.set(callback, true);
|
|
203
200
|
currentOnAddCallback = callback;
|
|
204
201
|
callback(value, key);
|
|
@@ -207,10 +204,10 @@ function getDecoderStateCallbacks(decoder) {
|
|
|
207
204
|
});
|
|
208
205
|
};
|
|
209
206
|
const onRemove = function (ref, callback) {
|
|
210
|
-
return $root.addCallback(ref[
|
|
207
|
+
return $root.addCallback(ref[$refId], OPERATION.DELETE, callback);
|
|
211
208
|
};
|
|
212
209
|
const onChange = function (ref, callback) {
|
|
213
|
-
return $root.addCallback(ref[
|
|
210
|
+
return $root.addCallback(ref[$refId], OPERATION.REPLACE, callback);
|
|
214
211
|
};
|
|
215
212
|
return new Proxy({
|
|
216
213
|
onAdd: function (callback, immediate = true) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getDecoderStateCallbacks.js","sourceRoot":"","sources":["../../../src/decoder/strategy/getDecoderStateCallbacks.ts"],"names":[],"mappings":"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","sourcesContent":["import { Metadata } from \"../../Metadata\";\nimport { Collection, NonFunctionNonPrimitivePropNames, NonFunctionPropNames } from \"../../types/HelperTypes\";\nimport { IRef, Ref } from \"../../encoder/ChangeTree\";\nimport { Decoder } from \"../Decoder\";\nimport { DataChange } from \"../DecodeOperation\";\nimport { OPERATION } from \"../../encoding/spec\";\nimport { Schema } from \"../../Schema\";\nimport { $refId } from \"../../types/symbols\";\nimport type { DefinitionType } from \"../../annotations\";\nimport type { CollectionSchema } from \"../../types/custom/CollectionSchema\";\n\n//\n// Discussion: https://github.com/colyseus/schema/issues/155\n//\n// Main points:\n// - Decouple structures from their callbacks.\n// - Registering deep callbacks can be confusing.\n// - Avoid closures by allowing to pass a context. (https://github.com/colyseus/schema/issues/155#issuecomment-1804694081)\n//\n\n/**\n * TODO: define a schema interface, which even having duplicate definitions, it could be used to get the callback proxy.\n *\n * ```ts\n * export type SchemaCallbackProxy<RoomState> = (<T extends Schema>(instance: T) => CallbackProxy<T>);\n * ```\n */\nexport type SchemaCallbackProxy<RoomState> = (<T>(instance: T) => CallbackProxy<T>);\nexport type GetCallbackProxy = SchemaCallbackProxy<any>; // workaround for compatibility for < colyseus.js0.16.6. Remove me on next major release.\n\nexport type CallbackProxy<T> = unknown extends T // is \"any\"?\n ? SchemaCallback<T> & CollectionCallback<any, any>\n : T extends Collection<infer K, infer V, infer _>\n ? CollectionCallback<K, V>\n : SchemaCallback<T>;\n\nexport type SchemaCallback<T> = {\n /**\n * Trigger callback when value of a property changes.\n *\n * @param prop name of the property\n * @param callback callback to be triggered on property change\n * @param immediate trigger immediatelly if property has been already set.\n * @return callback to detach the listener\n */\n listen<K extends NonFunctionPropNames<T>>(\n prop: K,\n callback: (value: T[K], previousValue: T[K]) => void,\n immediate?: boolean,\n ): () => void;\n\n /**\n * Trigger callback whenever any property changed within this instance.\n *\n * @param prop name of the property\n * @param callback callback to be triggered on property change\n * @param immediate trigger immediatelly if property has been already set.\n * @return callback to detach the listener\n */\n onChange(callback: () => void): () => void;\n\n /**\n * Bind properties to another object. Changes on the properties will be reflected on the target object.\n *\n * @param targetObject object to bind properties to\n * @param properties list of properties to bind. If not provided, all properties will be bound.\n */\n bindTo(targetObject: any, properties?: Array<NonFunctionPropNames<T>>): void;\n} & {\n [K in NonFunctionNonPrimitivePropNames<T>]: CallbackProxy<T[K]>;\n}\n\nexport type CollectionCallback<K, V> = {\n /**\n * Trigger callback when an item has been added to the collection.\n *\n * @param callback\n * @param immediate\n * @return callback to detach the onAdd listener\n */\n onAdd(callback: (item: V, index: K) => void, immediate?: boolean): () => void;\n\n /**\n * Trigger callback when an item has been removed to the collection.\n *\n * @param callback\n * @return callback to detach the onRemove listener\n */\n onRemove(callback: (item: V, index: K) => void): () => void;\n\n /**\n * Trigger callback when the value on a key has changed.\n *\n * THIS METHOD IS NOT RECURSIVE!\n * If you want to listen to changes on individual items, you need to attach callbacks to the them directly inside the `onAdd` callback.\n *\n * @param callback\n * @return callback to detach the onChange listener\n */\n onChange(callback: (item: V, index: K) => void): () => void;\n};\n\ntype OnInstanceAvailableCallback = (callback: (ref: Ref, existing: boolean) => void) => void;\n\ntype CallContext = {\n instance?: any,\n parentInstance?: any,\n onInstanceAvailable?: OnInstanceAvailableCallback,\n}\n\n/**\n * Legacy callback system\n *\n * @param decoder\n * @returns\n */\nexport function getDecoderStateCallbacks<T extends Schema>(decoder: Decoder<T>): SchemaCallbackProxy<T> {\n const $root = decoder.root;\n const callbacks = $root.callbacks;\n\n const onAddCalls: WeakMap<Function, boolean> = new WeakMap();\n let currentOnAddCallback: Function | undefined;\n\n decoder.triggerChanges = function (allChanges: DataChange[]) {\n const uniqueRefIds = new Set<number>();\n\n for (let i = 0, l = allChanges.length; i < l; i++) {\n const change = allChanges[i];\n const refId = change.refId;\n const ref = change.ref;\n const $callbacks = callbacks[refId];\n\n if (!$callbacks) { continue; }\n\n //\n // trigger onRemove on child structure.\n //\n if (\n (change.op & OPERATION.DELETE) === OPERATION.DELETE &&\n change.previousValue instanceof Schema\n ) {\n const deleteCallbacks = callbacks[(change.previousValue as Ref)[$refId]]?.[OPERATION.DELETE];\n for (let i = deleteCallbacks?.length - 1; i >= 0; i--) {\n deleteCallbacks[i]();\n }\n }\n\n if (ref instanceof Schema) {\n //\n // Handle schema instance\n //\n\n if (!uniqueRefIds.has(refId)) {\n // trigger onChange\n const replaceCallbacks = $callbacks?.[OPERATION.REPLACE];\n for (let i = replaceCallbacks?.length - 1; i >= 0; i--) {\n replaceCallbacks[i]();\n // try {\n // } catch (e) {\n // console.error(e);\n // }\n }\n }\n\n if ($callbacks.hasOwnProperty(change.field)) {\n const fieldCallbacks = $callbacks[change.field];\n for (let i = fieldCallbacks?.length - 1; i >= 0; i--) {\n fieldCallbacks[i](change.value, change.previousValue);\n // try {\n // } catch (e) {\n // console.error(e);\n // }\n }\n }\n\n\n } else {\n //\n // Handle collection of items\n //\n\n if ((change.op & OPERATION.DELETE) === OPERATION.DELETE) {\n //\n // FIXME: `previousValue` should always be available.\n //\n if (change.previousValue !== undefined) {\n // triger onRemove\n const deleteCallbacks = $callbacks[OPERATION.DELETE];\n for (let i = deleteCallbacks?.length - 1; i >= 0; i--) {\n deleteCallbacks[i](change.previousValue, change.dynamicIndex ?? change.field);\n }\n }\n\n // Handle DELETE_AND_ADD operations\n if ((change.op & OPERATION.ADD) === OPERATION.ADD) {\n const addCallbacks = $callbacks[OPERATION.ADD];\n for (let i = addCallbacks?.length - 1; i >= 0; i--) {\n addCallbacks[i](change.value, change.dynamicIndex ?? change.field);\n }\n }\n\n } else if (\n (change.op & OPERATION.ADD) === OPERATION.ADD &&\n change.previousValue !== change.value\n ) {\n // triger onAdd\n const addCallbacks = $callbacks[OPERATION.ADD];\n for (let i = addCallbacks?.length - 1; i >= 0; i--) {\n addCallbacks[i](change.value, change.dynamicIndex ?? change.field);\n }\n }\n\n // trigger onChange\n if (\n change.value !== change.previousValue &&\n // FIXME: see \"should not encode item if added and removed at the same patch\" test case.\n // some \"ADD\" + \"DELETE\" operations on same patch are being encoded as \"DELETE\"\n (change.value !== undefined || change.previousValue !== undefined)\n ) {\n const replaceCallbacks = $callbacks[OPERATION.REPLACE];\n for (let i = replaceCallbacks?.length - 1; i >= 0; i--) {\n replaceCallbacks[i](change.value, change.dynamicIndex ?? change.field);\n }\n }\n }\n\n uniqueRefIds.add(refId);\n }\n };\n\n function getProxy(\n metadataOrType: Metadata | DefinitionType,\n context: CallContext\n ) {\n let metadata: Metadata = context.instance?.constructor[Symbol.metadata] || metadataOrType;\n let isCollection = (\n (context.instance && typeof (context.instance['forEach']) === \"function\") ||\n (metadataOrType && typeof ((metadataOrType as typeof Schema)[Symbol.metadata]) === \"undefined\")\n );\n\n if (metadata && !isCollection) {\n\n const onAddListen = function (\n ref: Ref,\n prop: string,\n callback: (value: any, previousValue: any) => void, immediate: boolean\n ) {\n // immediate trigger\n if (\n immediate &&\n context.instance[prop] !== undefined &&\n !onAddCalls.has(currentOnAddCallback) // Workaround for https://github.com/colyseus/schema/issues/147\n ) {\n callback(context.instance[prop], undefined);\n }\n return $root.addCallback(ref[$refId], prop, callback);\n }\n\n /**\n * Schema instances\n */\n return new Proxy({\n listen: function listen(prop: string, callback: (value: any, previousValue: any) => void, immediate: boolean = true) {\n if (context.instance) {\n return onAddListen(context.instance, prop, callback, immediate);\n\n } else {\n // collection instance not received yet\n let detachCallback = () => {};\n\n context.onInstanceAvailable((ref: Ref, existing: boolean) => {\n detachCallback = onAddListen(ref, prop, callback, immediate && existing && !onAddCalls.has(currentOnAddCallback))\n });\n\n return () => detachCallback();\n }\n },\n\n onChange: function onChange(callback: () => void) {\n return $root.addCallback(\n context.instance[$refId],\n OPERATION.REPLACE,\n callback\n );\n },\n\n //\n // TODO: refactor `bindTo()` implementation.\n // There is room for improvement.\n //\n bindTo: function bindTo(targetObject: any, properties?: string[]) {\n if (!properties) {\n properties = Object.keys(metadata).map((index) => metadata[index as any as number].name);\n }\n return $root.addCallback(\n context.instance[$refId],\n OPERATION.REPLACE,\n () => {\n properties.forEach((prop) =>\n targetObject[prop] = context.instance[prop])\n }\n );\n }\n }, {\n get(target, prop: string) {\n const metadataField = metadata[metadata[prop]];\n if (metadataField) {\n const instance = context.instance?.[prop];\n const onInstanceAvailable: OnInstanceAvailableCallback = (\n (callback: (ref: Ref, existing: boolean) => void) => {\n const unbind = $(context.instance).listen(prop, (value, _) => {\n callback(value, false);\n\n // FIXME: by \"unbinding\" the callback here,\n // it will not support when the server\n // re-instantiates the instance.\n //\n unbind?.();\n }, false);\n\n // has existing value\n if (instance?.[$refId] !== undefined) {\n callback(instance, true);\n }\n }\n );\n\n return getProxy(metadataField.type, {\n // make sure refId is available, otherwise need to wait for the instance to be available.\n instance: (instance?.[$refId] !== undefined && instance),\n parentInstance: context.instance,\n onInstanceAvailable,\n });\n\n } else {\n // accessing the function\n return target[prop as keyof typeof target];\n }\n },\n has(target, prop: string) { return metadata[prop] !== undefined; },\n set(_, _1, _2) { throw new Error(\"not allowed\"); },\n deleteProperty(_, _1) { throw new Error(\"not allowed\"); },\n });\n\n } else {\n /**\n * Collection instances\n */\n\n const onAdd = function (ref: Ref, callback: (value: any, key: any) => void, immediate: boolean) {\n // Trigger callback on existing items\n if (immediate) {\n (ref as CollectionSchema).forEach((v, k) => callback(v, k));\n }\n\n return $root.addCallback(ref[$refId], OPERATION.ADD, (value: any, key: any) => {\n onAddCalls.set(callback, true);\n currentOnAddCallback = callback;\n callback(value, key);\n onAddCalls.delete(callback)\n currentOnAddCallback = undefined;\n });\n };\n\n const onRemove = function (ref: Ref, callback: (value: any, key: any) => void) {\n return $root.addCallback(ref[$refId], OPERATION.DELETE, callback);\n };\n\n const onChange = function (ref: Ref, callback: (value: any, key: any) => void) {\n return $root.addCallback(ref[$refId], OPERATION.REPLACE, callback);\n };\n\n return new Proxy({\n onAdd: function(callback: (value: any, key: any) => void, immediate: boolean = true) {\n //\n // https://github.com/colyseus/schema/issues/147\n // If parent instance has \"onAdd\" registered, avoid triggering immediate callback.\n //\n\n if (context.instance) {\n return onAdd(context.instance, callback, immediate && !onAddCalls.has(currentOnAddCallback));\n\n } else if (context.onInstanceAvailable) {\n // collection instance not received yet\n let detachCallback = () => {};\n\n context.onInstanceAvailable((ref: Ref, existing: boolean) => {\n detachCallback = onAdd(ref, callback, immediate && existing && !onAddCalls.has(currentOnAddCallback));\n });\n\n return () => detachCallback();\n }\n },\n onRemove: function(callback: (value: any, key: any) => void) {\n if (context.instance) {\n return onRemove(context.instance, callback);\n\n } else if (context.onInstanceAvailable) {\n // collection instance not received yet\n let detachCallback = () => {};\n\n context.onInstanceAvailable((ref: Ref) => {\n detachCallback = onRemove(ref, callback)\n });\n\n return () => detachCallback();\n }\n },\n onChange: function(callback: (value: any, key: any) => void) {\n if (context.instance) {\n return onChange(context.instance, callback);\n\n } else if (context.onInstanceAvailable) {\n // collection instance not received yet\n let detachCallback = () => {};\n\n context.onInstanceAvailable((ref: Ref) => {\n detachCallback = onChange(ref, callback)\n });\n\n return () => detachCallback();\n }\n },\n }, {\n get(target, prop: string) {\n if (!target[prop as keyof typeof target]) {\n throw new Error(`Can't access '${prop}' through callback proxy. access the instance directly.`);\n }\n return target[prop as keyof typeof target];\n },\n has(target, prop) { return target[prop as keyof typeof target] !== undefined; },\n set(_, _1, _2) { throw new Error(\"not allowed\"); },\n deleteProperty(_, _1) { throw new Error(\"not allowed\"); },\n });\n }\n }\n\n function $<T>(instance: T): CallbackProxy<T> {\n return getProxy(undefined, { instance }) as unknown as CallbackProxy<T>;\n }\n\n return $;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"getDecoderStateCallbacks.js","sourceRoot":"","sources":["../../../src/decoder/strategy/getDecoderStateCallbacks.ts"],"names":[],"mappings":"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","sourcesContent":["import { Metadata } from \"../../Metadata\";\nimport { Collection, NonFunctionNonPrimitivePropNames, NonFunctionPropNames } from \"../../types/HelperTypes\";\nimport { IRef, Ref } from \"../../encoder/ChangeTree\";\nimport { Decoder } from \"../Decoder\";\nimport { DataChange } from \"../DecodeOperation\";\nimport { OPERATION } from \"../../encoding/spec\";\nimport { Schema } from \"../../Schema\";\nimport { $refId } from \"../../types/symbols\";\nimport type { DefinitionType } from \"../../annotations\";\nimport type { CollectionSchema } from \"../../types/custom/CollectionSchema\";\n\n//\n// Discussion: https://github.com/colyseus/schema/issues/155\n//\n// Main points:\n// - Decouple structures from their callbacks.\n// - Registering deep callbacks can be confusing.\n// - Avoid closures by allowing to pass a context. (https://github.com/colyseus/schema/issues/155#issuecomment-1804694081)\n//\n\n/**\n * TODO: define a schema interface, which even having duplicate definitions, it could be used to get the callback proxy.\n *\n * ```ts\n * export type SchemaCallbackProxy<RoomState> = (<T extends Schema>(instance: T) => CallbackProxy<T>);\n * ```\n */\nexport type SchemaCallbackProxy<RoomState> = (<T>(instance: T) => CallbackProxy<T>);\nexport type GetCallbackProxy = SchemaCallbackProxy<any>; // workaround for compatibility for < colyseus.js0.16.6. Remove me on next major release.\n\nexport type CallbackProxy<T> = unknown extends T // is \"any\"?\n ? SchemaCallback<T> & CollectionCallback<any, any>\n : T extends Collection<infer K, infer V, infer _>\n ? CollectionCallback<K, V>\n : SchemaCallback<T>;\n\nexport type SchemaCallback<T> = {\n /**\n * Trigger callback when value of a property changes.\n *\n * @param prop name of the property\n * @param callback callback to be triggered on property change\n * @param immediate trigger immediatelly if property has been already set.\n * @return callback to detach the listener\n */\n listen<K extends NonFunctionPropNames<T>>(\n prop: K,\n callback: (value: T[K], previousValue: T[K]) => void,\n immediate?: boolean,\n ): () => void;\n\n /**\n * Trigger callback whenever any property changed within this instance.\n *\n * @param prop name of the property\n * @param callback callback to be triggered on property change\n * @param immediate trigger immediatelly if property has been already set.\n * @return callback to detach the listener\n */\n onChange(callback: () => void): () => void;\n\n /**\n * Bind properties to another object. Changes on the properties will be reflected on the target object.\n *\n * @param targetObject object to bind properties to\n * @param properties list of properties to bind. If not provided, all properties will be bound.\n */\n bindTo(targetObject: any, properties?: Array<NonFunctionPropNames<T>>): void;\n} & {\n [K in NonFunctionNonPrimitivePropNames<T>]: CallbackProxy<T[K]>;\n}\n\nexport type CollectionCallback<K, V> = {\n /**\n * Trigger callback when an item has been added to the collection.\n *\n * @param callback\n * @param immediate\n * @return callback to detach the onAdd listener\n */\n onAdd(callback: (item: V, index: K) => void, immediate?: boolean): () => void;\n\n /**\n * Trigger callback when an item has been removed to the collection.\n *\n * @param callback\n * @return callback to detach the onRemove listener\n */\n onRemove(callback: (item: V, index: K) => void): () => void;\n\n /**\n * Trigger callback when the value on a key has changed.\n *\n * THIS METHOD IS NOT RECURSIVE!\n * If you want to listen to changes on individual items, you need to attach callbacks to the them directly inside the `onAdd` callback.\n *\n * @param callback\n * @return callback to detach the onChange listener\n */\n onChange(callback: (item: V, index: K) => void): () => void;\n};\n\ntype OnInstanceAvailableCallback = (callback: (ref: Ref, existing: boolean) => void) => void;\n\ntype CallContext = {\n instance?: any,\n parentInstance?: any,\n onInstanceAvailable?: OnInstanceAvailableCallback,\n}\n\n/**\n * Legacy callback system\n *\n * @param decoder\n * @returns\n */\nexport function getDecoderStateCallbacks<T extends Schema>(decoder: Decoder<T>): SchemaCallbackProxy<T> {\n const $root = decoder.root;\n const callbacks = $root.callbacks;\n\n const onAddCalls: WeakMap<Function, boolean> = new WeakMap();\n let currentOnAddCallback: Function | undefined;\n\n decoder.triggerChanges = function (allChanges: DataChange[]) {\n const uniqueRefIds = new Set<number>();\n\n for (let i = 0, l = allChanges.length; i < l; i++) {\n const change = allChanges[i];\n const refId = change.refId;\n const ref = change.ref;\n const $callbacks = callbacks[refId];\n\n if (!$callbacks) { continue; }\n\n //\n // trigger onRemove on child structure.\n //\n if (\n (change.op & OPERATION.DELETE) === OPERATION.DELETE &&\n change.previousValue instanceof Schema\n ) {\n const deleteCallbacks = callbacks[(change.previousValue as Ref)[$refId]]?.[OPERATION.DELETE];\n for (let i = deleteCallbacks?.length - 1; i >= 0; i--) {\n deleteCallbacks[i]();\n }\n }\n\n if (ref instanceof Schema) {\n //\n // Handle schema instance\n //\n\n if (!uniqueRefIds.has(refId)) {\n // trigger onChange\n const replaceCallbacks = $callbacks?.[OPERATION.REPLACE];\n for (let i = replaceCallbacks?.length - 1; i >= 0; i--) {\n replaceCallbacks[i]();\n // try {\n // } catch (e) {\n // console.error(e);\n // }\n }\n }\n\n if ($callbacks.hasOwnProperty(change.field)) {\n const fieldCallbacks = $callbacks[change.field];\n for (let i = fieldCallbacks?.length - 1; i >= 0; i--) {\n fieldCallbacks[i](change.value, change.previousValue);\n // try {\n // } catch (e) {\n // console.error(e);\n // }\n }\n }\n\n\n } else {\n //\n // Handle collection of items\n //\n\n if ((change.op & OPERATION.DELETE) === OPERATION.DELETE) {\n //\n // FIXME: `previousValue` should always be available.\n //\n if (change.previousValue !== undefined) {\n // triger onRemove\n const deleteCallbacks = $callbacks[OPERATION.DELETE];\n for (let i = deleteCallbacks?.length - 1; i >= 0; i--) {\n deleteCallbacks[i](change.previousValue, change.dynamicIndex ?? change.field);\n }\n }\n\n // Handle DELETE_AND_ADD operations\n if ((change.op & OPERATION.ADD) === OPERATION.ADD) {\n const addCallbacks = $callbacks[OPERATION.ADD];\n for (let i = addCallbacks?.length - 1; i >= 0; i--) {\n addCallbacks[i](change.value, change.dynamicIndex ?? change.field);\n }\n }\n\n } else if (\n (change.op & OPERATION.ADD) === OPERATION.ADD &&\n change.previousValue !== change.value\n ) {\n // triger onAdd\n const addCallbacks = $callbacks[OPERATION.ADD];\n for (let i = addCallbacks?.length - 1; i >= 0; i--) {\n addCallbacks[i](change.value, change.dynamicIndex ?? change.field);\n }\n }\n\n // trigger onChange\n if (\n change.value !== change.previousValue &&\n // FIXME: see \"should not encode item if added and removed at the same patch\" test case.\n // some \"ADD\" + \"DELETE\" operations on same patch are being encoded as \"DELETE\"\n (change.value !== undefined || change.previousValue !== undefined)\n ) {\n const replaceCallbacks = $callbacks[OPERATION.REPLACE];\n for (let i = replaceCallbacks?.length - 1; i >= 0; i--) {\n replaceCallbacks[i](change.value, change.dynamicIndex ?? change.field);\n }\n }\n }\n\n uniqueRefIds.add(refId);\n }\n };\n\n function getProxy(\n metadataOrType: Metadata | DefinitionType,\n context: CallContext\n ) {\n let metadata: Metadata = context.instance?.constructor[Symbol.metadata] || metadataOrType;\n let isCollection = (\n (context.instance && typeof (context.instance['forEach']) === \"function\") ||\n (metadataOrType && typeof ((metadataOrType as typeof Schema)[Symbol.metadata]) === \"undefined\")\n );\n\n if (metadata && !isCollection) {\n\n const onAddListen = function (\n ref: Ref,\n prop: string,\n callback: (value: any, previousValue: any) => void, immediate: boolean\n ) {\n // immediate trigger\n if (\n immediate &&\n context.instance[prop] !== undefined &&\n !onAddCalls.has(currentOnAddCallback) // Workaround for https://github.com/colyseus/schema/issues/147\n ) {\n callback(context.instance[prop], undefined);\n }\n return $root.addCallback(ref[$refId], prop, callback);\n }\n\n /**\n * Schema instances\n */\n return new Proxy({\n listen: function listen(prop: string, callback: (value: any, previousValue: any) => void, immediate: boolean = true) {\n if (context.instance) {\n return onAddListen(context.instance, prop, callback, immediate);\n\n } else {\n // collection instance not received yet\n let detachCallback = () => {};\n\n context.onInstanceAvailable((ref: Ref, existing: boolean) => {\n detachCallback = onAddListen(ref, prop, callback, immediate && existing && !onAddCalls.has(currentOnAddCallback))\n });\n\n return () => detachCallback();\n }\n },\n\n onChange: function onChange(callback: () => void) {\n return $root.addCallback(\n context.instance[$refId],\n OPERATION.REPLACE,\n callback\n );\n },\n\n //\n // TODO: refactor `bindTo()` implementation.\n // There is room for improvement.\n //\n bindTo: function bindTo(targetObject: any, properties?: string[]) {\n if (!properties) {\n properties = Object.keys(metadata).map((index) => metadata[index as any as number].name);\n }\n return $root.addCallback(\n context.instance[$refId],\n OPERATION.REPLACE,\n () => {\n properties.forEach((prop) =>\n targetObject[prop] = context.instance[prop])\n }\n );\n }\n }, {\n get(target, prop: string) {\n const metadataField = metadata[metadata[prop]];\n if (metadataField) {\n const instance = context.instance?.[prop];\n const onInstanceAvailable: OnInstanceAvailableCallback = (\n (callback: (ref: Ref, existing: boolean) => void) => {\n const unbind = $(context.instance).listen(prop, (value, _) => {\n callback(value, false);\n\n // FIXME: by \"unbinding\" the callback here,\n // it will not support when the server\n // re-instantiates the instance.\n //\n unbind?.();\n }, false);\n\n // has existing value\n if (instance?.[$refId] !== undefined) {\n callback(instance, true);\n }\n }\n );\n\n return getProxy(metadataField.type, {\n // make sure refId is available, otherwise need to wait for the instance to be available.\n instance: (instance?.[$refId] !== undefined && instance),\n parentInstance: context.instance,\n onInstanceAvailable,\n });\n\n } else {\n // accessing the function\n return target[prop as keyof typeof target];\n }\n },\n has(target, prop: string) { return metadata[prop] !== undefined; },\n set(_, _1, _2) { throw new Error(\"not allowed\"); },\n deleteProperty(_, _1) { throw new Error(\"not allowed\"); },\n });\n\n } else {\n /**\n * Collection instances\n */\n\n const onAdd = function (ref: Ref, callback: (value: any, key: any) => void, immediate: boolean) {\n // Trigger callback on existing items\n if (immediate) {\n (ref as CollectionSchema).forEach((v, k) => callback(v, k));\n }\n\n return $root.addCallback(ref[$refId], OPERATION.ADD, (value: any, key: any) => {\n onAddCalls.set(callback, true);\n currentOnAddCallback = callback;\n callback(value, key);\n onAddCalls.delete(callback)\n currentOnAddCallback = undefined;\n });\n };\n\n const onRemove = function (ref: Ref, callback: (value: any, key: any) => void) {\n return $root.addCallback(ref[$refId], OPERATION.DELETE, callback);\n };\n\n const onChange = function (ref: Ref, callback: (value: any, key: any) => void) {\n return $root.addCallback(ref[$refId], OPERATION.REPLACE, callback);\n };\n\n return new Proxy({\n onAdd: function(callback: (value: any, key: any) => void, immediate: boolean = true) {\n //\n // https://github.com/colyseus/schema/issues/147\n // If parent instance has \"onAdd\" registered, avoid triggering immediate callback.\n //\n\n if (context.instance) {\n return onAdd(context.instance, callback, immediate && !onAddCalls.has(currentOnAddCallback));\n\n } else if (context.onInstanceAvailable) {\n // collection instance not received yet\n let detachCallback = () => {};\n\n context.onInstanceAvailable((ref: Ref, existing: boolean) => {\n detachCallback = onAdd(ref, callback, immediate && existing && !onAddCalls.has(currentOnAddCallback));\n });\n\n return () => detachCallback();\n }\n },\n onRemove: function(callback: (value: any, key: any) => void) {\n if (context.instance) {\n return onRemove(context.instance, callback);\n\n } else if (context.onInstanceAvailable) {\n // collection instance not received yet\n let detachCallback = () => {};\n\n context.onInstanceAvailable((ref: Ref) => {\n detachCallback = onRemove(ref, callback)\n });\n\n return () => detachCallback();\n }\n },\n onChange: function(callback: (value: any, key: any) => void) {\n if (context.instance) {\n return onChange(context.instance, callback);\n\n } else if (context.onInstanceAvailable) {\n // collection instance not received yet\n let detachCallback = () => {};\n\n context.onInstanceAvailable((ref: Ref) => {\n detachCallback = onChange(ref, callback)\n });\n\n return () => detachCallback();\n }\n },\n }, {\n get(target, prop: string) {\n if (!target[prop as keyof typeof target]) {\n throw new Error(`Can't access '${prop}' through callback proxy. access the instance directly.`);\n }\n return target[prop as keyof typeof target];\n },\n has(target, prop) { return target[prop as keyof typeof target] !== undefined; },\n set(_, _1, _2) { throw new Error(\"not allowed\"); },\n deleteProperty(_, _1) { throw new Error(\"not allowed\"); },\n });\n }\n }\n\n function $<T>(instance: T): CallbackProxy<T> {\n return getProxy(undefined, { instance }) as unknown as CallbackProxy<T>;\n }\n\n return $;\n}\n"]}
|