¿Biblioteca de transformación operativa?

102

Estoy buscando una biblioteca que me permita sincronizar texto en tiempo real entre múltiples usuarios (ala Google Docs).

Me encontré con Operational Transformation, que parece satisfacer mis necesidades. Habiendo dicho eso, entiendo la esencia de OT, pero no las matemáticas ni la implementación de OT.

Por lo tanto, me preguntaba si había una biblioteca de JavaScript de arrastrar y soltar que se engancharía en un área de texto, generaría las transformaciones y luego me permitiría aplicar esas transformaciones en otro cliente.

(Obtuve la fuente de Etherpad, pero no puedo sacarle cabeza ni cruz. Si alguien pudiera señalar cómo aprovechar la implementación de OT de Etherpad, ¡eso también sería genial!)

jugadores2000
fuente
Editor de texto colaborativo con tecnología de Firebase llamado Firepad - firepad.io Verifique el código para inspirarse github.com/FirebaseExtended/firepad
Tharanga Hewavithana

Respuestas:

57

Creo que algunas partes de la implementación de OT de Google Wave son de código abierto (y vendrán más partes).

No estoy seguro de si esto es lo que está buscando, pero una alternativa a OT es la sincronización diferencial :

Jörg W Mittag
fuente
6
Diff-Match-Patch, combinado con el documento de sincronización diferencial de Neil Frasier ( neil.fraser.name/writing/sync ) hizo el truco. Muchas gracias por señalarme en la dirección correcta.
gamers2000
Por lo que entiendo, Diff-Match-Patch y, por extensión, MobWrite (ya que el último usa el primero) solo admite texto, no cambios binarios. Sin embargo, hay una demostración de colaboración con elementos de formulario HTML, lo que indicaría que no solo admite texto sin formato.
gamers2000
¿Alguna buena noticia sobre "y vienen más piezas" desde esta respuesta?
bertie
3
En realidad, Google-Diff-Match-Patch tiene como objetivo implementar el método alternativo a las transformaciones operativas, que es la sincronización diferencial, para comprender las diferencias puede leer el documento de Neil Fraser de DS: neil.fraser.name/writing/sync (OT se hace referencia en este documento como paso de evento). Son dos métodos muy diferentes.
Benja
5
esto es antiguo, pero en caso de que te importe , he abierto github.com/benjamine/JsonDiffPatch , usa el parche Diff-Match-Patch de Neil para cadenas largas, pero funciona para gráficos de objetos arbritrary js
Benja
44

Uno de los antiguos ingenieros de Wave ha lanzado una implementación de Coffeescript de su algoritmo de edición colaborativa llamado ShareJS, ahora llamado ShareDB .

ojo de halcón
fuente
1
ShareJS es probablemente más simple y mejor documentado y más reutilizable que lo que hace MobWrite con Diff and Patch de Google.
Luke Stanley
33

Resumiré las soluciones que encontré.

  • Transformación operativa: Ej.

    • Google Wave OT. El enfoque se basa en el llamado enfoque de Júpiter.
    • ShareJs. Basado en el mismo algoritmo de OT que Google Wave OT.
    • Coweb-jsoe. Basado en COT, un enfoque OT muy sofisticado que también admite la propagación de mensajes p2p.
    • OpenCoweb. Aprovecha OpenCoweb-jsoe para proporcionar un marco completo para muchos problemas similares.
    • OT.js se basa en los tipos de operación de ShareJs.
    • DriveSDK. Una API muy interesante que puede hacer muchas cosas, por ejemplo, colaboración en gráficos.
    • SwellRT es una bifurcación de Apache Wave. Está federado y admite texto enriquecido.
  • Sincronización diferencial:

    • Diff-Match-Patch de Neil Fraser.
    • MobWrite aprovecha el algoritmo Diff-Match-Patch.
  • CRDT (tipo de datos replicados conmutativos):

    • Hay muchos algoritmos CRDT diferentes que permiten la implementación de tipos compartidos. Algunos CRDT funcionan con la propagación de mensajes P2P, algunos se basan en modelos cliente-servidor
    • Yjs le permite compartir tipos de datos arbitrarios (RichText, Array, Hash Maps, .. extensible). Soporte sin conexión y soporte para protocolos de comunicación P2P (hay módulos para XMPP, Websockets y WebRTC)
    • Base de datos compartida del servidor de cliente SwarmJS con soporte fuera de línea. Funciona bien con React
    • Woot Una implementación del Woot CRDT
    • CRDT Otra implementación de CRDT
    • Automerge
dmonad
fuente
La API de Google Drive utiliza OT, no DS. developers.google.com/drive/realtime/conflict-resolution
Mathias Bak
4

Las soluciones "llave en mano" o "arrastrar y soltar" para este problema no han existido realmente debido a la complejidad de sincronizar de manera confiable el estado mutable compartido. La respuesta de dmonad es un resumen decente, y publiqué una descripción general más actualizada de las soluciones disponibles aquí .

Esta pregunta es bastante antigua, pero Convergence (descargo de responsabilidad: soy un fundador) proporciona la solución más llave en mano que existe, proporcionando no solo sincronización de datos, sino una serie de otras API útiles para construir una UX colaborativa. A continuación se muestra un ejemplo que muestra exactamente lo que solicitó: sincronización de un campo de texto en varios clientes.

De lo contrario, ShareDB es una excelente solución de código abierto que se adapta a las necesidades de muchas personas.

alalonde
fuente
2

Con una biblioteca de cliente js (Strophe.js), puede usar un servidor XMPP gratuito (como jabber.org) junto con mi biblioteca OT del lado del cliente (JSOTTEST) para construir un sistema cliente-servidor completo.

Enviaré el src de un sistema de chat cliente-servidor de demostración cuando tenga tiempo de revisar el código.

user981836
fuente
1
Hace casi dos años escribiste "Enviaré el src de una demostración ...". ¿Alguna vez terminaste esa demostración?
Bryan Oakley
Lo siento ... ¡pero no tuve tiempo de lanzar una demostración pública! ¡Sin embargo, es muy simple usar Bosh lib para php! adiós
user981836
2

Npm tiene algunas bibliotecas de ot agradables para node.js:

  • https://npmjs.org/package/ot : adaptadores para codemirror y ace integrados, así como una implementación de cliente y servidor
  • https://npmjs.org/package/changesets - biblioteca de ot simple utilizable en el nodo y el navegador; le permite crear 'conjuntos de cambios' (esencialmente diffs) que puede enviar, transformar entre sí y aplicar en un documento
invitado
fuente
1

Podrías hablar con los chicos de Cedanet . Aunque Ceda es de código cerrado y no hay una prueba gratuita disponible en su sitio web. He estado involucrado en el desarrollo de Ceda y continúo trabajando con él en proyectos comerciales, por lo que podría proporcionar algunos comentarios / consejos si sigues este camino.

Daniel Paull
fuente
1

Creo que etherpad.org con etherpad lite es superior a otras soluciones.

gorn
fuente
1
¿Podrías corroborar la superioridad de etherpad con algún ejemplo?
DL Narasimhan
1

He escrito una pequeña biblioteca de unixy (haz una cosa y hazlo bien) que implementa una capa de control de OT, lo que te permite conectar diferentes tipos de OT (admite todos los tipos compatibles con shareJS). Es similar a shareJS pero menos obstinado y más abstracto.

https://github.com/marcelklehr/gulf

Marcel Klehr
fuente