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
JavaScript
;
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);
}