Biblioteca de Transformação Operacional?

Estou à procura de uma biblioteca que permita sincronizar o texto em tempo real entre vários usuários (ala Google Docs).

Eu tropecei na Transformação Operacional, que parece se encheckboxr em minhas necessidades. Tendo dito isso, eu entendo a essência do AT, mas não a matemática nem a implementação do AT.

Assim, eu queria saber se havia uma biblioteca JavaScript drag’n’drop que se conectaria a uma área de texto, geraria as transformações e permitiria que eu aplicasse essas transformações em outro cliente?

(Eu obtive a fonte do Etherpad, mas não consigo tirar o máximo proveito dela. Se alguém puder apontar como aproveitar a implementação do OT do Etherpad, isso também será ótimo!)

    Acho que partes da implementação do 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 synchronization diferencial :

    • Google-Diff-Match-Patch – Bibliotecas Diff, Match e Patch para texto simples : ” As bibliotecas Diff Match e Patch oferecem algoritmos robustos para realizar as operações necessárias para sincronizar texto simples.
    • Google-MobWrite – Serviço de synchronization e colaboração em tempo real : “O MobWrite converte formulários e aplicativos da Web em ambientes colaborativos. Crie um sistema simples de usuário único, adicione uma linha de JavaScript e obtenha instantaneamente um sistema colaborativo ” (usa o Google-Diff -Match-Patch.)

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

    Vou resumir as soluções que encontrei.

    • Transformação Operacional: Por exemplo

      • Google Wave OT A abordagem é baseada na chamada abordagem de Júpiter.
      • ShareJs. Baseado no mesmo algoritmo OT do Google Wave OT.
      • Coweb-jsoe. Baseado no COT – uma abordagem OT muito sofisticada que também suporta propagação de mensagens p2p.
      • OpenCoweb. Ele aproveita o OpenCoweb-jsoe para fornecer uma estrutura completa para muitos problemas semelhantes.
      • O OT.js é baseado nos tipos de operação do ShareJs.
      • DriveSDK. Uma API muito interessante que pode fazer muitas coisas – por exemplo, colaboração em charts.
      • O SwellRT é um fork do Apache Wave. Is é federado e suporta rich text.
    • Sincronização Diferencial:

      • Diff-Match-Patch de Neil Fraser.
      • O MobWrite utiliza o algoritmo Diff-Match-Patch.
    • CRDT (Tipo de Dados Replicados Comutativos):

      • Existem vários algoritmos CRDT diferentes que permitem a implementação de tipos compartilhados. Alguns CRDTs trabalham 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 SwarmJS Client com suporte offline. Funciona bem com o React
      • Woot Uma implementação do Woot CRDT
      • CRDT Outra implementação do CRDT
      • Automergia

    Bibliotecas OT:

    Dentro do projeto websocket HWIOS, eu usei com sucesso um combo de ambos (py-infinote no serverside, jinfinote no clientside) para sincronizar os estados do documento.

    A biblioteca ot.js https://github.com/Operational-Transformation/ot.js pode ser útil para cenários multiusuários.

    Soluções turnkey ou “arrastar e soltar” para esse problema realmente não existiam devido à complexidade da synchronization confiável do estado mutável compartilhado. A resposta da dmonad é um roundup decente, e eu postei uma visão geral mais atualizada das soluções disponíveis aqui .

    Essa questão é bem antiga, mas a Convergence (disclaimer: eu sou um fundador) fornece a solução mais completa disponível, fornecendo não apenas a synchronization de dados, mas uma série de outras APIs úteis para criar uma UX colaborativa. Aqui está um exemplo mostrando exatamente o que você solicitou: synchronization de um campo de texto em vários clientes.

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

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

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

    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 – plain ot library utilizável no node e no browser; permite que você construa ‘changesets’ (essencialmente diffs) que você pode enviar, transformar uns aos outros e aplicar em um documento

    Você poderia falar com os caras da Cedanet . Embora Ceda seja de código fechado e nenhuma versão gratuita esteja disponível em seu site. Eu estive envolvido no desenvolvimento da Ceda e continuo a trabalhar com ela em projetos comerciais, então eu poderia ser capaz de fornecer algum feedback / aconselhamento se você seguir esse caminho.

    Eu thing etherpad.org com etherpad lite é superior a outras soluções.

    Estamos construindo um editor colaborativo que combina a Transformação operacional com o version control. Dessa forma, podemos suportar collab offline e online. Nós lançamos nossa própria biblioteca OT ontem como parte de nossa pilha de código aberto.

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

    Também contribuímos com uma biblioteca para version control.

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

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

    https://github.com/marcelklehr/gulf