realizeObjectDataInfo()

in remote/data-info-manager.js [364:439]


    realizeObjectDataInfo(dataInfo) {
        const weakRef = this.remoteRefs[dataInfo.id];

        if (weakRef && !weakRef.isDead()) {
            return weakRef.ref();
        }

        /** @type {object} */
        const base = Object.create(null);

        /** @type {string} */
        const refId = dataInfo.id;

        /** @type {ProxyHandler.<object>} */
        const handlers = {
            /**
             * @param {*} target
             * @param {string | number | symbol} property
             * @param {object} receiver 
             * @returns {Promise<*> | *}
             */
            get: (target, property, receiver) => {
                const baseValue = target[property];

                if (baseValue || typeof property === "symbol") {
                    return baseValue;
                }

                return this.proxy.getPropertyAsync(refId, property);
            },

            /**
             * @param {*} target
             * @param {string | number | symbol} property
             * @param {*} value
             * @param {object} receiver 
             * @returns {boolean}
             */
            set: (target, property, value, receiver) => {
                if (typeof property === "symbol") {
                    target[property] = value;
                    return true;
                }

                if (property in target) {
                    return false;
                }

                this.proxy.setPropertyAsync(refId, property, value);
                return true;
            },

            /**
             * @param {*} target
             * @param {string | number | symbol} prop
             * @return {Boolean}
             */
            has: (target, prop) => true
        };

        const objProxy = new Proxy(base, handlers);

        if (dataInfo.memberInfos) {
            for (const propertyName of Object.getOwnPropertyNames(dataInfo.memberInfos)) {
                Object.defineProperty(base, propertyName, {
                    enumerable: false,
                    configurable: false,
                    writable: false,
                    value: this.realizeDataInfo(dataInfo.memberInfos[propertyName])
                });
            }
        }

        this.dataInfoMap.set(objProxy, dataInfo);
        return this.registerRealizedObject(objProxy);
    }