Библиотека оперативного преобразования?
Я ищу библиотеку, которая позволила бы мне синхронизировать текст в режиме реального времени между несколькими пользователями (аля Google Docs).
Я наткнулся на оперативную трансформацию, которая, кажется, соответствует моим потребностям. Сказав это, я понимаю суть ОТ, но не математику и не реализацию ОТ.
Таким образом, мне было интересно, есть ли библиотека Javascript drag'n'drop, которая будет подключаться к текстовой области, генерировать преобразования, а затем позволять мне применять эти преобразования к другому клиенту?
(Я получил источник Etherpad, но я не могу сделать из этого голову или хвост. Если кто-нибудь может указать, как использовать реализацию OT Etherpad, это тоже будет здорово!)
14 ответов
Я думаю, что часть OT-реализации Google Wave является открытым исходным кодом (и еще больше частей).
Я не уверен, что это то, что вы ищете, но альтернативой OT является дифференциальная синхронизация:
- Google-Diff-Match-Patch - библиотеки Diff, Match и Patch для простого текста: "Библиотеки Diff Match и Patch предлагают надежные алгоритмы для выполнения операций, необходимых для синхронизации простого текста".
- Google-MobWrite - служба синхронизации и совместной работы в реальном времени: "MobWrite преобразует формы и веб-приложения в среды совместной работы. Создайте простую однопользовательскую систему, добавьте одну строку JavaScript и мгновенно получите систему совместной работы". (Использует Google-Diff -match-Patch.)
Один из бывших инженеров Wave выпустил реализацию Coffeescript для своего алгоритма совместного редактирования под названием ShareJS, который теперь называется ShareDB.
Я подведу итог решения, которые я нашел.
Операционная трансформация: например
- Google Wave OT. Подход основан на так называемом подходе Юпитера.
- ShareJs. Основан на том же алгоритме OT, что и Google Wave OT.
- Coweb-jsoe. Основан на COT - очень сложном подходе OT, который также поддерживает распространение сообщений p2p.
- OpenCoweb. Он использует OpenCoweb-jsoe для того, чтобы предоставить полноценный Framework для множества подобных проблем.
- OT.js основан на типах операций ShareJs.
- DriveSDK. Очень интересный API, который может делать много вещей - например, сотрудничество на графиках.
- SwellRT - это вилка Apache Wave. Является федеративным и поддерживает форматированный текст.
Дифференциальная синхронизация:
- Diff-Match-Patch от Нила Фрейзера.
- MobWrite использует алгоритм Diff-Match-Patch.
CRDT (коммутативный реплицируемый тип данных):
- Существует множество различных алгоритмов CRDT, которые позволяют реализацию разделяемых типов. Некоторые CRDT работают с распространением сообщений P2P, некоторые полагаются на модели клиент-сервер
- Yjs позволяет вам обмениваться произвольными типами данных (RichText, Array, Hash Maps, ... расширяемый). Автономная поддержка и поддержка протоколов связи P2P (есть модули для XMPP, Websockets и WebRTC)
- Общая база данных клиентского сервера SwarmJS с автономной поддержкой. Хорошо работает с React
- Woot Реализация Woot CRDT
- CRDT Еще одна реализация CRDT
- Automerge
OT Библиотеки:
В рамках проекта веб-сокета HWIOS я успешно использовал комбинацию обоих (py-infinote на стороне сервера, jinfinote на стороне клиента) для синхронизации состояний документа.
Библиотека ot.js https://github.com/Operational-Transformation/ot.js может быть полезна для многопользовательских сценариев.
Решений этой проблемы "под ключ" или "перетаскивание" на самом деле не существовало из-за сложности надежной синхронизации общего изменяемого состояния. Ответ dmonad является достойным обзором, и я опубликовал более актуальный обзор доступных решений здесь.
Этот вопрос довольно старый, но https://convergence.io/ (отказ от ответственности: я являюсь основателем) предоставляет наиболее готовое решение, предоставляя не только синхронизацию данных, но и множество других API, полезных для построения UX для совместной работы. Вот пример, показывающий, что именно вы запросили: синхронизация текстового поля между несколькими клиентами.
В противном случае, ShareDB - это отличное решение с открытым исходным кодом, которое соответствует потребностям многих людей.
С клиентской библиотекой js (Strophe.js) вы можете использовать бесплатный XMPP-сервер (например, jabber.org) вместе с моей клиентской OT-библиотекой (JSOTTEST) для создания полной клиент-серверной системы.
Я предоставлю src демо-клиент-серверной системы чата, когда у меня будет время пересмотреть код.
Npm имеет несколько хороших библиотек ot для node.js:
- https://npmjs.org/package/ot - встроенные адаптеры для codemirror и ace, а также реализация для клиента и сервера
- https://npmjs.org/package/changesets - простая библиотека, используемая в узле и браузере; позволяет создавать "наборы изменений" (по сути, различия), которые можно отправлять, преобразовывать друг против друга и применять к документу
Также проверьте эти библиотеки Javascript:
- https://github.com/vitotafuni/JSOTTEST <Реализация JavaScript на стороне клиента
- https://github.com/fitzgen/operational-transformation-example
Я написал небольшую библиотеку Unixy (сделай одну вещь и сделай это хорошо), которая реализует уровень управления OT, позволяя подключать различные типы OT (поддерживает все типы, совместимые с shareJS). Это похоже на shareJS, но менее самоуверенное и более абстрактное.
Вы могли бы поговорить с парнями в Cedanet. Хотя Ceda является закрытым исходным кодом, и на их веб-сайте нет бесплатной пробной версии. Я принимал участие в разработке Ceda и продолжаю работать с ним в коммерческих проектах, поэтому я мог бы предоставить некоторые отзывы / советы, если вы идете по этому пути.
Я считаю, что etherpad.org с etherpad lite превосходит другие решения.
Мы создаем совместный редактор, который сочетает операционную трансформацию с версионированием. Таким образом, мы можем поддерживать как оффлайн, так и онлайн коллаб. Вчера мы выпустили нашу собственную библиотеку OT как часть нашего стека с открытым исходным кодом.
http://interior.substance.io/modules/operator.html
Мы также предоставили библиотеку для управления версиями.