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

103

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

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

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

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

геймеры2000
источник
Текстовый редактор для совместной работы на базе 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
dmonad
источник
Google Drive API использует OT, а не DS. developers.google.com/drive/realtime/conflict-resolution
Матиас Бак
4

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

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

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

Alalonde
источник
2

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

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

user981836
источник
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

Марсель Клер
источник