constructor(editor) { this.editor = editor; this.type = editor.type; this._lastObjectId = 0; this.proxyRef = {}; this.factories = {}; this.cache = new HLRU(1000); this.refs = new Map(); this.events = new EventEmitter(); editor.addEventListener('change', change => { if(! change.local) { change.operation.apply(this._changeHandler); } this.events.emit('change', change); }); this._changeHandler = { update: (id, type, change) => { const ref = this._findRef(id); if(ref) { this.remote = true; ref.editor.apply({ operation: change, local: false, remote: true }); } } }; editor.addEventListener('state', e => this.events.emit('state', e)); this.registerType('map', e => new SharedMap(e)); this.registerType('list', e => new SharedList(e)); this.registerType('string', e => new SharedString(e)); this.root = this._getObject('root', 'map'); this.refs.set(this.cache.get('root')); this.root.on('valueChanged', data => this.events.emit('valueChanged', data)); this.root.on('valueRemoved', data => this.events.emit('valueRemove', data)); }
_findRef(id) { return this.refs.get(id) || this.cache.get(id); }