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