Operative Transformationsbibliothek?

102

Ich suche nach einer Bibliothek, mit der ich Text in Echtzeit zwischen mehreren Benutzern synchronisieren kann (z. B. Google Text & Tabellen).

Ich bin auf Operational Transformation gestoßen, die meinen Bedürfnissen zu entsprechen scheint. Trotzdem verstehe ich den Kern von OT, aber nicht die Mathematik oder Implementierung von OT.

Daher habe ich mich gefragt, ob es eine Drag'n'Drop-Javascript-Bibliothek gibt, die sich in einen Textbereich einfügt, die Transformationen generiert und mir dann erlaubt, diese Transformationen auf einen anderen Client anzuwenden.

(Ich habe die Etherpad-Quelle erhalten, aber ich kann weder Kopf noch Zahl daraus machen. Wenn jemand darauf hinweisen könnte, wie er die OT-Implementierung von Etherpad nutzen kann, ist das auch großartig!)

gamers2000
quelle
Collaborative Texteditor bereitgestellt von Firebase genannt Firepad - firepad.io den Code überprüfen , um Inspiration zu bekommen github.com/FirebaseExtended/firepad
Tharanga Hewavithana

Antworten:

57

Ich denke, dass Teile der OT-Implementierung von Google Wave Open Source sind (und weitere Teile kommen).

Ich bin mir nicht sicher, ob Sie danach suchen, aber eine Alternative zu OT ist die differenzielle Synchronisierung :

Jörg W Mittag
quelle
6
Diff-Match-Patch, kombiniert mit dem Differential Synchronization Paper von Neil Frasier ( neil.fraser.name/writing/sync ) hat es geschafft! Vielen Dank, dass Sie mich in die richtige Richtung weisen.
Gamers2000
Soweit ich weiß, unterstützt Diff-Match-Patch und im weiteren Sinne MobWrite (da letzteres das erstere verwendet) nur Text, keine binären Änderungen. Es gibt jedoch eine Demo der Zusammenarbeit mit HTML-Formularelementen, die darauf hinweist, dass nicht nur einfacher Text unterstützt wird.
Gamers2000
Gibt es seit dieser Antwort gute Nachrichten zu "und weitere Teile kommen"?
Bertie
3
Tatsächlich zielt Google-Diff-Match-Patch darauf ab, die alternative Methode zu Operational Transformations zu implementieren, die Differential Synchronization, um die Unterschiede zu verstehen, die Sie im Neil Fraser-Dokument von DS lesen können: neil.fraser.name/writing/sync (OT wird in diesem Dokument als Ereignisübergabe bezeichnet. Sie sind zwei sehr unterschiedliche Methoden.
Benja
5
Das ist alt, aber für den Fall, dass es Ihnen etwas ausmacht, ich habe github.com/benjamine/JsonDiffPatch geöffnet. Es verwendet Neils Diff-Match-Patch für lange Strings, aber es funktioniert für arbritrary js Objektgraphen
Benja
44

Einer der Ex-Wave-Ingenieure hat eine Coffeescript-Implementierung seines kollaborativen Bearbeitungsalgorithmus namens ShareJS veröffentlicht, der jetzt ShareDB heißt .

Falkenauge
quelle
1
ShareJS ist wahrscheinlich einfacher und besser dokumentiert und wiederverwendbarer als das, was MobWrite mit Google Diff und Patch macht.
Luke Stanley
33

Ich werde die Lösungen zusammenfassen, die ich gefunden habe.

  • Operative Transformation: ZB

    • Google Wave OT. Der Ansatz basiert auf dem sogenannten Jupiter-Ansatz.
    • ShareJs. Basierend auf demselben OT-Algorithmus wie Google Wave OT.
    • Coweb-jsoe. Basierend auf COT - einem sehr ausgeklügelten OT-Ansatz, der auch die Weitergabe von P2P-Nachrichten unterstützt.
    • OpenCoweb. Es nutzt OpenCoweb-jsoe, um ein vollwertiges Framework für viele ähnliche Probleme bereitzustellen.
    • OT.js basiert auf den Operationstypen von ShareJs.
    • DriveSDK. Eine sehr interessante API, die viele Dinge tun kann - z. B. die Zusammenarbeit an Diagrammen.
    • SwellRT ist eine Gabelung von Apache Wave. Is ist ein Verbund und unterstützt Rich Text.
  • Differenzielle Synchronisation:

    • Diff-Match-Patch von Neil Fraser.
    • MobWrite nutzt den Diff-Match-Patch-Algorithmus.
  • CRDT (Commutative Replicated Data Type):

    • Es gibt viele verschiedene CRDT-Algorithmen, die die Implementierung gemeinsam genutzter Typen ermöglichen. Einige CRDTs arbeiten mit der Weitergabe von P2P-Nachrichten, andere basieren auf Client-Server-Modellen
    • Mit Yjs können Sie beliebige Datentypen (RichText, Array, Hash Maps, .. erweiterbar) gemeinsam nutzen. Offline-Unterstützung und Unterstützung für P2P-Kommunikationsprotokolle (es gibt Module für XMPP, Websockets und WebRTC)
    • Freigegebene Datenbank des SwarmJS- Client-Servers mit Offline-Unterstützung. Funktioniert gut mit React
    • Woot Eine Implementierung des Woot CRDT
    • CRDT Eine weitere CRDT-Implementierung
    • Automerge
dmonad
quelle
Die Google Drive-API verwendet OT und nicht DS. developer.google.com/drive/realtime/conflict-resolution
Mathias Bak
4

Schlüsselfertige oder "Drag & Drop" -Lösungen für dieses Problem gab es aufgrund der Komplexität der zuverlässigen Synchronisierung des gemeinsam genutzten veränderlichen Status nicht wirklich. dmonad Antwort ist ein anständiger Roundup, und ich schrieb einen mehr up-to-date Überblick über die verfügbaren Lösungen hier .

Diese Frage ist ziemlich alt, aber Convergence (Haftungsausschluss: Ich bin ein Gründer) bietet die schlüsselfertigste Lösung auf dem Markt und bietet nicht nur Datensynchronisation, sondern auch eine Vielzahl anderer APIs, die für den Aufbau einer kollaborativen UX nützlich sind. Hier ist ein Beispiel, das genau zeigt, was Sie angefordert haben: Synchronisierung eines Textfelds über mehrere Clients hinweg.

Ansonsten ist ShareDB eine großartige Open-Source-Lösung, die den Bedürfnissen vieler Menschen gerecht wird.

Alalonde
quelle
2

Mit einer js-Client-Bibliothek (Strophe.js) können Sie einen kostenlosen XMPP-Server (wie jabber.org) zusammen mit meiner clientseitigen OT-Bibliothek (JSOTTEST) verwenden, um ein vollständiges Client-Server-System zu erstellen.

Ich werde den Quellcode eines Demo-Client-Server-Chat-Systems senden, wenn ich Zeit habe, den Code zu überarbeiten.

user981836
quelle
1
Vor fast zwei Jahren schreibst du "Ich werde den src einer Demo einreichen ...". Hast du diese Demo jemals beendet?
Bryan Oakley
Entschuldigung ... aber ich hatte keine Zeit, eine öffentliche Demo zu veröffentlichen! Es ist jedoch sehr einfach, Bosh lib für PHP zu verwenden !! bye
user981836
2

Npm hat einige nette Bibliotheken für node.js:

  • https://npmjs.org/package/ot - Adapter für Codemirror und Ace sowie eine Client- und Server-Implementierung
  • https://npmjs.org/package/changesets - einfache Bibliothek, die im Knoten und im Browser verwendet werden kann; Mit dieser Option können Sie "Änderungssätze" (im Wesentlichen Unterschiede) erstellen, die Sie versenden, gegeneinander transformieren und auf ein Dokument anwenden können
Gast
quelle
1

Sie könnten mit den Jungs von Cedanet sprechen . Obwohl Ceda eine geschlossene Quelle ist und auf ihrer Website keine kostenlose Testversion verfügbar ist. Ich war an der Entwicklung von Ceda beteiligt und arbeite weiterhin mit ihm in kommerziellen Projekten, sodass ich möglicherweise Feedback / Ratschläge geben kann, wenn Sie diesen Weg beschreiten.

Daniel Paull
quelle
1

Ich denke, etherpad.org mit etherpad lite ist anderen Lösungen überlegen.

gorn
quelle
1
Könnten Sie die Überlegenheit von Etherpad anhand eines Beispiels belegen?
DL Narasimhan
1

Ich habe eine kleine Unixy-Bibliothek geschrieben (machen Sie eine Sache und machen Sie es gut), die eine OT-Kontrollschicht implementiert, mit der Sie verschiedene OT-Typen anschließen können (unterstützt alle ShareJS-kompatiblen Typen). Es ist ähnlich wie shareJS, aber weniger eigensinnig und abstrakter.

https://github.com/marcelklehr/gulf

Marcel Klehr
quelle