Peerjs: ¿Ejecutar el cliente peerjs en una aplicación node.js?

Creado en 6 nov. 2013  ·  65Comentarios  ·  Fuente: peers/peerjs

¿Sería posible ejecutar un cliente peer.js en una aplicación node.js en lugar del navegador?

Estoy creando una red peer-to-peer que consta de pares (programáticos) que viven tanto en navegadores como en aplicaciones node.js. Tienen que enviarse datos entre sí, sin video/audio. WebRTC sería una gran solución para resolver el enrutamiento y la comunicación entre pares sin necesidad de una estructura cliente/servidor centralista. Pero WebRTC parece ser compatible solo con el navegador.

Consulte también esta pregunta: http://stackoverflow.com/questions/18872712/node-js-webrtc-client

Comentario más útil

Visión de conjunto
Hola, veo que esto es viejo, pero usted o cualquier persona podría necesitar esto. Estoy trabajando en mi tesis y he dado algunos pasos hacia adelante. He probado muchas cosas y simplepeer no tiene implementada la señalización. Ahora funciona el envío de mensajes a través del canal de datos (nodejs peerjs webrtc), a través de la red en Raspberry Pi 2 (ARM, Raspbian Jessie, pero debería funcionar en todas partes) utilizando el servidor de señalización implementado (peerserver). El otro cliente es un navegador Firefox en entorno Windows. No lo habría logrado sin su discusión aquí, así que estoy retribuyendo a la comunidad.

Cosas clave sobre qué (no) hacer:
-no use selenio, no es lo suficientemente rápido, al menos para mi aplicación
-xvfb no funcionó para mí, bueno, sí lo hizo
-no debe requerir el módulo peerjs
-al menos en Raspberry - use electron-webrtc, ya que wrtc no está disponible para arm de todos modos
-no utilice serialización

Tener que hacer todo por ti mismo es difícil, así que aquí está el código:
ventana = mundial
ventana.BlobBuilder = require("BlobBuilder")
ubicación = {protocolo: 'http'}

PaqueteBinario = require("paquete-binario")
XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var wrtc = require('electron-webrtc')()
//var Peer = require('peerjs')

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

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

var compañero = nuevo compañero (
...
})

var conn=peer.connect('id')
conn.serialization='ninguno'
conn.send('¡Hola desde nodejs!')

Eso es todo, saludos, JP

Todos 65 comentarios

Encontré una iniciativa de @helloIAmPau para crear una implementación node.js de WebRTC: https://github.com/helloIAmPau/node-rtc/. ¿Tal vez es posible agrupar fuerzas?

Hola José,

Voy a mantener un ojo en él. Cuando hay un cliente de nodo webrtc confiable,
debería ser trivial transferir peerjs.

El miércoles 6 de noviembre de 2013 a las 6:46 a. m., Jos de Jong [email protected] escribió:

Encontré una iniciativa de @helloIAmPau https://github.com/helloIAmPau para
cree una implementación node.js de WebRTC:
https://github.com/helloIAmPau/node-rtc/. Tal vez es posible agrupar
¿efectivo?


Responda a este correo electrónico directamente o véalo en Gi tHubhttps://github.com/peers/peerjs/issues/103#issuecomment -27878686
.

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

Consulte https://github.com/modeswitch/node-webrtc también. Creo que node-rtc está siendo reemplazado por él.

Gracias Eric, eso sería genial.

Esto también permitiría que una aplicación node.js funcione como una MCU para controlar transmisiones de video/audio para un grupo de pares (llamada de conferencia), en una arquitectura en estrella, como explicó Justin Uberti en la última E/S de Google en WebRTC (del 23 :19). Node.js es bueno para manejar transmisiones, por lo que podría encajar perfectamente.

@ericz, ¿cuál es la razón para cerrar este problema? El soporte para node.js sería realmente increíble y poderoso.

Hola josdejong,

Lo cerré porque no hay ningún elemento de acción, pero lo volveré a abrir para que podamos controlar la función :)

bueno, gracias. Siéntete libre de ajustar el título a algo así como "soporte de node.js" y dale al problema una etiqueta adecuada...

:+1: Esta sería una característica bastante útil.

:+1: También votando por esto.

:+1: muy necesario

+1

Me las arreglé para burlarme de algunos objetos y hacer que peerjs se ejecutara en node.js

ventana={};
ventana.BlobBuilder = require("BlobBuilder");
ubicación={};
ubicación.protocolo="http";

PaqueteBinario = require("paquete-binario");
XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;

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

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

Logré que peerjs configurara conexiones y que el servidor obtuviera conexiones. Sin embargo, cuando intento enviar datos obtengo un error de seguimiento.

[Error: la conexión no está abierta. Debe escuchar el evento open antes de enviar mensajes.]

Aquí está la esencia completa

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

Y estos paquetes npm deben estar instalados

npm instalar BlobBuilder
npm instalar paquete binario
npm instalar ws
npm instalar xmlhttprequest
npm instalar wrtc

¡Ah, esto es realmente increíble! Echaré un vistazo :).

michelle

El martes 6 de mayo de 2014 a las 7:37 a. m., Piyush Ranjan [email protected] escribió:

Me las arreglé para burlarme de algunos objetos y hacer que peerjs se ejecutara en node.js

ventana={};
ventana.BlobBuilder = require("BlobBuilder");
ubicación={};
ubicación.protocolo="http";

PaqueteBinario = require("paquete-binario");
XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;

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

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

Logré que peerjs configurara conexiones y que el servidor obtuviera conexiones.
Sin embargo, cuando intento enviar datos obtengo un error de seguimiento.

[Error: la conexión no está abierta. Deberías escuchar el evento abierto.
antes de enviar mensajes.]

Aquí está la esencia completa

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

Y estos paquetes npm deben estar instalados

npm instalar BlobBuilder
npm instalar paquete binario
npm instalar ws
npm instalar xmlhttprequest
npm instalar wrtc


Responda a este correo electrónico directamente o véalo en Gi tHubhttps://github.com/peers/peerjs/issues/103#issuecomment -42292282
.

@michelle , ¿ya has tenido suerte con esto? Lo intenté y abrir una conexión parece funcionar, pero los mensajes enviados nunca se reciben.

:+1: para esta característica

:+1: para esta característica

:+1:

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

Me preguntaba cuál era el estado de esto. ¿Sería increíble si esto fuera compatible?

Hay un módulo de nodo para peerjs, pero creo que aún no funciona. Cuando lo requiero, obtengo que la ventana no está definida, lo cual es una objeción justa.
https://www.npmjs.org/package/peerjs#readme

Así que tengo curiosidad: ¿está pasando algo? ¡Sería genial tenerlo! ;)

Este módulo de nodo es para el código del navegador :).

michelle

El jueves, 23 de octubre de 2014 a las 11:37 a. m., Lixissimus [email protected]
escribió:

Hay un módulo de nodo para peerjs, pero creo que aún no funciona. Cuando yo
lo necesito, obtengo que la ventana no está definida, lo cual es una objeción justa.
https://www.npmjs.org/package/peerjs#readme

Así que tengo curiosidad: ¿está pasando algo? Sería genial tener
¡eso! ;)


Responda a este correo electrónico directamente o véalo en GitHub
https://github.com/peers/peerjs/issues/103#issuecomment-60287567 .

Entonces, ¿qué se supone que debe hacer?

No sé si estoy confundido acerca del nodo, pero parece extraño tener un módulo npm para peerjs, si el módulo peerjs en sí solo se puede usar desde el navegador.

Lo siento, esto fue antes de que empezáramos a publicar la biblioteca en Bower.

michelle

El jueves 23 de octubre de 2014 a las 11:51 a. m., Alan Chusuei [email protected]
escribió:

No sé si estoy confundido acerca del nodo, pero parece extraño tener
un módulo npm para peerjs, si el propio módulo peerjs solo se puede usar desde
¿el navegador?


Responda a este correo electrónico directamente o véalo en GitHub
https://github.com/peers/peerjs/issues/103#issuecomment-60289790 .

@AChusuei No veo ningún problema en tener bibliotecas específicas del navegador en npm o bibliotecas isomorfas. Para mis aplicaciones web JS de pila completa, me gusta tener que lidiar solo con npm, en lugar de tener que buscar la mitad de las bibliotecas de npm y la otra mitad de Bower.

@michelle ¡Realmente espero que peerjs obtenga soporte para un cliente node.js!

@josdejong , supongo que podrías hacerlo de esa manera. Todavía soy nuevo en el mundo de los nodos, ¡estoy abierto a hacer las cosas de manera diferente!

:+1:

Hasta que se resuelva este problema, es posible que existan soluciones alternativas con navegadores sin interfaz. No los he probado por mí mismo:

Probaré con el segundo.

:+1:

¡+2^56 por la función!

:+1:

:+1:

:+1:

+1

El truco publicado por @piyushranjan no parece funcionar con la versión estable actual, ya que no exporta nada globalmente (y todos los módulos están en un solo archivo).

La solución para esto parece ser usar la versión no "compilada"/concatenada.

Por lo tanto, clone el repositorio y luego haga algo como esto:

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 especial atención a la línea require cerca de la parte inferior, que se encarga de cargar todas las partes por separado en el objeto global / window .

Sigue siendo un truco desagradable, pero parece funcionar, al menos para pruebas muy básicas.

Nota: Se aplican las mismas advertencias, aún necesita instalar algunos paquetes primero:

npm install BlobBuilder binary-pack ws xmlhttprequest wrtc

@lewiseason ¿Realmente conseguiste una conexión en funcionamiento y pudiste enviar algunos datos, por ejemplo?

No tuve éxito en esto hasta ahora. Parece que puedo abrir una conexión, pero no se ha creado ningún canal de datos.

Esto es lo que probé:

  1. Instalación

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

  1. Cree un archivo html peer1.html conectando un par de cliente con id 'peer1' :

``` html



par1



```
  1. Cree un script node.js peer3.js :

``` js
ventana = global;
ventana.BlobBuilder = require("BlobBuilder");
ubicación = {protocolo: 'http'};

PaqueteBinario = require("paquete-binario");
XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;

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

WebSocket = requerir ('ws');

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

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

peer.on('abrir', función () {
console.log('par abierto');
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 el archivo peer1.html en su navegador
  2. Ejecute el script node.js peer3.js

En cuanto a la salida de depuración, parece que peer3 se conectó con éxito a peer1, pero no establece un canal de datos: peer1 emite "nueva conexión a peer3", pero no se reciben mensajes.

Me temo que no llegué muy lejos al probarlo; le pareció un poco a Frankenstein para usarlo en producción, así que terminé dejándolo. Lo siento :(

:+1:

:+1:

¿Algún avance en esto?

@josdejong el problema radica en los datos de señalización. Parece que no se adjuntan datos de STUN a la oferta/respuesta. Sin estos datos no se puede realizar ninguna conexión real. Lo siguiente hace una conexión entre el navegador y el nodo, pero sin señalización peerjs.

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

+1

+1

¿Alguien quiere abrir una recompensa?

Como esto ha estado abierto durante más de dos años: ¿Hay algún (otro) paquete conocido que funcione P2P en el navegador y el nodo?

No he tenido tiempo de comprobarlo, pero https://github.com/feross/simple-peer dice que funciona tanto en node.js como en el navegador.

¿Es esto lo que estás buscando? https://github.com/socketio/socket.io-p2p

del archivo Léame:

"Este módulo proporciona una forma fácil y confiable de configurar una conexión WebRTC entre pares y comunicarse mediante eventos (el protocolo socket.io).

Socket.IO se usa para transportar datos de señalización y como respaldo para clientes donde WebRTC PeerConnection no es compatible".

En lo que a mí respecta, no funciona en Node. Por eso me encontré con este hilo.

Mmm. ¿Podría ser más específico? Lo estoy usando ahora mismo, usando un servidor de nodos para conectar pares que luego establecen conexiones webRTC entre sí y/o con la máquina del servidor de nodos.

usar un servidor de nodo para conectar pares que luego establecen conexiones webRTC entre sí

Entonces, _no_ lo está ejecutando como cliente. Lo está ejecutando en un servidor que conecta _otros_ clientes (que no menciona que son aplicaciones de nodo; si lo son, me interesaría cómo las configura).
Este hilo trata sobre el uso de peerjs (o potencialmente cualquier otra cosa) como un par (cliente) en una aplicación de nodo.

Conexiones webRTC entre sí y/o con la máquina del servidor del nodo

La segunda parte de eso parece exactamente lo que se está discutiendo aquí. ¿Alguien más puede confirmar esto?

No, el problema es usar NodeJS como cliente WebRTC. Es decir. conectarse desde una instancia de NodeJS que no es necesariamente el servidor.

Ah, disculpas. SimplePeer hará eso. Pero requiere que la plataforma del servidor tenga ciertas capacidades webrtc instaladas. El módulo 'wrtc' proporciona esto en la mayoría de las máquinas. En particular, _no_ en una raspberry pi en este momento, en caso de que te importe (¡a mí me importa!)

fragmento de su readme.md:

en nodo

Para usar esta biblioteca en el nodo, pase opts.wrtc como parámetro:

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

var peer1 = nuevo SimplePeer ({ iniciador: verdadero, wrtc: wrtc })
var peer2 = nuevo SimplePeer({ wrtc: wrtc })

+1 esta sería una buena característica

Consulte electron-webrtc o webrtc-native. Uso electron-webrtc para mi instancia de node.js para conectarme con los navegadores (usando específicamente el canal de datos)

Visión de conjunto
Hola, veo que esto es viejo, pero usted o cualquier persona podría necesitar esto. Estoy trabajando en mi tesis y he dado algunos pasos hacia adelante. He probado muchas cosas y simplepeer no tiene implementada la señalización. Ahora funciona el envío de mensajes a través del canal de datos (nodejs peerjs webrtc), a través de la red en Raspberry Pi 2 (ARM, Raspbian Jessie, pero debería funcionar en todas partes) utilizando el servidor de señalización implementado (peerserver). El otro cliente es un navegador Firefox en entorno Windows. No lo habría logrado sin su discusión aquí, así que estoy retribuyendo a la comunidad.

Cosas clave sobre qué (no) hacer:
-no use selenio, no es lo suficientemente rápido, al menos para mi aplicación
-xvfb no funcionó para mí, bueno, sí lo hizo
-no debe requerir el módulo peerjs
-al menos en Raspberry - use electron-webrtc, ya que wrtc no está disponible para arm de todos modos
-no utilice serialización

Tener que hacer todo por ti mismo es difícil, así que aquí está el código:
ventana = mundial
ventana.BlobBuilder = require("BlobBuilder")
ubicación = {protocolo: 'http'}

PaqueteBinario = require("paquete-binario")
XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var wrtc = require('electron-webrtc')()
//var Peer = require('peerjs')

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

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

var compañero = nuevo compañero (
...
})

var conn=peer.connect('id')
conn.serialization='ninguno'
conn.send('¡Hola desde nodejs!')

Eso es todo, saludos, JP

Hola @jeryfast , gracias por tus soluciones, estaba buscando algo así 👍

Lo pruebo en una Mac (todavía no en la frambuesa) y recibí el error "Error al establecer la propiedad 'Tipo binario' en 'RTCDataChannel': la compatibilidad con Blob aún no está implementada"

Después de algunas búsquedas, encontré que en el archivo utils, en la ruta node_modules/peerjs/lib alrededor de la línea 116:

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

eso está causando el error y la aplicación se bloquea.

Si se comenta el código, la aplicación funciona y se comporta como un cliente de navegador, simplemente hermoso. Pero es un truco sucio, así que estaba buscando una forma de "configurar" o hacer algo que no fuera cambiar el código de la biblioteca, pero hasta ahora no encontré ninguno.

El desafío reside en cuando se ejecuta ese fragmento de código, es decir, en el proceso de carga del módulo, cuando se realiza el requerimiento de las exportaciones:

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

¿Alguien tiene una idea o sugerencia sobre cómo corregir esto?

Saludos

Bien, si usa la serialización 'ninguna', también funciona, sin cambiar nada en una biblioteca. Saludos

Hola de nuevo, @jeryfast , funciona en Raspberry como dijiste. El problema en mi última publicación está relacionado con OS X.

Pues la cosa es un gran trabajo 👍

No, empecemos la diversión 💃

Hola
Estoy recibiendo este error.
```
global.postMessage(mensajeNombre, '*');
^

TypeError: global.postMessage no es una función
en Object.setZeroTimeoutPostMessage [como setZeroTimeout] (

@crosogf , ese error me parece un síntoma de un problema mayor. Parece que el único lugar donde se usa postMessage es en el código de manejo de errores. Supongo que tiene algo que ver con la detección de soporte de blob binario en lib/util.js (el código @nuno-nlfsoftware dice comentar). Noté que hay dos lugares donde está presente el código, en dist/peer.js o dist/peer.min.js, y en lib/util.js. Para mí, solo las modificaciones a este último fueron efectivas (debido al truco de @jeryfast de requerir lib/exports.js).

Además, la serialización de la conexión no tiene que establecerse en none . Puede usar cualquier otra opción además binary , solo necesita configurarlo ya que el binario es el predeterminado. Lo configuré en json que funciona bien.

Voy a dejar esto aquí https://www.npmjs.com/package/peerjs-nodejs

Gracias, creo que debería ser parte de PeerJS.

aquí está mi código después de la prueba 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);

Hola, recibo este error tan pronto como creo una instancia de Peer (usando peerjs-nodejs ) en el servidor NodeJS. Ni siquiera estoy creando una conexión con un Peer remoto en este momento. ¿Alguien lo ha solucionado?

servidor.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)

¿Alguien puede ayudar? Gracias.

¿Fue útil esta página
0 / 5 - 0 calificaciones