marshall-y-slate
Version:
Yjs bindings for Slate.
167 lines • 11.2 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 apply_to_slate_1 = require("../apply-to-slate");
const apply_to_yjs_1 = __importDefault(require("../apply-to-yjs"));
const convert_1 = require("../utils/convert");
const IS_REMOTE = new WeakSet();
const IS_LOCAL = new WeakSet();
const IS_UNDO = 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 = (0, convert_1.toSlateDoc)(e.sharedType);
e.onChange();
});
},
/**
* Returns whether the editor currently is applying remote changes.
*/
sharedType: (editor) => {
const sharedType = SHARED_TYPES.get(editor);
(0, 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, () => {
try {
(0, apply_to_yjs_1.default)(exports.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 = exports.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 = exports.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 (exports.YjsEditor.isUndo(editor)) {
try {
(0, apply_to_slate_1.applyYjsEvents)(editor, events);
}
catch (error) {
const e = editor;
if (e.onError) {
e.onError({ code: 10001, name: 'apply yjs undo events', nativeError: error });
}
}
}
else {
exports.YjsEditor.asRemote(editor, () => {
try {
(0, apply_to_slate_1.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 = exports.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);
}
};
function withYjs(editor, sharedType, { isSynchronizeValue = true } = {}) {
const e = editor;
let isInitialized = false;
e.sharedType = sharedType;
SHARED_TYPES.set(editor, sharedType);
if (isSynchronizeValue) {
setTimeout(() => {
exports.YjsEditor.synchronizeValue(e);
isInitialized = true;
});
}
sharedType.observeDeep((events) => {
if (!exports.YjsEditor.isLocal(e)) {
const isNormalizing = slate_1.Editor.isNormalizing(editor);
slate_1.Editor.setNormalizing(e, false);
if (!isInitialized) {
e.children = e.sharedType.toJSON();
e.onChange();
isInitialized = true;
}
else {
exports.YjsEditor.applyYjsEvents(e, events);
}
slate_1.Editor.setNormalizing(e, isNormalizing);
}
});
const { onChange } = editor;
e.onChange = () => {
if (!exports.YjsEditor.isRemote(e) && !exports.YjsEditor.isUndo(e) && isInitialized) {
exports.YjsEditor.applySlateOperations(e, e.operations);
}
onChange();
};
return e;
}
exports.withYjs = withYjs;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieWpzLWVkaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wbHVnaW4veWpzLWVkaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxpQ0FBc0Q7QUFDdEQsb0VBQXVDO0FBRXZDLHNEQUFtRDtBQUNuRCxtRUFBNEM7QUFFNUMsOENBQThDO0FBRTlDLE1BQU0sU0FBUyxHQUFvQixJQUFJLE9BQU8sRUFBRSxDQUFDO0FBQ2pELE1BQU0sUUFBUSxHQUFvQixJQUFJLE9BQU8sRUFBRSxDQUFDO0FBQ2hELE1BQU0sT0FBTyxHQUFvQixJQUFJLE9BQU8sRUFBRSxDQUFDO0FBQy9DLE1BQU0sWUFBWSxHQUFnQyxJQUFJLE9BQU8sRUFBRSxDQUFDO0FBTW5ELFFBQUEsU0FBUyxHQUFHO0lBQ3ZCOztPQUVHO0lBQ0gsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFZLEVBQVEsRUFBRTtRQUN2QyxjQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRTtZQUNoQyxDQUFDLENBQUMsUUFBUSxHQUFHLElBQUEsb0JBQVUsRUFBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDdEMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2YsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVLEVBQUUsQ0FBQyxNQUFpQixFQUFjLEVBQUU7UUFDNUMsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1QyxJQUFBLHdCQUFTLEVBQUMsVUFBVSxFQUFFLHdDQUF3QyxDQUFDLENBQUM7UUFDaEUsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsb0JBQW9CLEVBQUUsQ0FBQyxNQUFpQixFQUFFLFVBQXVCLEVBQVEsRUFBRTtRQUN6RSxpQkFBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFO1lB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