Peerjs: Запустить клиент peerjs в приложении node.js?

Созданный на 6 нояб. 2013  ·  65Комментарии  ·  Источник: peers/peerjs

Можно ли запустить клиент peer.js в приложении node.js вместо браузера?

Я создаю одноранговую сеть, состоящую из (программных) пиров, живущих как в браузерах, так и в приложениях node.js. Они должны отправлять данные друг другу, без видео/аудио. WebRTC был бы отличным решением для маршрутизации и связи между одноранговыми узлами без необходимости централизованной структуры клиент/сервер. Но WebRTC вроде бы поддерживается только в браузере.

См. также этот вопрос: http://stackoverflow.com/questions/18872712/node-js-webrtc-client

Самый полезный комментарий

Обзор
Привет, я вижу, что это старо, но вам или кому-то это может понадобиться. Я работаю над своей диссертацией, и я сделал несколько шагов вперед. Я пробовал много вещей, и в simplepeer не реализована сигнализация. Отправка сообщений по каналу данных (nodejs peerjs webrtc) — по сети на Raspberry Pi 2 (ARM, Raspbian Jessie, но должна работать везде) с использованием развернутого сервера сигнализации (peerserver). Другой клиент - это браузер Firefox в среде Windows. Я бы не сделал этого без вашего обсуждения здесь, поэтому я отдаю должное сообществу.

Ключевые вещи о том, что (не) делать:
-не используйте селен, это недостаточно быстро, по крайней мере, для моего приложения
-xvfb у меня не сработало, ну сработало
-вы не должны требовать модуль peerjs
-по крайней мере на Raspberry - используйте электрон-webrtc, так как wrtc все равно не доступен для руки
-не использовать сериализацию

Делать все самому сложно, поэтому вот код:
окно = глобальное
window.BlobBuilder = требуется ("BlobBuilder")
местоположение = {протокол: 'http'}

BinaryPack = требуется ("двоичный пакет")
XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var wrtc = требуется ('электрон-webrtc') ()
//var Peer = require('peerjs')

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

WebSocket = требуется ('ws')
require('/home/pi/node_modules/peerjs/lib/exports.js');

var одноранговый = новый одноранговый(
...
})

var conn=peer.connect('id')
conn.serialization = 'нет'
conn.send('привет от nodejs!')

Вот и все, с уважением, JP

Все 65 Комментарий

Я нашел инициативу @helloIAmPau по созданию реализации WebRTC в node.js: https://github.com/helloIAmPau/node-rtc/. Может быть, можно объединить силы?

Эй, Джос,

Я буду следить за этим. Когда есть надежный клиент узла webrtc, он
должно быть тривиально для переноса peerjs.

В среду, 6 ноября 2013 г., в 6:46 утра, Jos de [email protected] написал :

Я нашел инициативу @helloIAmPau https://github.com/helloIAmPau , чтобы
создайте реализацию WebRTC в node.js:
https://github.com/helloIAmPau/node-rtc/. Может быть, можно связать
силы?


Ответьте на это письмо напрямую или просмотрите его на Gi tHubhttps://github.com/peers/peerjs/issues/103#issuecomment -27878686
.

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

См. также https://github.com/modeswitch/node-webrtc . Я думаю, что node-rtc заменяется им.

Спасибо, Эрик, это было бы здорово.

Это также позволит приложению node.js, работающему в качестве MCU , управлять видео/аудиопотоками для группы одноранговых узлов (конференц-связь) в звездообразной архитектуре, как объяснил Джастин Уберти в последнем вводе- выводе Google на WebRTC (от 23 :19). Node.js хорошо справляется с потоками, так что это может отлично подойти.

@ericz , в чем причина закрытия этой проблемы? Поддержка node.js была бы действительно потрясающей и мощной.

Эй, Джосдеджонг,

Я закрыл его, потому что там нет действий, но я снова открою его, чтобы мы могли следить за функцией :)

хорошо спасибо. Не стесняйтесь изменить заголовок на что-то вроде «поддержка node.js» и дать проблеме правильный ярлык...

:+1: Это было бы очень полезной функцией.

:+1: Голосую за это тоже.

:+1: очень нужно

+1

Мне удалось издеваться над некоторыми объектами и запустить peerjs на node.js

окно={};
window.BlobBuilder = требуют ("BlobBuilder");
местоположение={};
местоположение.протокол="http";

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

вар wrtc = требуют ("wrtc");
RTCPeerConnection = wrtc.RTCPeerConnection;
RTCSessionDescription = wrtc.RTCSessionDescription;
RTCIceCandidate = wrtc.RTCIceCandidate;

WebSocket = требуется ('ws');
вар peerClient =require("./peer.js");

Мне удалось настроить соединения peerjs и установить соединения с сервером. Однако, когда я пытаюсь отправить данные, я получаю сообщение об ошибке

[Ошибка: соединение не открыто. Вы должны прослушивать событие open перед отправкой сообщений.]

Вот полная суть

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

И эти пакеты npm должны быть установлены

npm установить BlobBuilder
npm установить бинарный пакет
нпм установить ws
npm установить xmlhttprequest
npm установить wrtc

Ах, это действительно здорово! Посмотрю :).

Мишель

Во вторник, 6 мая 2014 г., в 7:37, Пиюш Ранджан ( [email protected] ) написал:

Мне удалось издеваться над некоторыми объектами и запустить peerjs на node.js

окно={};
window.BlobBuilder = требуют ("BlobBuilder");
местоположение={};
местоположение.протокол="http";

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

вар wrtc = требуют ("wrtc");
RTCPeerConnection = wrtc.RTCPeerConnection;
RTCSessionDescription = wrtc.RTCSessionDescription;
RTCIceCandidate = wrtc.RTCIceCandidate;

WebSocket = требуется ('ws');
вар peerClient =require("./peer.js");

Мне удалось настроить соединения peerjs и установить соединения с сервером.
Однако, когда я пытаюсь отправить данные, я получаю сообщение об ошибке

[Ошибка: соединение не открыто. Вы должны слушать открытое событие
перед отправкой сообщений.]

Вот полная суть

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

И эти пакеты npm должны быть установлены

npm установить BlobBuilder
npm установить бинарный пакет
нпм установить ws
npm установить xmlhttprequest
npm установить wrtc


Ответьте на это письмо напрямую или просмотрите его на Gi tHubhttps://github.com/peers/peerjs/issues/103#issuecomment -42292282
.

@Мишель уже повезло с этим? Я попытался, и открытие соединения, похоже, работает, но отправленные сообщения никогда не принимаются.

:+1: для этой функции

:+1: для этой функции

:+1:

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

Мне было интересно, в каком статусе это было? Было бы здорово, если бы это поддерживали?

Есть модуль node для peerjs, но я думаю, что он еще не работает. Когда мне это нужно, я получаю, что окно не определено, что является справедливым возражением.
https://www.npmjs.org/package/peerjs#readme

Вот мне и интересно: что-то происходит? Было бы так здорово иметь его! ;)

Этот модуль узла предназначен для кода браузера :).

Мишель

Чт, 23 октября 2014 г., 11:37, [email protected]
написал:

Есть модуль node для peerjs, но я думаю, что он еще не работает. Когда я
требуют этого, я получаю, что окно не определено, что является справедливым возражением.
https://www.npmjs.org/package/peerjs#readme

Вот мне и интересно: что-то происходит? Было бы так здорово иметь
Это! ;)


Ответьте на это письмо напрямую или просмотрите его на GitHub
https://github.com/peers/peerjs/issues/103#issuecomment-60287567 .

Так что же он должен делать?

Я не знаю, может быть, я просто запутался в узле, но мне кажется странным иметь модуль npm для peerjs, если сам модуль peerjs можно использовать только из браузера?

Извините, это было до того, как мы начали публиковать библиотеку на Bower.

Мишель

В четверг, 23 октября 2014 г., в 11:51, Алан Чусуэй, [email protected]
написал:

Я не знаю, просто ли я запутался в узле, но мне кажется странным
модуль npm для peerjs, если сам модуль peerjs можно использовать только из
браузер?


Ответьте на это письмо напрямую или просмотрите его на GitHub
https://github.com/peers/peerjs/issues/103#issuecomment-60289790 .

@AChusuei Я не вижу никаких проблем с наличием специфичных для браузера библиотек в npm или изоморфных библиотек. Для моих веб-приложений с полным стеком JS мне нравится иметь дело только с npm, вместо того, чтобы получать половину библиотек из npm, а другую половину из Bower.

@michelle Я очень надеюсь, что peerjs получит поддержку клиента node.js!!

@josdejong , я думаю, вы могли бы сделать это таким образом. Я все еще новичок в мире узлов и готов делать что-то по-другому!

:+1:

Пока эта проблема не будет решена, могут быть возможные обходные пути с безголовыми браузерами. Я не проверял их на себе:

попробую второй.

:+1:

+2^56 за функцию!

:+1:

:+1:

:+1:

+1

Хак, опубликованный @piyushranjan , похоже, не работает с текущей стабильной версией, поскольку он ничего не экспортирует глобально (и все модули находятся в одном файле).

Обходной путь для этого, по-видимому, заключается в использовании не "скомпилированной"/конкатенированной версии.

Таким образом, клонируйте репозиторий, а затем сделайте что-то вроде этого:

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...
});

Обратите особое внимание на строку require внизу, которая отвечает за загрузку всех отдельных частей в объект global / window .

Все еще неприятный хак, но, похоже, он работает, по крайней мере, для самых простых тестов.

Примечание. Применяются те же предостережения, вам все равно нужно сначала установить некоторые пакеты:

npm install BlobBuilder binary-pack ws xmlhttprequest wrtc

@lewiseason У вас действительно установлено и работает соединение, и вы можете, например, отправить некоторые данные?

Мне это пока не удалось. Похоже, я могу открыть соединение, но канал данных не создан.

Вот что я пробовал:

  1. Установка

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

  1. Создайте html-файл peer1.html , соединяющий одноранговый клиент с идентификатором 'peer1' :

``` html



одноранговый узел1



```
  1. Создайте скрипт node.js peer3.js :

```js
окно = глобальное;
window.BlobBuilder = требуют ("BlobBuilder");
location = {протокол: 'http'};

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

вар wrtc = требуют ("wrtc");
RTCPeerConnection = wrtc.RTCPeerConnection;
RTCSessionDescription = wrtc.RTCSessionDescription;
RTCIceCandidate = wrtc.RTCIceCandidate;

WebSocket = требуется ('ws');

требуют('peerjs/lib/exports.js');

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

peer.on('открыть', функция () {
console.log('одноранговое открытие');
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. Откройте файл peer1.html в браузере.
  2. Запустите скрипт node.js peer3.js

Глядя на вывод отладки, похоже, что узел 3 успешно подключен к узлу 1, но не устанавливает канал данных: узел 1 выводит «новое соединение с узлом 3», но сообщений не получено.

Боюсь, я не очень далеко продвинулся в тестировании — Франкенштейну показалось, что это немного для использования в производстве, поэтому я в итоге оставил его. К сожалению :(

:+1:

:+1:

Есть новости по этому поводу?

@josdejong проблема связана с сигнальными данными. Похоже, что к предложению/ответу не прикрепляются данные STUN. Без этих данных не может быть установлено фактическое соединение. Следующее устанавливает соединение между браузером и узлом, но без сигнализации peerjs.

https://github.com/cjb/бессерверный-webrtc

+1

+1

Кто-нибудь хочет открыть баунти?

Поскольку это было открыто более двух лет: есть ли какой-либо (другой) известный пакет, который работает с P2P в браузере и узле?

У меня не было времени проверить это, но https://github.com/feross/simple-peer говорит, что это работает как в node.js, так и в браузере.

Это то, что вы ищете? https://github.com/socketio/socket.io-p2p

из ридми:

«Этот модуль предоставляет простой и надежный способ установить соединение WebRTC между одноранговыми узлами и обмениваться данными с использованием событий (протокол socket.io).

Socket.IO используется для передачи данных сигнализации и в качестве запасного варианта для клиентов, для которых WebRTC PeerConnection не поддерживается».

Насколько я понимаю, это не работает на Node. Вот почему я столкнулся с этой темой.

Хм. Не могли бы вы быть более конкретным? Я использую его прямо сейчас, используя сервер узла для подключения пиров, которые затем устанавливают соединения WebRTC друг с другом и/или с машиной сервера узла.

использование узлового сервера для подключения пиров, которые затем устанавливают соединения WebRTC друг с другом

Итак, вы _не_ запускаете его как клиент. Вы запускаете его на сервере, который подключает _other_ клиентов (которые вы не упоминаете как приложения узла - если они есть, мне было бы интересно, как вы их настроили).
Этот поток посвящен использованию peerjs (или, возможно, чего-то еще) в качестве партнера (клиента) в приложении узла.

соединения webRTC друг с другом и/или с серверной машиной узла

Вторая часть этого кажется именно тем, что обсуждается здесь. Кто-нибудь еще может подтвердить это?

Нет, проблема в использовании NodeJS в качестве клиента WebRTC. Т.е. подключиться из экземпляра NodeJS, который не обязательно является сервером.

О, извините. SimplePeer сделает это. Но для этого требуется, чтобы на серверной платформе были установлены определенные возможности webrtc. Модуль «wrtc» обеспечивает это на большинстве машин. В частности, _не_ на raspberry pi прямо сейчас, если это важно для вас (для меня это важно!)

фрагмент из их readme.md:

в узле

Чтобы использовать эту библиотеку в узле, передайте opts.wrtc в качестве параметра:

var SimplePeer = требуется ('простой узел')
вар wrtc = требуется ('wrtc')

var peer1 = новый SimplePeer({инициатор: true, wrtc: wrtc})
var peer2 = новый SimplePeer({wrtc: wrtc})

+1 это была бы хорошая функция

Проверьте электронный-webrtc или webrtc-native. Я использую electronic-webrtc для своего экземпляра node.js для подключения к браузерам (в частности, используя канал данных)

Обзор
Привет, я вижу, что это старо, но вам или кому-то это может понадобиться. Я работаю над своей диссертацией, и я сделал несколько шагов вперед. Я пробовал много вещей, и в simplepeer не реализована сигнализация. Отправка сообщений по каналу данных (nodejs peerjs webrtc) — по сети на Raspberry Pi 2 (ARM, Raspbian Jessie, но должна работать везде) с использованием развернутого сервера сигнализации (peerserver). Другой клиент - это браузер Firefox в среде Windows. Я бы не сделал этого без вашего обсуждения здесь, поэтому я отдаю должное сообществу.

Ключевые вещи о том, что (не) делать:
-не используйте селен, это недостаточно быстро, по крайней мере, для моего приложения
-xvfb у меня не сработало, ну сработало
-вы не должны требовать модуль peerjs
-по крайней мере на Raspberry - используйте электрон-webrtc, так как wrtc все равно не доступен для руки
-не использовать сериализацию

Делать все самому сложно, поэтому вот код:
окно = глобальное
window.BlobBuilder = требуется ("BlobBuilder")
местоположение = {протокол: 'http'}

BinaryPack = требуется ("двоичный пакет")
XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var wrtc = требуется ('электрон-webrtc') ()
//var Peer = require('peerjs')

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

WebSocket = требуется ('ws')
require('/home/pi/node_modules/peerjs/lib/exports.js');

var одноранговый = новый одноранговый(
...
})

var conn=peer.connect('id')
conn.serialization = 'нет'
conn.send('привет от nodejs!')

Вот и все, с уважением, JP

Привет @jeryfast , спасибо за ваши решения, я искал что-то подобное 👍

Я тестировал его на Mac (еще не на малине) и получал ошибку «Не удалось установить свойство« двоичный тип »на« RTCDataChannel »: поддержка больших двоичных объектов еще не реализована»

После некоторого поиска обнаружил, что в файловых утилитах по пути node_modules/peerjs/lib вокруг строки 116:

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

это вызывает ошибку и сбой приложения.

Если код прокомментирован, приложение работает и ведет себя как клиент браузера, просто красиво. Но это грязный взлом, поэтому я искал способ «настроить» или сделать что-то, что не будет изменять код из библиотеки, но до сих пор я ничего не нашел.

Проблема заключается в том, когда этот фрагмент кода выполняется, то есть в процессе загрузки модуля, когда выполняется требование экспорта:

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

У кого-нибудь есть идея или предложение о том, как это исправить?

С уважением

Хорошо, если вы используете сериализацию «нет», она также работает, ничего не меняя в библиотеке. С уважением

Еще раз привет, @jeryfast , как ты сказал, он работает на малине. Проблема в моем последнем посте связана с OS X.

Ну вещь отличная работа 👍

Нет, давайте начнем веселье 💃

Привет
Я получаю эту ошибку.
```
global.postMessage (имя сообщения, '*');
^

TypeError: global.postMessage не является функцией
в Object.setZeroTimeoutPostMessage [как setZeroTimeout] (

@crosogf , эта ошибка кажется мне симптомом более серьезной проблемы. Похоже, что postMessage используется только в коде обработки ошибок. Я предполагаю, что это как-то связано с обнаружением поддержки бинарных BLOB-объектов в lib/util.js (код @nuno-nlfsoftware говорит закомментировать). Я заметил, что код присутствует в двух местах: в dist/peer.js или dist/peer.min.js и в lib/util.js. Для меня эффективны были только модификации последнего (из-за того, что @jeryfast взломал требование lib/exports.js).

Я просто оставлю это здесь https://www.npmjs.com/package/peerjs-nodejs

Кроме того, сериализация соединения не должна быть установлена ​​​​на none . Вы можете использовать любой другой параметр, кроме binary , вам просто нужно установить его, так как двоичный файл используется по умолчанию. Я установил его на json , который отлично работает.

Я просто оставлю это здесь https://www.npmjs.com/package/peerjs-nodejs

Спасибо, я думаю, что это должно быть частью PeerJS.

вот мой код после теста 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);

Здравствуйте, я получаю эту ошибку, как только создаю экземпляр Peer (используя peerjs-nodejs ) на сервере NodeJS. В данный момент я даже не создаю соединение с удаленным узлом. Кто-нибудь решил это?

сервер.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)

Кто-нибудь может помочь? Спасибо.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги