Libreria di trasformazione operativa?


102

Sto cercando una libreria che mi permetta di sincronizzare il testo in tempo reale tra più utenti (ala Google Docs).

Mi sono imbattuto nella trasformazione operativa, che sembra soddisfare le mie esigenze. Detto questo, capisco l'essenza di OT, ma non la matematica né l'implementazione di OT.

Quindi, mi chiedevo se ci fosse una libreria Javascript drag'n'drop che si aggancia a un'area di testo, genera le trasformazioni, quindi mi consente di applicare quelle trasformazioni su un altro client?

(Ho ottenuto il sorgente Etherpad, ma non riesco a ricavarne testa o croce. Se qualcuno potesse indicare come sfruttare l'implementazione OT di Etherpad, anche quello sarebbe fantastico!)


Editor di testo collaborativo basato su Firebase chiamato Firepad - firepad.io Controlla il codice per trarre ispirazione github.com/FirebaseExtended/firepad
Tharanga Hewavithana

Risposte:


57

Penso che parti dell'implementazione OT di Google Wave siano Open Source (e altre parti stanno arrivando).

Non sono sicuro che questo sia quello che stai cercando, ma un'alternativa a OT è la sincronizzazione differenziale :


6
Diff-Match-Patch, combinato con il documento sulla sincronizzazione differenziale di Neil Frasier ( neil.fraser.name/writing/sync ) ha fatto il trucco! Molte grazie per avermi indirizzato nella giusta direzione.
gamers2000

Da quello che ho capito, Diff-Match-Patch e, per estensione, MobWrite (poiché quest'ultimo utilizza il primo) supporta solo il testo, non le modifiche binarie. Tuttavia, è disponibile una demo di collaborazione con gli elementi del modulo HTML, che indicherebbe che non supporta solo il testo normale.
gamers2000

Qualche buona notizia su "e più parti in arrivo" dopo questa risposta?
bertie

3
In realtà, Google-Diff-Match-Patch ha lo scopo di implementare il metodo alternativo alle Trasformazioni Operative, ovvero la Sincronizzazione Differenziale, per capire le differenze puoi leggere il documento Neil Fraser di DS: neil.fraser.name/writing/sync (OT è indicato in questo documento come passaggio di eventi). Sono due metodi molto diversi.
Benja

5
questo è vecchio, ma nel caso ti dispiaccia, ho open source github.com/benjamine/JsonDiffPatch usa la patch di corrispondenza di Neil per le stringhe lunghe, ma funziona per i grafi di oggetti js arbitrari
Benja

44

Uno degli ex ingegneri di Wave ha rilasciato un'implementazione Coffeescript del suo algoritmo di editing collaborativo chiamato ShareJS, ora denominato ShareDB .


1
ShareJS è probabilmente più semplice e meglio documentato e più riutilizzabile di quello che MobWrite fa con Diff e Patch di Google.
Luke Stanley

33

Riassumo le soluzioni che ho trovato.

  • Trasformazione operativa: es

    • Google Wave OT. L'approccio si basa sul cosiddetto approccio di Giove.
    • ShareJs. Basato sullo stesso algoritmo OT di Google Wave OT.
    • COWEB-jsoe. Basato su COT - un approccio OT molto sofisticato che supporta anche la propagazione dei messaggi p2p.
    • OpenCoweb. Sfrutta OpenCoweb-jsoe per fornire un framework completo per molti problemi simili.
    • OT.js si basa sui tipi di operazione di ShareJs.
    • DriveSDK. Un'API molto interessante che può fare molte cose, ad esempio la collaborazione sui grafici.
    • SwellRT è un fork di Apache Wave. È federato e supporta il rich text.
  • Sincronizzazione differenziale:

    • Diff-Match-Patch di Neil Fraser.
    • MobWrite sfrutta l'algoritmo Diff-Match-Patch.
  • CRDT (Commutative Replicated Data Type):

    • Esistono molti algoritmi CRDT diversi che consentono l'implementazione di tipi condivisi. Alcuni CRDT funzionano con la propagazione dei messaggi P2P, altri si basano su modelli client-server
    • Yjs ti consente di condividere tipi di dati arbitrari (RichText, Array, Hash Maps, .. estendibili). Supporto offline e supporto per protocolli di comunicazione P2P (ci sono moduli per XMPP, Websocket e WebRTC)
    • Database condiviso del server client SwarmJS con supporto offline. Funziona bene con React
    • Woot Un'implementazione del Woot CRDT
    • CRDT Un'altra implementazione CRDT
    • Automerge

L'API di Google Drive utilizza OT non DS. Developers.google.com/drive/realtime/conflict-resolution
Mathias Bak




4

Le soluzioni chiavi in ​​mano o "drag and drop" a questo problema non sono realmente esistite a causa della complessità della sincronizzazione affidabile dello stato mutabile condiviso. La risposta di dmonad è un discreto riepilogo e ho pubblicato una panoramica più aggiornata delle soluzioni disponibili qui .

Questa domanda è piuttosto vecchia, ma Convergence (dichiarazione di non responsabilità: sono un fondatore) fornisce la soluzione più chiavi in ​​mano disponibile, fornendo non solo la sincronizzazione dei dati ma una serie di altre API utili per costruire una UX collaborativa. Ecco un esempio che mostra esattamente ciò che hai richiesto: sincronizzazione di un campo di testo su più client.

Altrimenti, ShareDB è un'ottima soluzione open source che si adatta alle esigenze di molte persone.



2

Con una libreria client js (Strophe.js) potresti usare un server XMPP gratuito (come jabber.org) insieme alla mia lib OT lato client (JSOTTEST) per costruire un sistema client-server completo.

Presenterò lo src di un sistema di chat client-server demo quando avrò il tempo di rivedere il codice.


1
Quasi due anni fa hai scritto "ti sottoporrò lo src di una demo ...". Hai mai finito quella demo?
Bryan Oakley

Scusa ... ma non ho avuto il tempo di rilasciare una demo pubblica! Tuttavia è molto semplice usare Bosh lib per php !! bye
user981836

2

Npm ha alcune belle librerie ot per node.js:

  • https://npmjs.org/package/ot - adattatori per codemirror e ace integrati, nonché un'implementazione client e server
  • https://npmjs.org/package/changesets - semplice libreria ot utilizzabile nel nodo e nel browser; ti permette di costruire 'changeset' (essenzialmente diff) che puoi inviare, trasformare l'uno contro l'altro e applicare su un documento

1

Potresti parlare con i ragazzi di Cedanet . Sebbene Ceda sia closed source e non sia disponibile alcuna prova gratuita sul loro sito web. Sono stato coinvolto nello sviluppo di Ceda e continuo a collaborare con esso in progetti commerciali, quindi potrei essere in grado di fornire alcuni feedback / consigli se intraprendi questa strada.


1

Penso che etherpad.org con etherpad lite sia superiore ad altre soluzioni.


1
Sareste in grado di dimostrare la superiorità di Etherpad con qualche esempio?
DL Narasimhan


1

Ho scritto una piccola libreria unixy (fai una cosa e fallo bene) che implementa un livello di controllo OT, che ti consente di collegare diversi tipi di OT (supporta tutti i tipi conformi a shareJS). È simile a shareJS ma meno supponente e più astratto.

https://github.com/marcelklehr/gulf

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.