Библиотека оперативного преобразования? - PullRequest
98 голосов
/ 11 января 2010

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

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

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

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

Ответы [ 14 ]

56 голосов
/ 11 января 2010

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

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

42 голосов
/ 19 октября 2011

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

25 голосов
/ 26 октября 2014

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

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

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

OT Библиотеки:

В проекте веб-сокета HWIOS я успешно использовал комбинацию обоих (py-infinote на стороне сервера, jinfinote на стороне клиента) для синхронизации состояний документа.

5 голосов
/ 12 сентября 2013

Библиотека ot.js https://github.com/Operational-Transformation/ot.js может быть полезна для многопользовательских сценариев.

4 голосов
/ 06 февраля 2017

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

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

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

4 голосов
/ 30 сентября 2011
2 голосов
/ 13 февраля 2013

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

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

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

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

2 голосов
/ 11 августа 2011

Также ознакомьтесь со следующими библиотеками Javascript:

...