Bibliothèque de transformation opérationnelle?

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

Je suis tombé sur la transformation opérationnelle, qui semble correspondre à 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 existait une bibliothèque Javascript drag’n’drop qui serait connectée à une zone de texte, génèrerait les transformations, puis me permettrait d’appliquer ces transformations à un autre client?

(J’ai obtenu la source Etherpad, mais je ne peux pas en tirer parti. Si quelqu’un pouvait indiquer comment exploiter l’implémentation OT d’Etherpad, ce serait génial aussi!)

Je pense que certaines parties de l’implémentation d’OT de Google Wave sont Open Source (et que d’autres parties sont à venir).

Je ne suis pas sûr si c’est ce que vous recherchez, mais une alternative à OT est la synchronisation différentielle :

  • Bibliothèques Diff-Match-Patch – Diff, Match et Patch pour le texte brut : ” Les bibliothèques Diff Match et Patch offrent des algorithmes robustes pour effectuer les opérations nécessaires à la synchronisation du texte brut.
  • Google-MobWrite – Service de synchronisation et de collaboration en temps réel : « MobWrite convertit les formulaires et les applications Web en environnements collaboratifs. Créez un système mono-utilisateur simple, ajoutez une ligne JavaScript et obtenez instantanément un système collaboratif. » (Utilise Google-Diff -Match-Patch.)

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

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

  • Transformation opérationnelle: par exemple

    • 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 de nombreux problèmes similaires.
    • OT.js est basé sur les types d’opération des ShareJs.
    • DriveSDK. Une API très intéressante qui peut faire beaucoup de choses – par exemple la collaboration sur des graphiques.
    • SwellRT est une fourche de Apache Wave. Est fédéré et prend en charge le texte enrichi.
  • Synchronisation différentielle:

    • Diff-Match-Patch de Neil Fraser.
    • MobWrite exploite l’algorithme Diff-Match-Patch.
  • CRDT (Commutative Replicated Data Type):

    • Il existe de nombreux algorithmes CRDT permettant l’implémentation 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, .. extensibles). Prise en charge et support hors ligne des protocoles de communication P2P (il existe des modules pour XMPP, Websockets et WebRTC)
    • Base de données partagée SwarmJS Client Server avec un support hors ligne. Fonctionne bien avec React
    • Woot Une implémentation du WD CRDT
    • CRDT Autre implémentation CRDT
    • Automerge

Bibliothèques d’OT:

Dans le cadre du projet websocket HWIOS, j’ai utilisé avec succès une combinaison des deux (py-infinote sur le côté serveur, jinfinote chez clientside) pour synchroniser les états des documents.

La bibliothèque ot.js https://github.com/Operational-Transformation/ot.js peut être utile pour les scénarios multi-utilisateurs.

Les solutions clé en main ou “glisser-déposer” à ce problème n’ont pas vraiment existé 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 actuel des solutions disponibles ici .

Cette question est assez ancienne, mais Convergence (avertissement: je suis un fondateur) fournit la solution la plus clé en main, fournissant non seulement la synchronisation des données, mais aussi une multitude d’autres API utiles pour la création d’un UX collaboratif. 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.

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

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

Npm a quelques belles bibliothèques pour node.js:

  • https://npmjs.org/package/ot – des adaptateurs pour codemirror et ace intégrés ainsi qu’une implémentation client et serveur
  • https://npmjs.org/package/changesets – une bibliothèque simple utilisable dans le noeud et le navigateur; vous permet de créer des «changesets» (essentiellement des différences) que vous pouvez envoyer, transformer les uns contre les autres et appliquer sur un document

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. Je me suis impliqué dans le développement de Ceda et je continue à travailler avec lui dans le cadre de projets commerciaux. Je serai donc en mesure de vous fournir des commentaires / conseils si vous vous engagez dans cette voie.

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

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

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

Nous avons également consortingbué à une bibliothèque pour la gestion des versions.

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

J’ai écrit une petite bibliothèque unixy (faites une chose et faites-le bien) qui implémente une couche de contrôle OT, vous permettant de twigr différents types d’OT (supporte tous les types compatibles avec shareJS). C’est similaire à shareJS mais moins avisé et plus abstrait.

https://github.com/marcelklehr/gulf