@skokenes/slate-yjs
Version:
Yjs bindings for Slate.
99 lines • 6.48 kB
JavaScript
import { Editor } from 'slate';
import invariant from 'tiny-invariant';
import applySlateOps from '../applyToYjs';
import applyYjsEvents from '../applyToSlate';
import { toSlateDoc } from '../utils/convert';
const IS_REMOTE = new WeakSet();
const IS_LOCAL = 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 remove 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, () => {
applySlateOps(YjsEditor.sharedType(editor), operations);
});
},
/**
* Returns whether the editor currently is applying remove 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));
}
},
/**
* Apply Yjs events to slate
*/
applyYjsEvents: (editor, events) => {
YjsEditor.asRemote(editor, () => {
applyYjsEvents(editor, events);
});
},
/**
* 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 remove change to the yjs doc.
*/
isLocal: (editor) => {
return IS_LOCAL.has(editor);
},
};
export function withYjs(editor, sharedType) {
const e = editor;
e.sharedType = sharedType;
SHARED_TYPES.set(editor, sharedType);
setTimeout(() => {
YjsEditor.synchronizeValue(e);
});
sharedType.observeDeep((events) => {
if (!YjsEditor.isLocal(e)) {
YjsEditor.applyYjsEvents(e, events);
}
});
const { onChange } = editor;
e.onChange = () => {
if (!YjsEditor.isRemote(e)) {
YjsEditor.applySlateOperations(e, e.operations);
}
onChange();
};
return e;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieWpzRWRpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3BsdWdpbi95anNFZGl0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBYSxNQUFNLE9BQU8sQ0FBQztBQUMxQyxPQUFPLFNBQVMsTUFBTSxnQkFBZ0IsQ0FBQztBQUV2QyxPQUFPLGFBQWEsTUFBTSxlQUFlLENBQUM7QUFDMUMsT0FBTyxjQUFjLE1BQU0saUJBQWlCLENBQUM7QUFFN0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTlDLE1BQU0sU0FBUyxHQUFvQixJQUFJLE9BQU8sRUFBRSxDQUFDO0FBQ2pELE1BQU0sUUFBUSxHQUFvQixJQUFJLE9BQU8sRUFBRSxDQUFDO0FBQ2hELE1BQU0sWUFBWSxHQUFnQyxJQUFJLE9BQU8sRUFBRSxDQUFDO0FBTWhFLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRztJQUN2Qjs7T0FFRztJQUNILGdCQUFnQixFQUFFLENBQUMsQ0FBWSxFQUFRLEVBQUU7UUFDdkMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUU7WUFDaEMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3RDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNmLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsVUFBVSxFQUFFLENBQUMsTUFBaUIsRUFBYyxFQUFFO1FBQzVDLE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUMsU0FBUyxDQUFDLFVBQVUsRUFBRSx3Q0FBd0MsQ0FBQyxDQUFDO1FBQ2hFLE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7T0FFRztJQUNILG9CQUFvQixFQUFFLENBQUMsTUFBaUIsRUFBRSxVQUF1QixFQUFRLEVBQUU7UUFDekUsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFO1lBQzdCLGFBQWEsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzFELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsUUFBUSxFQUFFLENBQUMsTUFBaUIsRUFBVyxFQUFFO1FBQ3ZDLE9BQU8sU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxRQUFRLEVBQUUsQ0FBQyxNQUFpQixFQUFFLEVBQWMsRUFBUSxFQUFFO1FBQ3BELE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0MsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUV0QixFQUFFLEVBQUUsQ0FBQztRQUVMLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDZCxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztTQUN4RDtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILGNBQWMsRUFBRSxDQUFDLE1BQWlCLEVBQUUsTUFBa0IsRUFBUSxFQUFFO1FBQzlELFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRTtZQUM5QixjQUFjLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsT0FBTyxFQUFFLENBQUMsTUFBaUIsRUFBRSxFQUFjLEVBQVEsRUFBRTtRQUNuRCxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNDLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFckIsRUFBRSxFQUFFLENBQUM7UUFFTCxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2IsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN6QjtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILE9BQU8sRUFBRSxDQUFDLE1BQWlCLEVBQVcsRUFBRTtRQUN0QyxPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUIsQ0FBQztDQUNGLENBQUM7QUFFRixNQUFNLFVBQVUsT0FBTyxDQUNyQixNQUFTLEVBQ1QsVUFBc0I7SUFFdEIsTUFBTSxDQUFDLEdBQUcsTUFBdUIsQ0FBQztJQUVsQyxDQUFDLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztJQUMxQixZQUFZLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztJQUVyQyxVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2QsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLENBQUMsQ0FBQyxDQUFDO0lBRUgsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1FBQ2hDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3pCLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQ3JDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSCxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsTUFBTSxDQUFDO0lBRTVCLENBQUMsQ0FBQyxRQUFRLEdBQUcsR0FBRyxFQUFFO1FBQ2hCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQzFCLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ2pEO1FBRUQsUUFBUSxFQUFFLENBQUM7SUFDYixDQUFDLENBQUM7SUFFRixPQUFPLENBQUMsQ0FBQztBQUNYLENBQUMifQ==