Bibliothèque de transformation opérationnelle?

102

Je recherche une bibliothèque qui me permettrait de synchroniser du texte en temps réel entre plusieurs utilisateurs (ala Google Docs).

Je suis tombé sur la transformation opérationnelle, qui semble répondre à mes besoins. Cela dit, je comprends l'essentiel de l'OT, mais pas les mathématiques ni la mise en œuvre de l'OT.

Ainsi, je me demandais s'il y avait une bibliothèque Javascript drag'n'drop qui s'accrocherait à une zone de texte, générerait les transformations, puis me permettrait d'appliquer ces transformations sur un autre client?

(J'ai obtenu la source Etherpad, mais je ne peux pas m'en sortir. Si quelqu'un pouvait expliquer comment tirer parti de l'implémentation OT d'Etherpad, ce sera bien aussi!)

gamers2000
la source
Éditeur de texte collaboratif alimenté par Firebase appelé Firepad - firepad.io Vérifiez le code pour vous inspirer github.com/FirebaseExtended/firepad
Tharanga Hewavithana

Réponses:

57

Je pense que certaines parties de la mise en œuvre OT de Google Wave sont Open Source (et d'autres parties sont à venir).

Je ne sais pas si c'est ce que vous recherchez, mais une alternative à OT est la synchronisation différentielle :

Jörg W Mittag
la source
6
Diff-Match-Patch, combiné avec l'article sur la synchronisation différentielle de Neil Frasier ( neil.fraser.name/writing/sync ) a fait l'affaire! Merci beaucoup de m'avoir orienté dans la bonne direction.
gamers2000
D'après ce que je comprends, Diff-Match-Patch, et par extension, MobWrite (puisque ce dernier utilise le premier) ne prend en charge que le texte, pas les modifications binaires. Cependant, il existe une démonstration de collaboration avec des éléments de formulaire HTML, ce qui indiquerait qu'il ne prend pas uniquement en charge le texte brut.
gamers2000
Y a-t-il de bonnes nouvelles sur "et plus de pièces arrivent" depuis cette réponse?
bertie
3
En fait, Google-Diff-Match-Patch vise à implémenter la méthode alternative aux transformations opérationnelles, qui est la synchronisation différentielle, pour comprendre les différences que vous pouvez lire le document Neil Fraser de DS: neil.fraser.name/writing/sync (OT est référencé dans ce document en tant que passage d'événement). Ce sont deux méthodes très différentes.
Benja
5
c'est vieux, mais au cas où cela vous dérangerait, j'ai open source github.com/benjamine/JsonDiffPatch il utilise Diff-Match-Patch de Neil pour les longues chaînes, mais cela fonctionne pour les graphiques d'objets arbritrary js
Benja
44

L'un des anciens ingénieurs de Wave a publié une implémentation Coffeescript de son algorithme d'édition collaboratif appelé ShareJS, maintenant nommé ShareDB .

oeil de faucon
la source
1
ShareJS est probablement plus simple et mieux documenté et plus réutilisable que ce que MobWrite fait avec le Diff and Patch de Google.
Luke Stanley
33

Je vais résumer les solutions que j'ai trouvées.

  • Transformation opérationnelle: par ex.

    • Google Wave OT. L'approche est basée sur l'approche dite de Jupiter.
    • ShareJs. Basé sur le même algorithme OT que Google Wave OT.
    • Coweb-jsoe. Basé sur COT - une approche OT très sophistiquée qui prend également en charge la propagation des messages p2p.
    • OpenCoweb. Il exploite OpenCoweb-jsoe afin de fournir un cadre complet pour un grand nombre de problèmes similaires.
    • OT.js est basé sur les types d'opération de ShareJs.
    • DriveSDK. Une API très intéressante qui peut faire beaucoup de choses - par exemple la collaboration sur des graphiques.
    • SwellRT est un Fork d'Apache Wave. Is est fédéré et prend en charge le texte enrichi.
  • Synchronisation différentielle:

    • Diff-Match-Patch de Neil Fraser.
    • MobWrite utilise l'algorithme Diff-Match-Patch.
  • CRDT (type de données répliquées commutatives):

    • Il existe de nombreux algorithmes CRDT différents qui permettent la mise en œuvre de types partagés. Certains CRDT fonctionnent avec la propagation de messages P2P, certains reposent sur des modèles client-serveur
    • Yjs vous permet de partager des types de données arbitraires (RichText, Array, Hash Maps, .. extensible). Prise en charge hors ligne et prise en charge des protocoles de communication P2P (il existe des modules pour XMPP, Websockets et WebRTC)
    • Base de données partagée du serveur SwarmJS Client avec prise en charge hors ligne. Fonctionne bien avec React
    • Woot Une implémentation du Woot CRDT
    • CRDT Une autre implémentation du CRDT
    • Automerge
dmonad
la source
L'API Google Drive utilise OT et non DS. développeurs.google.com
drive/realtime/
4

Les solutions clés en main ou «glisser-déposer» à ce problème n'existaient pas vraiment en raison de la complexité de la synchronisation fiable de l'état mutable partagé. La réponse de dmonad est un tour d'horizon décent, et j'ai posté un aperçu plus à jour des solutions disponibles ici .

Cette question est assez ancienne, mais Convergence (clause de non-responsabilité: je suis un fondateur) fournit la solution la plus clé en main, fournissant non seulement la synchronisation des données, mais une foule d'autres API utiles pour créer une UX collaborative. Voici un exemple montrant exactement ce que vous avez demandé: la synchronisation d'un champ de texte sur plusieurs clients.

Sinon, ShareDB est une excellente solution open source qui répond à de nombreux besoins.

Alalonde
la source
2

Avec une bibliothèque client js (Strophe.js), vous pouvez utiliser un serveur XMPP gratuit (comme jabber.org) avec ma bibliothèque OT côté client (JSOTTEST) pour construire un système client-serveur complet.

Je soumettrai le src d'un système de discussion client-serveur de démonstration lorsque j'aurai le temps de réviser le code.

user981836
la source
1
Il y a presque deux ans, vous écrivez "Je vais soumettre le src d'une démo ..." Avez-vous déjà terminé cette démo?
Bryan Oakley
Désolé ... mais je n'ai pas eu le temps de sortir une démo publique! Cependant, il est très simple d'utiliser Bosh lib pour php !! bye
user981836
2

Npm a de belles bibliothèques ot pour node.js:

  • https://npmjs.org/package/ot - adaptateurs pour codemirror et ace intégrés ainsi qu'une implémentation client et serveur
  • https://npmjs.org/package/changesets - bibliothèque plain ot utilisable dans le nœud et le navigateur; vous permet de créer des 'changesets' (essentiellement des différences) que vous pouvez envoyer, transformer les uns par rapport aux autres et appliquer sur un document
client
la source
1

Vous pourriez parler aux gars de Cedanet . Bien que Ceda soit une source fermée et qu'aucun essai gratuit ne soit disponible sur leur site Web. J'ai été impliqué dans le développement de Ceda et je continue à travailler avec lui dans des projets commerciaux, donc je pourrais peut-être fournir des commentaires / conseils si vous vous dirigez dans cette voie.

Daniel Paull
la source
1

Je pense que etherpad.org avec etherpad lite est supérieur aux autres solutions.

gorn
la source
1
Seriez-vous capable de prouver la supériorité d'Etherpad avec un exemple?
DL Narasimhan
1

Nous construisons un éditeur collaboratif qui combine la transformation opérationnelle et la gestion des versions. De cette façon, nous pouvons prendre en charge les collaborations hors ligne et en ligne. Nous avons publié notre propre bibliothèque OT hier dans le cadre de notre pile open source.

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

Nous avons également fourni une bibliothèque pour le contrôle des versions.

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

Michael
la source
1

J'ai écrit une petite bibliothèque unixy (faites une chose et faites-la bien) qui implémente une couche de contrôle OT, vous permettant de brancher différents types OT (prend en charge tous les types compatibles shareJS). C'est similaire à shareJS mais moins opiniâtre et plus abstrait.

https://github.com/marcelklehr/gulf

Marcel Klehr
la source