@skokenes/slate-yjs
Version:
Yjs bindings for Slate.
106 lines • 6.83 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.withYjs = exports.YjsEditor = void 0;
const slate_1 = require("slate");
const tiny_invariant_1 = __importDefault(require("tiny-invariant"));
const applyToYjs_1 = __importDefault(require("../applyToYjs"));
const applyToSlate_1 = __importDefault(require("../applyToSlate"));
const convert_1 = require("../utils/convert");
const IS_REMOTE = new WeakSet();
const IS_LOCAL = new WeakSet();
const SHARED_TYPES = new WeakMap();
exports.YjsEditor = {
/**
* Set the editor value to the content of the to the editor bound shared type.
*/
synchronizeValue: (e) => {
slate_1.Editor.withoutNormalizing(e, () => {
e.children = convert_1.toSlateDoc(e.sharedType);
e.onChange();
});
},
/**
* Returns whether the editor currently is applying remove changes.
*/
sharedType: (editor) => {
const sharedType = SHARED_TYPES.get(editor);
tiny_invariant_1.default(sharedType, 'YjsEditor without attached shared type');
return sharedType;
},
/**
* Applies a slate operations to the bound shared type.
*/
applySlateOperations: (editor, operations) => {
exports.YjsEditor.asLocal(editor, () => {
applyToYjs_1.default(exports.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 = exports.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) => {
exports.YjsEditor.asRemote(editor, () => {
applyToSlate_1.default(editor, events);
});
},
/**
* Performs an action as a local operation.
*/
asLocal: (editor, fn) => {
const wasLocal = exports.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);
},
};
function withYjs(editor, sharedType) {
const e = editor;
e.sharedType = sharedType;
SHARED_TYPES.set(editor, sharedType);
setTimeout(() => {
exports.YjsEditor.synchronizeValue(e);
});
sharedType.observeDeep((events) => {
if (!exports.YjsEditor.isLocal(e)) {
exports.YjsEditor.applyYjsEvents(e, events);
}
});
const { onChange } = editor;
e.onChange = () => {
if (!exports.YjsEditor.isRemote(e)) {
exports.YjsEditor.applySlateOperations(e, e.operations);
}
onChange();
};
return e;
}
exports.withYjs = withYjs;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieWpzRWRpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3BsdWdpbi95anNFZGl0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsaUNBQTBDO0FBQzFDLG9FQUF1QztBQUV2QywrREFBMEM7QUFDMUMsbUVBQTZDO0FBRTdDLDhDQUE4QztBQUU5QyxNQUFNLFNBQVMsR0FBb0IsSUFBSSxPQUFPLEVBQUUsQ0FBQztBQUNqRCxNQUFNLFFBQVEsR0FBb0IsSUFBSSxPQUFPLEVBQUUsQ0FBQztBQUNoRCxNQUFNLFlBQVksR0FBZ0MsSUFBSSxPQUFPLEVBQUUsQ0FBQztBQU1uRCxRQUFBLFNBQVMsR0FBRztJQUN2Qjs7T0FFRztJQUNILGdCQUFnQixFQUFFLENBQUMsQ0FBWSxFQUFRLEVBQUU7UUFDdkMsY0FBTSxDQUFDLGtCQUFrQixDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUU7WUFDaEMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxvQkFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN0QyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDZixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILFVBQVUsRUFBRSxDQUFDLE1BQWlCLEVBQWMsRUFBRTtRQUM1QyxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVDLHdCQUFTLENBQUMsVUFBVSxFQUFFLHdDQUF3QyxDQUFDLENBQUM7UUFDaEUsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsb0JBQW9CLEVBQUUsQ0FBQyxNQUFpQixFQUFFLFVBQXVCLEVBQVEsRUFBRTtRQUN6RSxpQkFBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFO1lBQzdCLG9CQUFhLENBQUMsaUJBQVMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDMUQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxRQUFRLEVBQUUsQ0FBQyxNQUFpQixFQUFXLEVBQUU7UUFDdkMsT0FBTyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7T0FFRztJQUNILFFBQVEsRUFBRSxDQUFDLE1BQWlCLEVBQUUsRUFBYyxFQUFRLEVBQUU7UUFDcEQsTUFBTSxTQUFTLEdBQUcsaUJBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0MsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUV0QixFQUFFLEVBQUUsQ0FBQztRQUVMLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDZCxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztTQUN4RDtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILGNBQWMsRUFBRSxDQUFDLE1BQWlCLEVBQUUsTUFBa0IsRUFBUSxFQUFFO1FBQzlELGlCQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUU7WUFDOUIsc0JBQWMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxPQUFPLEVBQUUsQ0FBQyxNQUFpQixFQUFFLEVBQWMsRUFBUSxFQUFFO1FBQ25ELE1BQU0sUUFBUSxHQUFHLGlCQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNDLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFckIsRUFBRSxFQUFFLENBQUM7UUFFTCxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2IsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN6QjtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILE9BQU8sRUFBRSxDQUFDLE1BQWlCLEVBQVcsRUFBRTtRQUN0QyxPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUIsQ0FBQztDQUNGLENBQUM7QUFFRixTQUFnQixPQUFPLENBQ3JCLE1BQVMsRUFDVCxVQUFzQjtJQUV0QixNQUFNLENBQUMsR0FBRyxNQUF1QixDQUFDO0lBRWxDLENBQUMsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO0lBQzFCLFlBQVksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBRXJDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDZCxpQkFBUyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLENBQUMsQ0FBQyxDQUFDO0lBRUgsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1FBQ2hDLElBQUksQ0FBQyxpQkFBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUN6QixpQkFBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDckM7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVILE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxNQUFNLENBQUM7SUFFNUIsQ0FBQyxDQUFDLFFBQVEsR0FBRyxHQUFHLEVBQUU7UUFDaEIsSUFBSSxDQUFDLGlCQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQzFCLGlCQUFTLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUNqRDtRQUVELFFBQVEsRUFBRSxDQUFDO0lBQ2IsQ0FBQyxDQUFDO0lBRUYsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBOUJELDBCQThCQyJ9