Biblioteka transformacji operacyjnej?

103

Szukam biblioteki, która pozwoliłaby mi synchronizować tekst w czasie rzeczywistym pomiędzy wieloma użytkownikami (ala Google Docs).

Natknąłem się na Operacyjną Transformację, która wydaje się pasować do moich potrzeb. Powiedziawszy to, rozumiem istotę OT, ale nie rozumiem matematyki ani implementacji OT.

Dlatego zastanawiałem się, czy istnieje biblioteka Javascript typu drag'n'drop, która łączyłaby się z obszarem tekstowym, generowała transformacje, a następnie pozwalała mi zastosować te transformacje na innym kliencie?

(Mam źródło Etherpada, ale nie mogę z tego zrobić głowy ani ogonów. Jeśli ktoś mógłby wskazać, jak wykorzystać implementację OT Etherpada, to też będzie świetne!)

gracze2000
źródło
Współpracujący edytor tekstu oparty na Firebase o nazwie Firepad - firepad.io Sprawdź kod, aby uzyskać inspirację github.com/FirebaseExtended/firepad
Tharanga Hewavithana

Odpowiedzi:

57

Myślę, że części implementacji Google Wave OT to Open Source (i będzie ich więcej).

Nie jestem pewien, czy tego właśnie szukasz, ale alternatywą dla OT jest Synchronizacja Różnicowa :

Jörg W Mittag
źródło
6
Diff-Match-Patch, w połączeniu z papierem do synchronizacji różnicowej Neila Frasiera ( neil.fraser.name/writing/sync ) załatwiło sprawę ! Wielkie dzięki za wskazanie mi właściwego kierunku.
gracze2000
Z tego, co rozumiem, Diff-Match-Patch, a co za tym idzie, MobWrite (ponieważ ten ostatni używa pierwszego) obsługuje tylko tekst, a nie zmiany binarne. Istnieje jednak demonstracja współpracy z elementami formularza HTML, która wskazuje, że obsługuje ona nie tylko zwykły tekst.
gracze2000
Jakieś dobre wieści na temat „i więcej części nadchodzi” od czasu tej odpowiedzi?
bertie
3
W rzeczywistości Google-Diff-Match-Patch ma na celu zaimplementowanie metody alternatywnej do transformacji operacyjnych, czyli synchronizacji różnicowej, aby zrozumieć różnice, które można przeczytać w dokumencie Neil Fraser DS: neil.fraser.name/writing/sync (OT w tym dokumencie jest określane jako zaliczenie zdarzenia). Są to dwie bardzo różne metody.
Benja,
5
to jest stare, ale jeśli masz na to ochotę, otworzyłem github.com/benjamine/JsonDiffPatch , używa on Diff-Match-Patch Neila dla długich ciągów, ale działa dla grafów obiektów arbritrary js
Benja
44

Jeden z byłych inżynierów Wave wydał implementację Coffeescript swojego wspólnego algorytmu edycji o nazwie ShareJS, teraz o nazwie ShareDB .

Sokole Oko
źródło
1
ShareJS jest prawdopodobnie prostsze, lepiej udokumentowane i bardziej wielokrotnego użytku niż to, co robi MobWrite z Google Diff and Patch.
Luke Stanley
36

Podsumuję znalezione rozwiązania.

  • Transformacja operacyjna: np

    • Google Wave OT. Podejście oparte jest na tzw. Podejściu Jowisza.
    • UdostępnijJs. Oparty na tym samym algorytmie OT, co Google Wave OT.
    • Coweb-jsoe. Oparty na COT - bardzo wyrafinowanym podejściu OT, które obsługuje również propagację wiadomości p2p.
    • OpenCoweb. Wykorzystuje OpenCoweb-jsoe w celu zapewnienia pełnoprawnego środowiska dla wielu podobnych problemów.
    • OT.js jest oparty na typach operacji ShareJs.
    • DriveSDK. Bardzo ciekawe API, które potrafi wiele rzeczy - np. Współpracę przy grafach.
    • SwellRT to rozwidlenie Apache Wave. Jest stowarzyszony i obsługuje tekst sformatowany.
  • Synchronizacja różnicowa:

    • Diff-Match-Patch od Neila Frasera.
    • MobWrite wykorzystuje algorytm Diff-Match-Patch.
  • CRDT (przemienny replikowany typ danych):

    • Istnieje wiele różnych algorytmów CRDT, które pozwalają na implementację typów współdzielonych. Niektóre CRDT działają z propagacją wiadomości P2P, inne opierają się na modelach klient-serwer
    • Yjs umożliwia udostępnianie dowolnych typów danych (RichText, Array, Hash Maps,… rozszerzalne). Obsługa offline i obsługa protokołów komunikacyjnych P2P (istnieją moduły dla XMPP, Websockets i WebRTC)
    • Współużytkowana baza danych serwera SwarmJS Client z obsługą trybu offline. Działa dobrze z React
    • Woot Implementacja Woot CRDT
    • CRDT Kolejna implementacja CRDT
    • Automerge
dmonad
źródło
Google Drive API korzysta z OT, a nie DS. developers.google.com/drive/realtime/conflict-resolution
Mathias Bak
4

Rozwiązania tego problemu „pod klucz” lub „przeciągnij i upuść” tak naprawdę nie istniały ze względu na złożoność niezawodnej synchronizacji współdzielonego stanu zmiennego. Odpowiedź dmonad jest przyzwoity Roundup, a ja napisali przegląd bardziej up-to-date z dostępnych rozwiązań tutaj .

To pytanie jest dość stare, ale Convergence (zrzeczenie się: jestem założycielem) zapewnia najbardziej gotowe rozwiązanie, zapewniające nie tylko synchronizację danych, ale także wiele innych interfejsów API przydatnych do tworzenia wspólnego UX. Oto przykład pokazujący dokładnie to, o co prosiłeś: synchronizację pola tekstowego na wielu klientach.

W przeciwnym razie ShareDB to świetne rozwiązanie typu open source, które pasuje do potrzeb wielu ludzi.

alalonde
źródło
2

Z biblioteką klienta js (Strophe.js) możesz użyć darmowego serwera XMPP (takiego jak jabber.org) wraz z moją biblioteką OT po stronie klienta (JSOTTEST), aby zbudować kompletny system klient-serwer.

Prześlę źródło demonstracyjnego systemu czatu klient-serwer, gdy będę miał czas na poprawienie kodu.

user981836
źródło
1
Prawie dwa lata temu piszesz "Prześlę src dema ...". Skończyłeś kiedyś to demo?
Bryan Oakley,
Przepraszam ... ale nie miałem czasu, aby opublikować publiczne demo! Jednak użycie Bosh lib dla php jest bardzo proste !! do widzenia
użytkownik981836
2

Npm ma kilka fajnych bibliotek OT dla node.js:

  • https://npmjs.org/package/ot - wbudowane adaptery do codemirror i ace oraz implementacja klienta i serwera
  • https://npmjs.org/package/changesets - zwykła biblioteka ot do użytku w węźle i przeglądarce; pozwala na budowanie 'zestawów zmian' (zasadniczo różnic), które można przesyłać, przekształcać względem siebie i stosować w dokumencie
Gość
źródło
1

Możesz porozmawiać z chłopakami z Cedanet . Chociaż Ceda jest zamkniętym źródłem i na ich stronie internetowej nie jest dostępna bezpłatna wersja próbna. Byłem zaangażowany w rozwój Cedy i nadal pracuję z nim w projektach komercyjnych, więc jeśli pójdziesz tą ścieżką, być może będę mógł przekazać opinię / radę.

Daniel Paull
źródło
1

Uważam, że etherpad.org z etherpad lite jest lepszy od innych rozwiązań.

gorn
źródło
1
Czy byłbyś w stanie uzasadnić wyższość etherpada na jakimś przykładzie?
DL Narasimhan
1

Napisałem małą bibliotekę unixy (zrób jedną rzecz i zrób to dobrze), która implementuje warstwę kontrolną OT, umożliwiając podłączenie różnych typów OT (obsługuje wszystkie typy zgodne z shareJS). Jest podobny do shareJS, ale mniej uparty i bardziej abstrakcyjny.

https://github.com/marcelklehr/gulf

Marcel Klehr
źródło