- Node >= 6 (Para la prueba use Node 6.10.0)
- NPM >= 5 (Para la prueba use NPM 5.6.0)
-
Lo primero que debemos hacer para instalar y correr el videochat, es dirigirnos a la carpeta
publicdesde la terminal y ejecutar el comandonpm install -
Luego nos dirigimos a la carpeta
serverdesde la terminal y ejecutamos el comandonpm install
-
En estos momentos, debemos correr dos servidores, primero tenemos que correr el servidor web que se encarga de montar la aplicacion para poder visualizar, para realizar esto, nos dirigimos a la carpeta
publicy corremos el comandonode website-server.js, el servidor se ejecutara enhttps://localhosto en la direccion de IP actual del computador -
Luego, abrimos otra terminal y debemos correr el servidor socket de
PeerJsque se encarga del flujo de la informacion, para realizar esto, nos dirigimos a la carpetaservery corremos el comandonode peer-server.js
Tenga en cuenta que para que la aplicacin se ejecute de forma correcta, desde el cliente debe establecer la direccion del socket al cual ud quiere conectar, en este caso, la direccion generada por el socket de PeerJs
Para realizar esto, en un editor de texto, abrimos el archivo ubicado en public/index.html y ubicar el siguiente codigo
var peer = new Peer(username, {
host: "localhost",
port: 9000,
path: '/peerjs',
debug: 3,
config: {
'iceServers': [
{
url: 'stun:stun1.l.google.com:19302'
},
{
url: 'turn:numb.viagenie.ca',
credential: 'muazkh',
username: '[email protected]'
}
]
}
});En el atributo host, sustituir por la direccion de IP actual del computador
Luego de hacer esto, el videochat funcionara a la perfeccion
// Sintaxis
@params {
evento : typeof string
funcion: typeof function
}
peer.on(evento, funcion);A continuacion, se presenta una tabla con los eventos de PeerJs usados en este videochat, cabe destacar que no son todos, para obtener mas informacion sobre la documentacion de PeerJs visite su pagina oficial
| Evento | Ejemplo | Descripcion | Funcion disparadora |
|---|---|---|---|
| open | peer.on('open', function(id) { // definicion }); |
Este evento se ejecuta al conectarse de forma correcta al socket de PeerJs, el parametro id de la funcion anonima devuelve el id autogenerado por PeerJs o el personalizado por el desarrollador |
Constructor de PeerJs |
| error | peer.on('open', function(err) { // definicion }); |
Este evento se ejecuta si ocurre un error al intentar conectarse al socket de PeerJs, el parametro err de la funcion anonima devuelve el error generado en err.type |
Constructor de PeerJs |
| connection | peer.on('connection', function(conn) { // definicion }); |
Este evento se ejecuta cuando se dectecta que una persona se ha conectado con tu usuario, el parametro conn de la funcion anonima devuelve la informacion sobre dicha conexion, este parametro a su vez, devuelve sus propios eventos los cuales especificaremos mas adelante |
peer.connect() |
| call | peer.on('call', function(call) { // definicion }); |
Esta evento se ejecuta cuando se detecta que alguien te esta llamando, el parametro call de la funcion anonima devuelve la informacion correspodiente a esta conexion, este parametro a su vez, devuelve sus propios eventos los cuales especificaremos mas adelante |
peer.call() |
peer.connect(id, opciones)
Ejemplo
@ Params {
id : string
opciones: object
}
peer.connect("id-peer", {
label: 'chat',
serialization: 'none',
metadata: {
// informacion personalizada para enviar al otro usuario
}
});peer.call(id, stream ,opciones)
Ejemplo
@ Params {
id : string
stream : blob,
opciones: object
}
peer.call("id-peer", stream, {
metadata: {
// informacion personalizada para enviar al otro usuario
}
});Ya que el parametro conn pertenece a una funcion anonima que es llamada desde el evento connection, es importante saber que los siguiente eventos a continuacion, corresponde a una variable local que solo puede ser ejecutada desde su entorno, tanto sus atributos, como eventos y funciones
| Evento | Ejemplo | Descripcion | Funcion disparadora |
|---|---|---|---|
| data | conn.on('data', function (data) { \\ definicion }); |
Este evento se ejecuta cuando un usuario conectado contigo, envia informacion, el parametro data en la funcion anonima, es la informacion misma |
|
| close | conn.on('close', function () { \\ definicion }); |
Este evento se ejecuta cuando se detecta que un usuario conectado contigo se ha desconectado del servidor | conn.close() |
El parametro call pertenece a una funcion anonima que es llamada desde el evento call, es importante saber que los siguiente eventos a continuacion, corresponde a una variable local que solo puede ser ejecutada desde su entorno, tanto sus atributos, como eventos y funciones
| Evento | Ejemplo | Descripcion | Funcion disparadora |
|---|---|---|---|
| stream | conn.on('stream', function (stream) { \\ definicion }); |
Este evento se ejecuta cuando aceptas una llamada de un usuario, el mismo recibe el audio y video enviado desde el usuario remoto | call.answer() |
| close | conn.on('close', function () { \\ definicion }); |
Este evento se ejecuta cuando se detecta que un usuario conectado contigo actualmente por videollamada se desconecta de la misma, sin embargo, el chat se mantiene activo ya que la conexion del chat no pertenece al entorno de la funcion anonima del evento call |
call.close() |
call.answer(stream)
Ejemplo
@ Params {
stream : blob
}
call.answer(stream);eachActiveConnection(conn): analiza todos los divs con la clase .active, toda aquel que tenga la clase y este conectado con el usuario, recibira la informacion que este envie, esta funcion se encarga de enviar a cada una de estas conexiones activas actualmente
function eachActiveConnection(fn) {
var actives = $('.active');
var checkedIds = {};
actives.each(function () {
var peerId = $(this).attr('id');
if (!checkedIds[peerId]) {
var conns = peer.connections[peerId];
for (var i = 0, ii = conns.length; i < ii; i += 1) {
var conn = conns[i];
fn(conn, $(this));
}
}
checkedIds[peerId] = 1;
});
}requestLocalVideo : Se encarga de solicitarte la conexion con tu camara web
function requestLocalVideo(callbacks) {
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;
navigator.getUserMedia({
audio: true,
video: true
}, callbacks.success, callbacks.error);
}onReceiveStream : Se encarga de ubicar el stream recibido en la etiqueta <video> correspondiente
function onReceiveStream(stream, element_id) {
var video = document.getElementById(element_id);
video.src = window.URL.createObjectURL(stream);
window.peer_stream = stream;
}escapeHtml : Se encarga de escapar los caracteres de etiquetas HTML con el fin de que cuando un usuario envie un mensaje cuyo contenido sea HTML, se envie tal cual y como lo ha escrito, evitando asi que el navegador pueda interpretar el contenido como HTML
var entityMap = {"&": "&","<": "<",">": ">",'"': ""","'": "'","/": "/","`": "`","=": "="};
function escapeHtml(string) {
return String(string).replace(/[&<>"'`=\/]/g, function(s) {
return entityMap[s];
});
}