Peerjs: Executar cliente peerjs em um aplicativo node.js?

Criado em 6 nov. 2013  ·  65Comentários  ·  Fonte: peers/peerjs

Seria possível executar um cliente peer.js em um aplicativo node.js em vez do navegador?

Estou criando uma rede peer-to-peer que consiste em peers (programáticos) que vivem tanto em navegadores quanto em aplicativos node.js. Eles precisam enviar dados um para o outro, sem vídeo/áudio. O WebRTC seria uma ótima solução para resolver o roteamento e a comunicação entre os peers sem a necessidade de uma estrutura cliente/servidor centralizada. Mas o WebRTC parece ser suportado apenas no navegador.

Veja também esta pergunta: http://stackoverflow.com/questions/18872712/node-js-webrtc-client

Comentários muito úteis

Visão geral
Oi, vejo que isso é antigo, mas você ou alguém pode precisar disso. Estou trabalhando na minha tese e dei alguns passos à frente. Eu tentei muitas coisas e o simplepeer não tem nenhuma sinalização implementada. O envio de mensagens pelo datachannel (nodejs peerjs webrtc) - pela rede no Raspberry Pi 2 (ARM, Raspbian Jessie, mas deve funcionar em todos os lugares) usando o servidor de sinalização implantado (peerserver) agora está funcionando. O outro cliente é um navegador firefox em ambiente windows. Eu não teria conseguido sem a sua discussão aqui, então estou retribuindo à comunidade.

Coisas importantes sobre o que (não) fazer:
-não use selênio, não é rápido o suficiente, pelo menos para minha aplicação
-xvfb não funcionou para mim, bem, funcionou
-você não deve exigir o módulo peerjs
- no Raspberry, pelo menos - use electron-webrtc, pois o wrtc não está disponível para arm de qualquer maneira
-não use serialização

Ter que fazer tudo sozinho é difícil, então aqui está o código:
janela = global
window.BlobBuilder = require("BlobBuilder")
local = {protocolo: 'http'}

BinaryPack = require("binary-pack")
XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var wrtc = require('electron-webrtc')()
//var Peer = require('peerjs')

RTCPeerConnection = wrtc.RTCPeerConnection;
RTCSessionDescription = wrtc.RTCSessionDescription;
RTCIceCandidate = wrtc.RTCIceCandidate;

WebSocket = require('ws')
require('/home/pi/node_modules/peerjs/lib/exports.js');

var peer = new peer(
...
})

var conn=peer.connect('id')
conn.serialization='nenhum'
conn.send('olá do nodejs!')

É isso, abraços, JP

Todos 65 comentários

Encontrei uma iniciativa do @helloIAmPau para criar uma implementação node.js do WebRTC: https://github.com/helloIAmPau/node-rtc/. Talvez seja possível agrupar forças?

Oi Jos,

Vou ficar de olho nisso. Quando há um cliente de nó webrtc confiável, ele
deve ser trivial para portar peerjs.

Na quarta-feira, 6 de novembro de 2013 às 6h46, Jos de Jong [email protected] escreveu :

Encontrei uma iniciativa do @helloIAmPau https://github.com/helloIAmPau para
crie uma implementação node.js do WebRTC:
https://github.com/helloIAmPau/node-rtc/. Talvez seja possível agrupar
forças?


Responda a este e-mail diretamente ou visualize-o no Gi tHubhttps://github.com/peers/peerjs/issues/103#issuecomment -27878686
.

510-691-3951
http://ericzhang.com

Veja https://github.com/modeswitch/node-webrtc também. Acho que o node-rtc está sendo substituído por ele.

Obrigado Eric, isso seria ótimo.

Isso também permitiria que um aplicativo node.js funcionasse como um MCU para controlar fluxos de vídeo/áudio para um grupo de pares (chamada de conferência), em uma arquitetura em estrela, conforme explicado por Justin Uberti no último Google I/O no WebRTC (de 23 :19). O Node.js é bom em lidar com streams, então pode ser uma ótima opção.

@ericz qual é o motivo para fechar este problema? O suporte para node.js seria realmente incrível e poderoso.

Oi Josdejong,

Fechei porque não há ação, mas vou reabri-lo para que possamos acompanhar o recurso :)

ok obrigado. Sinta-se à vontade para ajustar o título para algo como "suporte ao node.js" e dar ao problema um rótulo adequado...

:+1: Este seria um recurso bastante útil.

:+1: Votando para isso também.

:+1: muito necessário

+1

Consegui zombar de alguns objetos e obter peerjs rodando no node.js

janela={};
window.BlobBuilder = require("BlobBuilder");
local={};
localização.protocolo="http";

BinaryPack = require("binary-pack");
XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;

var wrtc = require("wrtc");
RTCPeerConnection = wrtc.RTCPeerConnection;
RTCSessionDescription = wrtc.RTCSessionDescription;
RTCIceCandidate = wrtc.RTCIceCandidate;

WebSocket = require('ws');
var peerClient =require("./peer.js");

Consegui obter peerjs configurando conexões e o servidor obter conexões. No entanto, quando tento enviar dados, recebo o erro de acompanhamento

[Erro: A conexão não está aberta. Você deve ouvir o evento open antes de enviar mensagens.]

Aqui está a essência completa

https://gist.github.com/piyushranjan/1204bc579b7c1f5a3e84

E esses pacotes npm devem ser instalados

npm instalar BlobBuilder
npm instalar pacote binário
npm instalar ws
npm instalar xmlhttprequest
npm instalar wrtc

Ah, isso é realmente incrível! Vou dar uma olhada :).

Michelle

Em terça-feira, 6 de maio de 2014 às 7h37, Piyush Ranjan [email protected] escreveu:

Consegui zombar de alguns objetos e obter peerjs rodando no node.js

janela={};
window.BlobBuilder = require("BlobBuilder");
local={};
localização.protocolo="http";

BinaryPack = require("binary-pack");
XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;

var wrtc = require("wrtc");
RTCPeerConnection = wrtc.RTCPeerConnection;
RTCSessionDescription = wrtc.RTCSessionDescription;
RTCIceCandidate = wrtc.RTCIceCandidate;

WebSocket = require('ws');
var peerClient =require("./peer.js");

Consegui obter peerjs configurando conexões e o servidor obter conexões.
No entanto, quando tento enviar dados, recebo o erro de acompanhamento

[Erro: A conexão não está aberta. Você deve ouvir o evento aberto
antes de enviar mensagens.]

Aqui está a essência completa

https://gist.github.com/piyushranjan/1204bc579b7c1f5a3e84

E esses pacotes npm devem ser instalados

npm instalar BlobBuilder
npm instalar pacote binário
npm instalar ws
npm instalar xmlhttprequest
npm instalar wrtc


Responda a este e-mail diretamente ou visualize-o no Gi tHubhttps://github.com/peers/peerjs/issues/103#issuecomment -42292282
.

@michelle alguma sorte com isso já? Eu tentei, e abrir uma conexão parece funcionar, mas as mensagens enviadas nunca são recebidas.

:+1: para este recurso

:+1: para este recurso

:+1:

:+1::+1::+1:

Eu queria saber qual era o status disso? Seria incrível se isso fosse suportado?

Existe um módulo de nó para peerjs, mas acho que ainda não funciona. Quando eu exijo, recebo que a janela não está definida, o que é uma objeção justa.
https://www.npmjs.org/package/peerjs#readme

Então, estou curioso: há algo acontecendo? Seria tão incrível tê-lo! ;)

Este módulo de nó é para o código do navegador :).

Michelle

Na quinta-feira, 23 de outubro de 2014 às 11h37, Lixissimus [email protected]
escrevi:

Existe um módulo de nó para peerjs, mas acho que ainda não funciona. Quando eu
exigi-lo, recebo janela não está definida, o que é uma objeção justa.
https://www.npmjs.org/package/peerjs#readme

Então, estou curioso: há algo acontecendo? Seria tão incrível ter
isto! ;)


Responda a este e-mail diretamente ou visualize-o no GitHub
https://github.com/peers/peerjs/issues/103#issuecomment -60287567.

Então o que é suposto fazer?

Não sei se estou apenas confuso sobre o nó, mas parece estranho ter um módulo npm para peerjs, se o próprio módulo peerjs só pode ser usado no navegador?

Desculpe, isso foi antes de começarmos a publicar a biblioteca no bower.

Michelle

Na quinta-feira, 23 de outubro de 2014 às 11h51, Alan Chusuei [email protected]
escrevi:

Não sei se estou apenas confuso sobre o nó, mas parece estranho ter
um módulo npm para peerjs, se o próprio módulo peerjs só puder ser usado de
o navegador?


Responda a este e-mail diretamente ou visualize-o no GitHub
https://github.com/peers/peerjs/issues/103#issuecomment -60289790.

@AChusuei Não vejo nenhum problema em ter bibliotecas específicas do navegador em npm ou bibliotecas isomórficas. Para meus aplicativos da Web JS de pilha completa, gosto de lidar apenas com o npm, em vez de buscar metade das bibliotecas do npm e a outra metade do bower.

@michelle Eu realmente espero que o peerjs tenha suporte para um cliente node.js!!

@josdejong , acho que você poderia fazer dessa maneira. Ainda sou novo no mundo dos nós, aberto a fazer as coisas de maneira diferente!

:+1:

Até que esse problema seja resolvido, pode haver soluções alternativas com navegadores headless. Eu não os testei por mim mesmo:

vou tentar o segundo.

:+1:

+2^56 para o recurso!

:+1:

:+1:

:+1:

+1

O hack postado por @piyushranjan não parece funcionar com a versão estável atual, pois não exporta nada globalmente (e todos os módulos estão em um arquivo).

A solução para isso parece ser usar a versão não "compilada"/concatenada.

Assim, clone o repositório e faça algo assim:

window = global;
location = {protocol: 'http'};

XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;

var wrtc = require("wrtc");
RTCPeerConnection = wrtc.RTCPeerConnection;
RTCSessionDescription = wrtc.RTCSessionDescription;
RTCIceCandidate = wrtc.RTCIceCandidate;

WebSocket = require('ws');

require('./peerjs/lib/exports.js');

var peer = new Peer({
  // snip...
});

Preste atenção especial à linha require perto da parte inferior, que lida com o carregamento de todas as partes separadas para você, no objeto global / window .

Ainda é um hack desagradável, mas parece funcionar, pelo menos para testes muito básicos.

Nota: As mesmas ressalvas se aplicam, você ainda precisa instalar alguns pacotes primeiro:

npm install BlobBuilder binary-pack ws xmlhttprequest wrtc

@lewiseason Você realmente conseguiu uma conexão funcionando e conseguiu enviar alguns dados, por exemplo?

Não consegui isso até agora. Parece que consigo abrir uma conexão, mas não há nenhum canal de dados criado.

Isto é o que eu tentei:

  1. Instalação

sudo apt-get install libnss3-dev libexpat1-dev npm install peerjs BlobBuilder binary-pack ws xmlhttprequest wrtc

  1. Crie um arquivo html peer1.html conectando um cliente peer com id 'peer1' :

``` html



par1



```
  1. Crie um script node.js peer3.js :

``` js
janela = global;
window.BlobBuilder = require("BlobBuilder");
local = {protocolo: 'http'};

BinaryPack = require("binary-pack");
XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;

var wrtc = require("wrtc");
RTCPeerConnection = wrtc.RTCPeerConnection;
RTCSessionDescription = wrtc.RTCSessionDescription;
RTCIceCandidate = wrtc.RTCIceCandidate;

WebSocket = require('ws');

require('peerjs/lib/exports.js');

var peer = new Peer('peer3', {chave: 'lwjd5qra8257b9', debug: true});

peer.on('abrir', function() {
console.log('peer aberto');
var conn = peer.connect('peer1');

 conn.on('data', function(data) {
   console.log('Received', data);
 });

 conn.on('error', function (err) {
   console.log('Error', err);
 });

 conn.on('open', function () {
   console.log('connection open');
   conn.send('Hello from ' + peer.id + '!');
 });

});
```

  1. Abra o arquivo peer1.html no seu navegador
  2. Execute o script node.js peer3.js

Observando a saída de depuração, parece que o peer3 está conectado com sucesso ao peer1, mas não estabelece um canal de dados: o peer1 gera "nova conexão com o peer3", mas não há mensagens recebidas.

Receio não ter ido muito longe testando-o - parecia um pouco para Frankenstein usar em produção, então acabei deixando-o. Desculpe :(

:+1:

:+1:

alguma atualização disso?

@josdejong o problema está nos dados de sinalização. Parece que nenhum dado STUN está sendo anexado à oferta/resposta. Sem esses dados, nenhuma conexão real pode ser feita. O seguinte faz uma conexão entre o navegador e o nó, mas sem sinalização de peerjs.

https://github.com/cjb/serverless-webrtc

+1

+1

Alguém quer abrir uma recompensa?

Como isso está aberto há mais de dois anos: Existe algum (outro) pacote conhecido que funcione P2P no navegador e no nó?

Não tive tempo de conferir, mas https://github.com/feross/simple-peer diz que funciona tanto no node.js quanto no navegador.

É isso que você está procurando? https://github.com/socketio/socket.io-p2p

do leia-me:

"Este módulo fornece uma maneira fácil e confiável de configurar uma conexão WebRTC entre pares e se comunicar usando eventos (o protocolo socket.io).

O Socket.IO é usado para transportar dados de sinalização e como substituto para clientes em que o WebRTC PeerConnection não é compatível."

No que me diz respeito, não funciona no Node. Por isso me deparei com este tópico.

Hmm. Você poderia ser mais específico? Estou usando agora, usando um servidor de nó para conectar peers que, em seguida, estabelecem conexões webRTC entre si e/ou a máquina do servidor de nó.

usando um servidor de nó para conectar peers que então estabelecem conexões webRTC entre si

Então, você _não_ está executando-o como um cliente. Você está executando-o em um servidor que conecta _outros_ clientes (que você não menciona como aplicativos de nó - se forem, eu estaria interessado em como você os configura).
Este thread é sobre o uso de peerjs (ou potencialmente qualquer outra coisa) como um peer (cliente) em um aplicativo de nó.

conexões webRTC entre si e/ou máquina do servidor do nó

A segunda parte disso parece ser exatamente o que está sendo discutido aqui. Mais alguém pode confirmar isso?

Não, o problema é usar o NodeJS como cliente WebRTC. Ou seja. conectar de uma instância NodeJS que não é necessariamente o servidor.

Ah, desculpa. SimplePeer fará isso. Mas requer que a plataforma do servidor tenha determinados recursos do webrtc instalados. O módulo 'wrtc' fornece isso na maioria das máquinas. Notavelmente _não_ em um pi de framboesa agora, caso isso seja importante para você (para mim!)

trecho de seu readme.md:

no nó

Para usar esta biblioteca no nó, passe opts.wrtc como parâmetro:

var SimplePeer = require('simple-peer')
var wrtc = require('wrtc')

var peer1 = new SimplePeer({ initiator: true, wrtc: wrtc })
var peer2 = new SimplePeer({ wrtc: wrtc })

+1 isso seria um bom recurso

Confira elétron-webrtc, ou webrtc-native. Eu uso electron-webrtc para minha instância node.js para conectar com navegadores (usando o datachannel especificamente)

Visão geral
Oi, vejo que isso é antigo, mas você ou alguém pode precisar disso. Estou trabalhando na minha tese e dei alguns passos à frente. Eu tentei muitas coisas e o simplepeer não tem nenhuma sinalização implementada. O envio de mensagens pelo datachannel (nodejs peerjs webrtc) - pela rede no Raspberry Pi 2 (ARM, Raspbian Jessie, mas deve funcionar em todos os lugares) usando o servidor de sinalização implantado (peerserver) agora está funcionando. O outro cliente é um navegador firefox em ambiente windows. Eu não teria conseguido sem a sua discussão aqui, então estou retribuindo à comunidade.

Coisas importantes sobre o que (não) fazer:
-não use selênio, não é rápido o suficiente, pelo menos para minha aplicação
-xvfb não funcionou para mim, bem, funcionou
-você não deve exigir o módulo peerjs
- no Raspberry, pelo menos - use electron-webrtc, pois o wrtc não está disponível para arm de qualquer maneira
-não use serialização

Ter que fazer tudo sozinho é difícil, então aqui está o código:
janela = global
window.BlobBuilder = require("BlobBuilder")
local = {protocolo: 'http'}

BinaryPack = require("binary-pack")
XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var wrtc = require('electron-webrtc')()
//var Peer = require('peerjs')

RTCPeerConnection = wrtc.RTCPeerConnection;
RTCSessionDescription = wrtc.RTCSessionDescription;
RTCIceCandidate = wrtc.RTCIceCandidate;

WebSocket = require('ws')
require('/home/pi/node_modules/peerjs/lib/exports.js');

var peer = new peer(
...
})

var conn=peer.connect('id')
conn.serialization='nenhum'
conn.send('olá do nodejs!')

É isso, abraços, JP

Oi @jeryfast , obrigado por suas soluções, eu estava procurando algo assim 👍

Eu testei em um mac (ainda não no framboesa) e estava recebendo o erro "Falha ao definir a propriedade 'tipo binário' em 'RTCDataChannel': suporte a blob ainda não implementado"

Após alguma pesquisa, descobri que no arquivo utils, no caminho node_modules/peerjs/lib em torno da linha 116:

try {
        dc.binaryType = 'blob';
        binaryBlob = true;
      } catch (e) {
      }

que está causando o erro e o aplicativo travar.

Se o código for comentado o app funciona e se comporta como um cliente de navegador, simplesmente lindo. Mas é um hack sujo, então eu estava procurando uma forma de "configurar" ou fazer algo que não fosse alterar código da lib, mas até agora não encontrei nenhum.

O desafio está em quando esse pedaço de código é executado, ou seja, no processo de carregamento do módulo, quando é feito o pedido das exportações:

require('./node_modules/peerjs/lib/exports.js');

Alguém tem uma ideia ou sugestão de como corrigir isso?

Cumprimentos

Legal, se você usar a serialização 'none', também funciona, sem alterar nada em uma biblioteca. Cumprimentos

Oi novamente @jeryfast funciona no Raspberry como você disse. O problema no meu último post está relacionado ao OS X.

Bem, a coisa é um ótimo trabalho 👍

Não vamos começar a diversão 💃

Olá
Estou recebendo este erro.
```
global.postMessage(messageName, '*');
^

TypeError: global.postMessage não é uma função
em Object.setZeroTimeoutPostMessage [como setZeroTimeout] (

@crossogf , esse erro me parece um sintoma de um problema maior. Parece que o único lugar em que postMessage é usado é no código de tratamento de erros. Meu palpite seria que tem algo a ver com a detecção de suporte a blob binário em lib/util.js (o código @nuno-nlfsoftware diz para comentar). Percebi que há dois lugares em que o código está presente, em dist/peer.js ou dist/peer.min.js e em lib/util.js. Para mim, apenas modificações neste último foram eficazes (devido ao hack do @jeryfast de exigir lib/exports.js).

Além disso, a serialização da conexão não precisa ser definida como none . Você pode usar qualquer outra opção além binary , você só precisa configurá-la já que o binário é o padrão. Eu configurei para json que funciona muito bem.

Vou deixar isso aqui https://www.npmjs.com/package/peerjs-nodejs

Obrigado, acho que deveria fazer parte do PeerJS.

aqui está meu código após o teste jeryfast & peerjs-nodejs

const peerJs = require('peerjs-nodejs');
const peer = peerJs("myPeerId", {
host: '192.168.137.231',
port: 9000,
pingInterval: 5000,
path: '/myapp',
debug: 3, 
iceTransportPolicy: 'relay',
config: {
'iceServers': [
    { urls: "stun:stun.l.google.com:19302" },
    {
        urls: "turn:34.192.149.24:5678?transport=udp",
        username: "USER", credential: "PASS"
    }
]
}
});

let conn = peer.connect('myPeerJS', {
    reliable: true
});


setTimeout(()=>{
 // NOT JSON
 // conn.serialization='none';
 // conn.send('hello from nodejs!');  

 // JSON WAY
 conn.serialization = 'json';
 conn.send({ value: 'hello from nodejs!' });

}, 3000);

setTimeout(()=>{
  conn.close();
  console.log("CONN CLOSE");
  process.exit();
}, 10000);

Olá, estou recebendo este erro, assim que crio uma instância Peer (usando peerjs-nodejs ) no servidor NodeJS. Eu nem estou criando uma conexão com um peer remoto no momento. Será que alguém resolveu?

server.js

const Peer = require('peerjs-nodejs')

...

this.peer = Peer('webRTC-webinar-plugin', {
      host: '/',
      path: 'peer-js',
      port: (useHTTPS) ? 8443 : 8080,
      secure: (useHTTPS) ? true : false
})
/Users/federico/Documents/webRTC-webinar-plugin/node_modules/peerjs-nodejs/node_modules/peerjs/lib/util.js:234

      global.postMessage(messageName, '*');
             ^
TypeError: global.postMessage is not a function
    at Object.setZeroTimeoutPostMessage [as setZeroTimeout] (/Users/federico/Documents/webRTC-webinar-plugin/node_modules/peerjs-nodejs/node_modules/peerjs/lib/util.js:234:14)
    at Peer.disconnect (/Users/federico/Documents/webRTC-webinar-plugin/node_modules/peerjs-nodejs/node_modules/peerjs/lib/peer.js:420:8)
    at Socket.<anonymous> (/Users/federico/Documents/webRTC-webinar-plugin/node_modules/peerjs-nodejs/node_modules/peerjs/lib/peer.js:120:12)
    at Socket.emit (/Users/federico/Documents/webRTC-webinar-plugin/node_modules/peerjs-nodejs/node_modules/eventemitter3/index.js:71:35)
    at exports.XMLHttpRequest._http.onerror (/Users/federico/Documents/webRTC-webinar-plugin/node_modules/peerjs-nodejs/node_modules/peerjs/lib/socket.js:91:12)
    at exports.XMLHttpRequest.dispatchEvent (/Users/federico/Documents/webRTC-webinar-plugin/node_modules/xmlhttprequest/lib/XMLHttpRequest.js:591:25)
    at exports.XMLHttpRequest.handleError (/Users/federico/Documents/webRTC-webinar-plugin/node_modules/xmlhttprequest/lib/XMLHttpRequest.js:533:10)
    at ClientRequest.errorHandler (/Users/federico/Documents/webRTC-webinar-plugin/node_modules/xmlhttprequest/lib/XMLHttpRequest.js:459:14)
    at ClientRequest.emit (events.js:310:20)
    at Socket.socketErrorListener (_http_client.js:426:9)

Alguém pode ajudar? Obrigado.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

afrokick picture afrokick  ·  5Comentários

l2aelba picture l2aelba  ·  3Comentários

veezo2007pk picture veezo2007pk  ·  7Comentários

jameshfisher picture jameshfisher  ·  6Comentários

kidandcat picture kidandcat  ·  8Comentários