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.

149 lines (148 loc) 6.52 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 connector_abstract_1 = __importDefault(require("../connector/connector.abstract")); const create_connector_1 = require("../connector/create-connector"); const create_rhine_var_1 = require("./create-rhine-var"); const native_utils_1 = require("../utils/native.utils"); const var_utils_1 = require("../utils/var.utils"); const rhine_var_text_class_1 = __importDefault(require("../var/items/rhine-var-text.class")); const rhine_var_base_class_1 = require("../var/rhine-var-base.class"); const support_manager_1 = __importDefault(require("../var/support/support-manager")); const index_1 = require("../../index"); const logger_1 = require("../../utils/logger"); // For create root RhineVar object function rhineProxy(defaultValue, connector, options = {}) { if (!connector) { return rhineProxyGeneral(defaultValue); } // Create local temp YDoc and YMap const 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, options.token); } const root = object; root._options = options; root._connector = connector; // Bind connector connector.subscribeSynced((synced) => { if (options.overwrite) { connector.setState(object.getNative().clone()); } if (!connector.hasState()) { connector.setState(object.getNative().clone()); } ; object._initialize(connector.getState()); }); return object; } function rhineProxyGeneral(data, parent = null) { const target = (0, var_utils_1.ensureNative)(data); const object = (0, create_rhine_var_1.createRhineVar)(target, parent); const native = object.getNative(); if (native instanceof index_1.YText) { Reflect.set(object, 'value', native.toString()); } else if (native instanceof index_1.YMap || native instanceof index_1.YArray) { native.forEach((value, keyString) => { const 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* () { const native = object.getNative(); if (native instanceof index_1.YMap) { for (const key of native.keys()) { yield Reflect.get(object, key); } } else if (native instanceof index_1.YArray) { for (let i = 0; i < 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.getNative() 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.getNative().doc; if (doc) { doc.transact(() => { const native = object.getNative(); 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.getNative(), 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.getNative(), 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.getNative(), p); }, ownKeys(proxy) { return (0, native_utils_1.nativeOwnKeys)(object.getNative()); }, getOwnPropertyDescriptor: proxyGetOwnPropertyDescriptor, }; return new Proxy(object, handler); }