slate-yjs
Version:
Yjs bindings for Slate.
110 lines • 7.74 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 applyToSlate_1 = require("../applyToSlate");
const applyToYjs_1 = __importDefault(require("../applyToYjs"));
const model_1 = require("../model");
const utils_1 = require("../utils");
const IS_REMOTE = new WeakSet();
const LOCAL_OPERATIONS = new WeakMap();
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 = utils_1.toSlateDoc(e.sharedType);
e.onChange();
});
},
/**
* Returns whether the editor currently is applying remote changes.
*/
sharedType: (editor) => {
const sharedType = SHARED_TYPES.get(editor);
tiny_invariant_1.default(sharedType, 'YjsEditor without attached shared type');
return sharedType;
},
/**
* 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) {
IS_REMOTE.delete(editor);
}
},
/**
* Unobserves the shared type.
*/
destroy: (editor) => {
editor.destroy();
},
};
function localOperations(editor) {
const operations = LOCAL_OPERATIONS.get(editor);
tiny_invariant_1.default(operations, 'YjsEditor without attached local operations');
return operations;
}
function trackLocalOperations(editor, operation) {
if (!exports.YjsEditor.isRemote(editor)) {
localOperations(editor).add(operation);
}
}
/**
* Applies a slate operations to the bound shared type.
*/
function applyLocalOperations(editor) {
const editorLocalOperations = localOperations(editor);
applyToYjs_1.default(exports.YjsEditor.sharedType(editor), Array.from(editorLocalOperations), model_1.slateYjsOriginSymbol);
editorLocalOperations.clear();
}
/**
* Apply Yjs events to slate
*/
function applyRemoteYjsEvents(editor, events) {
slate_1.Editor.withoutNormalizing(editor, () => exports.YjsEditor.asRemote(editor, () => applyToSlate_1.applyYjsEvents(editor, events.filter((event) => event.transaction.origin !== model_1.slateYjsOriginSymbol))));
}
function withYjs(editor, sharedType, { synchronizeValue = true } = {}) {
const e = editor;
e.sharedType = sharedType;
SHARED_TYPES.set(editor, sharedType);
LOCAL_OPERATIONS.set(editor, new Set());
if (synchronizeValue) {
setTimeout(() => exports.YjsEditor.synchronizeValue(e), 0);
}
const applyEvents = (events) => applyRemoteYjsEvents(e, events);
sharedType.observeDeep(applyEvents);
const { apply, onChange, destroy } = e;
e.apply = (op) => {
trackLocalOperations(e, op);
apply(op);
};
e.onChange = () => {
applyLocalOperations(e);
onChange();
};
e.destroy = () => {
sharedType.unobserveDeep(applyEvents);
if (destroy) {
destroy();
}
};
return e;
}
exports.withYjs = withYjs;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieWpzRWRpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3BsdWdpbi95anNFZGl0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsaUNBQTBDO0FBQzFDLG9FQUF1QztBQUV2QyxrREFBaUQ7QUFDakQsK0RBQTBDO0FBQzFDLG9DQUE0RDtBQUM1RCxvQ0FBc0M7QUFFdEMsTUFBTSxTQUFTLEdBQW9CLElBQUksT0FBTyxFQUFFLENBQUM7QUFDakQsTUFBTSxnQkFBZ0IsR0FBb0MsSUFBSSxPQUFPLEVBQUUsQ0FBQztBQUN4RSxNQUFNLFlBQVksR0FBZ0MsSUFBSSxPQUFPLEVBQUUsQ0FBQztBQVFuRCxRQUFBLFNBQVMsR0FBRztJQUN2Qjs7T0FFRztJQUNILGdCQUFnQixFQUFFLENBQUMsQ0FBWSxFQUFRLEVBQUU7UUFDdkMsY0FBTSxDQUFDLGtCQUFrQixDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUU7WUFDaEMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxrQkFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN0QyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDZixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILFVBQVUsRUFBRSxDQUFDLE1BQWlCLEVBQWMsRUFBRTtRQUM1QyxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVDLHdCQUFTLENBQUMsVUFBVSxFQUFFLHdDQUF3QyxDQUFDLENBQUM7UUFDaEUsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsUUFBUSxFQUFFLENBQUMsTUFBaUIsRUFBVyxFQUFFO1FBQ3ZDLE9BQU8sU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxRQUFRLEVBQUUsQ0FBQyxNQUFpQixFQUFFLEVB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