UNPKG

marshall-y-slate

Version:
160 lines 10.8 kB
import { Editor } from 'slate'; import invariant from 'tiny-invariant'; import { applyYjsEvents } from '../apply-to-slate'; import applySlateOps from '../apply-to-yjs'; import { toSlateDoc } from '../utils/convert'; const IS_REMOTE = new WeakSet(); const IS_LOCAL = new WeakSet(); const IS_UNDO = new WeakSet(); const SHARED_TYPES = new WeakMap(); export const YjsEditor = { /** * Set the editor value to the content of the to the editor bound shared type. */ synchronizeValue: (e) => { Editor.withoutNormalizing(e, () => { e.children = toSlateDoc(e.sharedType); e.onChange(); }); }, /** * Returns whether the editor currently is applying remote changes. */ sharedType: (editor) => { const sharedType = SHARED_TYPES.get(editor); invariant(sharedType, 'YjsEditor without attached shared type'); return sharedType; }, /** * Applies a slate operations to the bound shared type. */ applySlateOperations: (editor, operations) => { YjsEditor.asLocal(editor, () => { try { applySlateOps(YjsEditor.sharedType(editor), operations, editor); } catch (error) { const e = editor; if (e.onError) { e.onError({ code: 10000, name: 'apply local operations', nativeError: error }); } } }); }, /** * Returns whether the editor currently is applying remote changes. */ isRemote: (editor) => { return IS_REMOTE.has(editor); }, /** * Performs an action as a remote operation. */ asRemote: (editor, fn) => { const wasRemote = YjsEditor.isRemote(editor); IS_REMOTE.add(editor); fn(); if (!wasRemote) { Promise.resolve().then(() => IS_REMOTE.delete(editor)); } }, /** * Returns whether the editor currently is applying remote changes. */ isUndo: (editor) => { return IS_UNDO.has(editor); }, /** * Performs an action as a remote operation. */ asUndo: (editor, fn) => { const wasUndo = YjsEditor.isUndo(editor); IS_UNDO.add(editor); fn(); if (!wasUndo) { Promise.resolve().then(() => IS_UNDO.delete(editor)); } }, /** * Apply Yjs events to slate */ applyYjsEvents: (editor, events) => { if (YjsEditor.isUndo(editor)) { try { applyYjsEvents(editor, events); } catch (error) { const e = editor; if (e.onError) { e.onError({ code: 10001, name: 'apply yjs undo events', nativeError: error }); } } } else { YjsEditor.asRemote(editor, () => { try { applyYjsEvents(editor, events); } catch (error) { const e = editor; if (e.onError) { e.onError({ code: 10002, name: 'apply yjs remote events', nativeError: error }); } } }); } }, /** * Performs an action as a local operation. */ asLocal: (editor, fn) => { const wasLocal = YjsEditor.isLocal(editor); IS_LOCAL.add(editor); fn(); if (!wasLocal) { IS_LOCAL.delete(editor); } }, /** * Returns whether the editor currently is applying a remote change to the yjs doc. */ isLocal: (editor) => { return IS_LOCAL.has(editor); } }; export function withYjs(editor, sharedType, { isSynchronizeValue = true } = {}) { const e = editor; let isInitialized = false; e.sharedType = sharedType; SHARED_TYPES.set(editor, sharedType); if (isSynchronizeValue) { setTimeout(() => { YjsEditor.synchronizeValue(e); isInitialized = true; }); } sharedType.observeDeep((events) => { if (!YjsEditor.isLocal(e)) { const isNormalizing = Editor.isNormalizing(editor); Editor.setNormalizing(e, false); if (!isInitialized) { e.children = e.sharedType.toJSON(); e.onChange(); isInitialized = true; } else { YjsEditor.applyYjsEvents(e, events); } Editor.setNormalizing(e, isNormalizing); } }); const { onChange } = editor; e.onChange = () => { if (!YjsEditor.isRemote(e) && !YjsEditor.isUndo(e) && isInitialized) { YjsEditor.applySlateOperations(e, e.operations); } onChange(); }; return e; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieWpzLWVkaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wbHVnaW4veWpzLWVkaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWMsTUFBTSxFQUFhLE1BQU0sT0FBTyxDQUFDO0FBQ3RELE9BQU8sU0FBUyxNQUFNLGdCQUFnQixDQUFDO0FBRXZDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLGFBQWEsTUFBTSxpQkFBaUIsQ0FBQztBQUU1QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFOUMsTUFBTSxTQUFTLEdBQW9CLElBQUksT0FBTyxFQUFFLENBQUM7QUFDakQsTUFBTSxRQUFRLEdBQW9CLElBQUksT0FBTyxFQUFFLENBQUM7QUFDaEQsTUFBTSxPQUFPLEdBQW9CLElBQUksT0FBTyxFQUFFLENBQUM7QUFDL0MsTUFBTSxZQUFZLEdBQWdDLElBQUksT0FBTyxFQUFFLENBQUM7QUFNaEUsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHO0lBQ3ZCOztPQUVHO0lBQ0gsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFZLEVBQVEsRUFBRTtRQUN2QyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRTtZQUNoQyxDQUFDLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDdEMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2YsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVLEVBQUUsQ0FBQyxNQUFpQixFQUFjLEVBQUU7UUFDNUMsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1QyxTQUFTLENBQUMsVUFBVSxFQUFFLHdDQUF3QyxDQUFDLENBQUM7UUFDaEUsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsb0JBQW9CLEVBQUUsQ0FBQyxNQUFpQixFQUFFLFVBQXVCLEVBQVEsRUFBRTtRQUN6RSxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUU7WUFDN0IsSUFBSTtnQkFDRixhQUFhLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7YUFDakU7WUFBQyxPQUFPLEtBQUssRUFBRTtnQkFDZCxNQUFNLENBQUMsR0FPSCxNQUFhLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRTtvQkFDYixDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsd0JBQXdCLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7aUJBQ2hGO2FBQ0Y7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILFFBQVEsRUFBRSxDQUFDLE1BQWlCLEVBQVcsRUFBRTtRQUN2QyxPQUFPLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsUUFBUSxFQUFFLENBQUMsTUFBaUIsRUFBRSxFQUFjLEVBQVEsRUFBRTtRQUNwRCxNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdDLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFdEIsRUFBRSxFQUFFLENBQUM7UUFFTCxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2QsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7U0FDeEQ7SUFDSCxDQUFDO0lBRUQ7O0tBRUM7SUFDRCxNQUFNLEVBQUUsQ0FBQyxNQUFpQixFQUFXLEVBQUU7UUFDckMsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sRUFBRSxDQUFDLE1BQWlCLEVBQUUsRUFBYyxFQUFRLEVBQUU7UUFDbEQsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6QyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXBCLEVBQUUsRUFBRSxDQUFDO1FBRUwsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNaLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1NBQ3REO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsY0FBYyxFQUFFLENBQUMsTUFBaUIsRUFBRSxNQUFrQixFQUFRLEVBQUU7UUFDOUQsSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQzVCLElBQUk7Z0JBQ0YsY0FBYyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQzthQUNoQztZQUFDLE9BQU8sS0FBSyxFQUFFO2dCQUNkLE1BQU0sQ0FBQyxHQU9ILE1BQWEsQ0FBQztnQkFDbEIsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFO29CQUNiLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSx1QkFBdUIsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztpQkFDL0U7YUFDRjtTQUNGO2FBQU07WUFDTCxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUU7Z0JBQzlCLElBQUk7b0JBQ0YsY0FBYyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztpQkFDaEM7Z0JBQUMsT0FBTyxLQUFLLEVBQUU7b0JBQ2QsTUFBTSxDQUFDLEdBT0gsTUFBYSxDQUFDO29CQUNsQixJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUU7d0JBQ2IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLHlCQUF5QixFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO3FCQUNqRjtpQkFDRjtZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxPQUFPLEVBQUUsQ0FBQyxNQUFpQixFQUFFLEVBQWMsRUFBUSxFQUFFO1FBQ25ELE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0MsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVyQixFQUFFLEVBQUUsQ0FBQztRQUVMLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDYixRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3pCO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsT0FBTyxFQUFFLENBQUMsTUFBaUIsRUFBVyxFQUFFO1FBQ3RDLE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM5QixDQUFDO0NBQ0YsQ0FBQztBQUVGLE1BQU0sVUFBVSxPQUFPLENBQ3JCLE1BQVMsRUFDVCxVQUFzQixFQUN0QixFQUFFLGtCQUFrQixHQUFHLElBQUksS0FBcUIsRUFBRTtJQUVsRCxNQUFNLENBQUMsR0FBRyxNQUF1QixDQUFDO0lBQ2xDLElBQUksYUFBYSxHQUFHLEtBQUssQ0FBQztJQUUxQixDQUFDLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztJQUMxQixZQUFZLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztJQUVyQyxJQUFJLGtCQUFrQixFQUFFO1FBQ3RCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUIsYUFBYSxHQUFHLElBQUksQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztLQUNKO0lBRUQsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1FBQ2hDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3pCLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbkQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLGFBQWEsRUFBRTtnQkFDbEIsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNuQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2IsYUFBYSxHQUFHLElBQUksQ0FBQzthQUN0QjtpQkFBTTtnQkFDTCxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQzthQUNyQztZQUNELE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1NBQ3pDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSCxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsTUFBTSxDQUFDO0lBRTVCLENBQUMsQ0FBQyxRQUFRLEdBQUcsR0FBRyxFQUFFO1FBQ2hCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxhQUFhLEVBQUU7WUFDbkUsU0FBUyxDQUFDLG9CQUFvQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDakQ7UUFFRCxRQUFRLEVBQUUsQ0FBQztJQUNiLENBQUMsQ0FBQztJQUVGLE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQyJ9