Biblioteca de transformação operacional?


102

Estou procurando uma biblioteca que me permita sincronizar texto em tempo real entre vários usuários (ala Google Docs).

Eu tropecei na Transformação Operacional, que parece se adequar às minhas necessidades. Dito isso, eu entendo a essência do OT, mas não a matemática nem a implementação do OT.

Portanto, eu queria saber se existe uma biblioteca Javascript drag'n'drop que se conecte a uma área de texto, gere as transformações e, em seguida, me permita aplicar essas transformações em outro cliente.

(Eu consegui a fonte do Etherpad, mas não consigo fazer cara ou coroa com isso. Se alguém pudesse apontar como aproveitar a implementação OT do Etherpad, isso também seria ótimo!)


Editor de texto colaborativo com a tecnologia do Firebase chamado Firepad - firepad.io Verifique o código para se inspirar github.com/FirebaseExtended/firepad
Tharanga Hewavithana

Respostas:


57

Acho que partes da implementação de OT do Google Wave são Open Source (e mais partes estão chegando).

Não tenho certeza se é isso que você está procurando, mas uma alternativa para OT é a sincronização diferencial :


6
Diff-Match-Patch, combinado com o papel de sincronização diferencial de Neil Frasier ( neil.fraser.name/writing/sync ) fez o truque! Muito obrigado por me apontar na direção certa.
gamers2000

Pelo que entendi, Diff-Match-Patch e, por extensão, MobWrite (já que o último usa o primeiro) suporta apenas texto, não alterações binárias. No entanto, há uma demonstração de colaboração com elementos de formulário HTML, o que indica que ele não suporta apenas texto simples.
gamers2000

Alguma boa notícia sobre "e mais peças estão chegando" desde esta resposta?
Bertie

3
Na verdade, o Google-Diff-Match-Patch visa implementar o método alternativo às Transformações Operacionais, que é a Sincronização Diferencial, para entender as diferenças que você pode ler o documento de Neil Fraser do DS: neil.fraser.name/writing/sync (OT é referenciado neste documento como passagem de evento). São dois métodos muito diferentes.
Benja

5
isso é antigo, mas caso você se importe, abri github.com/benjamine/JsonDiffPatch que usa o Diff-Match-Patch de Neil para strings longas, mas funciona para gráficos de objeto js arbritrários
Benja

44

Um dos ex-engenheiros do Wave lançou uma implementação Coffeescript de seu algoritmo de edição colaborativa chamado ShareJS, agora chamado ShareDB .


1
O ShareJS é provavelmente mais simples e melhor documentado e mais reutilizável do que o MobWrite faz com o Google's Diff and Patch.
Luke Stanley

33

Vou resumir as soluções que encontrei.

  • Transformação operacional: Ex.

    • OT do Google Wave. A abordagem é baseada na chamada abordagem de Júpiter.
    • ShareJs. Baseado no mesmo algoritmo OT do Google Wave OT.
    • Coweb-jsoe. Baseado em COT - uma abordagem de OT muito sofisticada que também suporta a propagação de mensagens p2p.
    • OpenCoweb. Ele aproveita o OpenCoweb-jsoe para fornecer um Framework completo para muitos problemas semelhantes.
    • OT.js é baseado nos tipos de operação de ShareJs.
    • DriveSDK. Uma API muito interessante que pode fazer muitas coisas - por exemplo, colaboração em gráficos.
    • SwellRT é um Fork of Apache Wave. É federado e oferece suporte a rich text.
  • Sincronização diferencial:

    • Diff-Match-Patch de Neil Fraser.
    • MobWrite aproveita o algoritmo Diff-Match-Patch.
  • CRDT (tipo de dados replicados comutativos):

    • Existem muitos algoritmos CRDT diferentes que permitem a implementação de tipos compartilhados. Alguns CRDTs funcionam com propagação de mensagens P2P, alguns dependem de modelos cliente-servidor
    • Yjs permite que você compartilhe tipos de dados arbitrários (RichText, Array, Hash Maps, .. extensível). Suporte offline e suporte para protocolos de comunicação P2P (existem módulos para XMPP, Websockets e WebRTC)
    • Banco de dados compartilhado do servidor cliente SwarmJS com suporte offline. Funciona bem com React
    • Woot Uma implementação do Woot CRDT
    • CRDT Outra implementação de CRDT
    • Automerge





4

Soluções turnkey ou "arrastar e soltar" para esse problema não existiam de fato devido à complexidade de sincronizar de forma confiável o estado mutável compartilhado. A resposta do dmonad é um resumo decente, e postei uma visão geral mais atualizada das soluções disponíveis aqui .

Esta questão é bastante antiga, mas Convergence (isenção de responsabilidade: eu sou um fundador) fornece a solução mais pronta para uso, fornecendo não apenas a sincronização de dados, mas uma série de outras APIs úteis para construir uma UX colaborativa. Aqui está um exemplo que mostra exatamente o que você solicitou: sincronização de um campo de texto em vários clientes.

Caso contrário, o ShareDB é uma ótima solução de código aberto que se adapta às necessidades de muitas pessoas.



2

Com uma lib de cliente js (Strophe.js), você pode usar um servidor XMPP gratuito (como jabber.org) junto com minha lib OT do lado do cliente (JSOTTEST) para construir um sistema cliente-servidor completo.

Enviarei o src de um sistema de bate-papo cliente-servidor de demonstração quando tiver tempo para revisar o código.


1
Quase dois anos atrás, você escreveu "Enviarei o src de uma demonstração ...". Você já terminou essa demonstração?
Bryan Oakley,

Desculpe ... mas não tive tempo de lançar uma demonstração pública! No entanto, é muito simples usar Bosh lib para php !! tchau
user981836

2

O Npm tem algumas ótimas bibliotecas para node.js:

  • https://npmjs.org/package/ot - adaptadores para codemirror e ace integrados, bem como uma implementação de cliente e servidor
  • https://npmjs.org/package/changesets - biblioteca simples ou utilizável no nó e no navegador; permite que você construa 'changesets' (essencialmente diffs) que você pode enviar, transformar um contra o outro e aplicar em um documento

1

Você poderia falar com o pessoal da Cedanet . Embora Ceda seja um código fechado e nenhum teste gratuito esteja disponível em seu site. Estive envolvido no desenvolvimento do Ceda e continuo a trabalhar com ele em projetos comerciais, então posso fornecer algum feedback / conselho se você seguir esse caminho.


1

Acho que etherpad.org com etherpad lite é superior a outras soluções.


1
Você seria capaz de comprovar a superioridade do etherpad com algum exemplo?
DL Narasimhan


1

Eu escrevi uma pequena biblioteca unixy (faça uma coisa e faça bem) que implementa uma camada de controle OT, permitindo que você conecte diferentes tipos de OT (suporta todos os tipos compatíveis com shareJS). É semelhante ao shareJS, mas menos opinativo e mais abstrato.

https://github.com/marcelklehr/gulf

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.