Библиотека оперативного преобразования?

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

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

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

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

14 ответов

Решение

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

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

Один из бывших инженеров 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:

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

https://github.com/marcelklehr/gulf

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

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

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

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

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

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

Другие вопросы по тегам