Библиотека оперативной трансформации?
-
19-09-2019 - |
Вопрос
Я ищу библиотеку, которая позволила бы мне синхронизировать текст в режиме реального времени между несколькими пользователями (например, Документы Google).
Я наткнулся на Операционную трансформацию, которая, кажется, соответствует моим потребностям.При этом я понимаю суть ОТ, но не математику и не реализацию ОТ.
Таким образом, мне было интересно, существует ли библиотека Javascript с возможностью перетаскивания, которая могла бы подключаться к текстовой области, генерировать преобразования, а затем позволять мне применять эти преобразования к другому клиенту?
(Я получил исходный код Etherpad, но не могу разобраться в нем.Если кто-нибудь подскажет, как можно использовать реализацию OT в Etherpad, это тоже будет здорово!)
Решение
Я думаю, что некоторые части реализации OT Google Wave имеют открытый исходный код (и в будущем появятся новые части).
Я не уверен, что это то, что вы ищете, но альтернативой ОТ является Дифференциальная синхронизация:
- Google-Diff-Match-Patch — библиотеки различий, совпадений и исправлений для обычного текста: "Библиотеки Diff Match и Patch предлагают надежные алгоритмы для выполнения операций, необходимых для синхронизации обычного текста."
- Google-MobWrite — служба синхронизации и совместной работы в реальном времени: "MobWrite преобразует формы и веб-приложения в среды для совместной работы.Создайте простую однопользовательскую систему, добавьте одну строчку JavaScript и мгновенно получите совместную систему." (Использует Google-Diff-Match-Patch.)
Другие советы
Один из бывших инженеров Wave выпустил реализацию Coffeescript своего алгоритма совместного редактирования под названием ShareJS, который теперь называется ShareDB.
Я суммирую найденные мной решения.
Операционная трансформация:Например.
- Гугл Вейв ОТ.Подход основан на так называемом подходе Юпитера.
- ShareJs.Основан на том же алгоритме OT, что и Google Wave OT.
- Coweb-jsoe.На основе COT — очень сложного подхода OT, который также поддерживает распространение сообщений p2p.
- OpenCoweb.Он использует OpenCoweb-jsoe, чтобы предоставить полноценную платформу для решения множества подобных задач.
- OT.js основан на типах операций ShareJs.
- ДискSDK.Очень интересный 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 CRDT
- CRDT Еще одна реализация CRDT
- Автослияние
Библиотеки ОТ:
В проекте веб-сокета HWIOS я успешно использовал комбинацию обоих (py-infinote на стороне сервера, jinfinote на стороне клиента) для синхронизации состояний документа.
Библиотека ot.js https://github.com/Operational-Transformation/ot.js может быть полезно для многопользовательских сценариев.
Решения этой проблемы «под ключ» или «перетаскивания» на самом деле не существовало из-за сложности надежной синхронизации общего изменяемого состояния.Ответ dmonad представляет собой достойный обзор, и я опубликовал более актуальный обзор доступных решений. здесь.
Этот вопрос довольно старый, но Конвергенция (отказ от ответственности:Я основатель) предоставляет наиболее готовое решение, обеспечивающее не только синхронизацию данных, но и множество других API, полезных для создания совместного пользовательского интерфейса. Вот пример показывая именно то, что вы просили:синхронизация текстового поля между несколькими клиентами.
В противном случае, ShareDB — отличное решение с открытым исходным кодом, которое отвечает потребностям многих людей.
Также ознакомьтесь с этими библиотеками Javascript:
- https://github.com/vitotafuni/JSOTTEST < Реализация Javascript на стороне клиента
- https://github.com/fitzgen/operational-transformation-example < Реализация клиента/сервера Node JS
С клиентской библиотекой js (Strope.js) вы можете использовать бесплатный сервер XMPP (например, jabber.org) вместе с моей клиентской библиотекой OT (JSOTTEST) для создания полноценной клиент-серверной системы.
Я отправлю исходный код демонстрационной системы клиент-серверного чата, когда у меня будет время пересмотреть код.
В Npm есть несколько хороших библиотек для node.js:
- https://npmjs.org/package/ot -- встроенные адаптеры для codemirror и ace, а также реализация клиента и сервера
- https://npmjs.org/package/changesets -- обычная библиотека, которую можно использовать в узле и браузере;позволяет вам создавать «наборы изменений» (по сути, различия), которые вы можете отправлять, преобразовывать друг против друга и применять к документу.
Вы могли бы поговорить с ребятами в Седанет.Хотя Ceda имеет закрытый исходный код, и на их веб-сайте нет бесплатной пробной версии.Я участвовал в разработке Ceda и продолжаю работать с ней в коммерческих проектах, поэтому, возможно, смогу предоставить некоторые отзывы/советы, если вы пойдете по этому пути.
Я считаю, что etherpad.org с etherpad lite превосходит другие решения.
Мы создаем редактор для совместной работы, который сочетает в себе оперативное преобразование и управление версиями.Таким образом, мы можем поддерживать как оффлайн, так и онлайн-сотрудничество.Вчера мы выпустили нашу собственную библиотеку OT как часть нашего стека с открытым исходным кодом.
http://interior.substance.io/modules/operator.html
Мы также предоставили библиотеку для управления версиями.
Я написал небольшую unixy-библиотеку (делай одно дело и делай это хорошо), которая реализует уровень управления OT, позволяя подключать различные типы OT (поддерживает все типы, совместимые с ShareJS).Он похож на ShareJS, но менее самоуверенный и более абстрактный.