{"version":3,"sources":["pointers.ts"],"sourcesContent":["// deno-lint-ignore-file no-namespace\nimport { Endpoint, endpoints, endpoint_name, IdEndpoint, Person, Target, target_clause, LOCAL_ENDPOINT, BROADCAST } from \"../types/addressing.ts\";\nimport { NetworkError, PermissionError, PointerError, RuntimeError, ValueError } from \"../types/errors.ts\";\nimport { Compiler, PrecompiledDXB } from \"../compiler/compiler.ts\";\nimport { DX_NOT_TRANSFERABLE, DX_PTR, DX_REACTIVE_METHODS, DX_VALUE, INVALID, NOT_EXISTING, SET_PROXY, SHADOW_OBJECT, UNKNOWN_TYPE, VOID } from \"./constants.ts\";\nimport { Runtime, UnresolvedValue } from \"./runtime.ts\";\nimport { DEFAULT_HIDDEN_OBJECT_PROPERTIES, logger, TypedArray } from \"../utils/global_values.ts\";\nimport type { compile_info, datex_scope, Equals, PointerSource } from \"../utils/global_types.ts\";\nimport { Type } from \"../types/type.ts\";\nimport { BinaryCode } from \"../compiler/binary_codes.ts\";\nimport { JSInterface } from \"./js_interface.ts\";\nimport { Stream } from \"../types/stream.ts\";\nimport { Tuple } from \"../types/tuple.ts\";\nimport type { primitive } from \"../types/abstract_types.ts\";\nimport { Function as DatexFunction } from \"../types/function.ts\";\nimport { Quantity } from \"../types/quantity.ts\";\nimport { buffer2hex, hex2buffer } from \"../utils/utils.ts\";\nimport { Conjunction, Disjunction, Logical } from \"../types/logic.ts\";\nimport { ProtocolDataType } from \"../compiler/protocol_types.ts\";\nimport { Scope } from \"../types/scope.ts\";\nimport { Time } from \"../types/time.ts\";\nimport \"../types/native_types.ts\"; // getAutoDefault\nimport { displayFatalError } from \"./display.ts\";\nimport { JSTransferableFunction } from \"../types/js-function.ts\";\nimport { sha256 } from \"../utils/sha256.ts\";\nimport { AutoMap } from \"../utils/auto_map.ts\";\nimport { IterableWeakSet } from \"../utils/iterable-weak-set.ts\";\nimport { IterableWeakMap } from \"../utils/iterable-weak-map.ts\";\nimport { LazyPointer } from \"./lazy-pointer.ts\";\nimport { ReactiveArrayMethods } from \"../types/reactive-methods/array.ts\";\nimport { Assertion } from \"../types/assertion.ts\";\nimport { Storage } from \"../storage/storage.ts\";\nimport { client_type } from \"../utils/constants.ts\";\nimport { BACKEND_EXPORT } from \"../utils/interface-generator.ts\";\n\nexport type observe_handler<K=any, V extends RefLike = any> = (value:V extends RefLike<infer T> ? T : V, key?:K, type?:ReactiveValue.UPDATE_TYPE, transform?:boolean, is_child_update?:boolean, previous?: any, atomic_id?:symbol)=>void|boolean\nexport type observe_options = {types?:ReactiveValue.UPDATE_TYPE[], ignore_transforms?:boolean, recursive?:boolean}\n\nconst arrayProtoNames = Object.getOwnPropertyNames(Array.prototype);\nconst objectProtoNames = Object.getOwnPropertyNames(Object.prototype)\n\n/**\n * use as generic type instead of Ref<T> to prevent \"excessively deep type instantiation\" error\n */\nexport type RefLike<T = any> = Pointer<T>|PointerProperty<T>\n/**\n * Same as RefLike, but returns Pointer<T>&T for primitive pointers\n */\nexport type RefLikeOut<T = any> = PointerWithPrimitive<T>|PointerProperty<T>\n\n// root class for pointers and pointer properties, value changes can be observed\nexport abstract class ReactiveValue<T = any> extends EventTarget {\n\n    static [DX_NOT_TRANSFERABLE] = true\n\n    #observerCount = 0;\n\n    #observers?: Map<observe_handler, observe_options|undefined>\n    #observers_bound_objects?: Map<object, Map<observe_handler, observe_options|undefined>>\n\n    #val?: T;\n\n    // guarantees that x instanceof Ref works correctly, inferring RefLike\n    static [Symbol.hasInstance]: (val: unknown) => val is RefLike\n\n    constructor(value?:RefOrValue<T>) {\n        super();\n        value = ReactiveValue.collapseValue(value);\n        if (value!=undefined) this.val = value;\n    }\n\n    public get val(): T|undefined {\n        if (typeof this.#val !== \"object\" && typeof this.#val !== \"function\")\n            this.handleBeforeNonReferencableGet();\n        return this.#val;\n    }\n    public set val(value: T|undefined) {\n        const previous = this.#val;\n        this.#val = <T> ReactiveValue.collapseValue(value, true, true);\n        if (previous !== this.#val) this.triggerValueInitEvent(false, previous)\n    }\n\n    /**\n     * get the current #val without triggering getters\n     * Only use this internally to get the current value,\n     * should not be acessed from outside the Ref\n     */\n    protected get current_val():T|undefined {\n        return this.#val;\n    }\n\n    // same as val setter, but can be awaited\n    public setVal(value:T, trigger_observers = true, is_transform?:boolean) {\n        const previous = this.#val;\n        this.#val = <T> ReactiveValue.collapseValue(value, true, true);\n        if (trigger_observers && previous !== this.#val) return this.triggerValueInitEvent(is_transform, previous)\n    }\n    \n    protected triggerValueInitEvent(is_transform = false, previous?:any){\n        const value = this.current_val;\n        const promises = [];\n        for (const [o, options] of this.#observers??[]) {\n            if ((!options?.types || options.types.includes(ReactiveValue.UPDATE_TYPE.INIT)) && !(is_transform && options?.ignore_transforms)) promises.push(o(value, VOID, ReactiveValue.UPDATE_TYPE.INIT, is_transform, undefined, previous));\n        }\n        for (const [object, observers] of this.#observers_bound_objects??[]) {\n            for (const [o, options] of observers??[]) {\n                if ((!options?.types || options.types.includes(ReactiveValue.UPDATE_TYPE.INIT)) && !(is_transform && options?.ignore_transforms)) promises.push(o.call(object, value, VOID, ReactiveValue.UPDATE_TYPE.INIT, is_transform, undefined, previous));\n            }\n        }\n        return Promise.allSettled(promises);\n    }\n\n    /**\n     * $ shortcut to create transforms for properties (also for primitive values in JS context for now (e.g. toString) - but no DATEX compatibility)\n     */\n    public get $(): Proxy$<T> {\n        return this.handle$(false, true, true); // direct pointer or ->\n    }\n    public get $$(): Proxy$<T> {\n        return this.handle$(true, false, true); // ->\n    }\n\n    private handle$(force_pointer_properties=true, setter=true, transform_functions=true): Proxy$<T> {\n        const handler:ProxyHandler<any> = {};\n\n        // deno-lint-ignore no-this-alias\n        let pointer:Pointer = this as any;\n\n        // double pointer property..TODO: improve, currently tries to collapse current value\n        if (pointer instanceof PointerProperty) {\n            pointer = <Pointer>Pointer.getByValue(pointer.val);\n            if (!pointer) throw new Error(\"Nested pointer properties are currently not supported\");\n        }\n\n        if (!(pointer instanceof Pointer)) throw new Error(\"Cannot use $, not a pointer\");\n\n        handler.ownKeys = () => {\n            return Reflect.ownKeys(pointer.val);\n        }\n        handler.getOwnPropertyDescriptor = (_target: T, p: string | symbol) => {\n            return Reflect.getOwnPropertyDescriptor(pointer.val, p);\n        }\n\n        const type = Type.ofValue(pointer.val);\n        \n        // add DX_REACTIVE_METHODS for array\n        if (pointer.val instanceof Array && !(pointer.val as any)[DX_REACTIVE_METHODS]) {\n            (pointer.val as any)[DX_REACTIVE_METHODS] = new ReactiveArrayMethods(pointer);\n        }\n        // add custom DX_REACTIVE_METHODS\n        else if (type.interface_config?.get_reactive_methods_object) {\n            (pointer.val as any)[DX_REACTIVE_METHODS] = type.interface_config.get_reactive_methods_object(pointer.val);\n        }\n\n        handler.get = (_, key) => {\n            // array iterator\n            if (key === Symbol.iterator) {\n                // array\n                if (pointer.val instanceof Array) return function* () {\n                    for (const key of Object.keys(pointer.val)) yield handler.get!(pointer.val, key, undefined);\n                }\n                // map\n                else if (pointer.val instanceof Map) return function* () {\n                    for (const key of pointer.val.keys()) yield [key, handler.get!(pointer.val, key, undefined)];\n                }\n                else throw new Error(\"Cannot iterate over pointer properties\");\n            }\n\n            if (typeof key == \"symbol\") return pointer.val?.[key];\n\n            // special $ methods\n            const reactiveMethods = pointer.val?.[DX_REACTIVE_METHODS];\n            if (reactiveMethods && key in reactiveMethods) return reactiveMethods[key];\n\n            if (force_pointer_properties) return PointerProperty.get(pointer, <keyof typeof pointer>key, true);\n            else {\n                if (!(pointer.val instanceof Array) && ![...pointer.getKeys()].includes(key)) {\n                    throw new ValueError(\"Property \"+key.toString()+\" does not exist in value\");\n                }\n                if (pointer instanceof Pointer && Pointer.pointerifyValue(pointer.shadow_object?.[key]) instanceof ReactiveValue) return Pointer.pointerifyValue(pointer.shadow_object?.[key]);\n                else return PointerProperty.get(pointer, <keyof typeof pointer>key, true);\n            } \n        }\n\n        const useFunction = transform_functions && typeof this.val == \"function\";\n        // handle function as transform\n        if (useFunction) {\n            handler.apply = (_target, thisRef, args) => {\n                const thisVal = ReactiveValue.collapseValue(thisRef, true, true);\n                if (typeof thisVal != \"function\") throw new Error(\"Cannot create a reference transform, not a function\"); \n    \n                if (thisRef instanceof PointerProperty) {\n                    return ReactiveValue.collapseValue(Pointer.createTransform([thisRef.pointer], ()=>{\n                        return thisVal(...args);\n                    }));\n                }\n                // currently for non-datex functions, function context is only available via PointerProperty\n                else throw new Error(\"Cannot create a reference transform, missing context for function\"); \n            }\n        }\n\n        if (setter && pointer instanceof Pointer) {\n            handler.set = (_target: unknown, p: string, value: unknown) => {\n                (<Pointer<T>>pointer).handleSetReference(p, value);\n                return true;\n            }\n        }\n        else handler.set = () => {\n            return false;\n        }\n        \n        return <Proxy$<T>> new Proxy(this.val!, handler);\n    }\n\n\n    /**\n     * returns a value that can be referenced in JS\n     */\n    get js_value():CollapsedValueJSCompatible<T> {\n        return <any>this;\n    }\n   \n    // call handler when value changes\n    // unobserve if handler returns false\n    public static observe<V=unknown, K=unknown>(value: V, handler:observe_handler<K, V>, bound_object?:object, key?:K, options?:observe_options):void {\n        const pointer = Pointer.pointerifyValue(value);\n        if (pointer instanceof Pointer) pointer.observe(handler, bound_object, key, options);\n        else if (pointer instanceof ReactiveValue) pointer.observe(<observe_handler>handler, bound_object, options);\n        else throw new ValueError(\"Cannot observe this value because it has no pointer\")\n    }\n\n\n    // same as observe, but also accepts non-reference values\n    // always calls the handler once directly (init)\n    public static observeAndInit<V=unknown, K=unknown>(value: V, handler:observe_handler<K, V>, bound_object?:object, key?:K, options?:observe_options):void {\n        try {\n            this.observe(value, handler, bound_object, key, options);\n        } catch {} // throws if value does not have a DATEX reference, can be ignored - in this case no observer is set, only the initial handler call is triggered\n        const val = this.collapseValue(value, true, true);\n        if (handler.call) handler.call(bound_object, val, undefined, ReactiveValue.UPDATE_TYPE.INIT);\n        else handler(val, undefined, ReactiveValue.UPDATE_TYPE.INIT);\n    }\n\n    // call handler when value changes\n    public static unobserve<V=unknown, K=unknown>(value: V, handler:observe_handler<K, V>, bound_object?:object, key?:K):void {\n        const pointer = Pointer.pointerifyValue(value);\n        if (pointer instanceof Pointer) pointer.unobserve(handler, bound_object, key);\n        else if (pointer instanceof ReactiveValue) pointer.unobserve(<observe_handler>handler, <object>bound_object);\n        else throw new ValueError(\"Cannot unobserve this value because it has no pointer\")\n    }\n\n   \n\n    // callback on property value change\n    // general handler structure is: (value:any, key?:any, type?:T)=>void \n    // when a specific property is updated, the key is set, and value is the property value\n    // when the value itself is changed, the new value is available in 'value' and the key is void\n    public observe(handler: observe_handler, bound_object?:object, options?:observe_options) {\n        if (!handler) throw new ValueError(\"Missing observer handler\")\n\n        // bind object to observer\n        if (bound_object) {\n            if (!this.#observers_bound_objects) this.#observers_bound_objects = new Map();\n            if (!this.#observers_bound_objects.has(bound_object)) this.#observers_bound_objects.set(bound_object, new Map());\n            this.#observers_bound_objects.get(bound_object)!.set(handler, options)\n        }\n\n        // normal observer\n        else {\n            if (!this.#observers) this.#observers = new Map();\n            this.#observers.set(handler, options);\n        }\n        this.updateObserverCount(+1);\n    }\n\n    // stop observation\n    public unobserve(handler:observe_handler): void\n    // remove this observer for bound_object\n    public unobserve(handler:observe_handler, bound_object?:object): void\n    // remove all observers for bound_object\n    public unobserve(bound_object:object): void\n\n    public unobserve(handler_or_bound_object:observe_handler|object, bound_object?:object) {\n\n        let wasRemoved = false;\n\n        let handler: observe_handler|undefined\n        if (handler_or_bound_object instanceof globalThis.Function) handler = handler_or_bound_object;\n        else bound_object = handler_or_bound_object;\n\n        if (bound_object) {\n            if (handler) {\n                if (this.#observers_bound_objects) {\n                    wasRemoved = !!this.#observers_bound_objects.get(bound_object)?.delete(handler)\n                    if (this.#observers_bound_objects.get(bound_object)?.size === 0) this.#observers_bound_objects.delete(bound_object)\n                }\n            }\n            else {\n                wasRemoved = !!this.#observers_bound_objects?.delete(bound_object);\n            }\n        }\n        else {\n            wasRemoved = !!this.#observers?.delete(handler!);\n        }\n        if (wasRemoved) this.updateObserverCount(-1);\n        return wasRemoved;\n    }\n\n    toString(){\n        return this.val?.toString() ?? '';\n    }\n\n    toJSON(){\n        return this.val;\n    }\n\n    valueOf(){\n        return this.val;\n    }\n\n    // utility functions\n\n    static collapseValue<V extends RefOrValue<unknown>, P1 extends boolean|undefined = false, P2 extends boolean|undefined = false>(value:V, collapse_indirect_references?:P1, collapse_primitive_pointers?:P2): CollapsedValueAdvanced<V, P1, P2> {\n        // don't collapse js primitive pointers per default\n        if (collapse_primitive_pointers == undefined) collapse_primitive_pointers = <P2>false;\n        // dont' collapse pointer properties or indirect pointer references per default\n        if (collapse_indirect_references == undefined) collapse_indirect_references = <P1>false;\n\n        if (\n            value instanceof ReactiveValue && \n            (\n                collapse_primitive_pointers || \n                !(value instanceof Pointer && value.is_js_primitive)\n            ) && (\n                collapse_indirect_references || \n                !(value instanceof PointerProperty || value.indirectReference)\n            )\n        ) {\n            // is a static transform\n            if (value instanceof Pointer && value.isStaticTransform) {\n                return value.staticTransformValue;\n            }\n            // unwrap previously wrapped value\n            if (value instanceof Pointer && value.current_type?.interface_config?.unwrap_transform) {\n                return value.current_type.interface_config.unwrap_transform(value.val);\n            }\n            else {\n                return value.val\n            }\n        }\n        else return <CollapsedValueAdvanced<V, P1, P2>> value;\n    }\n\n    // // create a new DatexValue from a DatexCompatValue that is updated based on a transform function\n    // static transform<OUT, V = any>(value:RefOrValue<V>, transform:(v:V)=>RefOrValue<OUT>):Ref<OUT> {\n    //     const initialValue = transform(Ref.collapseValue(value, true, true)); // transform current value\n    //     if (initialValue === VOID) throw new ValueError(\"initial tranform value cannot be void\");\n    //     const dx_value = Pointer.create(undefined, initialValue);\n    //     if (value instanceof Ref) value.observe(()=>{\n    //         const newValue = transform(value.value);\n    //         if (newValue !== VOID) dx_value.value = newValue;\n    //     }); // transform updates\n    //     return dx_value;\n    // }\n    // static transformMultiple<OUT>(values:RefOrValue<any>[], transform:(...values:RefOrValue<any>[])=>RefOrValue<OUT>):Ref<OUT> {\n    //     const initialValue = transform(...values.map(v=>Ref.collapseValue(v, true, true))); // transform current value\n    //     if (initialValue === VOID) throw new ValueError(\"initial tranform value cannot be void\");\n    //     const dx_value = Pointer.create(undefined, initialValue);\n    //     for (let value of values) {\n    //         if (value instanceof Ref) value.observe(()=>{\n    //             const newValue = transform(...values.map(v=>Ref.collapseValue(v, true, true)));\n    //             if (newValue !== VOID) dx_value.value = newValue;\n    //         }) // transform updates\n    //     }\n    //     return dx_value;\n    // }\n\n    /**\n     * Returns true if the value has a bound pointer or is a Datex.Ref\n     */\n    public static isRef(value: unknown) {\n        return (value instanceof ReactiveValue || Pointer.pointer_value_map.has(value));\n    }\n\n    // copy the value of a primitive datex value to another primitive value\n    static mirror<T extends primitive>(from:RefLike<T>, to:RefLike<T>) {\n        from.observe((v,k,p)=> to.val = v);\n    }\n\n\n\n    protected static capturedGetters? = new Set<ReactiveValue>()\n    protected static capturedGettersWithKeys? = new Map<Pointer, Set<any>>().setAutoDefault(Set)\n\n    /**\n     * true if currently capturing pointer getters in always function\n     */\n    public static isCapturing = false;\n    public static freezeCapturing = false;\n\n    /**\n     * Used for handling smart transforms\n     * captureGetters must be called before transform, getCaptuedGetters after to\n     * get a list of all dependencies\n     */\n    protected static captureGetters() {\n        this.isCapturing = true;\n        this.freezeCapturing = false;\n        this.capturedGetters = new Set()\n        this.capturedGettersWithKeys = new Map().setAutoDefault(Set)\n    }\n\n    protected static getCapturedGetters() {\n        const captured = {capturedGetters: this.capturedGetters, capturedGettersWithKeys:this.capturedGettersWithKeys};\n        this.capturedGetters = undefined;\n        this.capturedGettersWithKeys = undefined;\n        this.isCapturing = false;\n        return captured;\n    }\n\n    /**\n     * Prevents any values accessed within the callback function from\n     * being captured by a transform function (e.g. always)\n     */\n    public static disableCapturing<T>(callback:()=>T): T {\n        this.freezeCapturing = true;\n        const res = callback();\n        this.freezeCapturing = false;\n        return res;\n    }\n\n    /**\n     * must be called each time before the current collapsed value of the Ref is requested\n     * to keep track of dependencies and update transform\n     * Examples:\n     *  * raw values of a primitive pointer \n     *  * any raw property of a pointer (not a PointerProperty ref)\n     *  * toString() for any value\n     */\n    handleBeforeNonReferencableGet(key:any = NOT_EXISTING) {\n        if (ReactiveValue.freezeCapturing) return;\n\n        // remember previous capture state\n        const previousGetters = ReactiveValue.capturedGetters;\n        const previousGettersWithKeys = ReactiveValue.capturedGettersWithKeys;\n        const previousCapturing = ReactiveValue.isCapturing;\n\n        // trigger transform update if not live\n        if (this.#transformSource && !this.#liveTransform && !this.#forceLiveTransform) {\n            ReactiveValue.capturedGetters = new Set();\n            ReactiveValue.capturedGettersWithKeys = new Map().setAutoDefault(Set);\n            this.#transformSource.update();\n        }\n        if (previousCapturing) {\n            ReactiveValue.isCapturing = true;\n            ReactiveValue.capturedGetters = previousGetters ?? new Set();\n            ReactiveValue.capturedGettersWithKeys = previousGettersWithKeys ?? new Map().setAutoDefault(Set);\n\n            if (key === NOT_EXISTING) ReactiveValue.capturedGetters.add(this);\n            else if (this instanceof Pointer) ReactiveValue.capturedGettersWithKeys.getAuto(this).add(key)\n            else {\n                logger.warn(\"invalid capture, must be a pointer or property\")\n            }\n        }\n    }\n\n    #liveTransform = false;\n    #forceLiveTransform = false;\n    #transformSource?: TransformSource\n    #isStaticTransform = false;\n    #staticTransformValue?: unknown\n\n    /**\n     * if true, there are no dependencies and the value is never updated\n     * (only used when a transform source exists, e.g. for effects and always)\n     */\n    get isStaticTransform() {\n        return this.#isStaticTransform;\n    }\n\n    get staticTransformValue() {\n        return this.#staticTransformValue;\n    }\n\n    protected set _staticTransformValue(val: unknown) {\n        this.#isStaticTransform = true;\n        this.#staticTransformValue = val;\n    }\n\n\n    get transformSource() {\n        return this.#transformSource\n    }\n\n    protected set _liveTransform(val: boolean) {\n        this.#liveTransform = val;\n    }\n\n    /**\n     * add a new transform source\n     */\n    protected setTransformSource(transformSource: TransformSource) {\n        if (this.#transformSource) throw new Error(\"Ref already has a transform source\");\n        this.#transformSource = transformSource;\n        // initial value init\n        return transformSource.update();\n    }\n    \n    protected deleteTransformSource() {\n        this.#transformSource = undefined;\n    }\n\n    /**\n     * if there are no observers for this value and a live transform exists,\n     * the live mode is disabled, otherwise it is enabled\n     */\n    protected updateObserverCount(add:number) {\n        this.#observerCount += add;\n\n        if (this.#transformSource) {\n            if (this.#forceLiveTransform) return; // keep enabled\n            if (this.#observerCount == 0 && this.#liveTransform) this.disableLiveTransforms(); \n            else if (this.#observerCount && !this.#liveTransform) this.enableLiveTransforms();\n        }\n    }\n\n    /**\n     * only used for garbage collection\n     * @param count\n     */\n    protected forceSetObserverCount(count: number) {\n        this.#observerCount = count;\n    }\n\n    /**\n     * Should be called when live transforms are needed,\n     * i.e. when oberservers for this value are active\n     */\n    protected enableLiveTransforms(triggerUpdate = true) {\n        if (this.#forceLiveTransform) return;\n        this.#liveTransform = true;\n        this.#transformSource!.enableLive(triggerUpdate);\n    }\n\n    /**\n     * Should be called when live transforms are not needed,\n     * i.e. when there are no observers for this value\n     */\n    protected disableLiveTransforms() {\n        if (this.#forceLiveTransform) return;\n        this.#liveTransform = false;\n        this.#transformSource!.disableLive();\n    }\n\n    protected setForcedLiveTransform(forced: boolean, update = true) {\n        if (!this.#transformSource) return; // not relevant, no transform source\n        // console.log(\"forced live:\",forced)\n        this.#forceLiveTransform = forced;\n        // always enable if forced\n        if (forced) this.#transformSource.enableLive(update);\n        // disable if no observers left\n        else if (!this.#observerCount) this.disableLiveTransforms();\n    }\n\n}\n\n\n/**\n * @deprecated use Datex.Ref instead\n */\nexport const Value = ReactiveValue;\n/**\n * @deprecated use Datex.RefLike instead\n */\nexport type Value<T = unknown> = RefLike<T>;\n\n\nexport type TransformSource = {\n    /**\n     * called to indicate that the the .val should now always be\n     * automatically updated when dependencies change\n     */\n    enableLive: (update?: boolean)=>void\n    /**\n     * called to indicate that the transformed value should now\n     * only be calculated when update() is called\n     */\n    disableLive: ()=>void\n    /**\n     * called to update the transformed value\n     * returns a Pointer if the current (initial) transform value already was a transformed pointer itself\n     */\n    update: ()=>void|Pointer\n\n    // dependency values\n    deps: IterableWeakSet<ReactiveValue>\n    keyedDeps: IterableWeakMap<Pointer, Set<any>>\n}\n\n\nexport type PointerPropertyParent<K,V> = Map<K,V> | Record<K & (string|symbol),V>;\nexport type InferredPointerProperty<Parent, Key> = PointerProperty<Parent extends Map<unknown, infer MV> ? MV : Parent[Key&keyof Parent]>\n\n// interface to access (read/write) pointer value properties\nexport class PointerProperty<T=any> extends ReactiveValue<T> {\n\n    // override hasInstance from Ref\n    static [Symbol.hasInstance]: (val: unknown) => val is PointerProperty\n\n    #leak_js_properties: boolean\n\n    private _strongRef?: any // strong reference to own pointer to prevent garbage collection\n\n    public readonly pointer?: Pointer;\n    private lazy_pointer?: LazyPointer<unknown>;\n\n    private constructor(pointer: Pointer|LazyPointer<unknown>|undefined, public key: any, leak_js_properties = false) {\n        super();\n        \n        if (pointer instanceof Pointer) this.setPointer(pointer);\n        else if (pointer instanceof LazyPointer) {\n            this.lazy_pointer = pointer;\n            this.lazy_pointer.onLoad((_, ptr) => {\n                this.lazy_pointer = undefined;\n                this.setPointer(ptr);\n            })\n        }\n        else throw new Error(\"Pointer or lazy pointer required\")\n        \n        this.#leak_js_properties = leak_js_properties;\n    }\n\n    private setPointer(ptr: Pointer) {\n        // @ts-ignore private\n        this.pointer = ptr;\n\n        this._strongRef = ptr.val;\n\n        if (!PointerProperty.synced_pairs.has(ptr)) PointerProperty.synced_pairs.set(ptr, new Map());\n        PointerProperty.synced_pairs.get(ptr)!.set(this.key, new WeakRef(this)); // save in map\n    }\n\n\n    /**\n     * Called when the bound lazy pointer is loaded.\n     * If there is no lazy pointer, the callback is called immediately\n     * @param callback \n     */\n    public onLoad(callback: (val:PointerProperty<T>, ref: PointerProperty<T>)=>void) {\n        if (this.lazy_pointer) this.lazy_pointer.onLoad(() => callback(this, this));\n        else callback(this, this);\n    }\n\n    private static synced_pairs = new WeakMap<Pointer, Map<unknown, WeakRef<PointerProperty>>>()\n\n    // TODO: use InferredPointerProperty (does not collapse)\n    /**\n     * Returns a new Pointer property from a parent object/map and property key\n     * @param parent \n     * @param key \n     * @param leak_js_properties \n     * @returns \n     */\n    public static get<const Key, Parent extends PointerPropertyParent<Key,unknown>>(parent: Parent|Pointer<Parent>|LazyPointer<Parent>, key: Key, leak_js_properties = false): PointerProperty<Parent extends Map<unknown, infer MV> ? MV : Parent[Key&keyof Parent]> {\n        if (Pointer.isRef(key)) throw new Error(\"Cannot use a reference as a pointer property key\");\n        \n        const pointer = Pointer.createOrGetLazy(parent as any);\n\n        if (pointer instanceof Pointer) {\n            if (!this.synced_pairs.has(pointer)) this.synced_pairs.set(pointer, new Map());\n            if (this.synced_pairs.get(pointer)!.has(key)) {\n                const weakRef = this.synced_pairs.get(pointer)!.get(key);\n                const pointerProperty = weakRef.deref();\n                if (pointerProperty) return pointerProperty;\n                else {\n                    this.synced_pairs.get(pointer)!.delete(key);\n                }\n            }\n        }\n\n        return new PointerProperty(pointer, key, leak_js_properties);\n    }\n\n    public static getIfExists<const Key, Parent extends PointerPropertyParent<Key,unknown>>(parent: Parent|Pointer<Parent>|LazyPointer<Parent>, key: Key, leak_js_properties = false): PointerProperty<Parent extends Map<unknown, infer MV> ? MV : Parent[Key&keyof Parent]>|typeof NOT_EXISTING {\n        \n        parent = Pointer.pointerifyValue(parent);\n        if (parent instanceof Pointer && parent.type.template){\n            if ((typeof key == \"string\" || typeof key == \"symbol\" || typeof key == \"number\") && !(key in parent.type.template)) return NOT_EXISTING;\n        }\n        // normal html node without custom template, does not support pointer properties\n        else if (parent instanceof Pointer && parent.val instanceof Node && !parent.type.template) {\n            return NOT_EXISTING;\n        }\n        \n        const prop = this.get(parent, key, leak_js_properties);\n        if (prop.current_val === NOT_EXISTING) return NOT_EXISTING;\n        else return prop;\n    }\n\n    // get current pointer property\n    public override get val():T {\n        if (this.lazy_pointer) return undefined as T\n        \n        // capture property access in parent pointer\n        this.pointer!.handleBeforeNonReferencableGet(this.key);\n        const val = this.pointer!.getProperty(this.key, this.#leak_js_properties);\n        \n        if (val === NOT_EXISTING) {\n            console.log(this.pointer)\n            throw new Error(`Property ${this.key} does not exist in ${this.pointer?.type??\"Unknown\"}`);\n        }\n        else return val;\n    }\n\n    // update pointer property\n    public override set val(value: T) {\n        if (this.lazy_pointer) {\n            console.warn(\"Cannot set value of lazy pointer property\");\n            return;\n        }\n        this.pointer!.handleSet(this.key, ReactiveValue.collapseValue(value, true, true));\n    }\n\n    public override get current_val():T {\n        if (this.lazy_pointer) return undefined as T\n        return this.pointer!.getProperty(this.key, this.#leak_js_properties);\n    }\n\n  \n    // same as val setter, but can be awaited\n    public override setVal(value: T) {\n        if (this.lazy_pointer) {\n            console.warn(\"Cannot set value of lazy pointer property\");\n            return;\n        }\n        return this.pointer!.handleSet(this.key, ReactiveValue.collapseValue(value, true, true));\n    }\n\n    #observer_internal_handlers = new WeakMap<observe_handler, observe_handler>()\n    #observer_internal_bound_handlers = new WeakMap<object, WeakMap<observe_handler, observe_handler>>()\n\n    // callback on property value change and when the property value changes internally\n    public override observe(handler: observe_handler, bound_object?:Record<string, unknown>, options?:observe_options) {\n        if (this.lazy_pointer) {\n            console.warn(\"Cannot observe lazy pointer\");\n            return;\n        }\n        const value_pointer = Pointer.pointerifyValue(this.current_val);\n        if (value_pointer instanceof ReactiveValue) value_pointer.observe(handler, bound_object, options); // also observe internal value changes\n\n        const internal_handler = (v:unknown)=>{\n            const value_pointer = Pointer.pointerifyValue(v);\n            if (value_pointer instanceof ReactiveValue) value_pointer.observe(handler, bound_object, options); // also update observe for internal value changes\n            if (handler.call) handler.call(bound_object, v,undefined,ReactiveValue.UPDATE_TYPE.INIT)\n            // if arrow function\n            else handler(v,undefined,ReactiveValue.UPDATE_TYPE.INIT)\n        };\n        this.pointer!.observe(internal_handler, bound_object, this.key, options)\n\n        if (bound_object) {\n            if (!this.#observer_internal_bound_handlers.has(bound_object)) this.#observer_internal_bound_handlers.set(bound_object, new WeakMap);\n            this.#observer_internal_bound_handlers.get(bound_object)!.set(handler, internal_handler)\n        }\n        else this.#observer_internal_handlers.set(handler, internal_handler)\n    }\n\n    public override unobserve(handler: observe_handler, bound_object?:object) {\n        if (this.lazy_pointer) {\n            console.warn(\"Cannot unobserve lazy pointer\");\n            return;\n        }\n        const value_pointer = Pointer.pointerifyValue(this.current_val);\n        if (value_pointer instanceof ReactiveValue) value_pointer.unobserve(handler, bound_object); // also unobserve internal value changes\n\n        let internal_handler:observe_handler|undefined\n\n        if (bound_object) {\n            internal_handler = this.#observer_internal_bound_handlers.get(bound_object)?.get(handler);\n            this.#observer_internal_bound_handlers.get(bound_object)?.delete(handler);\n        }\n        else {\n            internal_handler = this.#observer_internal_handlers.get(handler);\n            this.#observer_internal_handlers.delete(handler);\n        }\n\n        if (internal_handler) this.pointer!.unobserve(internal_handler, bound_object, this.key); // get associated internal handler and unobserve\n    }\n\n    get type():Type|undefined {\n        const type = this.pointer?.type.getAllowedPropertyType(this.key);\n        if (type != Type.std.Any) return type; // TODO: returning Any makes problems\n        else return undefined;\n    }\n        \n}\n\n\n\nexport type ReadonlyRef<T> = Readonly<RefLike<T>>;\n/**\n * @deprecated Use Datex.RefOrValue instead\n */\nexport type CompatValue<T> = RefLike<T|undefined>|T;\nexport type RefOrValue<T> = RefLike<T>|T;\n\n\n/**\n * object with refs or values as properties\n */\nexport type RefOrValueObject<T> = { [P in keyof T]: RefOrValue<T[P]> }\n/**\n * object with refs or values as properties, all optional\n */\nexport type PartialRefOrValueObject<T> = { [P in keyof T]?: RefOrValue<T[P]> }\n\n\n// collapsed value\nexport type CollapsedValue<T extends RefOrValue<unknown>> =\n    // (reverse order of inheritance)\n    // generic value classes \n    T extends PointerProperty<infer TT> ? TT : \n    T extends Pointer<infer TT> ? TT : \n    T extends ReactiveValue<infer TT> ? TT : \n    T;\n\n// collapsed value that still has a reference in JS\nexport type CollapsedValueJSCompatible<T extends RefOrValue<unknown>> = \n    // (reverse order of inheritance) \n    // generic value classes\n    T extends PointerProperty<infer TT> ? (TT extends primitive ? T : TT) :\n    T extends Pointer<infer TT> ? (TT extends primitive ? T : TT) : \n    T extends ReactiveValue<infer TT> ? (TT extends primitive ? T : TT) : \n    T;\n\n// number -> Number, ..., get prototype methods\nexport type PrimitiveToClass<T> = \n    // deno-lint-ignore ban-types\n    T extends number ? Number :\n    // deno-lint-ignore ban-types\n    T extends string ? String :\n    // deno-lint-ignore ban-types\n    T extends boolean ? Boolean :\n    T extends bigint ? BigInt :\n    T;\n\n\ntype _Proxy$Function<T> = (T extends (...args: any) => any ? ((...args: Parameters<T>)=>Pointer<ReturnType<T>>) : unknown) // map all function properties to special transform functions that return a reference\n\ntype _Proxy$<T>         = _Proxy$Function<T> &\n    T extends Array<infer V> ? \n    // array\n    {\n        [key: number]: RefLike<V>, \n        map<U>(callbackfn: (value: MaybeObjectRef<V>, index: number, array: V[]) => U, thisArg?: any): Pointer<U[]>\n    }\n    : \n    (\n        T extends Map<infer K, infer V> ? \n        {\n            get(key: K): RefLike<V>\n        }\n\n         // normal object\n        : {[K in keyof T]: RefLike<T[K]>} // always map properties to pointer property references\n    )\n   \ntype _PropertyProxy$<T> = _Proxy$Function<T> & \n    T extends Array<infer V> ? \n    // array\n    {\n        [key: number]: PointerProperty<V>, \n        map<U>(callbackfn: (value: MaybeObjectRef<V>, index: number, array: V[]) => U, thisArg?: any): Pointer<U[]>\n    } \n    : \n    (\n        T extends Map<infer K, infer V> ? \n        {\n            get(key: K): PointerProperty<V>\n        }\n        // normal object\n        : {readonly [K in keyof T]: PointerProperty<T[K]>} // always map properties to pointer property references\n    )\nexport type Proxy$<T> = _Proxy$<PrimitiveToClass<T>>\nexport type PropertyProxy$<T> = _PropertyProxy$<PrimitiveToClass<T>>\n\nexport type ObjectRef<T> =\n    T\n    // TODO:\n    // {[K in keyof T]: MaybeObjectRef<T[K]>}\n    & (\n        // add $ and $$ properties if not already present\n        T extends {$: any, $$: any} ?\n            unknown: \n            {\n                $:Proxy$<T> // reference to value (might generate pointer property, if no underlying pointer reference)\n                $$:PropertyProxy$<T> // always returns a pointer property reference\n            }\n    );\n\nexport type MaybeObjectRef<T> = T extends primitive|Function ? T : ObjectRef<T>\n\n/**\n * @deprecated use ObjectRef\n */\nexport type JSValueWith$<T> = ObjectRef<T>;\n\n// TODO: does this make sense? (probably requires proxy for all pointer objects)\n// export type JSValueWith$<T> = T & \n//     {[P in keyof T & string as `$${P}`]: Ref<T[P]>} & \n//     {[P in keyof T & string as `$prop_${P}`]: PointerProperty<T[P]>}\n\n// converts Object to Record<string|symbol, unknown>\n\nexport type AnyObjectRef = {$: Record<string,unknown>, $$: Record<string,unknown>}\n\nexport type WrappedPointerValue = number|string|boolean|bigint|URL|Endpoint\n\n\n// Hint: T&{} is a workaround to prevent collapse of generic unions https://www.typescriptlang.org/docs/handbook/2/conditional-types.html#distributive-conditional-types\n\n// convert from any JS/DATEX value to minimal representation with reference\n// if a value is a object ref, it is converted to a Pointer<T>\nexport type MinimalJSRefWithIndirectRef<T, _C = CollapsedValue<T>> =\n    _C&{} extends symbol ? symbol : (\n        _C&{} extends WrappedPointerValue ?\n            PointerWithPrimitive<_C>: // keep pointer reference\n            _C&{} extends AnyObjectRef ?\n                Pointer<_C> : // pointer wrapper to keep indirect reference intact\n                ObjectRef<_C> // collapsed object\n    )\n\nexport type Ref<T, _C = CollapsedValue<T>> =\n    _C&{} extends symbol ? symbol : (\n        _C&{} extends WrappedPointerValue ?\n            PointerWithPrimitive<_C>: // keep pointer reference\n            ObjectRef<_C> // collapsed object\n    )\n\n/**\n * @deprecated use Ref\n */\nexport type MinimalJSRef<T, _C = CollapsedValue<T>> = Ref<T, _C>\n\n// same as MinimalJSRef, but objects don't have $ and $$ properties\nexport type MinimalJSRefNoObjRef<T, _C = CollapsedValue<T>> =\n_C&{} extends symbol ? symbol : (\n    _C&{} extends WrappedPointerValue ?\n        PointerWithPrimitive<_C>: // keep pointer reference\n        _C // collapsed object\n)\n\n// return Pointer<T>&T for primitives (excluding boolean) and Pointer<T> otherwise\nexport type PointerWithPrimitive<T> = T&{} extends WrappedPointerValue ? \n    T&{} extends primitive ? \n            Pointer<T>&T : // e.g. Pointer<number>&number\n            Pointer<T> : // e.g. Pointer<URL>\n    Pointer<T> // e.g. Pointer<Record<string, unknown>>\n\n\nexport type CollapsedValueAdvanced<T extends RefOrValue<unknown>, COLLAPSE_POINTER_PROPERTY extends boolean|undefined = true, COLLAPSE_PRIMITIVE_POINTER extends boolean|undefined = true, _C = CollapsedValue<T>> = \n    // if\n    _C extends primitive ?\n        (COLLAPSE_PRIMITIVE_POINTER extends true ? _C : T) : // primitive either collapsed or Pointer returned\n    // else\n        // if\n        T extends PointerProperty ?\n            (COLLAPSE_POINTER_PROPERTY extends true ? _C : T) : // PointerProperty either collapsed or PointerProperty returned\n        // else\n            ObjectRef<_C>  // otherwise pointer is always collapsed\n\n\n// convert value to DATEX reference value\nexport type ProxifiedValue<T extends RefOrValue<unknown>> = \n    // already a proxified value\n    T extends PointerProperty ? T :\n    T extends Pointer? T :\n    T extends ReactiveValue ? T :\n    // proxify\n    RefLike<T>\n\n// export type ObjectWithDatexValues<T> = {[K in keyof T]: T[K] extends RefOrValue<infer TT> ? (Ref<TT>&TT) : (Ref<T[K]>&T[K])}; // proxy object generated by props() function\n//export type ObjectWithDatexValues<T> = {[K in keyof T]: T[K] extends RefOrValue<infer TT> ? (TT extends primitive ? Ref<TT> : TT) : (T[K] extends primitive ? Ref<T[K]> : T[K])}; // proxy object generated by props() function\nexport type ObjectWithDatexValues<T> = {[K in keyof T]: ProxifiedValue<T[K]>}; // proxy object generated by props() function\nexport type CollapsedDatexObject<T> = {[K in keyof T]?: CollapsedValue<T[K]>}; // datex value properties are collapsed\nexport type CollapsedDatexObjectWithRequiredProperties<T> = {[K in keyof T]: CollapsedValue<T[K]>}; // datex value properties are collapsed\nexport type CollapsedDatexArray<T extends Record<number,unknown>> = CollapsedDatexObjectWithRequiredProperties<T>; // proxy array generated by props() function\n\ntype RefOrValueUnion<U> = (U extends any ? RefOrValue<U> : never)\n\nexport type DatexObjectInit<T> = {[K in keyof T]: (T[K] extends boolean ? RefOrValue<T[K]> : RefOrValueUnion<T[K]>) | (T[K] extends undefined ? undefined : never)}; // object that also accepts Datex Pointers etc. as properties, only for initializing\nexport type DatexObjectPartialInit<T> = {[K in keyof T]?: (T[K] extends boolean ? RefOrValue<T[K]> : RefOrValueUnion<T[K]>)}; // object that also accepts Datex Pointers etc. as properties, only for initializing\n\n// make sure a type union has the same be type (e.g. union of strings, ...)\n// returns the input T if valid, otherwise 'never'\ntype NotTheSameReturnType = never;\n\nexport type RestrictSameType<T extends RefOrValue<unknown>, _C = CollapsedValue<T>> =\n    // make sure if primitive, it's only one primitive type\n    _C extends string ? (Exclude<_C,string> extends never ? T : NotTheSameReturnType) :\n    _C extends number ? (Exclude<_C,number> extends never ? T : NotTheSameReturnType) :\n    _C extends bigint ? (Exclude<_C,bigint> extends never ? T : NotTheSameReturnType) :\n    _C extends boolean ? (Exclude<_C,boolean> extends never ? T : NotTheSameReturnType) :\n    _C extends null ? (Exclude<_C,null> extends never ? T : NotTheSameReturnType) :\n    _C extends undefined ? (Exclude<_C,undefined> extends never ? T : NotTheSameReturnType) :\n    T\n\n// transform functions\nexport type TransformFunctionInputs = readonly any[];\nexport type TransformFunction<Values extends TransformFunctionInputs, ReturnType> = (...values:CollapsedDatexArray<Values>)=>RestrictSameType<RefOrValue<ReturnType>>;\nexport type AsyncTransformFunction<Values extends TransformFunctionInputs, ReturnType> = (...values:CollapsedDatexArray<Values>)=>Promise<RestrictSameType<RefOrValue<ReturnType>>>|RestrictSameType<RefOrValue<ReturnType>>;\nexport type SmartTransformFunction<ReturnType> = ()=>Awaited<RestrictSameType<RefOrValue<ReturnType>>>;\nexport type AsyncSmartTransformFunction<ReturnType> = ()=>Awaited<RestrictSameType<RefOrValue<ReturnType>>>|Promise<Awaited<RestrictSameType<RefOrValue<ReturnType>>>>;\n\n\n// send datex updates from pointers only at specific times / intervals\n// either create new DatexUpdateScheduler(update_interval) or manually call trigger() to trigger an update for all pointers\nexport class UpdateScheduler {\n\n    static #schedulers = new Set<UpdateScheduler>();\n\n    updates_per_receiver: Map<target_clause, Map<Pointer, Map<string|symbol,[string|PrecompiledDXB, any[],boolean]>>> = new Map();\n    update_interval?: number;\n    active = false;\n    #interval?:number\n\n    datex_timeout?:number\n\n    constructor(update_interval?:number) {\n        UpdateScheduler.#schedulers.add(this);\n        this.update_interval = update_interval;\n        this.start();\n    }\n\n    private setUpdateInterval(){\n        if (this.update_interval != null) {\n            this.#interval = setInterval(()=>{\n                this.trigger()\n            }, this.update_interval)\n        }\n    }\n    private clearUpdateInterval(){\n        if (this.update_interval != null) clearInterval(this.#interval);\n    }\n\n    /**\n     * start all update triggers\n     */\n    start(){\n        this.active = true;\n        this.setUpdateInterval(); // set interval if update_interval defined\n    }\n\n    /**\n     * stop all update triggers\n     */\n    stop(){\n        this.active = false;\n        this.clearUpdateInterval();\n    }\n\n    /**\n     * remove this scheduler\n     */\n    remove(){\n        this.stop();\n        UpdateScheduler.#schedulers.delete(this);\n    }\n\n    // trigger an update\n    trigger(){\n        if (!this.active) return;\n         for (const [receiver, map] of this.updates_per_receiver) {\n            const data = [];\n            let datex:string|PrecompiledDXB = ''\n            const pdxb_array = []; // precompiled datex\n            let is_datex_strings = true;\n\n            for (const [_ptr, entries] of map) {\n                if (!entries.size) continue;\n\n                for (const [entry_datex, entry_data] of entries.values()) {\n                    // first entry decides if PrecompiledDXB or string\n                    if (is_datex_strings && entry_datex instanceof PrecompiledDXB) is_datex_strings = false;\n\n                    // join dx strings\n                    if (typeof entry_datex == \"string\") {\n                        datex+=entry_datex+';';\n                    }\n                    // join multiple PrecompiledDXB\n                    else if (entry_datex instanceof PrecompiledDXB) {\n                        pdxb_array.push(entry_datex);\n                    }\n                    data.push(...entry_data);\n                }\n                entries.clear();\n            }\n\n            // empty string?\n            if (is_datex_strings && !datex) continue;\n            // empty precompiled?, else generate\n            else if (!is_datex_strings) {\n                if (pdxb_array.length==0) continue;\n                if (pdxb_array.length==0) datex = pdxb_array[0]; // single PrecompiledDXB, just use it\n                else datex = PrecompiledDXB.combine(...pdxb_array); // combine multiple\n            }\n\n            if (!(receiver instanceof Disjunction && !receiver.size)) {\n                Runtime.datexOut([datex, data, {end_of_scope:false, type:ProtocolDataType.UPDATE, preemptive_pointer_init: true}], receiver, undefined, false, undefined, undefined, false, this.datex_timeout)\n                    .then(() => {\n                        // Success\n                    })\n                    .catch((e) => {\n                        console.error(\"forwarding failed\", e);\n                    });\n            }            \n        }\n\n    }\n\n    intermediate_updates_pointers = new Set<Pointer>();\n\n    // add a pointer for scheduling\n    // if skip_intermediate_updates = true, intermediate update are not guaranteed to be transmitted\n    addPointer(ptr: Pointer|any, intermediate_updates = false) {\n        if (!(ptr instanceof Pointer)) ptr = Pointer.pointerifyValue(ptr);\n        if (!(ptr instanceof Pointer)) throw new RuntimeError(\"value is not a pointer\");\n        if (intermediate_updates) this.intermediate_updates_pointers.add(ptr);\n        ptr.setScheduler(this);\n        // use timeout from last pointer\n        this.datex_timeout = ptr.datex_timeout;\n    }\n\n    // remove pointer from scheduling\n    removePointer(ptr: Pointer|any) {\n        if (!(ptr instanceof Pointer)) ptr = Pointer.pointerifyValue(ptr);\n        if (!(ptr instanceof Pointer)) throw new RuntimeError(\"value is not a pointer\");\n        ptr.deleteScheduler();\n    }\n\n\n    /** for the pointers */\n    /** important: datex for one pointer either all PrecompiledDXB or all string */\n    addUpdate(pointer:Pointer, identifier:string, datex:string|PrecompiledDXB, data:any[], receiver:target_clause, collapse_first_inserted = false) {\n        if (!this.updates_per_receiver.has(receiver)) this.updates_per_receiver.set(receiver, new Map());\n        const ptr_map = this.updates_per_receiver.get(receiver)!;\n        if (!ptr_map.has(pointer)) ptr_map.set(pointer, new Map())\n        ptr_map.get(pointer)!.set((!this.intermediate_updates_pointers.has(pointer) && identifier) ? identifier : Symbol(), [datex, data, collapse_first_inserted]);\n    }\n\n    /**\n     * trigger all schedulers\n     */\n    static triggerAll(){\n        for (const scheduler of this.#schedulers) {\n            scheduler.trigger();\n        }\n    }\n}\n\nexport type pointer_type = number;\n\n// mock pointer used for garbage collection\ntype MockPointer = {id: string, origin: Endpoint, subscribed?: Endpoint|false, is_origin: boolean} \n\nexport type SmartTransformOptions<T=unknown> = {\n    initial?: T,\n\tcache?: boolean,\n    allowStatic?: boolean,\n    // allow async when using always instead of asyncAlways\n    _allowAsync?: boolean,\n    // collapse primitive pointer if value has no reactive dependencies and garbage-collect pointer\n    _collapseStatic: boolean,\n    // always return the wrapper instead of the collapsed value, even for non-primitive pointers\n    _returnWrapper?: boolean,\n    // set the pointer type to allow any value\n    _allowAnyType?: boolean,\n}\n\ntype TransformState = {\n    isLive: boolean;\n    isFirst: boolean;\n    executingEffect: boolean;\n    deps: IterableWeakSet<ReactiveValue<any>>;\n    keyedDeps: AutoMap<any, Set<any>>;\n    returnCache: Map<string, any>;\n    getDepsHash: () => string;\n    update: () => void;\n}\n\n\nconst observableArrayMethods = new Set<string>([\n    \"entries\",\n    \"filter\",\n    \"find\",\n    \"findIndex\",\n    \"findLast\",\n    \"findLastIndex\",\n    \"flat\",\n    \"flatMap\",\n    \"forEach\",\n    \"includes\",\n    \"indexOf\",\n    \"join\",\n    \"keys\",\n    \"lastIndexOf\",\n    \"map\",\n    \"reduce\",\n    \"reduceRight\",\n    \"slice\",\n    \"some\",\n    \"toReversed\",\n    \"toSorted\",\n    \"toSpliced\",\n    \"values\",\n    \"with\",\n    \"sort\",\n    \"forEach\"\n])\n\n/** Wrapper class for all pointer values ($xxxxxxxx) */\nexport class Pointer<T = any> extends ReactiveValue<T> {\n\n    // override hasInstance from Ref\n    static [Symbol.hasInstance]: (val: unknown) => val is Pointer\n        \n    /** STATIC */\n\n    /** Pointer observers */\n    private static pointer_add_listeners = new Set<(p:Pointer)=>void>();\n    private static pointer_remove_listeners = new Set<(p:Pointer)=>void>();\n    private static pointer_property_add_listeners = new Set<(p:Pointer, key:any, value:any)=>void>();\n    private static pointer_property_change_listeners = new Set<(p:Pointer, key:any, value:any)=>void>();\n    private static pointer_property_delete_listeners = new Set<(p:Pointer, key:any)=>void>();\n    private static pointer_value_change_listeners =new Set<(p:Pointer)=>void>();\n    private static pointer_for_value_created_listeners = new WeakMap<any, (Set<((p:Pointer)=>void)>)>();\n    private static pointer_for_id_created_listeners = new Map<string, (Set<((p:Pointer)=>void)>)>();\n\n    public static onPointerAdded(listener: (p:Pointer)=>void) {\n        this.pointer_add_listeners.add(listener);\n    }\n    public static onPointerRemoved(listener: (p:Pointer)=>void) {\n        this.pointer_remove_listeners.add(listener);\n    }\n    public static onPointerPropertyAdded(listener: (p:Pointer, key:any, value:any)=>void) {\n        this.pointer_property_add_listeners.add(listener);\n    }\n    public static onPointerPropertyChanged(listener: (p:Pointer, key:any, value:any)=>void) {\n        this.pointer_property_change_listeners.add(listener);\n    }\n    public static onPointerPropertyDeleted(listener: (p:Pointer, key:any)=>void) {\n        this.pointer_property_delete_listeners.add(listener);\n    }\n    public static onPointerValueChanged(listener: (p:Pointer)=>void) {\n        this.pointer_value_change_listeners.add(listener);\n    }\n\n    /**\n     * Callback when pointer for a given id was added\n     * @param id\n     * @param listener \n     * @returns \n     */\n    public static onPointerForIdAdded(id:string, listener: (p:Pointer)=>void) {\n        const ptr = Pointer.get(id);\n        if (ptr && ptr.value_initialized) {\n            listener(ptr);\n            return;\n        }\n        // set listener\n        if (!this.pointer_for_id_created_listeners.has(id)) this.pointer_for_id_created_listeners.set(id, new Set());\n        this.pointer_for_id_created_listeners.get(id)?.add(listener);\n    }\n\n    public static onPointerForValueCreated(value:any, listener: (p:Pointer)=>void, trigger_if_exists = true){\n        // value already has a pointer?\n        if (trigger_if_exists) {\n            const ptr = Pointer.getByValue(value);\n            if (ptr) {\n                listener(ptr);\n                return;\n            }\n        }\n        // set listener\n        if (!this.pointer_for_value_created_listeners.has(value)) this.pointer_for_value_created_listeners.set(value, new Set());\n        this.pointer_for_value_created_listeners.get(value)?.add(listener);\n    }\n   \n\n    // unsubscribe from all external pointers\n    public static unsubscribeFromAllPointers(){\n        for (const pointer of this.getAllPointers()) {\n            if (!pointer.is_anonymous && !pointer.is_origin) pointer.unsubscribeFromPointerUpdates()\n        }\n    }\n\n    /**\n     *  Pointer Storage\n     *  stores all unique pointers + their values\n     */\n\n    public static pointers = new Map<string, Pointer>();   // pointer id -> pointer\n    public static primitive_pointers = new Map<string, WeakRef<Pointer>>();   // pointer id -> WeakRef<pointer>\n\n    public static pointer_value_map  = new WeakMap<any, Pointer>(); // value -> pointer\n    public static pointer_label_map  = new Map<string|number, Pointer>(); // label -> pointer\n\n    /**\n     * @returns an array containing all primitive and non-primitive pointers\n     */\n    public static getAllPointers() {\n        return [...this.iterateAllPointers()] \n    }\n\n    /**\n     * @returns an iterable that iterates over all primitive and non-primitive pointers\n     */\n    public static *iterateAllPointers(): Iterable<Pointer> {\n        yield* this.pointers.values();\n        for (const r of this.primitive_pointers.values()) {\n            const p = r.deref();\n            if (p) yield p;\n        }\n    }\n\n    /**\n     * returns a unique pointer hash: HASH + UNIQUE TIME\n     */\n    public static readonly MAX_POINTER_ID_SIZE = 26;\n    public static readonly STATIC_POINTER_SIZE = 26;\n\n    private static last_c = 0;\n    private static last_t = 0;\n\n    private static time_shift = 0;\n\n    public static POINTER_TYPE:\n    {\n        ENDPOINT:pointer_type,\n        ENDPOINT_PERSONAL:pointer_type,\n        ENDPOINT_INSTITUTION:pointer_type,\n        IPV6_ID:pointer_type,\n        STATIC:pointer_type,\n        BLOCKCHAIN_PTR:pointer_type,\n        PUBLIC:pointer_type\n    } = {\n        ENDPOINT: BinaryCode.ENDPOINT,\n        ENDPOINT_PERSONAL: BinaryCode.PERSON_ALIAS,\n        ENDPOINT_INSTITUTION: BinaryCode.INSTITUTION_ALIAS,\n        IPV6_ID: 4,\n        STATIC:  5,\n        BLOCKCHAIN_PTR:  0xBC, // blockchain ptr $BC, ...\n        PUBLIC:  6, // static public address\n    }\n\n    static #pointer_prefix?: Uint8Array\n\n    public static get pointer_prefix() {\n        if (!this.#pointer_prefix) this.#pointer_prefix = Runtime.endpoint.getPointerPrefix(); // new Uint8Array(21); // gets overwritten in DatexRuntime when endpoint id exists\n        return this.#pointer_prefix!;\n    }\n\n    static set pointer_prefix(pointer_prefix: Uint8Array) {\n        this.#pointer_prefix = pointer_prefix\n    }\n\n    static #is_local = true;\n    // all pointers with a @@local id, must be mapped to new endpoint ids when endpoint id is available\n    static #local_pointers = new IterableWeakSet<Pointer>();\n    // all pointers for which the is_origin property must be updated once the endpoint id is available\n    static #undetermined_pointers = new IterableWeakSet<Pointer>();\n    \n\n    public static set is_local(local: boolean) {\n        this.#is_local = local;\n        // update pointer ids if no longer local\n        if (!this.#is_local) {\n            // update local pointers\n            for (const pointer of this.#local_pointers) {\n                // still local?\n                if (pointer.origin == LOCAL_ENDPOINT) pointer.id = Pointer.getUniquePointerID(pointer);\n            }\n            this.#local_pointers.clear();\n\n            // update undetermined pointers\n            for (const pointer of this.#undetermined_pointers) {\n                pointer.#updateIsOrigin()\n            }\n            this.#undetermined_pointers.clear();\n        }\n    }\n    public static get is_local() {return this.#is_local}\n\n    #createdInContext = true;\n    /**\n     * Indicates if the pointer was created in the current context\n     * or fetched (from storage or network)\n     */\n    public get createdInContext() {\n        return this.#createdInContext;\n    }\n    public set createdInContext(fetched: boolean) {\n        this.#createdInContext = fetched;\n    }\n\n    /** 21 bytes address: 1 byte address type () 18/16 byte origin id - 2/4 byte origin instance - 4 bytes timestamp - 1 byte counter*/\n    /**\n     * Endpoint id types:\n     *  + Full Endpoint ID:   EEEE EEEE EEEE EEEE EE / II\n     *  + IPv6 compatible ID: IIII IIII IIII IIII / PPPP \n     * Pointer id types:\n     * Associaated with an endpoint id:\n     *  + Full Endpoint ID pointer: A EEEE EEEE EEEE EEEE EEII TTTT C    (A = Address type, E = endpoint id, I = instance id, T = timestamp, C = counter )\n     *  + IPv6 compatible Address:  A IIII IIII IIII IIII PPPP TTTT C    (I = IPv6 address, P = port) \n     *  + Endpoint static pointer:  A EEEE EEEE EEEE EEEE EEUU UUUU U    (E = endpoint id, U = unique id (agreed among all instances))\n     * Global / public:\n     *  + Blockchain address:       A BBBB BBBB BBBB                     (B = unique block address)\n     *  + Global static pointer:    A UUUU UUUU UUUU                     (U = unique id, stored in blockchain / decentralized) \n     * \n     * 'A' byte: first 3 bits for type, last 5 bits unused, can be used for custom flags \n     * */\n    /** total pointer id size: 26 bytes */\n    static getUniquePointerID(forPointer?:Pointer): Uint8Array {\n        const id = new Uint8Array(this.MAX_POINTER_ID_SIZE);\n        const id_view = new DataView(id.buffer)\n        // add custom origin id\n        if (forPointer && !forPointer.is_origin) id.set(forPointer.origin.getPointerPrefix());\n        // add current endpoint origin id\n        else id.set(this.pointer_prefix)\n\n        const timestamp = Math.round((new Date().getTime() - Compiler.BIG_BANG_TIME)/1000);\n\n        // reset on new timestamp\n        if (timestamp !== this.last_t) {\n            // reset time shift if actual time catches up with time shift \n            if (timestamp>this.last_t+this.time_shift) this.time_shift = 0;\n            // reset counter if no time shift\n            if (this.time_shift == 0) this.last_c = 0;\n        }\n\n        // counter overflow -> increment timestamp (should only happen if really necessary)\n        if (this.last_c > 255) {\n            this.last_c = 0;\n            this.time_shift ++;\n        }\n\n        // add timestamp (in seconds)\n        id_view.setUint32(21,timestamp+this.time_shift, true); // timestamp + time_shift\n\n        // add unique counter\n        id_view.setUint8(25, this.last_c++)\n\n        this.last_t = timestamp; // save actual last time a pointer was created\n\n        // add to local pointers list if no global endpoint id yet -> update pointer id as soon as global id available\n        if (forPointer && Pointer.is_local) {\n            this.#local_pointers.add(forPointer)\n        }\n\n        return id;\n    }\n\n    static getStaticPointerId(endpoint:IdEndpoint, unique_id:number): Uint8Array {\n        let id = new Uint8Array(this.STATIC_POINTER_SIZE);\n        let id_view = new DataView(id.buffer)\n\n        id.set(endpoint.getStaticPointerPrefix());\n        id_view.setUint32(13, unique_id, true);\n\n        return id;\n    }\n\n    static ANONYMOUS_ID = new Uint8Array(/*24*/1) // is anonymous pointer\n\n    /**\n     * returns true if the value has a bound pointer or is a Datex.Ref\n     * @deprecated use Ref.isRef\n     */\n    public static isReference(value:unknown) {\n        return ReactiveValue.isRef(value);\n    }\n\n    // returns the existing pointer for a value, or the value, if no pointer exists\n    public static pointerifyValue(value:any):Pointer|any {\n        return value?.[DX_PTR] ?? (value instanceof Pointer ? value : this.pointer_value_map.get(value)) ?? value;\n    }\n    // returns pointer only if pointer exists\n    public static getByValue<T>(value:RefOrValue<T>): Pointer<T>|undefined{\n        return (value?.[DX_PTR] ?? this.pointer_value_map.get(Pointer.collapseValue(value))) as Pointer<T>;\n    }\n\n    // returns pointer only if pointer exists\n    public static getByLabel(label:string|number):Pointer {\n        if (!this.pointer_label_map.has(label)) throw new PointerError(\"Label \"+Runtime.formatVariableName(label, '$')+\" does not exist\");\n        return this.pointer_label_map.get(label)!;\n    }\n\n    public static labelExists(label:string|number):boolean {\n        return this.pointer_label_map.has(label)\n    }\n\n    /**\n     * returns the pointer of a value if bound to a pointer, otherwise null\n     */\n    public static getId(value:unknown) {\n        const pointer = this.pointerifyValue(value);\n        if (pointer instanceof Pointer) return pointer.id;\n        else return null\n    }\n\n    // get pointer by id, only returns pointer if pointer already exists\n    static get(id:Uint8Array|string):Pointer|undefined {\n        id = Pointer.normalizePointerId(id);\n        return this.pointers.get(id) ?? this.primitive_pointers.get(id)?.deref();\n    }\n\n    static #pointer_sources = new Set<readonly [source:PointerSource, priority:number]>();\n    public static registerPointerSource(source: PointerSource, priority = 0) {\n        // sort by prio\n        const sorted = [...this.#pointer_sources, [source, priority] as const].sort((a,b)=>b[1]-a[1]);\n        this.#pointer_sources.clear();\n        sorted.forEach((s)=>this.#pointer_sources.add(s));\n    }\n\n    private static loading_pointers:Map<string, {promise: Promise<Pointer>, scopeList: WeakSet<datex_scope>}> = new Map();\n\n    // load from storage or request from remote endpoint if pointer not yet loaded\n    static load(id:string|Uint8Array, SCOPE?:datex_scope, only_load_local = false, sender_knows_pointer = true, allow_failure = false, lockedPointerPromise?: Promise<Pointer>): Promise<Pointer>|Pointer|LazyPointer<unknown> {\n\n        // pointer already exists\n        const existing_pointer = Pointer.get(id);\n        if (existing_pointer?.value_initialized) {\n            // check read permissions\n            existing_pointer.assertEndpointCanRead(SCOPE?.sender)\n            return existing_pointer;\n        }\n\n        const id_string = Pointer.normalizePointerId(id);\n        // only load if local pointer id\n        if (SCOPE?.exec_conditions?.onlyLocalPointers) {\n            const origin = Pointer.getOriginFromPointerId(id_string);\n            if (origin !== LOCAL_ENDPOINT && origin !== Runtime.endpoint) {\n                throw new Error(\"Tried to load non-local pointer\");\n            }\n        }\n\n        if (SCOPE) {\n            if (this.loading_pointers.get(id_string)?.scopeList.has(SCOPE)) {\n                return new LazyPointer(id_string)\n            }\n        }\n\n        if (this.loading_pointers.has(id_string)) {\n            if (SCOPE) this.loading_pointers.get(id_string)!.scopeList.add(SCOPE);\n            return this.loading_pointers.get(id_string)!.promise;\n        }\n\n\n        this.loading_pointers.set(id_string, null as any);\n        const loadPromise = this.handleLoad(id_string, id, SCOPE, only_load_local, sender_knows_pointer, allow_failure);\n        // only add load data if load not already finished\n        if (this.loading_pointers.has(id_string)) {\n            this.addLoadingPointerPromise(id_string, lockedPointerPromise??loadPromise, SCOPE);\n        }\n\n        return loadPromise;\n    }\n\n    /**\n     * called for pointer init blocks\n     */\n    static addLoadingPointerPromise(id: string|Uint8Array, loadedPromise: Promise<Pointer>, scope?: datex_scope) {\n        const id_string = Pointer.normalizePointerId(id);\n        this.loading_pointers.set(id_string, {promise: loadedPromise, scopeList: new WeakSet()});\n        if (scope) this.loading_pointers.get(id_string)!.scopeList.add(scope);\n    }\n\n    private static async handleLoad(id_string: string, id:string|Uint8Array, SCOPE:datex_scope|undefined, only_load_local:boolean, sender_knows_pointer:boolean, allow_failure:boolean) {\n\n        // get pointer or create new\n        let pointer:Pointer<any> = Pointer.create(id);\n\n        // logger.debug(\"loading pointer: \" + pointer.idString() +  \" origin = \" + pointer.origin, pointer.#loaded)\n        // not allowed: anonymous pointer\n        if (pointer.is_anonymous) {\n            this.loading_pointers.delete(id_string);\n            throw new PointerError(\"The anonymous pointer has no value\", SCOPE)\n        }\n\n        // get value if pointer value not yet loaded\n        if (!pointer.#loaded) {\n\n            // was not created new in current context\n            pointer.createdInContext = false;\n            \n            // first try loading from storage\n            let stored:any = NOT_EXISTING;\n            let source:PointerSource|null = null;\n            let priority:number;\n            for ([source,priority] of this.#pointer_sources) {\n                try {\n                    stored = await source.getPointer(pointer.id, !SCOPE, SCOPE?.exec_conditions?.onlyLocalPointers??false);\n                }\n                catch (e) {\n                    this.loading_pointers.delete(id_string);\n                    throw e;\n                }\n                if (stored != NOT_EXISTING) break;\n            }\n\n            if (stored!=NOT_EXISTING) {\n                // set value if pointer still not loaded during source.getPointer\n                if (!pointer.#loaded) {\n                    // if the value is a pointer with a tranform scope, copy the transform, not the value (TODO still just a workaround to preserve transforms in storage, maybe better solution?)\n                    if (stored instanceof Pointer && stored.transform_scope) {\n                        await pointer.handleTransformAsync(stored.transform_scope.internal_vars, stored.transform_scope);\n                    }\n                    // set normal value, force placeholder move\n                    else pointer = pointer.setValue(stored, true);\n                }\n               \n                // now sync if source (pointer storage) can sync pointer\n                if (source?.syncPointer) source.syncPointer(pointer);\n\n                // use local endpoint as default origin for storage pointer (TODO change?)\n                // pointer.origin = Runtime.endpoint;\n            }\n\n            // special pointers\n          \n            // request BC pointer from network\n            else if (id_string.startsWith(\"BC\")) {\n                // try to subscribe (default: main_node)\n                try {\n                    pointer = await pointer.subscribeForPointerUpdates(Runtime.main_node); // TODO relay node?\n                } catch (e) {\n                    this.loading_pointers.delete(id_string);\n                    // could not subscribe, remove pointer again\n                    pointer.delete();\n                    throw e;\n                }\n            }\n\n            // request pointer value from original sender, if pointer not yet loaded & not subscribe to own endpoint & fix: infinite loop: subscribe invalid pointer <-> subscribe\n            else if (!only_load_local && !pointer.is_origin) {\n\n                // waiting subscribe / unsubscribe ! should not happen TODO improve \n                if (SCOPE?.sync) {\n                    this.loading_pointers.delete(id_string);\n                    pointer.delete();\n                    throw new RuntimeError(\"Cannot subscribe to non-existing pointer\", SCOPE);\n                }\n                else if (SCOPE?.unsubscribe) {\n                    this.loading_pointers.delete(id_string);\n                    pointer.delete();\n                    throw new RuntimeError(\"Cannot unsubscribe from non-existing pointer\", SCOPE)\n                }\n\n                // // cannot subscribe to own pointer, this pointer does not exist on the endpoint\n                // if (DatexRuntime.endpoint.equals(SCOPE.header.sender)) {\n                //     this.loading_pointers.delete(id_string);\n                //     throw new DatexRuntimeError(\"Pointer does not exist 1\", SCOPE)\n                // }\n\n                // try to subscribe to owner endpoint\n                try {\n                    pointer = await pointer.subscribeForPointerUpdates();\n                } catch (e) {\n                    // cannot request from sender endpoint, doesn't know the pointer either\n                    if (!sender_knows_pointer) {\n                        this.loading_pointers.delete(id_string);\n                        pointer.delete();\n                        if (e instanceof NetworkError) {\n                            if (!allow_failure) displayFatalError('pointer-unresolvable');\n                            console.log(pointer, e)\n                            // logger.error(\"Could not get the pointer from the current, the owner, or the requesting endpoint: $\"+id_string+\". The pointer could not be loaded from the network. \" +pointer.origin + \" is either offline or the requested pointer data could not be sent in a reasonable amount of time.\")\n                            throw new PointerError(\"Could not get the pointer from the current, the owner, or the requesting endpoint: $\"+id_string+\". The pointer could not be loaded from the network. \" +pointer.origin + \" is either offline or the requested pointer data could not be sent in a reasonable amount of time.\")\n                        }\n                        else throw e;\n                    }\n                    // failed, request pointer from sender endpoint\n                    try {\n                        logger.debug(\"could not subscribe to origin, requesting pointer from \"+SCOPE?.sender+\": \" + pointer.idString());\n                        pointer = await pointer.subscribeForPointerUpdates(SCOPE?.sender);\n                    } catch {\n                        this.loading_pointers.delete(id_string);\n                        pointer.delete();\n                        throw e;\n                    }\n                    \n                }\n\n            }\n\n            // pointer is own origin, but not found, request value from sender\n            else if (SCOPE?.sender && !only_load_local && pointer.is_origin && !pointer.origin.equals(SCOPE.sender)) {\n\n                // cannot request from sender endpoint, doesn't know the pointer either\n                if (!sender_knows_pointer) {\n                    this.loading_pointers.delete(id_string);\n                    pointer.delete();\n                    throw new PointerError(\"Neither the owner (self) nor the requesting endpoint could find the pointer $\" + id_string)\n                }\n\n                try {\n                    logger.debug(\"could not find local pointer, requesting pointer from \"+SCOPE?.sender+\": \" + pointer.idString());\n                    pointer = await pointer.subscribeForPointerUpdates(SCOPE?.sender, undefined, false);\n                } catch  {\n                    this.loading_pointers.delete(id_string);\n                    pointer.delete();\n                    // could not subscribe, remove pointer again\n                    pointer.delete();\n                    if (!allow_failure) displayFatalError('owned-pointer-unresolvable');\n                    throw new PointerError(\"Owned pointer could not be loaded locally or from sender\")\n                }\n            }\n\n            // intentionally not loaded\n            else if (only_load_local) {\n                this.loading_pointers.delete(id_string);\n                throw new PointerError(\"Pointer $\"+id_string+\" was not found locally\", SCOPE);\n            }\n\n            // pointer does not exist / has no value\n            else  {\n                this.loading_pointers.delete(id_string);\n                // if (globalThis.UIX) UIX.State.resetPage(); // this should not happen\n                // else\n                if (!allow_failure) displayFatalError('pointer-not-found');\n                pointer.delete();\n                throw new PointerError(\"Pointer $\"+id_string+\" does not exist\", SCOPE);\n            }\n        }\n\n        this.loading_pointers.delete(id_string);\n\n        // check read permissions\n        pointer.assertEndpointCanRead(SCOPE?.sender)\n\n\n        return pointer;\n    }\n\n    // create/get DatexPointer for value if possible (not primitive) and return value\n    static proxifyValue(value:unknown, sealed = false, allowed_access?:target_clause, anonymous = false, persistant= false, check_proxify_as_child = false) {\n        if ((value instanceof Pointer && value.is_js_primitive) || value instanceof PointerProperty) return value; // return by reference\n        else if (value instanceof ReactiveValue) return value.val; // return by value\n        const type = Type.ofValue(value)\n        const collapsed_value = ReactiveValue.collapseValue(value,true,true)\n    // if proxify_as_child=false: don't create pointer for this value, return original value\n        // e.g.: primitive values\n        if ((check_proxify_as_child && !type.proxify_as_child) || type.is_primitive) {\n            return collapsed_value;\n        }\n\n        // create or get pointer\n        else return Pointer.createOrGet(collapsed_value, sealed, allowed_access, anonymous, persistant).val;\n    } \n\n    // create a new pointer or return the existing pointer/pointer property for this value\n    static createOrGet<T>(value:RefOrValue<T>, sealed = false, allowed_access?:target_clause, anonymous = false, persistant = false, id?: string):Pointer<T>{\n        if (value instanceof LazyPointer) throw new PointerError(\"Lazy Pointer not supported in this context\");\n        if (value instanceof Pointer) return <Pointer<T>>value; // return pointer by reference\n        //if (value instanceof PointerProperty) return value; // return pointerproperty TODO: handle pointer properties?\n        value = ReactiveValue.collapseValue(value, true, true);\n\n        const ptr = Pointer.getByValue(value); // try proxify\n\n        // pointer already exists\n        if (ptr) {\n            if (ptr.is_placeholder) ptr.unPlaceholder(); // no longer placeholder, becomes normal pointer\n            return ptr;\n        }\n        // create new pointer\n        else {\n            return <Pointer<T>>Pointer.create(id, value, sealed, undefined, persistant, anonymous, false, allowed_access); \n        }\n    }\n\n    // same as createOrGet, but also return lazy pointer if it exists\n    static createOrGetLazy<T>(value:RefOrValue<T>, sealed = false, allowed_access?:target_clause, anonymous = false, persistant = false):Pointer<T>|LazyPointer<T>{\n        if (value instanceof LazyPointer) return value;\n        return this.createOrGet(value, sealed, allowed_access, anonymous, persistant);\n    }\n\n\n    // create a new pointer with a transform value\n    static createTransform<const T, const V extends TransformFunctionInputs>(observe_values:V, transform:TransformFunction<V,T>, persistent_datex_transform?:string, force_transform = false) {\n        const ptr = Pointer.create(undefined, NOT_EXISTING).handleTransform(observe_values, transform, persistent_datex_transform);\n        ptr.force_local_transform = force_transform;\n        ptr.isTransform = true;\n        return ptr;\n    }\n\n    /**\n     * Create a new pointer with a transform value generated with smart js transform\n     * @param observe_values \n     * @param transform \n     * @param persistent_datex_transform \n     * @returns \n     */\n    static createSmartTransform<const T>(transform:SmartTransformFunction<T>, persistent_datex_transform?:string, forceLive = false, ignoreReturnValue = false, options?:SmartTransformOptions):Pointer<T> {\n        return Pointer.create(undefined, options?.initial??NOT_EXISTING).smartTransform(transform, persistent_datex_transform, forceLive, ignoreReturnValue, options);\n    }\n\n    static createTransformAsync<const T,V extends TransformFunctionInputs>(observe_values:V, transform:AsyncTransformFunction<V,T>, persistent_datex_transform?:string):Promise<Pointer<T>>\n    static createTransformAsync<const T,V extends TransformFunctionInputs>(observe_values:V, transform:Scope<RefOrValue<T>>):Promise<Pointer<T>>\n    static createTransformAsync<const T,V extends TransformFunctionInputs>(observe_values:V, transform:AsyncTransformFunction<V,T>|Scope<RefOrValue<T>>, persistent_datex_transform?:string):Promise<Pointer<T>>{\n        return Pointer.create(undefined, NOT_EXISTING).handleTransformAsync(observe_values, transform, persistent_datex_transform);\n    }\n\n    // only creates the same pointer once => unique pointers\n    // throws error if pointer is already allocated or pointer value is primitive\n    static create<T>(id?:string|Uint8Array, value:RefOrValue<T>|typeof NOT_EXISTING=NOT_EXISTING, sealed = false, origin?:Endpoint, persistant=false, anonymous = false, is_placeholder = false, allowed_access?:target_clause, timeout?:number): Pointer<T> {\n        let p:Pointer<T>;\n\n        // DatexValue: DatexPointer or DatexPointerProperty not valid as object, get the actual value instead\n        value = <T|typeof NOT_EXISTING> ReactiveValue.collapseValue(value,true,true)\n\n        // is js primitive value\n        if (Object(value) !== value && typeof value !== \"symbol\") {\n            \n            if (value instanceof TypedArray) value = <T>Runtime.serializeValue(value); // convert to ArrayBuffer\n\n            // id already in use\n            if (typeof id != \"symbol\" && id && (p = <Pointer<T>> this.get(id))) {\n                if (p.is_js_primitive) {\n                    if (value!=NOT_EXISTING) p.val = value; // update value of this pointer\n                    if (origin) p.origin = origin; // override origin\n                    return p;\n                }\n                else {\n                    throw new PointerError(\"Cannot assign a native primitive value to a initialized non-primitive pointer\");\n                }\n            }\n            else {\n                // create new\n                return new Pointer(id, <any>value, sealed, origin, persistant, anonymous, is_placeholder, allowed_access, timeout)\n            }\n        }\n        \n        // value already allocated to a pointer\n        else if (this.pointer_value_map.has(value)) {\n            const existing_pointer = <Pointer<T>> Pointer.pointer_value_map.get(value);\n            // is placeholder, add id\n            if (existing_pointer.is_placeholder) {\n                existing_pointer.unPlaceholder(id)\n                return existing_pointer;\n            }\n            // stays anonymous\n            if (existing_pointer.is_anonymous) return existing_pointer;\n            // value already has a pointer\n            else throw new PointerError(\"A pointer has already been allocated to this value (\"+Runtime.valueToDatexString(value)+\")\");\n        }\n\n        // id already allocated to a pointer\n        else if (typeof id != \"symbol\" && id && (p = <Pointer<T>> this.get(id))) {\n            if (value!=NOT_EXISTING) p.val = <any>value; // set value of this pointer, if not yet set\n            if (origin) p.origin = origin; // override origin\n            return p;\n        }\n\n        // create a completely new pointer\n        else {\n            return new Pointer<T>(id, value as T, sealed, origin, persistant, anonymous, is_placeholder, allowed_access, timeout)\n        }\n    }\n\n    public static normalizePointerId(id:string|Uint8Array):string {\n        // correct size depending on pointer id type\n        if (id instanceof Uint8Array) {\n            if (id[0] == Pointer.POINTER_TYPE.STATIC) return buffer2hex(id,undefined,Pointer.STATIC_POINTER_SIZE, true) \n            else return buffer2hex(id,undefined,Pointer.MAX_POINTER_ID_SIZE, true)\n        }\n        else if (typeof id == \"string\") {\n            const has_$ = id.startsWith(\"$\");\n            const buffer = hex2buffer(id.replace(\"$\",\"\"), undefined, true); \n            return (has_$ ? \"$\" : \"\") + this.normalizePointerId(buffer);\n        }\n        else {\n            throw Error(\"Cannot normalize invalid pointer id - must be string or Uint8Array\")\n        }\n    }\n\n\n    public onGargabeCollection(callback: (event: Event) => void) {\n        this.addEventListener(\"garbageCollection\", callback);\n    }\n\n    /**\n     *  Pointer Garbage collection\n     *  handles no longer needed pointers\n     */\n\n\n    private static garbage_registry = new FinalizationRegistry<MockPointer>((mockPtr) => {\n        this.handleGarbageCollected(mockPtr)\n    });\n\n    // clean up after garbage collection:\n    private static handleGarbageCollected(mockPtr: MockPointer|Pointer){\n        logger.debug(\"$\" + mockPtr.id + \" was garbage collected\");\n\n        // cleanup for complex pointer that still has an instance\n        const pointer = Pointer.get(mockPtr.id);\n        if (pointer) {\n            pointer.#garbage_collected = true;\n            pointer.delete()\n        }\n        else {\n            this.cleanup(mockPtr)\n        }\n    \n    }\n    \n    // cleanup for primitive and complex pointer\n    private static cleanup(mockPtr: MockPointer|Pointer) {\n        // unsubscribe\n        const doUnsubscribe = !!(!mockPtr.is_origin && mockPtr.origin)\n        if (doUnsubscribe && mockPtr.subscribed) this.unsubscribeFromPointerUpdates(mockPtr.subscribed, mockPtr.id);\n    }\n\n\n    // custom datex pointer array splice function\n    private arraySplice(start?: number, deleteCount?: number, ...items: unknown[]): unknown[] {\n        // is clear?\n        if (start == 0 && deleteCount == (<Array<unknown>><unknown>this.shadow_object).length && items.length == 0) {\n            this.handleClear();\n            return [];\n        }\n        if (deleteCount == undefined) deleteCount = (<Array<unknown>><unknown>this.shadow_object).length; // default deleteCount: all\n        if (deleteCount && deleteCount < 0) deleteCount = 0;\n        return this.handleSplice(start??0, deleteCount, items) ?? [];\n    }\n\n    private arraySort(compareFn?: (a: unknown, b: unknown) => number): T{\n        if (!(this.shadow_object instanceof Array)) throw new Error(\"Cannot call sort on non-array value\");\n        const sortedValues = this.shadow_object.toSorted(compareFn) as T;\n        this.handleSplice(0, this.shadow_object.length, sortedValues);\n        return this.val;\n    }\n    \n\n    /** END STATIC */\n\n\n\n    protected constructor(id?:Uint8Array|string, value:T=<any>NOT_EXISTING, sealed:boolean = false, origin?:Endpoint, persistant = false/*TODO handle persistant?*/, anonymous = false, is_placeholder = false, allowed_access?:target_clause, timeout?:number) {\n        super();\n        // TODO is_placeholder is deprecated? (no longer in use)\n        // is only a temporary placeholder pointer (has to be replaced with another pointer with an id, behaves like an anonymous pointer until then)\n        if (is_placeholder) {\n            this.#is_placeholder = true;\n            anonymous = true;\n        }\n        // is id anonymous ($00)?\n        if ((typeof id == \"string\" && id.match(/^0+$/)) || (id instanceof Uint8Array && id.every(x => x == 0))) {\n            anonymous = true;\n        }\n\n        this.#is_persistent = persistant;\n        this.sealed = sealed;\n        if (origin) this.origin = origin; // also updates #is_origin\n        this.#is_anonymous = anonymous;\n        this.#allowed_access = allowed_access;\n\n        this.datex_timeout = timeout;\n\n        // set pointer id (after this.#is_anonymous is set)\n        if (anonymous) {\n            this.id = Pointer.ANONYMOUS_ID;\n        }\n        else if (typeof id == \"string\" || id instanceof Uint8Array) {\n            this.id = id;\n        }\n        // generate new random pointer id\n        else {\n            this.id = Pointer.getUniquePointerID(this);\n        }\n\n        this.initOrigin()\n\n        // set value\n        if (value != NOT_EXISTING) this.val = value;\n\n        // set update_endpoint\n        this.#update_endpoints = this.subscribers\n    }\n\n    private initOrigin(force_update = false) {\n        // get origin based on pointer id if no origin provided\n        // TODO different pointer address formats / types\n        if ((!this.origin||force_update) && this.id && !this.#is_anonymous && this.#id_buffer && (this.pointer_type == Pointer.POINTER_TYPE.ENDPOINT || this.pointer_type == Pointer.POINTER_TYPE.ENDPOINT_PERSONAL || this.pointer_type == Pointer.POINTER_TYPE.ENDPOINT_INSTITUTION)) {\n            this.origin = Pointer.getOriginFromPointerId(this.#id_buffer);\n            // <Endpoint>Target.get(this.#id_buffer.slice(1,19), this.#id_buffer.slice(19,21), this.pointer_type);\n            //console.log(\"pointer origin based on id: \" + this.toString() + \" -> \" + this.origin)\n        }\n        else if (!this.origin||force_update) this.origin = Runtime.endpoint; // default origin is local endpoint\n\n    }\n\n    /**\n     * extracts the origin from a pointer id\n     * @param id_buffer \n     * @returns \n     */\n    static getOriginFromPointerId(id_buffer: Uint8Array|string) {\n        if (typeof id_buffer == \"string\") {\n            try {id_buffer = hex2buffer(id_buffer, Pointer.MAX_POINTER_ID_SIZE, true);}\n            catch {throw new SyntaxError('Invalid pointer id: $' + id_buffer.slice(0, 48));}\n        }\n        const pointer_type = id_buffer[0];\n        return <Endpoint>Target.get(id_buffer.slice(1,19), id_buffer.slice(19,21), pointer_type);\n    }\n    \n    // delete pointer again (reset everything) if not needed\n    public delete() {\n        \n        // common pointer cleanup\n        Pointer.cleanup(this)\n\n        // special complex pointer-specific cleanup:\n\n        // delete from maps\n        if (this.#loaded && !this.#garbage_collected && this.current_val) {\n            Pointer.pointer_value_map.delete(this.current_val);\n        } \n        if (this.original_value) {\n            Pointer.pointer_value_map.delete(this.original_value);\n            delete this.original_value[DX_PTR]\n        }\n        this.#loaded = false;\n\n        // disable transform source\n        this.forceSetObserverCount(0) // make sure observer counter is 0\n        this.setForcedLiveTransform(false);\n        this.deleteTransformSource();\n\n        // remove property observers\n        for (const [value, handler] of this.#active_property_observers.values()) {\n            ReactiveValue.unobserve(value, handler, this.#unique);\n        }\n\n        // delete labels\n        for (const label of this.labels??[]) Pointer.pointer_label_map.delete(label);\n        \n        Pointer.pointers.delete(this.#id);\n        Pointer.primitive_pointers.delete(this.#id)\n\n        // remove disposables\n        for (const disposable of this.#boundDisposables) {\n            console.log(\"disposing\", disposable)\n            disposable[Symbol.dispose]?.()\n        }\n\n        // call remove listeners (todo: also for primitive pointers)\n        if (!this.is_anonymous) for (const l of Pointer.pointer_remove_listeners) l(this);\n    }\n\n    #boundDisposables = new Set<{[Symbol.dispose]: ()=>any}>()\n\n    // binds a disposable object to this pointer that gets disposed as soon as the pointer is garbage collected\n    public bindDisposable(disposable: {[Symbol.dispose]: ()=>any}) {\n        this.#boundDisposables.add(disposable);\n        if (!this.is_js_primitive) {\n            if (!this.val[Pointer.DISPOSABLES]) this.val[Pointer.DISPOSABLES] = []\n            this.val[Pointer.DISPOSABLES].push(disposable);\n        }\n    }\n\n    static DISPOSABLES = Symbol(\"DISPOSABLES\")\n\n    public static bindDisposable(value: any, disposable: {[Symbol.dispose]: ()=>any}) {\n        const ptr = value instanceof Pointer ? value : this.getByValue(value);\n        if (ptr) {\n            ptr.bindDisposable(disposable);\n        }\n        else throw new Error(\"Cannot bind a disposable value to a non-pointer value\")\n    }\n\n\n    [Symbol.dispose]() {\n        this.delete()\n    }\n    \n    #original_value!: T extends {[key:string]:unknown} ? WeakRef<T> : void //  weak ref to original value (not proxyfied)\n    #shadow_object?: WeakRef<{[key:string]:unknown}>|T // object to make changes and get values from without triggering DATEX updates\n    #type:Type = Type.std.Any // type of the value\n\n    #unwrapped_transform_type?: Type\n\n    #loaded = false\n    #indirectReference?: Pointer\n    get indirectReference() {return this.#indirectReference}\n\n    get value_initialized() {return this.#loaded}\n\n    #isStored = false\n    /**\n     * indicates if the pointer value is stored in storage\n     */\n    get isStored() {return this.#isStored}\n    set isStored(isStored:boolean) {\n        this.#isStored = isStored;\n    }\n\n\n    #is_placeholder = false\n    #is_js_primitive = false;\n\n    #is_persistent: boolean // indicates if this pointer can get garbage collected\n    #is_anonymous: boolean // pointer should never be sent via datex as reference, always serialize the value\n    \n    #pointer_type!:pointer_type // pointer type (full id, static, ...)\n\n    // set in id setter triggered in constructor\n    #id!:string // id as hex string\n    #id_buffer!:Uint8Array // id buffer\n    #origin!: Endpoint\n    #is_origin = true;\n    #subscribed: false|Endpoint = false\n\n    get subscribed() {return this.#subscribed}\n\n    //readonly:boolean = false; // can the value ever be changed?\n    sealed = false; // can the value be changed from the client side? (otherwise, it can only be changed via DATEX calls)\n    #scheduler: UpdateScheduler|null = null  // has fixed update_interval\n\n    #allowed_access?: target_clause // who has access to this pointer?, undefined = all\n\n    // reverse mapping for allowed_access\n    static #allowed_access_by_endpoint = new Map<Endpoint, IterableWeakSet<Pointer>>().setAutoDefault(IterableWeakSet);\n\n    #garbage_collectable = false;\n    #garbage_collected = false;\n\n    #labels = new Set<string|number>();\n   \n    get garbage_collectable () {return this.#garbage_collectable} // indicates if pointer can be garbage collected\n    get garbage_collected () {return this.#garbage_collected} // indicates if pointer can be garbage collected\n    get allowed_access(){return this.#allowed_access}\n    get is_placeholder(){return this.#is_placeholder}\n    get id_buffer(){return this.#id_buffer}\n    get is_origin(){return this.#is_origin}\n    get is_js_primitive(){return this.#is_js_primitive} // true if js primitive (number, boolean, ...) or 'single instance' class (Type, Endpoint) that cannot be directly addressed by reference\n    get is_anonymous(){return this.#is_anonymous}\n    get origin(){return this.#origin}\n    private set origin(origin:Endpoint){\n        this.#origin = origin\n        this.#updateIsOrigin()\n        if (Runtime.endpoint == LOCAL_ENDPOINT) Pointer.#undetermined_pointers.add(this);\n    }\n\n    get is_persistent() { return this.#is_persistent || this.subscribers?.size != 0}\n    // change the persistant state of this pointer\n    set is_persistent(persistant:boolean) {\n        if (persistant && !this.#is_persistent) {\n            this.#is_persistent = true;\n            this.updateGarbageCollection()\n        }\n        else if (!persistant && this.#is_persistent){\n            this.#is_persistent = false;\n            this.updateGarbageCollection()\n        }\n    }\n\n    get labels(){return this.#labels}\n    get pointer_type(){return this.#pointer_type}\n\n    #waiting_for_always_promise?: Promise<unknown>;\n    get waiting_for_always_promise() {return this.#waiting_for_always_promise}\n\n    #updateIsJSPrimitive(val:any = this.val) {\n        const type = this.#type ?? Type.ofValue(val);\n        this.#is_js_primitive = (typeof val !== \"symbol\") && !(Object(val) === val && !type.is_js_pseudo_primitive && !(type == Type.js.NativeObject && globalThis.Element && val instanceof globalThis.Element))\n    }\n\n    /**\n     * Throws if endpoint is not in allowed_access list and not a trusted endpoint with protected-pointer-access.\n     * Never throws if Runtime.OPTIONS.PROTECT_POINTERS is set to false\n     * @param endpoint \n     * @returns \n     */\n    public assertEndpointCanRead(endpoint?: Endpoint) {\n        // always use main endpoint (TODO: change?)\n        endpoint = endpoint?.main;\n        if (\n            Runtime.OPTIONS.PROTECT_POINTERS \n            && !(endpoint == Runtime.endpoint.main)\n            && this.is_origin\n            && (\n                !endpoint || \n                (this.allowed_access instanceof Disjunction && this.allowed_access.size==0) || // TODO: this case is just added because Logical.matches currently always returns true for an empty Disjunction, which is not intended here\n                !Logical.matches(endpoint, this.allowed_access, Target))\n            && (endpoint && !Runtime.trustedEndpoints.get(endpoint)?.includes(\"protected-pointer-access\"))\n        ) {\n            throw new PermissionError(\"Endpoint \"+endpoint+\" has no read permissions for pointer \"+this.idString()+\" (origin: \"+this.origin+\")\");\n        }\n    }\n\n\n    #updateIsOrigin() {\n        this.#is_origin = !!Runtime.endpoint.equals(this.#origin) || !!Runtime.endpoint.main.equals(this.#origin) || this.#origin.equals(LOCAL_ENDPOINT);\n    }\n\n\n    /**\n     * add endpoint to allowed_access list\n     * @param endpoint\n     */\n    public grantAccessTo(endpoint: Endpoint, _force = false) {\n        // always use main endpoint (TODO: change?)\n        endpoint = endpoint.main;\n        // already has public access\n        if (this.#allowed_access == BROADCAST) return;\n        if (!_force && !Runtime.OPTIONS.PROTECT_POINTERS) throw new Error(\"Read permissions are not enabled per default (set Datex.Runtime.OPTIONS.PROTECT_POINTERS to true)\")\n        if (!this.#allowed_access) this.#allowed_access = new Disjunction()\n        if (this.#allowed_access instanceof Disjunction) {\n            this.#allowed_access.add(endpoint)\n            Pointer.#allowed_access_by_endpoint.getAuto(endpoint).add(this);\n        }\n        else throw new Error(\"Invalid access filter, cannot add endpoint (TODO)\")\n    }\n\n\n    /**\n     * add public access to pointer\n     * @param endpoint\n     */\n    public grantPublicAccess(_force = false) {\n        if (!_force && !Runtime.OPTIONS.PROTECT_POINTERS) throw new Error(\"Read permissions are not enabled per default (set Datex.Runtime.OPTIONS.PROTECT_POINTERS to true)\")\n        this.#allowed_access = BROADCAST;\n    }\n\n\n    /**\n     * remove endpoint from allowed_access list\n     * @param endpoint \n     */\n    public revokeAccessFor(endpoint: Endpoint, _force = false) {\n        // always use main endpoint (TODO: change?)\n        endpoint = endpoint.main;\n        if (!_force && !Runtime.OPTIONS.PROTECT_POINTERS) throw new Error(\"Read permissions are not enabled per default (set Datex.Runtime.OPTIONS.PROTECT_POINTERS to true)\")\n        if (this.#allowed_access instanceof Disjunction) {\n            this.#allowed_access.delete(endpoint);\n            const allowed_access_list = Pointer.#allowed_access_by_endpoint.get(endpoint);\n            if (allowed_access_list) {\n                allowed_access_list.delete(this);\n                if (allowed_access_list.size == 0) Pointer.#allowed_access_by_endpoint.delete(endpoint);\n            }\n        }\n        else throw new Error(\"Invalid access filter, cannot add endpoint (TODO)\")\n    }\n\n\n    /**\n     * always get the original reference for property, even if hidden in shadow_object\n     */\n    public static getOriginalPropertyRef(val:any, propName:any) {\n        const ptr = this.getByValue(val);\n        if (ptr) return ptr.shadow_object?.[propName] ?? val[propName];\n        else return val[propName]\n    }\n\n    #typeAssertions?: Conjunction<Assertion>\n\n    /**\n     * Add an assertion that is validated when the pointer value is changed\n     * Only works for primitive pointers\n     * @param assertion \n     */\n    public assert(assertion:(val:any)=>boolean|string|undefined|null) {\n        if (!this.is_js_primitive) throw new PointerError(\"Assertions are not yet supported for non-primitive pointer\")\n        if (!this.#typeAssertions) this.#typeAssertions = new Conjunction();\n        this.#typeAssertions.add(Assertion.get(undefined, assertion, false));\n        \n        this.validateTypeAssertions(this.val)\n        return this;\n    }\n\n    /**\n     * Changes the id of the pointer to point to the new origin (and also changes the .origin)\n     * @param new_owner\n     * @param recursive if true, also change the ownership for all properties recursively\n     */\n    public transferOwnership(new_owner:Endpoint|endpoint_name, recursive = false) {\n        const endpoint = new_owner instanceof Endpoint ? new_owner : (<Person>Endpoint.get(new_owner));\n        const old_id = this.idString();\n        this.origin = endpoint;\n        this.id = Pointer.getUniquePointerID(this);\n    \n        logger.info(`pointer transfer to origin ${this.origin}: ${old_id} -> ${this.idString()}`);\n\n        if (recursive && !this.type.is_primitive) {\n            for (const key of this.getKeys()) {\n                const prop = this.getProperty(key);\n                const pointer = Pointer.getByValue(prop);\n                if (pointer) pointer.transferOwnership(new_owner, recursive);\n            }\n        }\n    }\n\n    public static transferOwnership(value:any, new_owner:Endpoint|endpoint_name, recursive = false) {\n        const pointer = Pointer.getByValue(value);\n        if (!pointer) throw new PointerError(\"Cannot transfer ownership of non-pointer value\");\n        return pointer.transferOwnership(new_owner, recursive);\n    }\n\n    // don't call this method, call addPointer on DatexUpdateScheduler\n    setScheduler(scheduleder: UpdateScheduler){\n        this.#scheduler = scheduleder\n    }\n    // don't call this method, call deletePointer on DatexUpdateScheduler\n    deleteScheduler(){\n        this.#scheduler = null;\n    }\n\n    public addLabel(label: string|number){\n        if (Pointer.pointer_label_map.has(label)) throw new PointerError(\"Label \" + Runtime.formatVariableName(label, '$') + \" is already assigned to a pointer\");\n        this.#labels.add(label);\n        this.is_persistent = true; // make pointer persistant\n        Pointer.pointer_label_map.set(label, this)\n\n        const id = this.id;\n    }\n\n\n    /**\n     * create a new transformed pointer from an existing pointer\n     */\n    public transform<R>(transform:TransformFunction<[this],R>) {\n        return ReactiveValue.collapseValue(Pointer.createTransform([this], transform));\n    }\n\n    /**\n     * create a new transformed pointer from an existing pointer (Async transform function)\n     */\n    public transformAsync<R>(transform:AsyncTransformFunction<[this],R>) {\n        return ReactiveValue.collapseValue(Pointer.createTransformAsync([this], transform));\n    }\n\n\n    /**\n    * Subscribe for external pointer updates at remote endpoint -> might return a different pointer if current pointer was placeholder\n    */\n\n    public async subscribeForPointerUpdates(override_endpoint?:Endpoint, get_value = !this.#loaded, keep_pointer_origin = false):Promise<Pointer> {\n        \n        // never subscribe if pointer is bound to a transform function\n        if (this.transform_scope) {\n            return this;\n        }\n\n        // already subscribed\n        if (this.#subscribed) {\n            return this;\n        }\n\n        const endpoint = override_endpoint ?? this.origin;\n        // early return, trying to subscribe to the own main endpoint, guaranteed to be routed back to self, which is not allowed\n        if (endpoint.equals(Runtime.endpoint.main) || endpoint.equals(Runtime.endpoint) || endpoint.equals(LOCAL_ENDPOINT)) {\n            logger.warn(\"tried to subscribe to own pointer: \" + this.idString() + \"(pointer origin: \" + this.origin + \", own endpoint instance: \" + Runtime.endpoint + \")\");\n            return this;\n        }\n\n        // logger.debug(\"subscribing to \" + this.idString() + \", origin = \" +  this.origin +  (this.origin!=endpoint ? \", requesting from: \" + endpoint : '') + ', get value: ' + get_value);\n        if (this.origin==endpoint) logger.debug `subscribing to #color(65, 102, 238)${this.idString()}, origin: ${this.origin.toString()}${get_value?', getting value':''}`\n        else logger.debug `subscribing to #color(65, 102, 238)${this.idString()}, origin: ${this.origin.toString()}, request: ${endpoint.toString()}${get_value?', getting value':''}`\n\n\n        // don't get value, just request subscription\n        if (!get_value) {\n            await Runtime.datexOut(['#origin <==: ?', [this]], endpoint) \n            return this;\n        } \n\n        // subscribe and get latest value\n        else {\n            const pointer_value = await Runtime.datexOut(['#origin <== ?', [this]], endpoint) \n            if (pointer_value === VOID) { // TODO: could be allowed, but is currently considered a bug\n                throw new RuntimeError(\"pointer value \"+this.idString()+\" was resolved to void\");\n            }\n            \n            this.finalizeSubscribe(override_endpoint, keep_pointer_origin)\n\n            if (!this.#loaded) {\n                // special case: intercept MediaStream\n                if (globalThis.MediaStream && pointer_value instanceof MediaStream) {\n                    const {WebRTCInterface} = await import(\"../network/communication-interfaces/webrtc-interface.ts\")\n                    return this.setValue(await WebRTCInterface.getMediaStream(this.id) as any);\n                }\n                else return this.setValue(pointer_value); // set value\n            }\n            else return this;\n        }\n        \n    }\n\n\n    /**\n     * Finish pointer subscription. Set subscribed endpoint and add online state observer\n     * @param override_endpoint custom endpoint that differs from pointer origin\n     * @param keep_pointer_origin if false, update pointer origin to override_endpoint\n     */\n    public finalizeSubscribe(override_endpoint?: Endpoint, keep_pointer_origin = false) {\n        // never subscribe if pointer is bound to a transform function\n        if (this.transform_scope) return;\n        // already subscribed\n        if (this.#subscribed) return;\n\n        this.#subscribed = override_endpoint ?? this.origin;\n\n        if (!keep_pointer_origin && override_endpoint) this.origin = override_endpoint;\n\n        // fall back to trusted endpoint when origin is offline, if not already a override endpoint \n        if (!override_endpoint) {\n            Pointer.observeOriginOnline(this.origin, this.id);\n        }\n    }\n\n    /**\n     * Observes online state of pointer origin and subscribes to fallback endpoint if origin is offline\n     * @param origin\n     * @param ptrId \n     */\n    private static observeOriginOnline(origin: Endpoint, ptrId: string) {\n\n        const handler = async function(online: boolean) {\n            if (online) return;\n\n            const ptr = Pointer.get(ptrId);\n            // pointer no longer exists, unobserve\n            if (!ptr) {\n                logger.debug(\"unobserving pointer origin online state for \" + ptrId);\n                origin.online.unobserve(handler);\n                return;\n            }\n            let foundFallback = false;\n            for (const [trustedEndpoint, permissions] of Runtime.trustedEndpoints) {\n                if (permissions.includes(\"fallback-pointer-source\")) {\n                    logger.debug(origin  + \" is offline, trying to subscribe to trusted endpoint \" + trustedEndpoint)\n                    ptr.#subscribed = false;\n                    try {\n                        await ptr.subscribeForPointerUpdates(trustedEndpoint);\n                        foundFallback = true;\n                        break;\n                    }\n                    catch {}\n                }\n            }\n            if (!foundFallback) {\n                logger.debug(\"pointer origin \" + origin  + \" for \"+ptrId+\" is offline, could not find a trusted fallback endpoint for pointer synchronisation\")\n            }\n        }\n        origin.online.observe(handler)\n    }\n\n\n    public async unsubscribeFromPointerUpdates() {\n        if (!this.#subscribed) return; // already unsubscribed\n        await Pointer.unsubscribeFromPointerUpdates(this.#subscribed, this.id)\n        this.#subscribed = false;\n    }\n\n    public static async unsubscribeFromPointerUpdates(endpoint: Endpoint, pointerId: string) {\n        logger.debug(\"unsubscribing from \" + pointerId + \" (\"+endpoint+\")\");\n        try {\n            await Runtime.datexOut(['#origin </= $' + pointerId], endpoint, undefined, true);\n        }\n        catch {}\n    }\n\n\n    // make normal pointer from placeholder\n    unPlaceholder(id?:string|Uint8Array) {\n        if (!this.#is_placeholder) {\n            logger.error(\"Pointer is not a placeholder pointer (id: \" + this.idString() + \")\");\n        }\n        this.#is_anonymous = false; // before id change\n        this.id = id ?? Pointer.getUniquePointerID(this) // set id\n        this.#is_placeholder = false; // after id change\n        // update origin to match id\n        this.initOrigin(true)\n        // first time actual visible pointer\n        for (const l of Pointer.pointer_add_listeners) l(this);\n        // pointer for id listeners\n        if (Pointer.pointer_for_id_created_listeners.has(this.id)) {\n            for (const l of Pointer.pointer_for_id_created_listeners.get(this.id)!) l(this);\n            Pointer.pointer_for_id_created_listeners.delete(this.id)\n        }\n\n    }\n\n    // set id if not set initially set\n    get id():string{ return this.#id }\n    \n    set id (id:Uint8Array|string) {\n        // if (!this.is_placeholder && this.id !== undefined && !Pointer.#local_pointers.has(this)) {\n        //     // console.log(\"TODO: pointer transfer map\")\n        // }\n        // is id transfer for placeholder, trigger value init\n\n        if (typeof id == \"string\") {\n            // convert string to buffer\n            try {this.#id_buffer = hex2buffer(id, Pointer.MAX_POINTER_ID_SIZE, true);}\n            catch (e) {throw new SyntaxError('Invalid pointer id: $' + id.slice(0, 48));}\n            this.#id = Pointer.normalizePointerId(id)\n        }\n        else if (id instanceof Uint8Array) {\n            this.#id_buffer = id;\n            this.#id = Pointer.normalizePointerId(id)\n        }\n        else this.#id = Pointer.normalizePointerId(id)\n\n        // get pointer type\n        this.#pointer_type = this.#id_buffer[0];\n\n        // add to pointer list\n        if (!this.is_anonymous) {\n            if (this.is_js_primitive) Pointer.primitive_pointers.set(this.#id, new WeakRef(this)); \n            else Pointer.pointers.set(this.#id, this); \n        }\n    }\n\n    /**\n     * Set value, might return new pointer if placeholder pointer existed or converted to primitive pointer\n     * If forcePlaceholderMove is true, an existing pointer for the value is returned, even if it is not marked as placeholder\n     */\n    setValue<TT>(v:T extends typeof NOT_EXISTING ? TT : T, forcePlaceholderMove = false):Pointer<T extends typeof NOT_EXISTING ? TT : T> {\n\n        // primitive value and not yet initialized-> new pointer\n        if (!this.value_initialized && (Object(v) !== v || v instanceof ArrayBuffer)) {\n            Pointer.pointers.delete(this.id); // force remove previous non-primitive pointer (assume it has not yet been used)\n            Pointer.primitive_pointers.delete(this.id)\n            return <any>Pointer.create(this.id, v, this.sealed, this.origin, this.is_persistent, this.is_anonymous, false, this.allowed_access, this.datex_timeout)\n        }\n        const existingPtr = Pointer.pointer_value_map.get(v);\n\n        // placeholder replacement\n        if (existingPtr?.is_placeholder || (existingPtr && forcePlaceholderMove)) {\n            if (forcePlaceholderMove) existingPtr.#is_placeholder = true; // force placeholder\n            if (this.#loaded) {\n                throw new PointerError(\"Cannot assign a new value to an already initialized pointer\")\n            }\n            const existing_pointer = Pointer.pointer_value_map.get(v)!;\n            existing_pointer.unPlaceholder(this.id) // no longer placeholder, this pointer gets 'overriden' by existing_pointer\n            return existing_pointer;\n        }\n        else {\n            this.val = <any>v;\n            return <any>this;\n        }\n    }    \n\n    override get val():T {\n        if (this.#garbage_collected) throw new PointerError(\"Pointer \"+this.idString()+\" was garbage collected\");\n        else if (!this.#loaded) {\n            throw new PointerError(\"Cannot get value of uninitialized pointer (\"+this.idString()+\")\")\n        }\n        // deref and check if not garbage collected\n        if (!this.is_persistent && !this.is_js_primitive && super.val instanceof WeakRef && this.type !== Type.std.WeakRef) {\n            const val = super.val.deref();\n            // seems to be garbage collected\n            if (val === undefined && this.#loaded && !this.#is_js_primitive) {\n                Pointer.handleGarbageCollected(this)\n                throw new PointerError(\"Pointer \"+this.idString()+\" was garbage collected\");\n            }\n            // can be returned\n            return val;\n        }\n        // return the value directly\n        else return super.val!;\n    }\n\n    override set val(v: T) {\n        // TODO: fixme, check this.#loaded && this.original_value!==undefined?\n        const valueExists = this.#loaded && (this.original_value!==undefined || this.is_js_primitive);\n        if (valueExists) this.updateValue(v);\n        else this.initializeValue(v);\n    }\n\n    // same as get val, with current_val (calling super.current_val)\n    override get current_val():T|undefined {\n        if (this.#garbage_collected) throw new PointerError(\"Pointer \"+this.idString()+\" was garbage collected\");\n        else if (!this.#loaded) {\n            throw new PointerError(\"Cannot get value of uninitialized pointer (\"+this.idString()+\")\")\n        }\n        // deref and check if not garbage collected\n        if (!this.is_persistent && !this.is_js_primitive && super.current_val instanceof WeakRef && this.type !== Type.std.WeakRef) {\n            const val = super.current_val.deref();\n            // seems to be garbage collected\n            if (val === undefined && this.#loaded && !this.#is_js_primitive) {\n                Pointer.handleGarbageCollected(this)\n                throw new PointerError(\"Pointer \"+this.idString()+\" was garbage collected\");\n            }\n            // can be returned\n            return val;\n        }\n        // return the value directly\n        else return super.current_val;\n    }\n\n\n    // same as val setter, but can be awaited - don't confuse with Pointer.setValue (TODO: rename?)\n    override setVal(v: T, trigger_observers = true, is_transform?:boolean):Promise<any>|undefined {\n        // TODO: fixme, check this.#loaded && this.original_value!==undefined?\n        const valueExists = this.#loaded && (this.original_value!==undefined || this.is_js_primitive);\n        if (valueExists) return this.updateValue(v, trigger_observers, is_transform);\n        else return this.initializeValue(v, is_transform) as undefined; // observers not relevant for init\n    }\n\n    // also trigger event for all property specific observers\n    override triggerValueInitEvent(is_transform = false, previous?: any) {\n        const value = this.current_val;\n\n        // TODO: await promises?\n        for (const [key, entry] of this.change_observers) {\n            for (const [o, options] of entry) {\n                if ((!options?.types || options.types.includes(ReactiveValue.UPDATE_TYPE.INIT))) o(value, key, ReactiveValue.UPDATE_TYPE.INIT); \n            }\n        }\n        for (const [object, entries] of this.bound_change_observers) {\n            for (const [key, handlers] of entries) {\n                for (const [handler, options] of handlers) {\n                    if ((!options?.types || options.types.includes(ReactiveValue.UPDATE_TYPE.INIT))) {\n                        const res = handler.call(object, value, key, ReactiveValue.UPDATE_TYPE.INIT);\n                        if (res === false) this.unobserve(handler, object, key);\n                    }\n                }\n            }\n        }\n\n        return super.triggerValueInitEvent(is_transform, previous)\n    }\n\n\n    /**\n     * returns a value that can be referenced in JS\n     * if it has a primitive value, the pointer itself is returned\n     */\n    override get js_value():CollapsedValueJSCompatible<T> {\n        return <any> (this.is_js_primitive ? this : this.val)\n    }\n\n    /**\n     * Sets the initial value of the pointer\n     * @param v initial value\n     */\n    protected initializeValue(v:RefOrValue<T>, is_transform?:boolean) {\n        let val = ReactiveValue.collapseValue(v,true,true);\n\n        if (typeof val == \"symbol\" && Symbol.keyFor(val) !== undefined) {\n            throw new Error(\"Global and well-known symbols (e.g. Symbol.for('name') or Symbol.iterator) are no yet supported as pointer values\")\n        }\n\n        // get transform wrapper\n        if (is_transform) val = this.getInitialTransformValue(val)\n\n        // Get type from initial value, keep as <any> if initial value is null/undefined or indirect reference\n        if (val!==undefined && val !== null && \n            // allow false (workaround for UIX DOM elements)\n            !(val === false)\n            && !this.#indirectReference) this.#type = Type.ofValue(val);\n\n        // console.log(\"loaded : \"+ this.id + \" - \" + this.#type, val)\n\n        if (val == undefined) this.#is_js_primitive = true;\n        else this.#updateIsJSPrimitive(val);\n        \n        // init proxy value for non-JS-primitives value (also treat non-uix HTML Elements as primitives)\n        if (!this.is_js_primitive) {\n\n            // already an existing non-primitive pointer (indirect reference)\n            const existingPointer = Pointer.getByValue(val);\n            if (this.supportsIndirectRefs && existingPointer) {\n                this.#loaded = true;\n                this.#indirectReference = existingPointer;\n                this.#original_value = this.#shadow_object = <any> new WeakRef(<any>val);\n                super.setVal(val, true, is_transform)\n                logger.debug(`Set indirect reference for ${this.idString()} to ${existingPointer.idString()}`)\n            }\n\n            // normal\n            else {\n                this.#original_value = this.#shadow_object = <any> new WeakRef(<any>val);\n\n                // already a proxified value bound to a ptr\n                let alreadyProxy = false;\n                if (val && typeof val == \"object\" && DX_PTR in val) {\n                    alreadyProxy = true;\n                    // TODO: handle this correctly\n                    console.warn(\"The value assigned to pointer \"+this.idString()+\" is already bound to \" + (val[DX_PTR] as unknown as Pointer).idString() + \":\", val);\n                }\n\n                // TODO: is this required somewhere?\n                // add reference to this DatexPointer to the original value\n                if (!this.is_anonymous && !this.isStaticTransform) {\n                    try {\n                        Object.defineProperty(val, DX_PTR, {value: this, enumerable: false, writable: true, configurable: true})\n                    } catch {\n                        logger.error(\"Cannot set DX_PTR for \" + this.idString())\n                    }\n                }\n    \n                if (this.sealed) this.visible_children = new Set(Object.keys(val)); // get current keys and don't allow any other children\n                else if (this.type.visible_children) this.visible_children = this.type.visible_children; // use visible_children from type\n    \n                // save original value in map to find the right pointer for this value in the future\n                Pointer.pointer_value_map.set(val, this);\n                // create proxy\n\n                const value = alreadyProxy||this.isStaticTransform ? val : this.addObjProxy((val instanceof UnresolvedValue) ? val[DX_VALUE] : val); \n                // add $, $$\n                if (!(alreadyProxy||this.isStaticTransform) && typeof value !== \"symbol\") this.add$Properties(value);\n\n                this.#loaded = true; // this.value exists (must be set to true before the super.value getter is called)\n    \n                if (val instanceof UnresolvedValue) {\n                    this.#shadow_object = new WeakRef(val[DX_VALUE]) // original value, update here\n                    val[DX_VALUE] = value; // override DX_VALUE with proxified value\n                    super.setVal(val, true, is_transform)\n                } \n                else super.setVal(value, true, is_transform)\n    \n    \n                // creates weakref & adds garbage collection listener\n                this.updateGarbageCollection(); \n    \n                // proxify children, if not anonymous\n                if (this.type.proxify_children && !this.isStaticTransform) this.proxifyChildren();\n    \n                // save proxy + original value in map to find the right pointer for this value in the future\n                Pointer.pointer_value_map.set(value, this);\n    \n                // pointer for value listeners?\n                if (Pointer.pointer_for_value_created_listeners.has(val)) {\n                    for (const l of Pointer.pointer_for_value_created_listeners.get(val)!) l(this);\n                    Pointer.pointer_for_value_created_listeners.delete(val)\n                }\n                // pointer for id listeners\n                if (Pointer.pointer_for_id_created_listeners.has(this.id)) {\n                    for (const l of Pointer.pointer_for_id_created_listeners.get(this.id)!) l(this);\n                    Pointer.pointer_for_id_created_listeners.delete(this.id)\n                }\n    \n                // seal original value\n                if (this.sealed) Object.seal(this.original_value);\n            }\n\n            // always use live transforms for non-primitive pointers:\n            if (!is_transform) this.setForcedLiveTransform(true)\n            \n            // update registry\n            Pointer.primitive_pointers.delete(this.#id); \n            Pointer.pointers.set(this.#id, this); \n        }\n\n        // init value for JS-primitives value \n        else {\n            this.#loaded = true; // this.value exists\n            super.setVal(val, true, is_transform)\n\n            // update registry\n            Pointer.primitive_pointers.set(this.#id, new WeakRef(this)); \n            Pointer.pointers.delete(this.#id); \n\n            // pointer for id listeners\n            if (Pointer.pointer_for_id_created_listeners.has(this.id)) {\n                for (const l of Pointer.pointer_for_id_created_listeners.get(this.id)!) l(this);\n                Pointer.pointer_for_id_created_listeners.delete(this.id)\n            }\n\n            // adds garbage collection listener\n            this.updateGarbageCollection(); \n        }\n       \n    \n        this.afterFirstValueSet();\n    }\n\n    protected add$Properties(val:object){\n        try {\n            // $ reference getter\n            Object.defineProperty(val, \"$\", {\n                get: ()=>this.$,\n                enumerable: false\n            })\n            // $$ reference getter\n            Object.defineProperty(val, \"$$\", {\n                get: ()=>this.$$,\n                enumerable: false\n            })\n        }\n        catch(e) {\n            console.error(e);\n            console.log(val.$);\n            logger.error(\"Cannot set $ properties for \" + this.idString())\n        }\n    }\n\n    private validateTypeAssertions(val:T, type?:Type) {\n        type ??= Type.ofValue(val);\n        return this.#typeAssertions && \n            !Type.matchesType(type, this.#typeAssertions, val, true)\n    }\n\n    /**\n     * Overrides the current value of the pointer (only if the value has the correct type)\n     * @param v new value\n     * @returns promise which resolves when all update side effects are resolved\n     */\n    protected updateValue(v:RefOrValue<T>, trigger_observers = true, is_transform?:boolean) {\n        const val = <T> ReactiveValue.collapseValue(v,true,true);\n        const newType = Type.ofValue(val);\n\n        const current_val = this.current_val;\n\n        // not changed (relevant for primitive values)\n        if (Object.is(current_val, val)) {\n            return;\n        }\n\n        // also check if array is equal\n        if (current_val instanceof Array && val instanceof Array) {\n            if (current_val.length == val.length && current_val.every((v,i)=>v===val[i])) {\n                return;\n            }\n        }\n\n        if (this.type?.interface_config?.allow_transform_value) {\n            let error:string|boolean\n            if ((error = this.type.interface_config.allow_transform_value(newType, this)) !== true) {\n                throw new ValueError(\"Invalid value type for transform pointer \"+this.idString()+\": \" + newType + (error ? \" - \" + error : \"\"));\n            }\n        }\n        else if ((v!==null&&v!==undefined)) {\n            if (\n                // validate pointer type\n                !Type.matchesType(newType, this.type, val, true) ||\n                // validate custom type assertions\n                (\n                    this.#typeAssertions && this.validateTypeAssertions(val, newType)\n                )\n            ) {\n                throw new ValueError(\"Invalid value type for pointer \"+this.idString()+\": \" + newType + \" - must be \" + this.type);\n            }\n        }\n\n        let updatePromise: Promise<any>|undefined;\n\n        // set primitive value, reference not required\n        if (this.is_js_primitive || this.#any_type) {\n            const didCustomUpdate = this.customTransformUpdate(val)\n            if (!didCustomUpdate) updatePromise = super.setVal(val, trigger_observers, is_transform);\n        }\n        else {\n            // custom update\n            const didCustomUpdate = this.customTransformUpdate(val)\n\n            if (!didCustomUpdate) {\n                // is indirect reference, set new value\n                if (this.supportsIndirectRefs && (this.#indirectReference || ReactiveValue.isRef(val))) {\n                    this.#indirectReference = Pointer.getByValue(val);\n                    super.setVal(val, trigger_observers, is_transform);\n                }\n                // mutate value internally\n                else {\n                    this.type.updateValue(this.original_value, val);\n                }\n            }\n            \n            if (trigger_observers) updatePromise = this.triggerValueInitEvent(is_transform); // super.value setter is not called, trigger value INIT separately\n        }\n\n        // propagate updates via datex\n        if (this.send_updates_to_origin) {\n            this.handleDatexUpdate(null, this.idString()+' = ?', [this.indirectReference??this.current_val], this.origin, this.indirectReference ? false : true)\n        }\n        if (this.update_endpoints.size) {\n            logger.debug(\"forwarding update to subscribers\", this.update_endpoints);\n            // console.log(this.#update_endpoints);\n            this.handleDatexUpdate(null, this.idString()+' = ?', [this.indirectReference??this.current_val], this.update_endpoints, this.indirectReference ? false : true)\n        }\n\n        // pointer value change listeners\n        for (const l of Pointer.pointer_value_change_listeners) l(this);\n\n        return updatePromise;\n    }\n\n    protected afterFirstValueSet() {\n        // potential storage pointer initialized\n        Storage.providePointer(this);\n\n        // only in frontend, disabled for backend (TODO)\n        if (this.isStored && client_type == \"browser\") {\n            // get subsriber caches\n            Storage.getPointerSubscriberCache(this.id).then(cache => {\n                if (cache) {\n                    this.#subscriberCache = cache;\n                    for (const subscriber of cache) this.addSubscriber(subscriber)\n                    logger.debug(\"restored subscriber cache for \" + this.idString() + \":\",cache)\n                }\n            })\n        }\n        \n        // custom timeout from type?\n        if (this.type.timeout!=undefined && this.datex_timeout==undefined) this.datex_timeout = this.type.timeout\n        setTimeout(()=>{for (const l of Pointer.pointer_add_listeners) l(this)},0);\n        Object.freeze(this);\n    }\n\n\n    #transformMap?: Record<string,any>\n    set transformMap(transformMap:Record<string,any>) {\n        this.#transformMap = transformMap\n    }\n    get transformMap():Record<string,any>|undefined {return this.#transformMap}\n\n    #transform_scope?:Scope;\n    get transform_scope() {return this.#transform_scope}\n\n    #smart_transform_method?: (...args:any[])=>any\n    get smart_transform_method() {return this.#smart_transform_method}\n    set smart_transform_method(method: (...args:any[])=>any) {this.#smart_transform_method = method}\n\n    #force_transform = false; // if true, the pointer transform function is always sent via DATEX\n    set force_local_transform(force_transform: boolean) {this.#force_transform = force_transform}\n    get force_local_transform() {return this.#force_transform}\n\n    #isTransform = false;\n    set isTransform(isTransform: boolean) {this.#isTransform = isTransform}\n    get isTransform() {return this.#isTransform}\n\n    /**\n     * transform observed values to update pointer value (using a transform function or DATEX transform scope)\n     * @param values values to be observed (should be same as internal_vars in scope)\n     * @param transform DATEX Scope or JS function\n     * @param persistent_datex_transform  JUST A WORKAROUND - if transform is a JS function, a DATEX Script can be provided to be stored as a transform method\n     */\n    protected async handleTransformAsync<R,V extends TransformFunctionInputs>(observe_values:V, transform:AsyncTransformFunction<V,T&R>|Scope<RefOrValue<T&R>>, persistent_datex_transform?:string): Promise<Pointer<R>> {     \n        \n        const transformMethod = transform instanceof Function ? transform : ()=>transform.execute(Runtime.endpoint);\n\n        const initialValue = await (observe_values.length==1 ? transformMethod(...<CollapsedDatexObjectWithRequiredProperties<V>>[ReactiveValue.collapseValue(observe_values[0], true, true)]) : transformMethod(...<CollapsedDatexObjectWithRequiredProperties<V>>observe_values.map(v=>ReactiveValue.collapseValue(v, true, true)))); // transform current value\n        if (initialValue === VOID) throw new ValueError(\"initial tranform value cannot be void\");\n        this.setVal(initialValue, true, true);\n        \n\n        if (transform instanceof Scope) this.#transform_scope = transform; // store transform scope\n        else if (persistent_datex_transform) {\n            await this.setDatexTransform(persistent_datex_transform) // TODO: only workaround\n        }\n\n        // transform updates\n        for (const value of observe_values) {\n            if (value instanceof ReactiveValue) value.observe(async ()=>{\n                const newValue = await (observe_values.length==1 ? transformMethod(...<CollapsedDatexObjectWithRequiredProperties<V>>[ReactiveValue.collapseValue(observe_values[0], true, true)]) : transformMethod(...<CollapsedDatexObjectWithRequiredProperties<V>>observe_values.map(v=>ReactiveValue.collapseValue(v, true, true)))); // update value\n                if (newValue !== VOID) this.setVal(newValue, true, true)\n            });\n        }\n        return <Pointer<T&R>>this;\n    }\n\n    protected handleTransform<R,V extends TransformFunctionInputs>(observe_values:V, transform:TransformFunction<V,T&R>, persistent_datex_transform?:string): Pointer<R> {     \n        const initialValue = observe_values.length==1 ? transform(...<CollapsedDatexObjectWithRequiredProperties<V>>[ReactiveValue.collapseValue(observe_values[0], true, true)]) : transform(...<CollapsedDatexObjectWithRequiredProperties<V>>observe_values.map(v=>ReactiveValue.collapseValue(v, true, true))); // transform current value\n        if (initialValue === VOID) throw new ValueError(\"initial tranform value cannot be void\");\n        this.setVal(initialValue, true, true);\n        \n        if (persistent_datex_transform) {\n            this.setDatexTransform(persistent_datex_transform) // TODO: only workaround\n        }\n\n        // transform updates\n        for (const value of observe_values) {\n            if (value instanceof ReactiveValue) value.observe(()=>{\n                const newValue = observe_values.length==1 ? transform(...<CollapsedDatexObjectWithRequiredProperties<V>>[ReactiveValue.collapseValue(observe_values[0], true, true)]) : transform(...<CollapsedDatexObjectWithRequiredProperties<V>>observe_values.map(v=>ReactiveValue.collapseValue(v, true, true))); // update value\n                // await promise (should avoid in non-async transform)\n                if (newValue instanceof Promise) newValue.then((val)=>this.setVal(val, true, true));\n                else if (newValue !== VOID) this.setVal(newValue, true, true);\n            });\n        }\n\n        return this as unknown as Pointer<R>;\n    }\n\n    protected getInitialTransformValue(val: T) {\n        const type = Type.ofValue(val);\n        // special edge case: only update type if not void for transforms (TODO: better solution)\n        if (type !== Type.std.void as Type<T>) this.#unwrapped_transform_type = type;\n        if (type.interface_config?.wrap_transform) val = type.interface_config.wrap_transform(val);\n        return val;\n    }\n\n    protected get supportsIndirectRefs() {\n        // only supported if indirect references are not already handled by a custom transform (e.g. for UIX elements)\n        return this.type.supportsIndirectRefs\n    }\n\n    protected customTransformUpdate(val: T) {\n        if (this.type.interface_config?.handle_transform) {\n            this.type.interface_config.handle_transform(val, this)\n            return true;\n        }\n        else return false;\n    }\n\n    public static WEAK_EFFECT_DISPOSED = Symbol(\"WEAK_EFFECT_DISPOSED\")\n\n    protected smartTransform<R>(transform:SmartTransformFunction<T&R>, persistent_datex_transform?:string, forceLive = false, ignoreReturnValue = false, options?:SmartTransformOptions): Pointer<R> {\n        if (persistent_datex_transform) this.setDatexTransform(persistent_datex_transform) // TODO: only workaround\n        this.#smart_transform_method = transform;\n        this.isTransform = true;\n\n        const state: TransformState = {\n            isLive: false,\n            isFirst: true,\n            executingEffect: false,\n            deps: new IterableWeakSet<ReactiveValue>(),\n            keyedDeps: new IterableWeakMap<Pointer, Set<any>>().setAutoDefault(Set),\n            returnCache: new Map<string, any>(),\n\n            getDepsHash: () => {\n                const norm = \n                    [...state.deps].map(v=>Runtime.valueToDatexStringExperimental(v, false, false, false, true)).join(\"\\n\") + \"\\n\" +\n                    [...state.keyedDeps].map(([ptr, keys]) => \n                        [...keys].map(key => Runtime.valueToDatexStringExperimental(ptr.getProperty(key), false, false, false, false)).join(\"\\n\")\n                    ).join(\"\\n\")\n                const hash = sha256(norm) as string\n                return hash;\n            },\n\n            update: () => {\n                // currently executing effect, skip update\n                if (state.executingEffect) return;\n                \n                // no live transforms needed, just get current value\n                // capture getters in first update() call to check if there\n                // is a static transform and show a warning\n                if (!state.isLive && !state.isFirst) {\n                    state.executingEffect = true;\n                    this.setVal(transform() as T, true, true);\n                    state.executingEffect = false;\n                }\n                // get transform value and update dependency observers\n                else {\n                    state.isFirst = false;\n    \n                    let val!: T\n                    let capturedGetters: Set<ReactiveValue<any>> | undefined;\n                    let capturedGettersWithKeys: AutoMap<Pointer<any>, Set<any>> | undefined;\n    \n                    if (options?.cache) {\n                        const hash = state.getDepsHash()\n                        if (state.returnCache.has(hash)) {\n                            logger.debug(\"using cached transform result with hash \" + hash)\n                            val = state.returnCache.get(hash)\n                        } \n                    }\n    \n                    // no cached value found, run transform function\n                    if (val === undefined) {\n                        ReactiveValue.captureGetters();\n        \n                        try {\n                            state.executingEffect = true;\n                            val = transform() as T;\n                            state.executingEffect = false;\n                            // also trigger getter if pointer is returned\n                            ReactiveValue.collapseValue(val, true, true); \n                        }\n                        catch (e) {\n                            if (e !== Pointer.WEAK_EFFECT_DISPOSED) console.error(e);\n                            // invalid result, no update\n                            return;\n                        }\n                        // always cleanup capturing\n                        finally {\n                            ({capturedGetters, capturedGettersWithKeys} = ReactiveValue.getCapturedGetters());\n                        }\n                    }\n                                    \n                    // check if val is already the result if a transform function\n                    // happens e.g. with jusix _$(() => map(x, ...))\n                    // early return the inner transformed pointer\n                    const ptr = Pointer.getByValue(val);\n                    if (ptr?.isTransform) {\n                        return ptr;\n                    }\n\n                    // promise returned, wait for promise to resolve\n                    if (val instanceof Promise) {\n                        // force live required for async transforms (cannot synchronously calculate the value in a getter)\n                        this.enableLiveTransforms(false)\n\n                        // remember latest transform promise\n                        this.#waiting_for_always_promise = val; \n\n                        // wait until val promise resolves\n                        val\n                            .then((resolvedVal)=>{\n                                // got a more recent promise result in the meantime, ignore this one\n                                if (val !== this.#waiting_for_always_promise) {\n                                    return;\n                                }\n                                this.#waiting_for_always_promise = undefined;\n                                this.handleTransformValue(\n                                    resolvedVal,\n                                    capturedGetters,\n                                    capturedGettersWithKeys,\n                                    state,\n                                    ignoreReturnValue,\n                                    options\n                                )\n                            })\n                            .catch(e => {\n                                if (e !== Pointer.WEAK_EFFECT_DISPOSED) console.error(e);\n                                this.#waiting_for_always_promise = undefined;\n                                // invalid result, no update\n                                // TODO: handle case where promise is rejected in initial transform call\n                                // and captured refs are not observed?\n                            })\n                    }\n                    // normal sync transform\n                    else {\n                        this.handleTransformValue(\n                            val,\n                            capturedGetters,\n                            capturedGettersWithKeys,\n                            state,\n                            ignoreReturnValue,\n                            options\n                        )\n                    }\n                }\n                \n            }\n        }\n\n        // only for effects (indicated by ignoreReturnValue=true):\n        // execute an *async* transform call after the previous one has finished, not in parallel\n        if (ignoreReturnValue) {\n            let blocked = false; // if true, the update() method is blocked until the previous transform resolves\n            let requestingUpdate = false; // if true, an update is requested after the previous transform promise resolves\n\n            const originalUpdate = state.update;\n\n            /**\n             * execute update() and block if the transform method returns a promise\n             */\n            const safeUpdate = () => {\n                try {\n                    originalUpdate()\n                }\n                finally {\n                    blockLoop()\n                }\n            }\n            \n\n            /**\n             * if the transform triggeed by update() method returns a promise, block further updates until the promise resolves\n             */\n            const blockLoop = () => {\n                if (this.#waiting_for_always_promise) {\n                    blocked = true;\n                    this.#waiting_for_always_promise.then(()=>{\n                        // now trigger requested update\n                        if (requestingUpdate) {\n                            requestingUpdate = false;\n                            safeUpdate()\n                        }\n                        // unblock\n                        else {\n                            blocked = false;\n                        }\n                    })\n                }\n                else {\n                    blocked = false;\n                }\n            }\n            \n            /**\n             * overridden update method that makes sure transforms returning a Promise are executed in order\n             */\n            state.update = () => {\n                // already awaiting a promise, update is requested and handled by blockLoop()\n                if (blocked) {\n                    requestingUpdate = true;\n                }\n                // not awaiting a promise, execute update immediately\n                else {\n                    safeUpdate()\n                }\n                \n            }\n        }\n\n\n        // set transform source with TransformSource interface\n        const innerTransformPointer = this.setTransformSource({\n            enableLive: (doUpdate = true) => {\n                state.isLive = true;\n                // get current value and automatically reenable observers\n                if (doUpdate) state.update(); \n            },\n            disableLive: () => {\n                state.isLive = false;\n                // disable all observers\n                for (const dep of state.deps) dep.unobserve(state.update, this.#unique);\n                for (const [ptr, keys] of state.keyedDeps) {\n                    for (const key of keys) ptr.unobserve(state.update, this.#unique, key);\n                }\n\n                state.deps.clear();\n            },\n            deps: state.deps,\n            keyedDeps: state.keyedDeps,\n            update: state.update\n        })\n\n        /**\n         * if an inner transform pointer is returned, the current pointer is no longer needed\n         * and the inner transform pointer is returned instead\n         */\n        if (innerTransformPointer) {\n            this.delete();\n            logger.debug(\"found inner transform pointer \" + innerTransformPointer.idString())\n            return innerTransformPointer;\n        }\n\n        if (forceLive) this.enableLiveTransforms(false);\n\n        return this as unknown as Pointer<R>;\n    }\n\n\n    private handleTransformValue(\n        val: T,\n        capturedGetters: Set<ReactiveValue<any>>|undefined,\n        capturedGettersWithKeys: AutoMap<Pointer<any>, Set<any>>|undefined,\n        state: TransformState,\n        ignoreReturnValue: boolean,\n        options?: SmartTransformOptions\n    ) {\n        if (!ignoreReturnValue && !this.value_initialized) {\n            if (val == undefined) this.#is_js_primitive = true;\n            else this.#updateIsJSPrimitive(ReactiveValue.collapseValue(val,true,true));\n        }\n        \n        // set isLive to true, if not primitive\n        if (!this.is_js_primitive) {\n            state.isLive = true;\n            this._liveTransform = true\n        }\n\n        // remove return value if captured by getters\n        // TODO: this this work as intended?\n        capturedGetters?.delete(val instanceof Pointer ? val : Pointer.getByValue(val)!);\n        capturedGettersWithKeys?.delete(val instanceof Pointer ? val : Pointer.getByValue(val)!);\n\n        const hasGetters = capturedGetters||capturedGettersWithKeys;\n        const gettersCount = (capturedGetters?.size??0) + (capturedGettersWithKeys?.size??0);\n\n        // no dependencies, will never change, this is not the intention of the transform\n        if (!ignoreReturnValue && hasGetters && !gettersCount) {\n            this._staticTransformValue = val;\n            if (!options?.allowStatic) logger.warn(\"The transform value for \" + this.idString() + \" is a static value:\", val);\n            // cleanup stuff not needed if no reactive transform\n            if (options?.allowStatic) return;\n        }\n\n        // update value\n        if (!ignoreReturnValue) this.setVal(val, true, true);\n\n        if (state.isLive) {\n\n            if (capturedGetters) {\n                // unobserve no longer relevant dependencies\n                for (const dep of state.deps) {\n                    if (!capturedGetters?.has(dep)) {\n                        dep.unobserve(state.update, this.#unique);\n                        state.deps.delete(dep)\n                    }\n                }\n                // observe newly discovered dependencies\n                for (const getter of capturedGetters) {\n                    if (state.deps.has(getter)) continue;\n                    state.deps.add(getter)\n                    getter.observe(state.update, this.#unique);\n                }\n            }\n\n            if (capturedGettersWithKeys) {\n                // unobserve no longer relevant dependencies\n                for (const [ptr, keys] of state.keyedDeps) {\n                    const capturedKeys = capturedGettersWithKeys.get(ptr);\n                    for (const key of keys) {\n                        if (!capturedKeys?.has(key)) {\n                            ptr.unobserve(state.update, this.#unique, key);\n                            keys.delete(key)\n                        }\n                    }\n                    if (keys.size == 0) state.keyedDeps.delete(ptr);\n                }\n\n                // observe newly discovered dependencies\n                for (const [ptr, keys] of capturedGettersWithKeys) {\n                    const storedKeys = state.keyedDeps.getAuto(ptr);\n\n                    for (const key of keys) {\n                        if (storedKeys.has(key)) continue;\n                        ptr.observe(state.update, this.#unique, key);\n                        storedKeys.add(key);\n                    }\n                   \n                }\n            }\n            \n\n            if (options?.cache) {\n                const hash = state.getDepsHash()\n                state.returnCache.set(hash, val);\n            }\n        }\n    }\n\n\n    // TODO: JUST A WORKAROUND - if transform is a JS function, a DATEX Script can be provided to be stored as a transform method\n    async setDatexTransform(datex_transform:string) {\n        // TODO: fix and reenable\n        try {\n            const ptr = await Runtime.executeDatexLocally(datex_transform);\n            if (ptr instanceof Pointer && ptr.transform_scope) {\n                this.#transform_scope = ptr.transform_scope;\n            }\n            else {\n                throw new Error(\"invalid transform pointer\")\n            }\n        }\n        catch (e) {\n            console.log(\"transform error\", e);\n        }\n    }\n\n    #registeredForGC = false;\n    static #persistentPrimitivePointers = new Set<Pointer>();\n\n    #updatePersistent() {\n        if (this.is_persistent) {\n            // make sure complex pointer value is persisted\n            if (super.val instanceof WeakRef) super.setVal(super.val.deref(), false);\n            // make sure primitive pointer is persisted\n            if (this.#is_js_primitive) Pointer.#persistentPrimitivePointers.add(this);\n        }\n        else {\n            // make sure complex pointer value is not persisted (add WeakRef if not yet added)\n            if (!this.is_js_primitive && !(super.val instanceof WeakRef)) super.setVal(<any>new WeakRef(<any>super.val), false);\n            // make sure primitive pointer is not persisted\n            if (this.#is_js_primitive) Pointer.#persistentPrimitivePointers.delete(this);  \n        }\n    }\n\n    // enable / disable garbage collection based on subscribers & is_persistant\n    updateGarbageCollection(){\n        if (!this.value_initialized) return;\n\n        // remove WeakRef (keep value) if persistant, or has subscribers\n        if (this.is_persistent) {\n            //logger.warn(\"blocking \" + this + \" from beeing garbage collected\")\n            this.#garbage_collectable = false;\n\n            // make sure persistent state is up to date\n            this.#updatePersistent();\n\n            if (this.#registeredForGC) {\n                logger.debug(\"disabled garbage collection for \" + this.id);\n                Pointer.garbage_registry.unregister(this)\n                this.#registeredForGC = false;\n            }\n        }\n        // register finaliztion register (only once)\n        else if (!this.#registeredForGC) {\n\n            // add to garbage collection after timeout\n            const _keep = this.current_val;\n            setTimeout(()=>{\n                if (!this.garbage_collected && this.value_initialized && !this.is_persistent) {\n                    _keep; // prevent garbage collection until timeout finished\n                    \n                    // make sure persistent state is up to date\n                    this.#updatePersistent();\n\n                    this.#garbage_collectable = true;\n                    try {\n                        // TODO: update #subscribed of mockPointer when changed\n                        const mockPointer = {id: this.id, origin: this.origin, is_origin: this.is_origin, subscribed: this.#subscribed};\n                        this.#registeredForGC = true;\n                        Pointer.garbage_registry.register(<object><unknown>(this.is_js_primitive ? this : this.current_val), mockPointer, this)\n                    }\n                    catch {\n                        logger.error(\"couldn't register for garbage collection: \", this.idString())\n                    }\n                }\n            }, Runtime.OPTIONS.GARBAGE_COLLECTION_TIMEOUT);\n        }\n    }\n\n    // only exists for non-js-primitive values\n    public get original_value():T {    \n        return (<WeakRef<any>>this.#original_value)?.deref()\n    }\n\n    // shadow object store primitive pointers per reference, collapses object pointers (to prevent garbage collection)\n    public get shadow_object():{[key:string]:unknown}|undefined {    \n        return (<WeakRef<any>>this.#shadow_object)?.deref()\n    }\n\n    #any_type = false;\n\n    /**\n     * gets the current type of the pointer, or any if pointer is explicitly set to any\n     */\n    get type():Type {\n        if (this.#any_type) return Type.std.Any;\n        return this.current_type;\n    }\n\n    get current_type():Type {\n        return this.#unwrapped_transform_type ?? this.#type;\n    }\n\n\n    allowAnyType(any_type = true) {\n        this.#any_type = any_type;\n    }\n\n\n    public extended_pointers = new Set<Pointer>()\n\n    /**\n     * sync all properties from one pointer with an other\n     * only guaranteed to work for pointers with the same type, other (incompatible) types might cause problems\n     * @param otherPointer \n     */\n    public extend(otherPointer:Pointer|object, update_back = true) {\n        if (!(otherPointer instanceof Pointer)) throw \"not a pointer\";\n        logger.info(this + \" is extending pointer \" + otherPointer);\n\n        for (let property of otherPointer.getKeys()) {\n            this.extendProperty(otherPointer, property, update_back)\n        }\n    }\n\n    // extend pointer (updates in both directions or in one direction)\n    public extendProperty(otherPointer:Pointer, key:any, update_back = true) {\n        console.log(\"extend poperty\",key);\n        if (!(otherPointer instanceof Pointer)) throw \"not a pointer\";\n\n        this.extended_pointers.add(otherPointer);\n\n        // add property\n        this.val[key] = otherPointer.val[key];\n        \n        // prevent infinite loops\n        let changing1 = false;\n        let changing2 = false;\n\n        // reflect changes from other pointer\n        otherPointer.observe(value=>{\n            if (changing2) return;\n            changing1 = true;\n            console.warn(\"other pointer cahnged\", key, value)\n            this.handleSet(key, value, false)\n            changing1 = false;\n        }, undefined, key);\n\n        if (update_back) {\n            // reflect own changes to other pointer\n            this.observe(value=>{\n                if (changing1) return;\n                changing2 = true;\n                console.warn(\"own pointer cahnged\", key, value)\n                otherPointer.handleSet(key, value)\n                changing2 = false;\n            }, undefined, key);\n        }\n\n    }\n\n\n\n    public datex_timeout?:number\n\n    public visible_children?:Set<string>; // list of all children that are visible to DATEX\n    public sealed_properties?:Set<string>;\n    public anonymous_properties?:Set<string>;\n\n    // returns if a property of a @sync class can be read, returns true if not a @sync class\n    public canReadProperty(property_name:string):boolean {\n        return (!this.visible_children && !DEFAULT_HIDDEN_OBJECT_PROPERTIES.has(property_name)) || !!(this.visible_children?.has(property_name))\n    }\n    \n    // returns if a property of a @sync class can be updated, returns true if not a @sync class\n    public canUpdateProperty(property_name:string):boolean {\n        return this.canReadProperty(property_name) && (!this.sealed_properties || !this.sealed_properties.has(property_name));\n    }\n\n    static #endpoint_subscriptions = new Map<Endpoint, Set<Pointer>>().setAutoDefault(Set);\n\n    #subscriberCache?: Set<Endpoint> // subscriber cache in storage\n    #subscribers = new Disjunction<Endpoint>()\n\n    public get subscribers() {\n        return this.#subscribers;\n    }\n\n    public addSubscriber(subscriber: Endpoint) {\n\n        // already subscribed\n        if (this.subscribers.has(subscriber)) return;\n\n        // also store in subscriber cache - only in frontend \n        // (TODO: required for backend? currently disabled because backend is not stopped frequently, only leads to overhead)\n        if (this.isStored && client_type == \"browser\") {\n            if (this.#subscriberCache) this.#subscriberCache.add(subscriber)\n            else {\n                Storage.requestSubscriberCache(this.id).then(cache => {\n                    // add current subscriber to subscriber cache\n                    this.#subscriberCache = cache;\n                    this.#subscriberCache.add(subscriber)\n\n                    // add subscribers from cache\n                    for (const subscriber of cache) this.addSubscriber(subscriber)\n                })\n            }\n        }\n\n        // TODO also check pointer permission for 'to'\n\n        // request sync endpoint is self, cannot subscribe to own pointers!\n        if (Runtime.endpoint.equals(subscriber) || subscriber.equals(LOCAL_ENDPOINT)) {\n            throw new PointerError(\"Cannot sync pointer with own origin\");\n        }\n\n        logger.debug(subscriber + \" subscribed to \" + this.idString());\n\n        // not existing pointer or no access to this pointer\n        // TODO check access permission\n        // || (pointer.allowed_access && !pointer.allowed_access.test(SCOPE.sender))\n        if (!this.value_initialized) throw new PointerError(\"Pointer does not exist\")\n     \n        this.subscribers.add(subscriber);\n        if (this.subscribers.size == 1) this.updateGarbageCollection() // first subscriber\n        if (this.streaming.length) this.startStreamOutForEndpoint(subscriber) // setTimeout(()=>, 200); // TODO do without timeout?\n        // force enable live mode also if primitive (subscriber is not handled a new observer)\n        if (this.is_js_primitive) this.setForcedLiveTransform(true)\n\n        // add to endpoint subscriptions map\n        Pointer.#endpoint_subscriptions.getAuto(subscriber).add(this)\n    }\n\n    public removeSubscriber(subscriber: Endpoint) {\n        logger.debug(\"removed subscriber \" + subscriber + \" for \" + this.idString());\n\n        this.subscribers.delete(subscriber);\n\n        // also remove from subscriber cache\n        if (this.#subscriberCache) this.#subscriberCache.delete(subscriber)\n\n        // no subscribers left\n        if (this.subscribers.size == 0) {\n            // disable force live mode for primitives (subscriber is not handled a new observer)\n            if (this.is_js_primitive) this.setForcedLiveTransform(false)\n            this.updateGarbageCollection() \n        }\n\n        // stop streaming\n        this.stopStreamOutForEndpoint(subscriber)\n\n        // remove from endpoint subscriptions map\n        Pointer.#endpoint_subscriptions.get(subscriber)?.delete(this)\n        if (Pointer.#endpoint_subscriptions.get(subscriber)?.size == 0) {\n            Pointer.#endpoint_subscriptions.delete(subscriber)\n        }\n    }\n    \n    static #periodicSubscriberCleanup?: number\n\n    /**\n     * Enables a periodic cleanup of pointer subscribers that are no longer onlinea\n     * @param interval interval in seconds (default: 15 minutes)\n     */\n    public static enablePeriodicSubscriberCleanup(interval = 15 * 60) {\n        logger.debug(`periodic pointer subscriber cleanup enabled (interval: ${interval} seconds)`);\n        if (Pointer.#periodicSubscriberCleanup) clearInterval(Pointer.#periodicSubscriberCleanup);\n        Pointer.#periodicSubscriberCleanup = setInterval(() => this.cleanupEndpoints(), interval * 1000); \n    }\n\n    /**\n     * Disables the periodic cleanup of pointer subscribers\n     */\n    public static disablePeriodicSubscriberCleanup() {\n        logger.debug(\"periodic pointer subscriber cleanup disabled\");\n        if (Pointer.#periodicSubscriberCleanup) {\n            clearInterval(Pointer.#periodicSubscriberCleanup);\n            Pointer.#periodicSubscriberCleanup = undefined;\n        }\n    }\n\n    /**\n     * Iterates over all subscribers and access endpoints\n     */\n    static *#subscribersAndAccessEndpoints() {\n        for (const endpoint of Pointer.#endpoint_subscriptions.keys()) yield endpoint;\n        for (const endpoint of Pointer.#allowed_access_by_endpoint.keys()) yield endpoint;\n    }\n\n    /**\n     * Removes all referenced endpoints that are no longer online\n     */\n    public static async cleanupEndpoints() {\n        logger.debug(\"cleaning up endpoints with subscriptions or access permissions\");\n\n        for (const endpoint of this.#subscribersAndAccessEndpoints()) {\n            if (!(await endpoint.isOnline())) {\n                this.clearEndpointSubscriptions(endpoint);\n                this.clearEndpointPermissions(endpoint)\n                // TODO: this should ideally directly be handleded by the runtime\n                Runtime.clearEndpointScopes(endpoint);\n            }\n        }\n    }\n\n    /**\n     * Removes all subscriptions for an endpoint\n     */\n    public static clearEndpointSubscriptions(endpoint: Endpoint) {\n        let removeCount = 0;\n\n        for (const pointer of Pointer.#endpoint_subscriptions.get(endpoint) ?? []) {\n            pointer.removeSubscriber(endpoint);\n            removeCount++;\n        }\n\n        if (removeCount) logger.debug(\"removed \" + removeCount + \" subscriptions for \" + endpoint);\n    }\n\n    /**\n     * Removes all permissions for an endpoint given with grantAccessTo\n     */\n    public static clearEndpointPermissions(endpoint: Endpoint) {\n        if (!Runtime.OPTIONS.PROTECT_POINTERS) return; // ignore if pointer protection is disabled\n\n        let removeCount = 0;\n        for (const pointer of Pointer.#allowed_access_by_endpoint.get(endpoint) ?? []) {\n            pointer.revokeAccessFor(endpoint);\n            removeCount++;\n        }\n        if (removeCount) logger.debug(\"removed \" + removeCount + \" pointer access permissions for \" + endpoint);\n    }\n\n\n    // updates are from datex (external) and should not be distributed again or local update -> should be distributed to subscribers\n    #update_endpoints: Disjunction<Endpoint>; // endpoint to update\n\n    get send_updates_to_origin() {\n        // assumes origin is not current endpoint\n        // don't send if exclude_origin_from_updates set or has a local transform_scope\n        return this.origin && !this.is_origin && !(this.#exclude_origin_from_updates || this.transform_scope)\n    }\n\n    #exclude_origin_from_updates?:boolean;\n    public excludeEndpointFromUpdates(endpoint:Endpoint) {\n        // TODO origin equals id also for remote endpoints!\n        if (this.origin.equals(endpoint)) this.#exclude_origin_from_updates = true;\n        else {\n            this.#update_endpoints = new Disjunction(...this.subscribers);\n            this.#update_endpoints.delete(endpoint);\n        }\n    }\n    public enableUpdatesForAll() {\n        this.#exclude_origin_from_updates = false;\n        this.#update_endpoints = this.subscribers;\n    }\n    get update_endpoints() {\n        if (!this.#update_endpoints) this.#update_endpoints = this.subscribers\n        return this.#update_endpoints!;\n    }\n\n\n    // TODO merge with Datex.Runtime.runtime_actions.getKeys\n    public getKeys(array_indices_as_numbers = false):Iterable<any> {\n        // restricted to visible_children\n        if (this.visible_children) return this.visible_children;\n\n        let keys = JSInterface.handleKeys(this.current_val, this.type);\n        if (keys == INVALID) throw new ValueError(\"Value has no iterable content\");\n        if (keys == NOT_EXISTING) {\n            if (this.current_val instanceof Array) {\n                if (array_indices_as_numbers) return [...this.current_val.keys()]\n                else return [...this.current_val.keys()].map(BigInt);\n            }\n            else keys = Object.keys(this.current_val); // default Object.keys\n        }\n        return keys;\n    }\n\n    // proxify a (child) value, use the pointer context\n    proxifyChild(name:string, value:unknown) {\n        if (value === NOT_EXISTING && !this.shadow_object) throw new Error(\"Cannot proxify child of non-object value\");\n        let child = value === NOT_EXISTING ? this.shadow_object![name] : value;\n        \n        // special native function -> <Function> conversion - exception: BACKEND_EXPORT functions (normal js functions that are virtually bound to a datex function)\n        if (typeof child == \"function\" && !(child instanceof DatexFunction) && !(child instanceof JSTransferableFunction) && !((child as any)?.[BACKEND_EXPORT])) {\n            child = DatexFunction.createFromJSFunction(child as (...args: unknown[]) => unknown, this, name);\n        }\n\n        // create/get pointer, same permission filter\n        return Pointer.proxifyValue(child, false, this.allowed_access, this.anonymous_properties?.has(name), false, true);\n    }\n\n    /** proxify the child elements of a proxified value */\n    private proxifyChildren() {\n\n        // console.log(\"is objet like \" + this.type, this.type.interface_config.is_normal_object)\n\n        if (!this.shadow_object) return;\n        // normal object with properties\n        if (!this.type.interface_config || this.type.interface_config.is_normal_object) this.objProxifyChildren();\n        // other children (e.g. Set, Map)\n        else this.specialProxifyChildren()\n\n        return;\n    }\n\n    /**\n     * Add pointers to all non-primitive children recursively.\n     * For special objects like Maps, Sets, ...\n     */\n    private specialProxifyChildren() {\n        if (!this.type.interface_config) throw new Error(\"Cannot proxify children of type \" + this.type);\n        for (const key of this.getKeys()) {\n            const prop = this.getProperty(key);\n            // \"Set\" like type\n            if (prop == NOT_EXISTING) {\n                if (!this.type.interface_config.action_add || !this.type.interface_config.action_subtract) \n                    throw new Error(\"Cannot add children to type \" + this.type);\n                this.type.interface_config.action_subtract(this.val, key, true) \n                this.type.interface_config.action_add(this.val, this.proxifyChild(undefined, key), true) \n            }\n            // key->value relationship\n            else {\n                if (!this.type.interface_config.set_property_silently) \n                    throw new Error(\"Cannot set property of type \" + this.type);\n                this.type.interface_config.set_property_silently(this.val, key, this.proxifyChild(undefined, prop), this) \n            }\n        }\n    }\n\n    /**\n     * Add pointers to all non-primitive children recursively.\n     * For normal objects-like values with properties\n     */\n    private objProxifyChildren() {\n        const high_priority_keys = new Set();// remember higher priority keys in prototype chain, don't override observer with older properties in the chain\n\n        const value = this.shadow_object!;\n\n        for (const name of this.visible_children ?? Object.keys(value)) {\n            const type = Type.ofValue(value[name])\n\n            // run assertions for property if defined in template\n            const templatePropType = this.type?.template?.[name];\n            if (templatePropType instanceof Conjunction) {\n                Type.matchesType(type, templatePropType, value[name], true)\n                // for (const type of templatePropType) {\n                //     if (type instanceof)\n                // }\n\n            }\n\n            // non primitive value - proxify always\n            if (!type.is_primitive) {\n                // custom timeout for remote proxy function\n                if (value[name] instanceof DatexFunction && this.type?.children_timeouts?.has(name)) {\n                    value[name].datex_timeout = this.type.children_timeouts.get(name);\n                }\n                // save property to shadow_object\n                this.initShadowObjectProperty(name, this.proxifyChild(name, NOT_EXISTING))\n            }\n\n            // already proxified child - set observers\n            else if (value[name] instanceof ReactiveValue) {\n                this.initShadowObjectPropertyObserver(name, value[name]);\n            }\n            high_priority_keys.add(name);\n        }\n\n        // also observe prototype reference properties\n        let prototype = value;\n        // iterate up until Object.protoype reached\n        while ((prototype = Object.getPrototypeOf(prototype)) != Object.prototype) {\n            for (const name of this.visible_children ?? Object.keys(prototype)) {\n                try {\n                    if (prototype[name] instanceof ReactiveValue && !high_priority_keys.has(name)) { // only observer Values, and ignore if already observed higher up in prototype chain\n                        this.initShadowObjectPropertyObserver(name, <ReactiveValue>prototype[name]);\n                    }\n                } catch (e) {\n                    logger.warn(\"could not check prototype property:\",name)\n                }\n               \n                high_priority_keys.add(name);\n            }\n        }\n    }\n\n    #custom_prop_getter?:(key:unknown)=>unknown\n    #custom_prop_setter?:(key:unknown, value:unknown)=>unknown\n\n    public setPropertyGetter(getter:(key:unknown)=>unknown) {\n        this.#custom_prop_getter = getter; \n    }\n\n    public setPropertySetter(setter: (key:unknown, value:unknown)=>unknown) {\n        this.#custom_prop_setter = setter; \n    }\n\n\n    /** create proxy for object and adds listeners */\n    private addObjProxy(obj:T):T {   \n\n        // custom proxy\n        const res = JSInterface.createProxy(obj, this, this.type);\n        if (res != INVALID && res != NOT_EXISTING) return res; // proxy created successfully\n\n        if (typeof obj == \"symbol\" || obj instanceof WeakRef || obj instanceof Stream || obj instanceof DatexFunction || obj instanceof JSTransferableFunction) { // no proxy needed?!\n            return obj;\n        }\n\n        // fake primitives TODO: dynamic mime types\n        if (obj instanceof Quantity || obj instanceof Time || obj instanceof Type || obj instanceof URL  || obj instanceof Target || obj instanceof Blob || (globalThis.MediaStream && obj instanceof MediaStream) || (globalThis.HTMLImageElement && obj instanceof HTMLImageElement)) {\n            return obj;\n        }\n\n        // don't proxyify Text nodes\n        if (globalThis.Text && obj instanceof Text) {\n            return obj;\n        }\n\n        // convert date to time\n        if (obj instanceof Date) {\n            return <T><unknown> new Time(obj);\n        }\n\n        // special native function -> <Function> conversion\n        if (typeof obj == \"function\" && !(obj instanceof DatexFunction) && !(obj instanceof JSTransferableFunction)) return <T><unknown> DatexFunction.createFromJSFunction(obj as (...params: any[]) => any);\n\n        // get prototype and prototype of prototype (TODO go up the full protoype chain??!)\n        let prototype1 = Object.getPrototypeOf(obj);\n        let prototype2 = prototype1 && Object.getPrototypeOf(prototype1);\n        if (prototype1 == Object.prototype) prototype1 = undefined;\n        if (prototype2 == Object.prototype) prototype2 = undefined;\n\n        // is a sealed 'DatexObject' (no proxy needed, getters/setters already included in DatexObject)\n        if (obj[SHADOW_OBJECT] && Object.isSealed(obj)) {\n            obj[SET_PROXY] = (k,v)=>this.handleSet(k,v);\n            this.#shadow_object = new WeakRef(obj[SHADOW_OBJECT]);\n            return obj;\n        }\n\n        // only define getters/setters (no Proxy wrapper class)\n        else if (!Object.isSealed(obj) && this.visible_children) {\n\n            // set new shadow_object to handle properties in background\n            const shadow_object = {[DX_PTR]:this};\n            this.#shadow_object = new WeakRef(shadow_object);\n\n            // remember children with getters and\n            // init them after all other properties to make sure\n            // that reactive properties are already initialized and\n            // prevent unnecessary \"transform value is a static value\" warnings\n            // (cannot be guaranteed that this works in all cases)\n            const childrenWithGetters = new Map<string, PropertyDescriptor>();\n\n            for (const name of this.visible_children) {\n\n                /** extract existing getter + setter */\n                // get descriptor containing getter/setter\n                const property_descriptor = Object.getOwnPropertyDescriptor(obj,name) \n                    ?? (prototype1 && Object.getOwnPropertyDescriptor(prototype1,name))\n                    ?? (prototype2 && Object.getOwnPropertyDescriptor(prototype2,name));\n\n                // add original getters/setters to shadow_object if they exist (and call with right 'this' context)\n                if (property_descriptor?.set || property_descriptor?.get) {\n                    \n                    // @property getter: set pointer as property instead of getter\n                    // TODO: what should happen if getter & SETTER set (still use always transform?)\n                    if (property_descriptor.get && !property_descriptor?.set) {\n                        childrenWithGetters.set(name, property_descriptor);\n                    }\n                    // bind default getters and setters\n                    else {\n                        const descriptor:PropertyDescriptor = {};\n                        if (property_descriptor.set) descriptor.set = val => property_descriptor.set?.call(obj,val);\n                        if (property_descriptor.get) descriptor.get = () =>  property_descriptor.get?.call(obj)\n    \n                        Object.defineProperty(shadow_object, name, descriptor);\n                    }\n                   \n                }\n                // no original getter/setter\n                else shadow_object[name] = obj[name];\n\n                // new getter + setter\n                Object.defineProperty(obj, name, {\n                    configurable:  true, // TODO: cant be false because of uix @content bindings, fix\n                    enumerable: true,\n                    set: val => { \n                        this.handleSet(name, val);\n                    },\n                    get: () => { \n                        this.handleBeforeNonReferencableGet(name);\n                        // important: reference shadow_object, not this.shadow_object here, otherwise it might get garbage collected\n                        return ReactiveValue.collapseValue(shadow_object[name], true, true);\n                    }\n                });\n            \n            }\n\n            for (const [name, property_descriptor] of childrenWithGetters) {\n                // copied from always in datex_short\n                const transformRef = Pointer.createSmartTransform(property_descriptor.get!.bind(obj));\n\n                Object.defineProperty(shadow_object, name, {value:transformRef})\n            }\n\n            return obj;\n        }\n \n        // create Proxy class around object\n        if (typeof obj == \"object\" && obj != null) {\n\n            const is_array = Array.isArray(obj);\n\n            if (is_array) {\n                // overwrite special array methods TODO\n\n                try {\n                    // splice\n                    Object.defineProperty(obj, \"splice\", {\n                        value: this.arraySplice.bind(this),\n                        enumerable: false,\n                        writable: false\n                    })\n                    // sort\n                    Object.defineProperty(obj, \"sort\", {\n                        value: this.arraySort.bind(this),\n                        enumerable: false,\n                        writable: false\n                    })\n                }\n                catch (e) {\n                    console.log(e);\n                    logger.error(\"Cannot set custom array methods on \" + this.idString())\n                }\n            }\n\n\t\t\tconst proxy = new Proxy(<any>obj, {\n                get: (_target, key) => {\n                    if (key == DX_PTR) return this;\n                    if (this.#custom_prop_getter && (!this.shadow_object || !(key in this.shadow_object)) && !(typeof key == \"symbol\")) return this.#custom_prop_getter(key);\n                    const val:any = ReactiveValue.collapseValue(this.shadow_object?.[key], true, true);\n\n                    if (key != \"$\" && key != \"$$\") {\n                        if (is_array) this.handleBeforeNonReferenceableGetArray(key);\n                        else this.handleBeforeNonReferencableGetObject(key)\n                    }\n\n                    // should fix #private properties, but does not seem to work for inheriting classes?\n                    if (typeof val == \"function\" \n                        && key != \"$\" \n                        && key != \"$$\" \n                        && typeof val.bind == \"function\"\n                        // ignore constructors\n                        && key != \"constructor\"\n                        // ignore builtin object/array methods\n                        && !(_target.constructor == Array && (arrayProtoNames.includes(key as string)))\n                        && !(_target.constructor == Object && (objectProtoNames.includes(key as string)))\n                    ) {\n                        const propertyDesc = Object.getOwnPropertyDescriptor(_target, key);\n                        if (propertyDesc && propertyDesc.writable == false && propertyDesc.configurable == false) {\n                            // not allowed, return without bind\n                            return val;\n                        }\n                        return val.bind(_target);\n                    }\n                    else return val;\n                },\n                set: (target, val_name: keyof any, val: any) => {\n                    if (this.#custom_prop_setter) {\n                        return this.#custom_prop_setter(val_name, val);\n                    }\n\n                    // length changed\n                    if (is_array && val_name == \"length\") {\n                        // add empty values\n                        if (val > obj.length) {\n                            // do not change in DATEX\n                            //for (let i=obj.length; i<val;i++) this.handleSet(i, undefined);\n                            throw new ValueError(\"<Array> property 'length' cannot be increased\");\n                        }\n                        // delete values\n                        else if (val < obj.length) {\n                            for (let i=obj.length-1; i>=val;i--) {\n                                if (i in obj) this.handleDelete(BigInt(i));\n                            }\n                            // update array length if shorter than previous\n                            obj.length = val;\n                        }\n                        \n                        return true;\n                    }\n\n                    // ignore DATEX handling if array and not an index property\n                    if (is_array && !(typeof val_name == \"number\" || typeof val_name == \"bigint\" || /^[0-9]+$/.test(globalThis.String(val_name)))) {\n                        target[val_name] = val;\n                        return true;\n                    }\n\n                    // also ignore symbol keys\n                    if (typeof val_name == \"symbol\") {\n                        target[val_name] = val;\n                        return true;\n                    }\n\n                    this.handleSet(is_array ? BigInt(Number(val_name)) : val_name, val);\n\n                    // x = void => delete; trim array to match DATEX Arrays\n                    if (is_array && val === VOID && Number(val_name)+1==obj.length) Runtime.runtime_actions.trimArray(obj)\n\n                    return true;\n                },\n                deleteProperty: (target, prop) => {\n\n                    this.handleDelete(is_array ? BigInt(Number(prop)) : prop);   \n                    \n                    // trim array to match DATEX Arrays\n                    if (is_array && Number(prop)+1==obj.length) Runtime.runtime_actions.trimArray(obj)\n\n                    return true\n                },\n                ownKeys: (target) => {\n                    // assume that the whole object should be observed for transform\n                    this.handleBeforeNonReferencableGet();\n                    return Reflect.ownKeys(target);\n                },\n            });\n\n            // set right 'this' context for getters / setters\n            for (const name of [...Object.getOwnPropertyNames(obj), ...Object.getOwnPropertyNames(prototype1??{}), ...Object.getOwnPropertyNames(prototype2??{})]) {\n                // get descriptor containing getter/setter\n                const property_descriptor = Object.getOwnPropertyDescriptor(obj,name) \n                ?? Object.getOwnPropertyDescriptor(prototype1,name) \n                ?? (prototype2 && Object.getOwnPropertyDescriptor(prototype2,name));\n\n                // add original getters/setters to shadow_object if they exist (and call with right 'this' context)\n                if (property_descriptor?.set || property_descriptor?.get) {\n                    try {\n                        Object.defineProperty(obj, name, {\n                            set: val => {property_descriptor.set?.call(proxy,val)},\n                            get: () =>  property_descriptor.get?.call(proxy)\n                        });\n                    }\n                    catch (e) {\n                        console.log(obj, name);\n                        console.error(e)\n                    }\n                }\n            }\n\n            return proxy;\n        }\n\n        else {\n            return obj;\n        }\n    }\n\n\n    private handleBeforeNonReferenceableGetArray(key: string|symbol) {\n        // assumes map, filter, etc. gets called after property is accessed\n        if (typeof key==\"string\" && observableArrayMethods.has(key)) this.handleBeforeNonReferencableGet()\n        else this.handleBeforeNonReferencableGetObject(key);\n    }\n\n    private handleBeforeNonReferencableGetObject(key: string|symbol) {\n        if (Object.hasOwn(this.shadow_object!, key)) {\n            this.handleBeforeNonReferencableGet(key);\n        }\n    }\n\n\n    // get property by key\n    // if leak_js_properties is true, primitive + prototype methods (like toString are also accessible) - should only be used in JS context\n    public getProperty(key:unknown, leak_js_properties = false) {\n        let property_value = JSInterface.handleGetProperty(this.shadow_object, key, this.type)\n        if (property_value == INVALID || property_value == NOT_EXISTING) {\n            // all JS properties\n            if (leak_js_properties && this.current_val && key in this.current_val) {\n                property_value = this.current_val?.[key]; \n                // also bind non-datex function to parent\n                return (typeof property_value == \"function\") ? (...args:unknown[])=>(<Function>property_value).apply(this.current_val, args) : property_value;\n            }\n            // restricted to DATEX properties\n            else if (this.shadow_object && key in this.shadow_object) property_value = ReactiveValue.collapseValue(this.shadow_object[key], true, true)\n        }\n        return property_value;\n    }\n\n    // update reference of property to new value\n    handleSetReference(key:string, value:unknown, ignore_if_unchanged = true) {\n        value = Pointer.pointerifyValue(value); // make sure the value is a reference if possible (can also be a plain value)\n        // convert key to datex conform key\n        key = Pointer.proxifyValue(key);\n\n        // does property exist in DATEX?\n        if (!this.type.isPropertyAllowed(key)) {\n            throw new ValueError(\"Property '\" + key + \"' does not exist\")\n        }\n\n        // JS number -> bigint conversion\n        if (typeof value == \"number\" && this.type.getAllowedPropertyType(key).root_type == Type.std.integer) value = BigInt(value);\n\n        // invalid type for value?\n        this.type.assertPropertyValueAllowed(key, value)\n\n        this.initShadowObjectProperty(key, value);\n\n    }\n\n    // directly set value of property (reference)\n    handleSet(key:unknown, value:unknown, ignore_if_unchanged = true, always_use_provided_value = false) {\n\n        if (!this.current_val) return;\n        // convert value/key to datex conform value/key\n        value = this.type.proxify_children&&!always_use_provided_value ? this.proxifyChild(key, value) : value;\n        key = Pointer.proxifyValue(key);\n        \n        const obj = this.current_val;\n        let existed_before = false;\n\n        // write permission?\n        \n        // does property exist in DATEX?\n        if (!this.type.isPropertyAllowed(key)) {\n            throw new ValueError(\"Property '\" + key + \"' does not exist\")\n        }\n\n        // JS number -> bigint conversion\n        if (typeof value == \"number\" && this.type.getAllowedPropertyType(key).root_type == Type.std.integer) value = BigInt(value);\n\n        // invalid type for value?\n        this.type.assertPropertyValueAllowed(key, value)\n\n        // get current value\n        const current_value = this.getProperty(key);\n\n\n        // value has not changed, TODO ? only okay if undefined and not key not previously in object (explicitly setting to void/undefined)\n        if (current_value === value && ignore_if_unchanged) {\n            return;\n        }\n\n\n        if (current_value !== undefined) existed_before = true;\n  \n        // try set on custom pseudo class\n        const res = JSInterface.handleSetPropertySilently(obj, key, value, this, this.type);\n        if (res == INVALID || res == NOT_EXISTING) this.updateShadowObjectProperty(key, value); // set on original_value\n\n        // change to <Int> for DATEX if <Array>\n        if ((res == INVALID || res == NOT_EXISTING) && this.shadow_object instanceof Array) key = BigInt(key); \n\n        // inform observers\n        return this.handleSetObservers(key, value, existed_before, current_value);\n    }\n\n    /**\n     * trigger local and remote observers for SET action\n     * @param key property key\n     * @param value optional value, if not set, resolved via key\n     * @param existed_before was the property already initialized on the value\n     * @returns \n     */\n    handleSetObservers(key: any, value?: any, existed_before = false, previous?: any) {\n\n        // get current value\n        value = value ?? this.getProperty(key);\n\n        if (this.send_updates_to_origin) {\n            this.handleDatexUpdate(key, Runtime.PRECOMPILED_DXB.SET_PROPERTY, [this, key, value], this.origin)\n        }\n        if (this.update_endpoints.size) {\n            this.handleDatexUpdate(key, Runtime.PRECOMPILED_DXB.SET_PROPERTY, [this, key, value], this.update_endpoints)\n        }\n\n        // make sure the array index is a number\n        if (this.current_val instanceof Array) key = Number(key);\n\n\n        // inform listeners\n        // property changed\n        if (existed_before && Pointer.pointer_property_change_listeners.size) {\n            setTimeout(()=>{\n                for (const l of Pointer.pointer_property_change_listeners) l(this, key, value)\n            }, 0)\n        }\n        // property was added new\n        else if (!existed_before && Pointer.pointer_property_add_listeners.size) {\n            setTimeout(()=>{\n                for (const l of Pointer.pointer_property_add_listeners) l(this, key, value)\n            }, 0)\n        }\n\n        // inform observers\n        return this.callObservers(value, key, ReactiveValue.UPDATE_TYPE.SET, false, false, previous)\n    }\n\n\n    handleAdd(value:any) {\n        if(!this.current_val) return;\n\n        // convert value to datex conform value\n        value = this.type.proxify_children ? this.proxifyChild(undefined, value) : value;\n\n        const obj = this.current_val;\n\n        let index:number;\n\n        if (this.shadow_object instanceof Array) index = this.shadow_object.push(value); // Array push\n        // try set on custom pseudo class\n        else {\n            try {\n                this.type.handleActionAdd(obj, value, true);\n            } catch (e) {\n                 throw new ValueError(\"Cannot add values to this value\");\n            }\n        }\n        \n\n        // propagate updates via datex\n        if (this.send_updates_to_origin) {\n            this.handleDatexUpdate(null, '? += ?', [this, value], this.origin)\n        }\n        if (this.update_endpoints.size) {\n            this.handleDatexUpdate(null, '? += ?', [this, value], this.update_endpoints)\n        }\n        \n\n        // inform listeners\n        if (Pointer.pointer_property_add_listeners.size) {\n            setTimeout(()=>{\n                index = index ?? (<any[]>Runtime.serializeValue(this.current_val))?.indexOf(value) // array: use index, Set: first serialize to array and get index\n                for (const l of Pointer.pointer_property_add_listeners) l(this, index, value)\n            }, 0);\n        }\n\n\n        // inform observers\n        return this.callObservers(value, VOID, ReactiveValue.UPDATE_TYPE.ADD)\n\n    }\n\n    private streaming:[boolean?] = []; // use array because DatexPointer is sealed\n    startStreamOut() {\n        const obj = this.current_val;\n\n        // only if this.value is a DatexStream\n        if (!obj || !(obj instanceof Stream)) return;\n\n        this.streaming.push(true); // also stream for all future subscribers\n\n        // TODO: stream to multiple endpoints in single DXB block\n        // if (this.send_updates_to_origin) {\n        //     logger.info(\"streaming to parent \" + this.origin);\n        //     this.handleDatexUpdate(null, '? << ?'/*DatexRuntime.PRECOMPILED_DXB.STREAM*/, [this, obj], this.origin)\n        // }\n        // if (this.update_endpoints.size) {\n        //     logger.info(\"streaming to subscribers \" + this.update_endpoints);\n        //     this.handleDatexUpdate(null, '? << ?'/*DatexRuntime.PRECOMPILED_DXB.STREAM*/, [this, obj], this.update_endpoints)\n        // }\n\n        if (this.send_updates_to_origin) {\n            this.startStreamOutForEndpoint(this.origin);\n        }\n        for (const endpoint of this.update_endpoints) {\n            this.startStreamOutForEndpoint(endpoint);\n        }\n    }\n\n    #streamAbortControllers = new Map<Endpoint, AbortController>()\n\n    // TODO better way than streaming individually to every new subscriber?\n    startStreamOutForEndpoint(endpoint:Endpoint) {\n        const abortController = new AbortController();\n        this.#streamAbortControllers.set(endpoint, abortController);\n        logger.info(\"streaming to new subscriber \" + endpoint);\n        this.handleDatexUpdate(null, '? << ?', [this, this.current_val], endpoint, undefined, abortController.signal)\n    }\n    \n    stopStreamOutForEndpoint(endpoint: Endpoint) {\n        if (this.#streamAbortControllers.has(endpoint)) {\n            logger.info(\"stopping streaming to subscriber \" + endpoint);\n            this.#streamAbortControllers.get(endpoint)?.abort();\n            this.#streamAbortControllers.delete(endpoint);\n        }\n    }\n\n\n    /** all values are removed */\n    handleClear() {\n        if(!this.current_val) return;\n\n        let obj = this.current_val;\n\n        // get keys before clear (array indices as numbers, not integers)\n        const keys = this.getKeys(true);\n\n        const res = JSInterface.handleClearSilently(obj, this, this.type);\n        if (res == INVALID || res == NOT_EXISTING) {\n            if (this.shadow_object instanceof Array) Array.prototype.splice.call(this.shadow_object, 0, this.shadow_object.length); // Array clear\n            else throw new ValueError(\"Cannot perform clear operation on this value\");\n        }\n\n\n        // propagate updates via datex?\n        if (this.send_updates_to_origin) {\n            this.handleDatexUpdate(null, Runtime.PRECOMPILED_DXB.CLEAR_WILDCARD, [this], this.origin)\n        }\n        if (this.update_endpoints.size) {\n            this.handleDatexUpdate(null, Runtime.PRECOMPILED_DXB.CLEAR_WILDCARD, [this], this.update_endpoints)\n        }\n\n\n\n        // inform listeners\n        if (Pointer.pointer_property_delete_listeners.size) {\n            setTimeout(()=>{\n                for (const l of Pointer.pointer_property_delete_listeners) l(this, undefined)\n            }, 0)\n        }\n\n        // inform observers\n        this.callObservers(VOID, VOID, ReactiveValue.UPDATE_TYPE.CLEAR)\n    }\n\n    /** all values are removed */\n    handleSplice(start_index:number, deleteCount:number, replace:Array<unknown>) {\n        if(!this.current_val) return;\n\n        if (deleteCount == 0 && !replace.length) return; // nothing changes\n\n        const obj = this.current_val;\n\n        if (!(obj instanceof Array)) {\n            logger.error(\"Cannot handle splice for non-array value\");\n            return;\n        }\n        \n        const start = BigInt(start_index);\n        const end = BigInt(start_index+deleteCount);\n        let size = BigInt(deleteCount);\n        const replace_length = BigInt(replace.length);\n\n        // removed overflows array length\n        if (start+size > obj.length) size = BigInt(obj.length) - start;\n\n\n        const netDeleteCount = deleteCount - replace?.length;\n        const originalLength = obj.length;\n        // array splice\n        // trigger BEFORE_DELETE\n        for (let i = obj.length - netDeleteCount; i < obj.length; i++) {\n            this.callObservers(obj[i], i, ReactiveValue.UPDATE_TYPE.BEFORE_DELETE)\n        }\n\n        // previous entries\n        const previous = [...obj]\n\n        const ret = Array.prototype.splice.call(this.shadow_object, start_index, deleteCount, ...replace);\n\n        // default strategy: insert;\n        let dxScript = \"#0=?0;#0.(?4..?1) = void; #0.(?2..((count #0) + ?3)) = #0.(?4..(count #0));#0.(?4..?5) = ?6;\"\n        let dxParams = [this, end, start-size+replace_length, replace_length, start, start+replace_length, replace];\n\n        // only delete\n        if (!replace?.length) {\n            dxScript = \"#0 = ?0; #1 = count #0;#0.(?1..?2) = void;#0.(?1..#1) = #0.(?3..#1);\"\n            dxParams = [this, start, end, start+size];\n        }\n        // exact replace\n        else if (deleteCount == originalLength && start_index == 0) {\n            dxScript = \"#0=?0; #0 = ?1;\"\n            dxParams = [this, replace];\n        }\n\n        // propagate updates via datex?\n        if (this.send_updates_to_origin) {\n            this.handleDatexUpdate(null, dxScript, dxParams, this.origin)\n        }\n        if (this.update_endpoints.size) {\n            this.handleDatexUpdate(null, dxScript, dxParams, this.update_endpoints)\n        }\n\n        // inform observers TODO what to do here?\n        //for (let o of this.general_change_observers||[]) o(undefined); \n        \n        // inform listeners\n        if (Pointer.pointer_property_delete_listeners.size) {\n            setTimeout(()=>{\n                for (const l of Pointer.pointer_property_delete_listeners) l(this, undefined)\n            }, 0)\n        }\n\n        const atomicId = Symbol(\"ATOMIC_SPLICE\")\n\n        // inform observers after splice finished - value already in right position\n        for (let i = originalLength-1; i>=start_index; i--) {\n            // element moved here?\n            if (i < obj.length) {\n                this.callObservers(obj[i], i, ReactiveValue.UPDATE_TYPE.SET, undefined, undefined, previous[i], atomicId)\n            }\n            // end of array, trigger delete\n            else {\n                this.callObservers(VOID, i, ReactiveValue.UPDATE_TYPE.DELETE, undefined, undefined, previous[i], atomicId)\n            }\n        }\n       \n\n        return ret;\n    }\n\n    /** value is removed (by key)*/\n    handleDelete(key:any, arrayResize = false) {\n        if(!this.current_val) return;\n\n        const obj = this.current_val;\n\n        // does property exist in DATEX?\n        if (!this.type.isPropertyAllowed(key)) {\n            throw new ValueError(\"Property '\" + key + \"' does not exist\")\n        }\n\n        const previous = this.getProperty(key);\n        // inform observers before delete\n        this.callObservers(previous, key, ReactiveValue.UPDATE_TYPE.BEFORE_DELETE)\n\n        const res = JSInterface.handleDeletePropertySilently(obj, key, this, this.type);\n        if (res == INVALID || res == NOT_EXISTING) {\n            if (arrayResize && this.shadow_object instanceof Array && typeof key == \"number\") {\n                this.shadow_object.splice(key, 1);\n            }\n            else delete this.shadow_object[key]; // normal object\n        }\n\n        // propagate updates via datex\n        \n        if ((res == INVALID || res == NOT_EXISTING) && this.shadow_object instanceof Array) key = BigInt(key); // change to <Int> for DATEX if <Array>\n\n        if (this.send_updates_to_origin) {\n            this.handleDatexUpdate(null, '?.? = void', [this, key], this.origin)\n        }\n        if (this.update_endpoints.size) {\n            this.handleDatexUpdate(null, '?.? = void', [this, key], this.update_endpoints)\n        }\n        \n\n       \n        // inform listeners\n        if (Pointer.pointer_property_delete_listeners.size) {\n            setTimeout(()=>{\n                for (let l of Pointer.pointer_property_delete_listeners) l(this, key)\n            }, 0);\n        }\n        \n        // inform observers\n        return this.callObservers(VOID, key, ReactiveValue.UPDATE_TYPE.DELETE, undefined, undefined, previous)\n\n    }\n\n    /** value is removed */\n    handleRemove(value:any) {\n        if(!this.current_val) return;\n\n        let obj = this.current_val;\n\n        // inform observers before remove\n        this.callObservers(value, undefined, ReactiveValue.UPDATE_TYPE.BEFORE_REMOVE)\n\n        // try set on custom pseudo class\n        try {\n            this.type.handleActionSubtract(obj, value, true);\n        } catch (e) {\n            throw new ValueError(\"Cannot subtract values from this value\");\n        }\n        \n\n        // propagate updates via datex\n        if (this.send_updates_to_origin) {\n            this.handleDatexUpdate(null, '? -= ?', [this, value], this.origin)\n        }\n        if (this.update_endpoints.size) {\n            logger.debug(\"forwarding delete to subscribers \" + this.update_endpoints);\n            this.handleDatexUpdate(null, '? -= ?', [this, value], this.update_endpoints)\n        }\n\n\n        // inform listeners\n        if (Pointer.pointer_property_delete_listeners.size) {\n            setTimeout(()=>{\n                for (let l of Pointer.pointer_property_delete_listeners) l(this, value)\n            }, 0);\n        }\n\n        // inform observers\n        return this.callObservers(value, VOID, ReactiveValue.UPDATE_TYPE.REMOVE)\n\n    }\n\n    // actual update to subscribers/origin\n    // if identifier is set, further updates to the same identifier are overwritten\n    async handleDatexUpdate(identifier:string|null, datex:string|PrecompiledDXB, data:any[], receiver:endpoints, collapse_first_inserted = false, stream_abort_signal?: AbortSignal){\n        \n        // cannot send updates as @@local\n        if (Runtime.endpoint == LOCAL_ENDPOINT) {\n            logger.debug(\"Skipped DATEX update \" + this.idString() + \" (\" + identifier + \")\" + \" to \" + receiver + \", own endpoint is @@local\");\n            return;\n        }\n\n        // let schedulter handle updates (cannot throw errors)\n        if (this.#scheduler) {\n            this.#scheduler.addUpdate(this, identifier, datex, data, receiver, collapse_first_inserted);\n        }\n\n        // directly send update\n        else {\n            if (receiver instanceof Disjunction && !receiver.size) return;\n            try {\n                await Runtime.datexOut([datex, data, {collapse_first_inserted, type:ProtocolDataType.UPDATE, preemptive_pointer_init: true, stream_abort_signal}], receiver, undefined, false, undefined, undefined, false, this.datex_timeout);\n            } catch(e) {\n                //throw e;\n                console.error(\"forwarding failed\", e, datex, data)\n            }\n        }\n\n    }\n\n    // set new reference\n    protected initShadowObjectProperty(key:string, value:unknown){\n        if (!this.shadow_object) throw new Error(\"pointer has no shadow object\");\n\n        this.shadow_object[key] = value;\n\n        // add observer for internal changes\n        if (value instanceof ReactiveValue) {\n            this.initShadowObjectPropertyObserver(key, value);\n        }\n\n    }\n\n    #active_property_observers = new Map<string, [RefLike, observe_handler<unknown, RefLike<any>>]>();\n    #unique = {}\n\n    // set observer for internal changes in property value reference\n    protected initShadowObjectPropertyObserver(key:string, value:RefLike){\n        // console.log(\"set reference observer\" + this.idString(),key,value)\n\n        // remove previous observer for property\n        if (this.#active_property_observers.has(key)) {\n            const [value, handler] = this.#active_property_observers.get(key)!;\n            ReactiveValue.unobserve(value, handler, this.#unique); // xxxxxx\n        }\n\n        // new observer \n        // TODO: is weak pointer reference correct here?\n        const ref = new WeakRef(this);\n        const handler = (_value: unknown, _key?: unknown, _type?: ReactiveValue.UPDATE_TYPE, _is_transform?: boolean, _is_child_update?: boolean, previous?: any) => {\n            const self = ref.deref();\n            if (!self) return;\n            // console.warn(_value,_key,_type,_is_transform)\n            // inform observers (TODO: more update event info?, currently just acting as if it was a SET)\n            self.callObservers(_value, key, ReactiveValue.UPDATE_TYPE.SET, _is_transform, true, previous)\n        };\n\n        ReactiveValue.observeAndInit(value, handler, this.#unique);\n        this.#active_property_observers.set(key, [value, handler]);\n    }\n\n\n    // update value of property reference\n    protected updateShadowObjectProperty(key:string, value:unknown){\n        if (!this.shadow_object) throw new Error(\"pointer has no shadow object\");\n        // TODO: this currently only makes sense for primitive pointers in JS? in DATEX style, to update the property containing an object value, you should use x.$.z = {}, not x.z = {}. but might get confusing for now..\n        const reference = Pointer.pointerifyValue(this.shadow_object[key]);\n        if (reference instanceof Pointer && reference.is_js_primitive) reference.val = value; // update reference value (for primitive pointers at least)\n        else this.shadow_object[key] = value; // update normal\n    }\n\n\n    private change_observers: Map<any, Map<observe_handler, observe_options|undefined>> = new Map();\n    private bound_change_observers: Map<object, Map<any, Map<observe_handler, observe_options|undefined>>> = new Map();\n    private general_change_observers: Map<observe_handler, observe_options|undefined> = new Map(); // property_update is always true, undefined for other DatexValues / when the actual value is updated\n    private bound_general_change_observers: Map<object, Map<observe_handler, observe_options|undefined>> = new Map(); // property_update is always true, undefined for other DatexValues / when the actual value is updated\n\n    // observe pointer value change (primitive) of change of a key\n    public override observe<K=unknown>(handler:observe_handler<K, this>, bound_object?:object, key?:K, options?:observe_options):void {\n        if (!handler) throw new ValueError(\"Missing observer handler\")\n        \n        // TODO handle bound_object in pointer observers/unobserve\n        // observe all changes\n        if (key == undefined) {\n            super.observe(handler, bound_object, options); // default observer\n\n            if (bound_object) {\n                if (!this.bound_general_change_observers.has(bound_object)) this.bound_general_change_observers.set(bound_object, new Map());\n                this.bound_general_change_observers.get(bound_object)!.set(handler, options);\n            }\n            else this.general_change_observers.set(handler, options); // observer property updates\n        }\n        // observe specific property\n        else {\n            // make sure the array index is a number\n            if (this.current_val instanceof Array) {\n                if (!(typeof key == \"number\" || typeof key == \"bigint\" || typeof key == \"string\")) return;\n                key = <K><unknown>Number(key);\n            }\n     \n            if (bound_object) {\n                if (!this.bound_change_observers.has(bound_object)) {\n                    this.bound_change_observers.set(bound_object, new Map());\n                }\n                const bound_object_map = this.bound_change_observers.get(bound_object)!;\n                if (!bound_object_map.has(key)) bound_object_map.set(key, new Map());\n                bound_object_map.get(key)!.set(handler, options);\n            }\n            else {\n                if (!this.change_observers.has(key)) this.change_observers.set(key, new Map());\n                this.change_observers.get(key)!.set(handler, options);\n            }\n        }\n    }\n\n\n\n    public override unobserve<K=any>(handler:(value:any, key?:K, type?:ReactiveValue.UPDATE_TYPE)=>void, bound_object?:object, key?:K):void {\n        // unobserve all changes\n        if (key == undefined) {\n            super.unobserve(handler, bound_object); // default observer\n\n            if (bound_object) {\n                this.bound_general_change_observers.get(bound_object)?.delete(handler);\n                if (this.bound_general_change_observers.get(bound_object)?.size === 0) this.bound_general_change_observers!.delete(bound_object)\n            }\n            else this.general_change_observers.delete(handler); // observer property updates\n        }\n\n        // unobserve observer for specific property\n        else {\n            if (bound_object) {\n                this.bound_change_observers.get(bound_object)?.get(key)?.delete(handler);\n                if (this.bound_change_observers.get(bound_object)?.size == 0) this.bound_change_observers.delete(bound_object);\n                else if (this.bound_change_observers.get(bound_object)?.get(key)?.size === 0) this.bound_change_observers.get(bound_object)!.delete(key);\n            }\n            else this.change_observers.get(key)?.delete(handler);\n        }\n    }\n\n\n    private callObservers(value:any, key:any, type:ReactiveValue.UPDATE_TYPE, is_transform = false, is_child_update = false, previous?: any, atomic_id?: symbol) {\n        // disable unintentional capturing of dependencies for smart transforms that are triggered by getters inside observer callbacks\n        \n        // @ReactiveValue.disableCapturing\n        ReactiveValue.freezeCapturing = true;\n        const res = this._callObservers(value, key, type, is_transform, is_child_update, previous, atomic_id);\n        ReactiveValue.freezeCapturing = false;\n        return res;\n    }\n\n    private _callObservers(value:any, key:any, type:ReactiveValue.UPDATE_TYPE, is_transform = false, is_child_update = false, previous?: any, atomic_id?: symbol) {\n        const promises = [];\n        // key specific observers\n        if (key!=undefined) {\n            for (const [o, options] of this.change_observers.get(key)||[]) {\n                if ((!options?.types || options.types.includes(type)) && !(is_transform && options?.ignore_transforms) && (!is_child_update || !options || options.recursive)) {\n                    promises.push(o(value, key, type, is_transform, is_child_update, previous, atomic_id)); \n                }\n            }\n            // bound observers\n            for (const [object, entries] of this.bound_change_observers.entries()) {\n                for (const [k, handlers] of entries) {\n                    if (k === key) {\n                        for (const [handler, options] of handlers) {\n                            if ((!options?.types || options.types.includes(type)) && !(is_transform && options?.ignore_transforms) && (!is_child_update || !options || options.recursive)) {\n                                const res = handler.call(object, value, key, type, is_transform, is_child_update, previous, atomic_id);\n                                promises.push(res)\n                                if (res === false) this.unobserve(handler, object, key);\n                            }\n                        }\n                    }\n                }\n            }\n        } \n        // general observers\n        for (const [o, options] of this.general_change_observers||[]) {\n            if ((!options?.types || options.types.includes(type)) && !(is_transform && options?.ignore_transforms) && (!is_child_update || !options || options.recursive)) promises.push(o(value, key, type, is_transform, is_child_update, previous, atomic_id));\n        }    \n        // bound generalobservers\n        for (const [object, handlers] of this.bound_general_change_observers||[]) {\n            for (const [handler, options] of handlers) {\n                if ((!options?.types || options.types.includes(type)) && !(is_transform && options?.ignore_transforms) && (!is_child_update || !options || options.recursive)) {\n                    const res = handler.call(object, value, key, type, is_transform, is_child_update, previous, atomic_id)\n                    promises.push(res)\n                    if (res === false) this.unobserve(handler, object, key);\n                }\n            }\n        }\n\n        return Promise.allSettled(promises);\n    }\n\n\n    idString(){\n        return `$${this.id}`\n    }\n\n}\n\n\nexport namespace ReactiveValue {\n    export enum UPDATE_TYPE {\n        INIT, // set (initial) reference\n        UPDATE, // update value\n        SET, // set property\n        DELETE, // delete property\n        CLEAR, // clear\n        ADD, // add child\n        REMOVE, // remove child\n        BEFORE_DELETE,\n        BEFORE_REMOVE\n    }\n}\n\n\n\n/** proxy function (for remote calls) */\n\nexport function getProxyFunction(method_name:string, params:{filter:target_clause, dynamic_filter?: target_clause, sign?:boolean, scope_name?:string, timeout?:number}):(...args:any[])=>Promise<any> {\n    return function(...args:any[]) {\n        const filter = params.dynamic_filter ? new Conjunction(params.filter, params.dynamic_filter) : params.filter;\n\n        const params_proto = Object.getPrototypeOf(params);\n        if (params_proto!==Object.prototype) params_proto.dynamic_filter = undefined; // reset, no longer needed for call\n\n        const compile_info:compile_info = [`#public.${params.scope_name}.${method_name} ?`, [new Tuple(args)], {to:filter, sign:params.sign}];\n        return Runtime.datexOut(compile_info, filter, undefined, true, undefined, undefined, false, params.timeout);\n    }\n}\n\n\nexport function getProxyStaticValue(name:string, params:{filter?:target_clause, dynamic_filter?: target_clause, sign?:boolean, scope_name?:string, timeout?:number}):(...args:any[])=>Promise<any> {\n    return function() {\n        const filter = params.dynamic_filter ? new Conjunction(params.filter, params.dynamic_filter) : params.filter;\n\n        const params_proto = Object.getPrototypeOf(params);\n        if (params_proto!==Object.prototype) params_proto.dynamic_filter = undefined; // reset, no longer needed for call\n\n        const compile_info:compile_info = [`#public.${params.scope_name}.${name}`, [], {to:filter, sign:params.sign}];\n        return Runtime.datexOut(compile_info, filter, undefined, true, undefined, undefined, false, params.timeout);\n    }\n}\n\n\n// @ts-ignore devconsole\nglobalThis.snapshot = ()=>{\n    let x = \"\";\n    for (const ptr of Pointer.getAllPointers()) {\n        x += ptr.idString() + \" := \";\n        try {\n            x += Runtime.valueToDatexString(ptr,false,true);\n        } catch (e) {\n            x += \"?? \" + e.message\n        }\n        x +=  \";\\n\";\n    }\n    console.log(x)\n}"],"names":["ReactiveValue","UPDATE_TYPE","Endpoint","Target","LOCAL_ENDPOINT","BROADCAST","NetworkError","PermissionError","PointerError","RuntimeError","ValueError","Compiler","PrecompiledDXB","DX_NOT_TRANSFERABLE","DX_PTR","DX_REACTIVE_METHODS","DX_VALUE","INVALID","NOT_EXISTING","SET_PROXY","SHADOW_OBJECT","VOID","Runtime","UnresolvedValue","DEFAULT_HIDDEN_OBJECT_PROPERTIES","logger","TypedArray","Type","BinaryCode","JSInterface","Stream","Tuple","Function","DatexFunction","Quantity","buffer2hex","hex2buffer","Conjunction","Disjunction","Logical","ProtocolDataType","Scope","Time","displayFatalError","JSTransferableFunction","sha256","IterableWeakSet","IterableWeakMap","LazyPointer","ReactiveArrayMethods","Assertion","Storage","client_type","BACKEND_EXPORT","arrayProtoNames","Object","getOwnPropertyNames","Array","prototype","objectProtoNames","Symbol","hasInstance","EventTarget","constructor","value","undefined","collapseValue","val","handleBeforeNonReferencableGet","previous","triggerValueInitEvent","current_val","setVal","trigger_observers","is_transform","promises","o","options","types","includes","INIT","ignore_transforms","push","object","observers","call","Promise","allSettled","$","handle$","$$","force_pointer_properties","setter","transform_functions","handler","pointer","PointerProperty","Pointer","getByValue","Error","ownKeys","Reflect","getOwnPropertyDescriptor","_target","p","type","ofValue","interface_config","get_reactive_methods_object","get","_","key","iterator","keys","Map","reactiveMethods","getKeys","toString","pointerifyValue","shadow_object","apply","thisRef","args","thisVal","createTransform","set","handleSetReference","Proxy","js_value","observe","bound_object","observeAndInit","unobserve","has","updateObserverCount","handler_or_bound_object","wasRemoved","globalThis","delete","size","toJSON","valueOf","collapse_indirect_references","collapse_primitive_pointers","is_js_primitive","indirectReference","isStaticTransform","staticTransformValue","current_type","unwrap_transform","isRef","pointer_value_map","mirror","from","to","v","k","capturedGetters","Set","capturedGettersWithKeys","setAutoDefault","isCapturing","freezeCapturing","captureGetters","getCapturedGetters","captured","disableCapturing","callback","res","previousGetters","previousGettersWithKeys","previousCapturing","update","add","getAuto","warn","_staticTransformValue","transformSource","_liveTransform","setTransformSource","deleteTransformSource","disableLiveTransforms","enableLiveTransforms","forceSetObserverCount","count","triggerUpdate","enableLive","disableLive","setForcedLiveTransform","forced","Value","_strongRef","lazy_pointer","leak_js_properties","WeakMap","setPointer","onLoad","ptr","synced_pairs","WeakRef","parent","createOrGetLazy","pointerProperty","weakRef","deref","getIfExists","template","Node","prop","getProperty","console","log","handleSet","value_pointer","internal_handler","getAllowedPropertyType","std","Any","UpdateScheduler","updates_per_receiver","update_interval","active","datex_timeout","start","setUpdateInterval","setInterval","trigger","clearUpdateInterval","clearInterval","stop","remove","receiver","map","data","datex","pdxb_array","is_datex_strings","_ptr","entries","entry_datex","entry_data","values","clear","length","combine","datexOut","end_of_scope","UPDATE","preemptive_pointer_init","then","catch","e","error","intermediate_updates_pointers","addPointer","intermediate_updates","setScheduler","removePointer","deleteScheduler","addUpdate","identifier","collapse_first_inserted","ptr_map","triggerAll","scheduler","observableArrayMethods","dispose","pointer_add_listeners","pointer_remove_listeners","pointer_property_add_listeners","pointer_property_change_listeners","pointer_property_delete_listeners","pointer_value_change_listeners","pointer_for_value_created_listeners","pointer_for_id_created_listeners","onPointerAdded","listener","onPointerRemoved","onPointerPropertyAdded","onPointerPropertyChanged","onPointerPropertyDeleted","onPointerValueChanged","onPointerForIdAdded","id","value_initialized","onPointerForValueCreated","trigger_if_exists","unsubscribeFromAllPointers","getAllPointers","is_anonymous","is_origin","unsubscribeFromPointerUpdates","pointers","primitive_pointers","pointer_label_map","iterateAllPointers","r","MAX_POINTER_ID_SIZE","STATIC_POINTER_SIZE","last_c","last_t","time_shift","POINTER_TYPE","ENDPOINT","ENDPOINT_PERSONAL","PERSON_ALIAS","ENDPOINT_INSTITUTION","INSTITUTION_ALIAS","IPV6_ID","STATIC","BLOCKCHAIN_PTR","PUBLIC","pointer_prefix","endpoint","getPointerPrefix","is_local","local","origin","getUniquePointerID","createdInContext","fetched","forPointer","Uint8Array","id_view","DataView","buffer","timestamp","Math","round","Date","getTime","BIG_BANG_TIME","setUint32","setUint8","getStaticPointerId","unique_id","getStaticPointerPrefix","ANONYMOUS_ID","isReference","getByLabel","label","formatVariableName","labelExists","getId","normalizePointerId","registerPointerSource","source","priority","sorted","sort","a","b","forEach","s","loading_pointers","load","SCOPE","only_load_local","sender_knows_pointer","allow_failure","lockedPointerPromise","existing_pointer","assertEndpointCanRead","sender","id_string","exec_conditions","onlyLocalPointers","getOriginFromPointerId","scopeList","promise","loadPromise","handleLoad","addLoadingPointerPromise","loadedPromise","scope","WeakSet","create","stored","getPointer","transform_scope","handleTransformAsync","internal_vars","setValue","syncPointer","startsWith","subscribeForPointerUpdates","main_node","equals","debug","idString","sync","unsubscribe","proxifyValue","sealed","allowed_access","anonymous","persistant","check_proxify_as_child","collapsed_value","proxify_as_child","is_primitive","createOrGet","is_placeholder","unPlaceholder","observe_values","transform","persistent_datex_transform","force_transform","handleTransform","force_local_transform","isTransform","createSmartTransform","forceLive","ignoreReturnValue","initial","smartTransform","createTransformAsync","timeout","serializeValue","valueToDatexString","has_$","replace","onGargabeCollection","addEventListener","garbage_registry","FinalizationRegistry","mockPtr","handleGarbageCollected","cleanup","subscribed","arraySplice","deleteCount","items","handleClear","handleSplice","arraySort","compareFn","sortedValues","toSorted","match","every","x","initOrigin","subscribers","force_update","pointer_type","id_buffer","SyntaxError","slice","original_value","labels","disposable","l","bindDisposable","DISPOSABLES","isStored","garbage_collectable","garbage_collected","is_persistent","updateGarbageCollection","waiting_for_always_promise","is_js_pseudo_primitive","js","NativeObject","Element","main","OPTIONS","PROTECT_POINTERS","matches","trustedEndpoints","grantAccessTo","_force","grantPublicAccess","revokeAccessFor","allowed_access_list","getOriginalPropertyRef","propName","assert","assertion","validateTypeAssertions","transferOwnership","new_owner","recursive","old_id","info","scheduleder","addLabel","transformAsync","override_endpoint","get_value","keep_pointer_origin","pointer_value","finalizeSubscribe","MediaStream","WebRTCInterface","getMediaStream","observeOriginOnline","ptrId","online","foundFallback","trustedEndpoint","permissions","pointerId","forcePlaceholderMove","ArrayBuffer","existingPtr","updateValue","initializeValue","entry","change_observers","bound_change_observers","handlers","keyFor","getInitialTransformValue","existingPointer","supportsIndirectRefs","alreadyProxy","defineProperty","enumerable","writable","configurable","visible_children","addObjProxy","add$Properties","proxify_children","proxifyChildren","seal","afterFirstValueSet","matchesType","updatePromise","newType","is","i","allow_transform_value","customTransformUpdate","send_updates_to_origin","handleDatexUpdate","update_endpoints","providePointer","getPointerSubscriberCache","cache","subscriber","addSubscriber","setTimeout","freeze","transformMap","smart_transform_method","method","transformMethod","execute","initialValue","setDatexTransform","newValue","void","wrap_transform","handle_transform","WEAK_EFFECT_DISPOSED","state","isLive","isFirst","executingEffect","deps","keyedDeps","returnCache","getDepsHash","valueToDatexStringExperimental","join","hash","resolvedVal","handleTransformValue","blocked","requestingUpdate","originalUpdate","safeUpdate","blockLoop","innerTransformPointer","doUpdate","dep","hasGetters","gettersCount","allowStatic","getter","capturedKeys","storedKeys","datex_transform","executeDatexLocally","unregister","mockPointer","register","GARBAGE_COLLECTION_TIMEOUT","allowAnyType","any_type","extended_pointers","extend","otherPointer","update_back","property","extendProperty","changing1","changing2","sealed_properties","anonymous_properties","canReadProperty","property_name","canUpdateProperty","requestSubscriberCache","streaming","startStreamOutForEndpoint","removeSubscriber","stopStreamOutForEndpoint","enablePeriodicSubscriberCleanup","interval","cleanupEndpoints","disablePeriodicSubscriberCleanup","isOnline","clearEndpointSubscriptions","clearEndpointPermissions","clearEndpointScopes","removeCount","excludeEndpointFromUpdates","enableUpdatesForAll","array_indices_as_numbers","handleKeys","BigInt","proxifyChild","name","child","createFromJSFunction","is_normal_object","objProxifyChildren","specialProxifyChildren","action_add","action_subtract","set_property_silently","high_priority_keys","templatePropType","initShadowObjectPropertyObserver","children_timeouts","initShadowObjectProperty","getPrototypeOf","setPropertyGetter","setPropertySetter","obj","createProxy","URL","Blob","HTMLImageElement","Text","prototype1","prototype2","isSealed","childrenWithGetters","property_descriptor","descriptor","bind","is_array","isArray","proxy","handleBeforeNonReferenceableGetArray","handleBeforeNonReferencableGetObject","propertyDesc","target","val_name","handleDelete","test","String","Number","runtime_actions","trimArray","deleteProperty","hasOwn","property_value","handleGetProperty","ignore_if_unchanged","isPropertyAllowed","root_type","integer","assertPropertyValueAllowed","always_use_provided_value","existed_before","current_value","handleSetPropertySilently","updateShadowObjectProperty","handleSetObservers","PRECOMPILED_DXB","SET_PROPERTY","callObservers","SET","handleAdd","index","handleActionAdd","indexOf","ADD","startStreamOut","abortController","AbortController","signal","abort","handleClearSilently","splice","CLEAR_WILDCARD","CLEAR","start_index","end","replace_length","netDeleteCount","originalLength","BEFORE_DELETE","ret","dxScript","dxParams","atomicId","DELETE","arrayResize","handleDeletePropertySilently","handleRemove","BEFORE_REMOVE","handleActionSubtract","REMOVE","stream_abort_signal","ref","_value","_key","_type","_is_transform","_is_child_update","self","reference","general_change_observers","bound_general_change_observers","bound_object_map","is_child_update","atomic_id","_callObservers","getProxyFunction","method_name","params","filter","dynamic_filter","params_proto","compile_info","scope_name","sign","getProxyStaticValue","snapshot","message"],"mappings":"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","sourceRoot":"/core-lib/datex-core-js-legacy/runtime/","file":"pointers.ts"}