Changed protoojs to socketio

This commit is contained in:
Håvar Aambø Fosstveit
2018-10-19 10:00:54 +02:00
parent ff5678fa1b
commit 734a0aa575
8 changed files with 4423 additions and 4292 deletions
+186 -200
View File
@@ -1,7 +1,6 @@
'use strict';
const EventEmitter = require('events').EventEmitter;
const protooServer = require('protoo-server');
const WebTorrent = require('webtorrent-hybrid');
const Logger = require('./Logger');
const config = require('../config');
@@ -39,11 +38,10 @@ class Room extends EventEmitter
this._fileHistory = [];
this._signalingPeers = new Map();
try
{
// Protoo Room instance.
this._protooRoom = new protooServer.Room();
// mediasoup Room instance.
this._mediaRoom = mediaServer.Room(config.mediasoup.mediaCodecs);
}
@@ -75,9 +73,14 @@ class Room extends EventEmitter
this._closed = true;
// Close the protoo Room.
if (this._protooRoom)
this._protooRoom.close();
// Close the signalingPeers
if (this._signalingPeers)
for (let peer of this._signalingPeers)
{
peer.socket.disconnect();
};
this._signalingPeers.clear();
// Close the mediasoup Room.
if (this._mediaRoom)
@@ -93,31 +96,32 @@ class Room extends EventEmitter
return;
logger.info(
'logStatus() [room id:"%s", protoo peers:%s, mediasoup peers:%s]',
'logStatus() [room id:"%s", peers:%s, mediasoup peers:%s]',
this._roomId,
this._protooRoom.peers.length,
this._signalingPeers.length,
this._mediaRoom.peers.length);
}
handleConnection(peerName, transport)
handleConnection(peerName, socket)
{
logger.info('handleConnection() [peerName:"%s"]', peerName);
if (this._protooRoom.hasPeer(peerName))
if (this._signalingPeers.has(peerName))
{
logger.warn(
'handleConnection() | there is already a peer with same peerName, ' +
'closing the previous one [peerName:"%s"]',
peerName);
const protooPeer = this._protooRoom.getPeer(peerName);
const signalingPeer = this._signalingPeers.get(peerName);
protooPeer.close();
signalingPeer.socket.disconnect();
this._signalingPeers.delete(peerName);
}
const protooPeer = this._protooRoom.createPeer(peerName, transport);
const signalingPeer = { peerName : peerName, socket : socket };
this._handleProtooPeer(protooPeer);
this._handleSignalingPeer(signalingPeer);
}
_handleMediaRoom()
@@ -173,8 +177,8 @@ class Room extends EventEmitter
}
}
// Spread to others via protoo.
this._protooRoom.spread(
// Spread to room
this.emit(
'active-speaker',
{
peerName : activePeer ? activePeer.name : null
@@ -182,172 +186,156 @@ class Room extends EventEmitter
});
}
_handleProtooPeer(protooPeer)
_handleSignalingPeer(signalingPeer)
{
logger.debug('_handleProtooPeer() [peer:"%s"]', protooPeer.id);
logger.debug('_handleSignalingPeer() [peer:"%s"]', signalingPeer.id);
protooPeer.on('request', (request, accept, reject) =>
signalingPeer.socket.on('mediasoup-request', (request, cb) =>
{
logger.debug(
'protoo "request" event [method:%s, peer:"%s"]',
request.method, protooPeer.id);
const mediasoupRequest = request;
switch (request.method)
{
case 'mediasoup-request':
{
const mediasoupRequest = request.data;
this._handleMediasoupClientRequest(
protooPeer, mediasoupRequest, accept, reject);
break;
}
case 'mediasoup-notification':
{
accept();
const mediasoupNotification = request.data;
this._handleMediasoupClientNotification(
protooPeer, mediasoupNotification);
break;
}
case 'change-display-name':
{
accept();
const { displayName } = request.data;
const { mediaPeer } = protooPeer.data;
const oldDisplayName = mediaPeer.appData.displayName;
mediaPeer.appData.displayName = displayName;
// Spread to others via protoo.
this._protooRoom.spread(
'display-name-changed',
{
peerName : protooPeer.id,
displayName : displayName,
oldDisplayName : oldDisplayName
},
[ protooPeer ]);
break;
}
case 'change-profile-picture':
{
accept();
this._protooRoom.spread('profile-picture-changed', {
peerName : protooPeer.id,
picture : request.data.picture
}, [ protooPeer ]);
break;
}
case 'chat-message':
{
accept();
const { chatMessage } = request.data;
this._chatHistory.push(chatMessage);
// Spread to others via protoo.
this._protooRoom.spread(
'chat-message-receive',
{
peerName : protooPeer.id,
chatMessage : chatMessage
},
[ protooPeer ]);
break;
}
case 'chat-history':
{
accept();
protooPeer.send(
'chat-history-receive',
{ chatHistory: this._chatHistory }
);
break;
}
case 'send-file':
{
accept();
const fileData = request.data.file;
this._fileHistory.push(fileData);
if (!torrentClient.get(fileData.file.magnet))
{
torrentClient.add(fileData.file.magnet);
}
this._protooRoom.spread('file-receive', {
file : fileData
}, [ protooPeer ]);
break;
}
case 'file-history':
{
accept();
protooPeer.send('file-history-receive', {
fileHistory : this._fileHistory
});
break;
}
case 'raisehand-message':
{
accept();
const { raiseHandState } = request.data;
const { mediaPeer } = protooPeer.data;
mediaPeer.appData.raiseHandState = request.data.raiseHandState;
// Spread to others via protoo.
this._protooRoom.spread(
'raisehand-message',
{
peerName : protooPeer.id,
raiseHandState : raiseHandState
},
[ protooPeer ]);
break;
}
default:
{
logger.error('unknown request.method "%s"', request.method);
reject(400, `unknown request.method "${request.method}"`);
}
}
this._handleMediasoupClientRequest(
signalingPeer, mediasoupRequest, cb);
});
protooPeer.on('close', () =>
signalingPeer.socket.on('mediasoup-notification', (request, cb) =>
{
logger.debug('protoo Peer "close" event [peer:"%s"]', protooPeer.id);
// Return no error
cb(null);
const { mediaPeer } = protooPeer.data;
const mediasoupNotification = request;
this._handleMediasoupClientNotification(
signalingPeer, mediasoupNotification);
});
signalingPeer.socket.on('change-display-name', (request, cb) =>
{
// Return no error
cb(null);
const { displayName } = request;
const mediaPeer = this._mediaRoom.getPeerByName(peerName);
const oldDisplayName = mediaPeer.appData.displayName;
mediaPeer.appData.displayName = displayName;
signalingPeer.socket.broadcast.to(this._roomId).emit(
'display-name-changed',
{
peerName : signalingPeer.peerName,
displayName : displayName,
oldDisplayName : oldDisplayName
}
);
});
signalingPeer.socket.on('change-profile-picture', (request, cb) =>
{
// Return no error
cb(null);
signalingPeer.socket.broadcast.to(this._roomId).emit(
'profile-picture-changed',
{
peerName : signalingPeer.peerName,
picture : request.picture
}
);
});
signalingPeer.socket.on('chat-message', (request, cb) =>
{
// Return no error
cb(null);
const { chatMessage } = request;
this._chatHistory.push(chatMessage);
// Spread to others
signalingPeer.socket.broadcast.to(this._roomId).emit(
'chat-message-receive',
{
peerName : signalingPeer.peerName,
chatMessage : chatMessage
}
);
});
signalingPeer.socket.on('chat-history', (request, cb) =>
{
// Return no error
cb(null);
// Return to socket
signalingPeer.socket.emit(
'chat-history-receive',
{ chatHistory: this._chatHistory }
);
});
signalingPeer.socket.on('send-file', (request, cb) =>
{
// Return no error
cb(null);
const fileData = request.data.file;
this._fileHistory.push(fileData);
if (!torrentClient.get(fileData.file.magnet))
{
torrentClient.add(fileData.file.magnet);
}
// Spread to others
signalingPeer.socket.broadcast.to(this._roomId).emit(
'file-receive',
{
file : fileData
}
);
});
signalingPeer.socket.on('file-history', (request, cb) =>
{
// Return no error
cb(null);
// Return to socket
signalingPeer.socket.emit(
'file-history-receive',
{
fileHistory : this._fileHistory
}
);
});
signalingPeer.socket.on('raisehand-message', (request, cb) =>
{
// Return no error
cb(null);
const { raiseHandState } = request.data;
const { mediaPeer } = signalingPeer;
mediaPeer.appData.raiseHandState = request.data.raiseHandState;
// Spread to others
signalingPeer.socket.broadcast.to(this._roomId).emit(
'raisehand-message',
{
peerName : signalingPeer.peerName,
raiseHandState : raiseHandState
},
);
});
signalingPeer.socket.on('disconnect', () =>
{
logger.debug('Peer "close" event [peer:"%s"]', signalingPeer.peerName);
const mediaPeer = this._mediaRoom.getPeerByName(signalingPeer.peerName);
if (mediaPeer && !mediaPeer.closed)
mediaPeer.close();
@@ -371,12 +359,11 @@ class Room extends EventEmitter
});
}
_handleMediaPeer(protooPeer, mediaPeer)
_handleMediaPeer(signalingPeer, mediaPeer)
{
mediaPeer.on('notify', (notification) =>
{
protooPeer.send('mediasoup-notification', notification)
.catch(() => {});
signalingPeer.socket.emit('mediasoup-notification', notification);
});
mediaPeer.on('newtransport', (transport) =>
@@ -424,12 +411,11 @@ class Room extends EventEmitter
// Notify about the existing active speaker.
if (this._currentActiveSpeaker)
{
protooPeer.send(
signalingPeer.socket.emit(
'active-speaker',
{
peerName : this._currentActiveSpeaker.name
})
.catch(() => {});
});
}
}
@@ -495,19 +481,19 @@ class Room extends EventEmitter
consumer.setPreferredProfile('low');
}
_handleMediasoupClientRequest(protooPeer, request, accept, reject)
_handleMediasoupClientRequest(signalingPeer, request, cb)
{
logger.debug(
'mediasoup-client request [method:%s, peer:"%s"]',
request.method, protooPeer.id);
request.method, signalingPeer.peerName);
switch (request.method)
{
case 'queryRoom':
{
this._mediaRoom.receiveRequest(request)
.then((response) => accept(response))
.catch((error) => reject(500, error.toString()));
.then((response) => cb(null, response))
.catch((error) => cb(error.toString()));
break;
}
@@ -517,15 +503,15 @@ class Room extends EventEmitter
// TODO: Handle appData. Yes?
const { peerName } = request;
if (peerName !== protooPeer.id)
if (peerName !== signalingPeer.peerName)
{
reject(403, 'that is not your corresponding mediasoup Peer name');
cb('that is not your corresponding mediasoup Peer name');
break;
}
else if (protooPeer.data.mediaPeer)
else if (signalingPeer.mediaPeer)
{
reject(500, 'already have a mediasoup Peer');
cb('already have a mediasoup Peer');
break;
}
@@ -533,18 +519,18 @@ class Room extends EventEmitter
this._mediaRoom.receiveRequest(request)
.then((response) =>
{
accept(response);
cb(null, response);
// Get the newly created mediasoup Peer.
const mediaPeer = this._mediaRoom.getPeerByName(peerName);
protooPeer.data.mediaPeer = mediaPeer;
signalingPeer.mediaPeer = mediaPeer;
this._handleMediaPeer(protooPeer, mediaPeer);
this._handleMediaPeer(signalingPeer, mediaPeer);
})
.catch((error) =>
{
reject(500, error.toString());
cb(error.toString());
});
break;
@@ -552,7 +538,7 @@ class Room extends EventEmitter
default:
{
const { mediaPeer } = protooPeer.data;
const { mediaPeer } = signalingPeer;
if (!mediaPeer)
{
@@ -560,25 +546,25 @@ class Room extends EventEmitter
'cannot handle mediasoup request, no mediasoup Peer [method:"%s"]',
request.method);
reject(400, 'no mediasoup Peer');
cb('no mediasoup Peer');
}
mediaPeer.receiveRequest(request)
.then((response) => accept(response))
.catch((error) => reject(500, error.toString()));
.then((response) => cb(null, response))
.catch((error) => cb(error.toString()));
}
}
}
_handleMediasoupClientNotification(protooPeer, notification)
_handleMediasoupClientNotification(signalingPeer, notification)
{
logger.debug(
'mediasoup-client notification [method:%s, peer:"%s"]',
notification.method, protooPeer.id);
notification.method, signalingPeer.peerName);
// NOTE: mediasoup-client just sends notifications with target 'peer',
// so first of all, get the mediasoup Peer.
const { mediaPeer } = protooPeer.data;
const { mediaPeer } = signalingPeer;
if (!mediaPeer)
{