@@ -4,6 +4,7 @@ const throttle = require('@sitespeed.io/throttle');
4
4
const Logger = require ( './Logger' ) ;
5
5
const config = require ( '../config' ) ;
6
6
const Bot = require ( './Bot' ) ;
7
+ const jwt = require ( 'jsonwebtoken' ) ;
7
8
8
9
const logger = new Logger ( 'Room' ) ;
9
10
@@ -25,7 +26,7 @@ class Room extends EventEmitter
25
26
* mediasoup Router must be created.
26
27
* @param {String } roomId - Id of the Room instance.
27
28
*/
28
- static async create ( { mediasoupWorker, roomId } )
29
+ static async create ( { mediasoupWorker, roomId, authKey } )
29
30
{
30
31
logger . info ( 'create() [roomId:%s]' , roomId ) ;
31
32
@@ -54,11 +55,12 @@ class Room extends EventEmitter
54
55
protooRoom,
55
56
mediasoupRouter,
56
57
audioLevelObserver,
57
- bot
58
+ bot,
59
+ authKey
58
60
} ) ;
59
61
}
60
62
61
- constructor ( { roomId, protooRoom, mediasoupRouter, audioLevelObserver, bot } )
63
+ constructor ( { roomId, protooRoom, mediasoupRouter, audioLevelObserver, bot, authKey } )
62
64
{
63
65
super ( ) ;
64
66
this . setMaxListeners ( Infinity ) ;
@@ -105,6 +107,8 @@ class Room extends EventEmitter
105
107
// @type {Boolean }
106
108
this . _networkThrottled = false ;
107
109
110
+ this . _authKey = authKey ;
111
+
108
112
// Handle audioLevelObserver.
109
113
this . _handleAudioLevelObserver ( ) ;
110
114
@@ -202,6 +206,8 @@ class Room extends EventEmitter
202
206
peer . data . consumers = new Map ( ) ;
203
207
peer . data . dataProducers = new Map ( ) ;
204
208
peer . data . dataConsumers = new Map ( ) ;
209
+ peer . data . peerToConsumers = new Map ( ) ;
210
+ peer . data . blockedPeers = new Set ( ) ;
205
211
206
212
peer . on ( 'request' , ( request , accept , reject ) =>
207
213
{
@@ -705,7 +711,8 @@ class Room extends EventEmitter
705
711
displayName,
706
712
device,
707
713
rtpCapabilities,
708
- sctpCapabilities
714
+ sctpCapabilities,
715
+ token
709
716
} = request . data ;
710
717
711
718
// Store client data into the protoo Peer data object.
@@ -714,6 +721,7 @@ class Room extends EventEmitter
714
721
peer . data . device = device ;
715
722
peer . data . rtpCapabilities = rtpCapabilities ;
716
723
peer . data . sctpCapabilities = sctpCapabilities ;
724
+ peer . data . token = token ;
717
725
718
726
// Tell the new Peer about already joined Peers.
719
727
// And also create Consumers for existing Producers.
@@ -1387,6 +1395,71 @@ class Room extends EventEmitter
1387
1395
break ;
1388
1396
}
1389
1397
1398
+ case 'kick' :
1399
+ {
1400
+ jwt . verify ( peer . data . token , this . _authKey , { algorithms : [ 'RS512' ] } , ( err , decoded ) => {
1401
+ if ( err ) {
1402
+ reject ( 500 , err ) ;
1403
+ } else {
1404
+ if ( decoded . kick_users ) {
1405
+ const consumerId = request . data . user_id ;
1406
+ if ( this . _protooRoom . hasPeer ( consumerId ) ) {
1407
+ this . _protooRoom . getPeer ( consumerId ) . close ( ) ;
1408
+ }
1409
+ accept ( ) ;
1410
+ } else {
1411
+ reject ( 401 ) ;
1412
+ }
1413
+ }
1414
+ } ) ;
1415
+ break ;
1416
+ }
1417
+
1418
+ case 'block' :
1419
+ {
1420
+ const localPeer = peer ;
1421
+ const remotePeerId = request . data . whom ;
1422
+
1423
+ const localConsumerId = localPeer . data . peerToConsumers . get ( remotePeerId ) ;
1424
+ if ( localPeer . data . consumers . has ( localConsumerId ) ) {
1425
+ localPeer . data . blockedPeers . add ( remotePeerId ) ;
1426
+ localPeer . data . consumers . get ( localConsumerId ) . pause ( ) ;
1427
+
1428
+ if ( this . _protooRoom . hasPeer ( remotePeerId ) ) {
1429
+ const remotePeer = this . _protooRoom . getPeer ( remotePeerId )
1430
+ const remoteConsumerId = remotePeer . data . peerToConsumers . get ( localPeer . id ) ;
1431
+ if ( remotePeer . data . consumers . has ( remoteConsumerId ) ) {
1432
+ remotePeer . data . consumers . get ( remoteConsumerId ) . pause ( ) ;
1433
+ remotePeer . notify ( 'peerBlocked' , { peerId : localPeer . id } ) . catch ( ( ) => { } ) ;
1434
+ }
1435
+ }
1436
+ }
1437
+ accept ( ) ;
1438
+ break ;
1439
+ }
1440
+
1441
+ case 'unblock' :
1442
+ {
1443
+ const localPeer = peer ;
1444
+ const remotePeerId = request . data . whom ;
1445
+
1446
+ localPeer . data . blockedPeers . delete ( remotePeerId ) ;
1447
+
1448
+ if ( this . _protooRoom . hasPeer ( remotePeerId ) ) {
1449
+ const remotePeer = this . _protooRoom . getPeer ( remotePeerId ) ;
1450
+ if ( ! remotePeer . data . blockedPeers . has ( localPeer . id ) &&
1451
+ localPeer . data . consumers . has ( localPeer . data . peerToConsumers . get ( remotePeerId ) ) &&
1452
+ remotePeer . data . consumers . has ( remotePeer . data . peerToConsumers . get ( localPeer . id ) ) ) {
1453
+ localPeer . data . consumers . get ( localPeer . data . peerToConsumers . get ( remotePeerId ) ) . resume ( ) ;
1454
+ remotePeer . data . consumers . get ( remotePeer . data . peerToConsumers . get ( localPeer . id ) ) . resume ( ) ;
1455
+ localPeer . notify ( 'peerUnblocked' , { peerId : remotePeer . id } ) . catch ( ( ) => { } ) ;
1456
+ remotePeer . notify ( 'peerUnblocked' , { peerId : localPeer . id } ) . catch ( ( ) => { } ) ;
1457
+ }
1458
+ }
1459
+ accept ( ) ;
1460
+ break ;
1461
+ }
1462
+
1390
1463
default :
1391
1464
{
1392
1465
logger . error ( 'unknown request.method "%s"' , request . method ) ;
@@ -1471,17 +1544,21 @@ class Room extends EventEmitter
1471
1544
// Store the Consumer into the protoo consumerPeer data Object.
1472
1545
consumerPeer . data . consumers . set ( consumer . id , consumer ) ;
1473
1546
1547
+ consumerPeer . data . peerToConsumers . set ( producerPeer . id , consumer . id ) ;
1548
+
1474
1549
// Set Consumer events.
1475
1550
consumer . on ( 'transportclose' , ( ) =>
1476
1551
{
1477
1552
// Remove from its map.
1478
1553
consumerPeer . data . consumers . delete ( consumer . id ) ;
1554
+ consumerPeer . data . peerToConsumers . delete ( producerPeer . id ) ;
1479
1555
} ) ;
1480
1556
1481
1557
consumer . on ( 'producerclose' , ( ) =>
1482
1558
{
1483
1559
// Remove from its map.
1484
1560
consumerPeer . data . consumers . delete ( consumer . id ) ;
1561
+ consumerPeer . data . peerToConsumers . delete ( producerPeer . id ) ;
1485
1562
1486
1563
consumerPeer . notify ( 'consumerClosed' , { consumerId : consumer . id } )
1487
1564
. catch ( ( ) => { } ) ;
0 commit comments