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


102

Я шукаю бібліотеку, яка б дозволила мені синхронізувати текст у режимі реального часу між кількома користувачами (ала Google Документи).

Я натрапив на оперативну трансформацію, яка, здається, відповідає моїм потребам. Сказавши це, я розумію суть ОТ, але не математику, ні реалізацію ОТ.

Таким чином, мені було цікаво, чи існує бібліотека JavaScript JavaScript drag'n'drop, яка би зачепилася в текстову область, створила перетворення, а потім дозволила мені застосувати ці перетворення на іншому клієнті?

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


Спільний текстовий редактор, що працює на базі Firepad під назвою Firepad - firepad.io Перевірте код, щоб отримати трохи натхнення github.com/FirebaseExtended/firepad
Tharanga Hewavithana

Відповіді:


57

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

Я не впевнений, що це те, що ви шукаєте, але альтернативою ОТ є диференціальна синхронізація :


6
Diff-Match-Patch у поєднанні з документом про диференційну синхронізацію Ніла Фрейзьє ( neil.fraser.name/writing/sync ) зробив свою справу ! Велике спасибі за те, що спрямували мене в правильному напрямку.
gamers2000

З того, що я розумію, Diff-Match-Patch, і за розширенням, MobWrite (оскільки останній використовує перший) підтримує лише текст, а не бінарні зміни. Однак є демонстрація співпраці з елементами HTML форми, що вказує на те, що вона не підтримує лише звичайний текст.
gamers2000

Будь-яка гарна новина на тему "і більше деталей надходить" після цієї відповіді?
bertie

3
Власне, Google-Diff-Match-Patch має на меті реалізувати альтернативний метод Оперативних трансформацій, який є диференціальною синхронізацією, щоб зрозуміти відмінності, якими ви можете прочитати документ Neil Fraser DS: neil.fraser.name/writing/sync (OT в цьому документі посилається на проходження події). Це два дуже різні методи.
Бенджа

5
це старе, але якщо ви не заперечуєте, я відкрив github.com/benjamine/JsonDiffPatch, він використовує Ніл Diff-Match-Patch для довгих рядків, але він працює для арбітражних js-об'єктних графіків
Бенджа

44

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


1
ShareJS, ймовірно, простіший і краще задокументований та більш багаторазовий, ніж те, що робить MobWrite з Google Diff and Patch від Google.
Люк Стенлі

33

Я підсумую знайдені рішення.

  • Операційна трансформація: Напр

    • Google Wave OT. Підхід заснований на так званому підході Юпітера.
    • ShareJs. На основі того ж алгоритму ОТ, що і Google Wave OT.
    • Coweb-jsoe. На основі COT - дуже складний підхід OT, який також підтримує поширення повідомлень p2p.
    • OpenCoweb. Він використовує OpenCoweb-jsoe, щоб забезпечити повноцінний фреймворк для багатьох подібних проблем.
    • OT.js заснований на типах операцій ShareJs.
    • DriveSDK. Дуже цікавий API, який може зробити багато чого - наприклад, співпрацю над графіками.
    • SwellRT - це вилка хвилі Apache. Є федерацією і підтримує насичений текст.
  • Диференціальна синхронізація:

    • Патч "Diff-Match-Patch" від Ніла Фрейзера.
    • MobWrite використовує алгоритм Diff-Match-Patch.
  • CRDT ( тип комунікативного тиражуваного даних):

    • Існує маса різних алгоритмів CRDT, які дозволяють реалізувати спільні типи. Деякі CRDT працюють з розповсюдженням P2P повідомлень, деякі покладаються на моделі клієнт-сервер
    • Так дозволяє ділитися довільними типами даних (RichText, Array, Hash Maps, .. розширювані). Офлайн-підтримка та підтримка протоколів зв'язку P2P (є модулі для XMPP, Websockets та WebRTC)
    • SwarmJS Client-спільна база даних з автономною підтримкою. Добре працює з React
    • Woot Впровадження CRDT Woot
    • CRDT Ще одна реалізація CRDT
    • Automerge

API Google Drive використовує ОТ, а не DS. developers.google.com/drive/realtime/conflict-resolution
Mathias Bak




4

Рішення цієї проблеми «під ключ», або «перетягування», насправді не існувало через складність надійно синхронізованої загальнозміненого стану. Відповідь dmonad - це гідний перелік, і я опублікував більш сучасний огляд доступних рішень тут .

Це питання досить старе, але конвергенція (відмова від відповідальності: я є засновником) пропонує найбільш підключене під ключ рішення, що забезпечує не просто синхронізацію даних, а й безліч інших API, корисних для створення спільної UX. Ось приклад, який показує саме те, що ви запитували: синхронізація текстового поля для кількох клієнтів.

В іншому випадку ShareDB - це чудове рішення з відкритим кодом, яке відповідає великим потребам людей.



2

За допомогою lib-клієнта js (Strophe.js) ви можете використовувати безкоштовний XMPP-сервер (наприклад, jabber.org) разом з моєю клієнтською лівою OT (JSOTTEST) для створення повноцінної системи клієнт-сервер.

Я надішлю src демо-системи чату-клієнта-сервера, коли встигну переглянути код.


1
Майже два роки тому ви пишете "Я надішлю src демонстрації ...". Ви коли-небудь закінчували цю демонстрацію?
Брайан Оуклі

Вибачте ... але я не мав часу випустити публічну демонстрацію! Однак це дуже просто, використовуючи Bosh lib для php !! до побачення
користувач981836

2

У Npm є кілька приємних бібліотек для node.js:

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

1

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


1

Я річ etherpad.org з etherpad lite перевершує інші рішення.


1
Чи зможете ви обґрунтувати перевагу etherpad деяким прикладом?
DL Нарасимхан

1

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

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

Ми також створили бібліотеку для версій.

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


1

Я написав невелику бібліотеку unixy (зробіть одне і зробіть це добре), яка реалізує рівень керування OT, що дозволяє вам підключати різні типи OT (підтримує всі типи сумісних з ShareJS). Це схоже на shareJS, але менш самовпевнене та більш абстрактне.

https://github.com/marcelklehr/gulf

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.