@atlaskit/editor-plugin-collab-edit
Version:
Collab Edit plugin for @atlaskit/editor-core
52 lines (50 loc) • 2.87 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.mergeUnconfirmedSteps = mergeUnconfirmedSteps;
var _editorPluginConnectivity = require("@atlaskit/editor-plugin-connectivity");
var _state = require("@atlaskit/editor-prosemirror/state");
var _prosemirrorCollab = require("@atlaskit/prosemirror-collab");
var _expValEquals = require("@atlaskit/tmp-editor-statsig/exp-val-equals");
var isLocked = function isLocked(step) {
if (step.origin instanceof _state.Transaction) {
return step.origin.getMeta('mergeIsLocked');
}
return false;
};
/**
* Merge a set of steps together to reduce the total number of steps stored in memory.
*
* All steps passing through here should be "lockable" (ie. can be locked by the document service)
* so that it can be indicated they have already been sent (or are about to be sent) to the backend
* and cannot be merged.
*
* @param steps Rebaseable steps
* @returns Rebaseable steps
*/
function mergeUnconfirmedSteps(steps, api) {
var mergedSteps = steps.reduce(function (acc, rebaseable) {
var _api$connectivity;
var lastStep = acc[acc.length - 1];
var isOffline = (0, _editorPluginConnectivity.isOfflineMode)(api === null || api === void 0 || (_api$connectivity = api.connectivity) === null || _api$connectivity === void 0 || (_api$connectivity = _api$connectivity.sharedState.currentState()) === null || _api$connectivity === void 0 ? void 0 : _api$connectivity.mode);
var isOnlineMergeEnabled = (0, _expValEquals.expValEquals)('platform_editor_enable_single_player_step_merging', 'isEnabled', true);
var isMergingEnabled = isOffline || isOnlineMergeEnabled;
if (isMergingEnabled && lastStep && !isLocked(lastStep) && !isLocked(rebaseable)) {
var mergedStep = lastStep.step.merge(rebaseable.step);
var inverted = rebaseable.inverted.merge(lastStep.inverted);
// Always take the origin of the new step.
// We use this in packages/editor/collab-provider/src/document/document-service.ts:commitUnconfirmedSteps
// to confirm that the last transaction has been sent. Since we're taking the latest this still works as expected
// As we want to wait until all the transactions have been pushed through
var origin = lastStep.origin;
if (mergedStep && inverted) {
acc[acc.length - 1] = new _prosemirrorCollab.Rebaseable(mergedStep, inverted, origin instanceof _state.Transaction ? origin.setMeta('isOffline', origin.getMeta('isOffline') === true || isOffline) : origin);
return acc;
}
}
acc.push(new _prosemirrorCollab.Rebaseable(rebaseable.step, rebaseable.inverted, rebaseable.origin instanceof _state.Transaction ? rebaseable.origin.setMeta('isOffline', rebaseable.origin.getMeta('isOffline') === true || isOffline) : rebaseable.origin));
return acc;
}, []);
return mergedSteps;
}