{"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    // required for reactive indexing logic (JUSIX)\n    #__ref__!: never\n    __ref__!: symbol\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        return this.triggerValueEvent(ReactiveValue.UPDATE_TYPE.INIT, is_transform, previous);\n    }\n    protected triggerValueEvent(event: ReactiveValue.UPDATE_TYPE, 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(event)) && !(is_transform && options?.ignore_transforms)) promises.push(o(value, VOID, event, 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(event)) && !(is_transform && options?.ignore_transforms)) promises.push(o.call(object, value, VOID, event, 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 && !(this as unknown as Pointer).strongBoundPointerProperties?.has(key)) {\n                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:Set<ReactiveValue>[] = [];\n    protected static capturedGettersWithKeys:AutoMap<Pointer<any>, Set<any>>[] = [];\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.push(new Set());\n        this.capturedGettersWithKeys.push(new Map().setAutoDefault(Set));\n    }\n\n    /**\n     * pops the last captured getters and returns them\n     */\n    protected static getCapturedGetters() {\n        this.isCapturing = false;\n        return {capturedGetters: this.capturedGetters.pop(), capturedGettersWithKeys: this.capturedGettersWithKeys.pop()};\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        try {\n            const res = callback();\n            return res;\n        }\n        finally {\n            this.freezeCapturing = false;\n        }\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 previousCapturing = ReactiveValue.isCapturing;\n\n        // trigger transform update if not live\n        if (this.#transformSource && !this.#liveTransform && !this.#forceLiveTransform) {\n            this.#transformSource.update();\n        }\n\n        // add self to current capturedGetters\n        if (previousCapturing) {\n            if (key === NOT_EXISTING) ReactiveValue.capturedGetters[ReactiveValue.capturedGetters.length-1].add(this);\n            else if (this instanceof Pointer) ReactiveValue.capturedGettersWithKeys[ReactiveValue.capturedGettersWithKeys.length-1].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        if (!transformSource.initLazy) return transformSource.update();\n    }\n    \n    protected deleteTransformSource() {\n        this.#transformSource = undefined;\n    }\n\n    protected handleLazyTransformInit() {\n        if (this.#transformSource?.initLazy) {\n            this.#transformSource.initLazy = false;\n            this.#transformSource.update();\n        }\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    initLazy?: boolean // if true, don't immediately initialize the pointer - instead wait for the first access\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    /**\n     * returns true if the property cannot directly observed,\n     * e.g. because it is an internal JS property like Array.length which only\n     * gets updated when the array is modified\n     */\n    private isIndirectReactiveProperty() {\n        if (this.pointer?.val instanceof Array && this.key == \"length\") return true;\n        else if (this.pointer?.val instanceof Map && this.key == \"size\") return true;\n        else if (this.pointer?.val instanceof Set && this.key == \"size\") return true;\n        else return false;\n    }\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       \n        const key = this.isIndirectReactiveProperty() ? undefined : this.key;\n        // if indirect property, observe the whole parent for any changes\n        this.pointer!.observe(internal_handler, bound_object, 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]: V extends primitive ? CollapsedRef<V> : 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): V extends primitive ? CollapsedRef<V> :  RefLike<V>\n        }\n\n         // normal object\n        : {[K in keyof T]: T[K] extends primitive ? CollapsedRef<T[K]> : 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 CollapsedRef<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\nexport type Ref<T, _C = CollapsedValue<T>> =\n    _C&{} extends symbol ? symbol : (\n        PointerWithPrimitive<_C>\n    )\n\n/**\n * global type definitions\n */\ntype _Ref<T> = Ref<T>\ndeclare global {\n    type Ref<T> = _Ref<T>\n}\n\n/**\n * @deprecated use Ref\n */\nexport type MinimalJSRef<T, _C = CollapsedValue<T>> = CollapsedRef<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    initLazy?: boolean, // if true, don't immediately initialize the pointer - instead wait for the first access\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    // when _collapseStatic is enabled, values are first collapsed and then re-assigned to a pointer wrapper\n    _rebindStaticToPointers?: 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    #autoGetterProperties: Set<string> = new Set();\n\n    /**\n     * A list of all object properties of the pointer that are created from @property get xy() {} and are automatically wrapped in an always transform\n     */\n    get autoGetterProperties() {\n        return this.#autoGetterProperties\n    }\n\n    #strongBoundPointerProperties: Set<string> = new Set();\n\n    /**\n     * A list of all object properties that are strongly bound to a specific pointer, meaning that .$$ and .$ both return\n     * the pointer and never a PointerProperty\n     */\n    get strongBoundPointerProperties() {\n        return this.#strongBoundPointerProperties\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        const ptr = Pointer.create(undefined, options?.initial??NOT_EXISTING).smartTransform(transform, persistent_datex_transform, forceLive, ignoreReturnValue, options);\n        ptr.blockExternalUpdates();\n        return ptr;\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\n    #waiting_for_initial_async_transform?: Promise<unknown>;\n    get waiting_for_initial_async_transform() {return this.#waiting_for_initial_async_transform}\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        this.handleLazyTransformInit();\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        return this.triggerValueEvent(ReactiveValue.UPDATE_TYPE.INIT, is_transform, previous)\n    }\n    override triggerValueEvent(event: ReactiveValue.UPDATE_TYPE, 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(event))) o(value, key, event); \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(event))) {\n                        const res = handler.call(object, value, key, event);\n                        if (res === false) this.unobserve(handler, object, key);\n                    }\n                }\n            }\n        }\n\n        return super.triggerValueEvent(event, 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 of 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\n                        let resolveInitialAsyncTransform: (() => void) | undefined;\n\n                        // handle waiting_for_initial_async_transform if not yet initialized\n                        if (!this.#loaded) {\n                            const {promise, resolve} = Promise.withResolvers<void>();\n                            resolveInitialAsyncTransform = resolve;\n                            this.#waiting_for_initial_async_transform = promise;\n                        }\n\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                        const alreadyWaiting = !!this.#waiting_for_always_promise;\n                        // update promise result to most recent val\n                        this.#waiting_for_always_promise = val; \n\n                        // return if already waiting for a promise\n                        if (alreadyWaiting) return;\n\n                        // wait until val promise resolves\n                        val\n                            .then(async ()=>{\n                                const resolvedVal = await this.#waiting_for_always_promise;\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                            .finally(() => {\n                                resolveInitialAsyncTransform?.();\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 triggered 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            initLazy: options?.initLazy\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                        // TODO: (NOTE) this was disabled because in some scenarios, dependencies were unobserved\n                        // although they were still needed for reactive updates.\n                        // This is not the most efficient solution, but it should work for now.\n                        // Potential source for memory leaks.\n\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)) {\n                let weakRef;\n                try {\n                    weakRef = new WeakRef(<any>super.val);\n                }\n                catch {\n                    logger.debug(\"Cannot assign a primitive value (\" + super.val + \") to a pointer that was previously an object\");\n                    return;\n                }\n                super.setVal(<any>weakRef, false);\n            }\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                        console.warn(\"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    #blockExternalUpdates = 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    blockExternalUpdates() {\n        this.#blockExternalUpdates = true;\n    }\n\n    get externalUpdatesBlocked() {\n        return this.#blockExternalUpdates;\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        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            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                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 - always proxify\n            \n            // already proxified child - set observers\n            if (value[name] instanceof ReactiveValue) {\n                this.initShadowObjectPropertyObserver(name, value[name]);\n            }\n            else 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            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 observe 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 nodes (except for UIX Components)\n        if (globalThis.Node && obj instanceof Node && (Object.getPrototypeOf(obj.constructor)?.name !== \"Component\")) {\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                // custom get/set if value is already a pointer\n                if (obj[name] instanceof ReactiveValue) {\n                    const ptr = obj[name];\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                            ptr.val = val\n                        },\n                        get: () => { \n                            this.handleBeforeNonReferencableGet(name);\n                            return ptr.val;\n                        }\n                    });\n                    this.#strongBoundPointerProperties.add(name)\n                }\n                // new getter + setter\n                else {\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), undefined, undefined, undefined, {initLazy: true});\n                transformRef.allowAnyType(true);\n                Object.defineProperty(shadow_object, name, {value:transformRef})\n            }\n\n            this.#autoGetterProperties = new Set(childrenWithGetters.keys());\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                            this.handleSplice(val, 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 if (key === Symbol.iterator) 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 && (typeof this.current_val == \"object\" || typeof this.current_val == \"function\") && 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 && (typeof this.shadow_object == \"object\" || typeof this.shadow_object == \"function\") && 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 - 1; i >= obj.length - netDeleteCount; 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        // inform observers after splice finished - value already in right position\n        for (let i = Math.max(originalLength, obj.length)-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    #scheduledWhenObserving = new Set<(...args:unknown[])=>unknown>();\n\n    /**\n     * schedule a task to only be called once a observer is added to this pointer\n     * can be used to setup observers for pointer properties that are only needed when observing\n     */\n    protected scheduleWhenObserving(callback: (...args:unknown[])=>unknown) {\n        this.#scheduledWhenObserving.add(callback);\n    }\n\n    protected callScheduledWhenObserving() {\n        for (const callback of this.#scheduledWhenObserving) {\n            callback();\n        }\n        this.#scheduledWhenObserving.clear();\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        this.scheduleWhenObserving(()=>{\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\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        this.callScheduledWhenObserving();\n\n        // make sure the ptr is not garbage collected\n        this.is_persistent = true;\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    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        try {\n            const res = this._callObservers(value, key, type, is_transform, is_child_update, previous, atomic_id);\n            return res;\n        }\n        finally {\n            ReactiveValue.freezeCapturing = false;\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        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","__ref__","constructor","value","undefined","collapseValue","val","handleBeforeNonReferencableGet","previous","triggerValueInitEvent","current_val","setVal","trigger_observers","is_transform","triggerValueEvent","INIT","event","promises","o","options","types","includes","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","strongBoundPointerProperties","has","getKeys","toString","pointerifyValue","shadow_object","apply","thisRef","args","thisVal","createTransform","set","handleSetReference","Proxy","js_value","observe","bound_object","observeAndInit","unobserve","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","capturedGettersWithKeys","isCapturing","freezeCapturing","captureGetters","Set","setAutoDefault","getCapturedGetters","pop","disableCapturing","callback","previousCapturing","update","length","add","getAuto","warn","_staticTransformValue","transformSource","_liveTransform","setTransformSource","initLazy","deleteTransformSource","handleLazyTransformInit","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","isIndirectReactiveProperty","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","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","autoGetterProperties","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","blockExternalUpdates","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_initial_async_transform","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","res","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","resolveInitialAsyncTransform","resolve","withResolvers","alreadyWaiting","resolvedVal","handleTransformValue","finally","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","externalUpdatesBlocked","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","prototype1","prototype2","isSealed","childrenWithGetters","property_descriptor","descriptor","transformRef","bind","is_array","isArray","proxy","handleBeforeNonReferenceableGetArray","handleBeforeNonReferencableGetObject","propertyDesc","target","val_name","test","String","Number","runtime_actions","trimArray","deleteProperty","handleDelete","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","max","DELETE","arrayResize","handleDeletePropertySilently","handleRemove","BEFORE_REMOVE","handleActionSubtract","REMOVE","stream_abort_signal","scheduleWhenObserving","callScheduledWhenObserving","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":"/lib/datex-core-js-legacy-0.3.15/runtime/","file":"pointers.ts"}