UNPKG

rhine-var

Version:

Variables that support multi-user collaboration and persistence, making collaboration and variable operations as simple as possible, with strict and well-defined type hints.

147 lines (146 loc) 6.44 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.rhineProxy = rhineProxy; exports.rhineProxyGeneral = rhineProxyGeneral; const index_1 = require("../../index"); const connector_abstract_1 = __importDefault(require("../connector/connector.abstract")); const rhine_var_base_class_1 = require("../var/rhine-var-base.class"); const logger_1 = require("../../utils/logger"); const native_utils_1 = require("../utils/native.utils"); const create_connector_1 = require("../connector/create-connector"); const create_rhine_var_1 = require("./create-rhine-var"); const var_utils_1 = require("../utils/var.utils"); const support_manager_1 = __importDefault(require("../var/support/support-manager")); const rhine_var_text_class_1 = __importDefault(require("../var/items/rhine-var-text.class")); // For create root RhineVar object function rhineProxy(defaultValue, connector, options = {}) { if (!connector) { return rhineProxyGeneral(defaultValue); } // Create local temp YDoc and YMap let target = (0, var_utils_1.ensureNative)(defaultValue); const tempMap = new index_1.YDoc().getMap(); tempMap.set(connector_abstract_1.default.STATE_KEY, target); // Create core proxied rhine-var object const object = rhineProxyGeneral(target); // Create connector by string, number or direct if (typeof connector === 'string' || typeof connector === 'number') { connector = (0, create_connector_1.createConnector)(connector); } connector = connector; const root = object; root._options = options; root._connector = connector; // Bind connector connector.subscribeSynced((synced) => { if (options.overwrite) { connector.setState(object.native.clone()); } if (!connector.hasState()) { connector.setState(object.native.clone()); } object._initialize(connector.getState()); }); return object; } function rhineProxyGeneral(data, parent = null) { let target = (0, var_utils_1.ensureNative)(data); const object = (0, create_rhine_var_1.createRhineVar)(target, parent); if (object.native instanceof index_1.YText) { Reflect.set(object, 'value', object.native.toString()); } else if (object.native instanceof index_1.YMap || object.native instanceof index_1.YArray) { object.native.forEach((value, keyString) => { let key = keyString; if ((0, native_utils_1.isNative)(value)) { Reflect.set(object, key, rhineProxyGeneral(value, object)); } else { Reflect.set(object, key, value); } }); } const proxyGetOwnPropertyDescriptor = (proxy, p) => { // log('Proxy.handler.getOwnPropertyDescriptor:', p, ' ', object) if (p === Symbol.iterator) { return { value: function* () { if (object.native instanceof index_1.YMap) { for (const key of object.native.keys()) { yield Reflect.get(object, key); } } else if (object.native instanceof index_1.YArray) { for (let i = 0; i < object.native.length; i++) { yield Reflect.get(object, String(i)); } } }, enumerable: false, configurable: true, }; } const result = Reflect.getOwnPropertyDescriptor(object, p); }; const handler = { get(proxy, p, receiver) { if (rhine_var_base_class_1.RHINE_VAR_PREDEFINED_PROPERTIES.has(p)) return Reflect.get(object, p, receiver); const supportProperty = support_manager_1.default.convertProperty(p, object); if (supportProperty !== undefined) return supportProperty; (0, logger_1.log)('Proxy.handler.get:', p, ' ', object, receiver); if (p in object) return Reflect.get(object, p, receiver); const descriptor = proxyGetOwnPropertyDescriptor(proxy, p); if (descriptor !== undefined) return descriptor.value; return undefined; }, set(proxy, p, value, receiver) { if (rhine_var_base_class_1.RHINE_VAR_PREDEFINED_PROPERTIES.has(p)) return Reflect.set(object, p, value, receiver); (0, logger_1.log)('Proxy.handler.set:', p, 'to', value, ' ', object, receiver); if (object.native instanceof index_1.YText && object instanceof rhine_var_text_class_1.default && p === 'value') { if (typeof value !== 'string') { (0, logger_1.error)('Value for YText must be a string'); return false; } const doc = object.native.doc; if (doc) { doc.transact(() => { const native = object.native; native.delete(0, native.length); native.insert(0, value); }); return true; } else { (0, logger_1.error)('Document is not available'); return false; } } value = (0, var_utils_1.ensureRhineVar)(value, object); return (0, native_utils_1.nativeSet)(object.native, p, value); }, deleteProperty(proxy, p) { if (rhine_var_base_class_1.RHINE_VAR_PREDEFINED_PROPERTIES.has(p)) return false; (0, logger_1.log)('Proxy.handler.deleteProperty:', p); return (0, native_utils_1.nativeDelete)(object.native, p); }, has(proxy, p) { if (rhine_var_base_class_1.RHINE_VAR_PREDEFINED_PROPERTIES.has(p)) return false; return (0, native_utils_1.nativeHas)(object.native, p); }, ownKeys(proxy) { return (0, native_utils_1.nativeOwnKeys)(object.native); }, getOwnPropertyDescriptor: proxyGetOwnPropertyDescriptor, }; return new Proxy(object, handler); }