Библиотека оперативной трансформации?


103

Я ищу библиотеку, которая позволила бы мне синхронизировать текст в реальном времени между несколькими пользователями (например, Google Docs).

Я наткнулся на Operational Transformation, который, кажется, соответствует моим потребностям. Сказав это, я понимаю суть ОТ, но не математику и не реализацию ОТ.

Таким образом, мне было интересно, существует ли библиотека Javascript drag'n'drop, которая будет подключаться к текстовой области, генерировать преобразования, а затем позволять мне применять эти преобразования на другом клиенте?

(У меня есть исходный код Etherpad, но я не могу разобраться в этом. Если бы кто-нибудь мог указать, как использовать реализацию Etherpad OT, это тоже будет здорово!)


Текстовый редактор для совместной работы на базе Firebase под названием Firepad - firepad.io Проверьте код, чтобы получить вдохновение github.com/FirebaseExtended/firepad
— Tharanga Hewavithana

Ответы:


57

Я думаю, что части реализации OT Google Wave имеют открытый исходный код (и скоро появятся новые части).

Я не уверен, что это то, что вы ищете, но альтернативой OT является дифференциальная синхронизация :


6
Diff-Match-Patch в сочетании с статьей Нила Фрейзера по дифференциальной синхронизации ( neil.fraser.name/writing/sync ) сделали свое дело! Большое спасибо за то, что указали мне правильное направление.
— gamers2000,

Насколько я понимаю, Diff-Match-Patch и, соответственно, MobWrite (поскольку последний использует первое) поддерживает только текст, а не двоичные изменения. Однако есть демонстрация совместной работы с элементами формы HTML, которая указывает на то, что он поддерживает не только простой текст.
— gamers2000,

Есть ли хорошие новости о том, что "и еще больше деталей" после этого ответа?
— Берти,

3
На самом деле, Google-Diff-Match-Patch нацелен на реализацию метода, альтернативного операционным преобразованиям, то есть дифференциальной синхронизации, чтобы понять различия, которые вы можете прочитать в документе DS Нил Фрейзер: neil.fraser.name/writing/sync (OT упоминается в этом документе как передача события). Это два очень разных метода.
— Benja

5
это старый, но если вы не возражаете, я открыл github.com/benjamine/JsonDiffPatch, он использует Diff-Match-Patch Нила для длинных строк, но он работает для произвольных графов объектов js
— Benja

44

Один из бывших инженеров Wave выпустил на Coffeescript реализацию своего алгоритма совместного редактирования под названием ShareJS, теперь называемого ShareDB .


1
ShareJS, вероятно, проще, лучше документирован и более пригоден для повторного использования, чем то, что MobWrite делает с Google Diff and Patch.
— Люк Стэнли,

36

Обобщу найденные решения.

  • Операционная трансформация: например

    • Google Wave OT. Подход основан на так называемом подходе Юпитера.
    • ShareJs. Основан на том же алгоритме OT, что и Google Wave OT.
    • Coweb-jsoe. Основан на COT - очень сложном подходе OT, который также поддерживает распространение сообщений p2p.
    • OpenCoweb. Он использует OpenCoweb-jsoe, чтобы обеспечить полноценный фреймворк для множества подобных проблем.
    • OT.js основан на типах операций ShareJ.
    • 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

Google Drive API использует OT, а не DS. developers.google.com/drive/realtime/conflict-resolution
— Матиас Бак




4

Готовых решений этой проблемы или «перетаскивания» на самом деле не существовало из-за сложности надежной синхронизации общего изменяемого состояния. Ответ dmonad является достойной облавой, и я разместил обзор более уточненный доступных решений здесь .

Это довольно старый вопрос, но Convergence (отказ от ответственности: я являюсь основателем) предоставляет наиболее готовое решение, обеспечивая не только синхронизацию данных, но и множество других API, полезных для создания совместного UX. Вот пример, показывающий именно то, что вы просили: синхронизацию текстового поля между несколькими клиентами.

В остальном ShareDB - отличное решение с открытым исходным кодом, удовлетворяющее потребности многих людей.



2

С клиентской библиотекой js (Strophe.js) вы можете использовать бесплатный сервер XMPP (например, jabber.org) вместе с моей клиентской библиотекой OT (JSOTTEST) для создания полной клиент-серверной системы.

Я отправлю src демонстрационной системы чата клиент-сервер, когда у меня будет время для доработки кода.


1
Почти два года назад вы написали: «Я отправлю src демо ...». Вы когда-нибудь заканчивали демо?
— Брайан Окли

Извините ... но у меня не было времени выпустить публичную демонстрацию! Однако использовать Bosh lib для php очень просто !! пока
— user981836 05

2

В Npm есть несколько хороших библиотек для node.js:

  • https://npmjs.org/package/ot - встроенные адаптеры для codemirror и ace, а также реализация клиента и сервера
  • https://npmjs.org/package/changesets - простая библиотека, которую можно использовать в узле и браузере; позволяет создавать наборы изменений (по сути, различия), которые можно отправлять, преобразовывать друг в друга и применять к документу

1

Вы могли бы поговорить с ребятами из Cedanet . Хотя Ceda имеет закрытый исходный код, и на их веб-сайте нет бесплатной пробной версии. Я принимал участие в разработке Ceda и продолжаю работать с ним в коммерческих проектах, поэтому, возможно, я смогу дать некоторые отзывы / советы, если вы пойдете по этому пути.


1

Я считаю, что etherpad.org с etherpad lite превосходит другие решения.


1
Не могли бы вы доказать превосходство etherpad на каком-нибудь примере?
— DL Narasimhan

1

Мы создаем редактор для совместной работы, который сочетает в себе операционное преобразование и управление версиями. Таким образом, мы можем поддерживать как офлайн, так и онлайн сотрудничество. Вчера мы выпустили нашу собственную библиотеку OT как часть нашего стека с открытым исходным кодом.

http://interior.substance.io/modules/operator.html

Мы также добавили библиотеку для управления версиями.

http://interior.substance.io/modules/chronicle.html


1

Я написал небольшую unixy-библиотеку (делай одно дело и делай это хорошо), которая реализует уровень управления OT, позволяя подключать различные типы OT (поддерживает все типы, совместимые с shareJS). Он похож на shareJS, но менее самоуверен и более абстрактен.

https://github.com/marcelklehr/gulf

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.