-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
143 lines (119 loc) · 4.16 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
const app = require('express')();
const server = require('http').Server(app);
const io = require('socket.io')(server);
const config = require('./config');
const mediasoup = require('mediasoup');
const port = process.env.PORT || config.server.port;
// Map of Room instances indexed by roomId.
const rooms = new Map();
app.get('/', function (req, res) {
res.send('<h1 style="text-align: center;">Rex-Mediasoup-Server is running...</h1>');
});
server.listen(port, () => console.log(`MediaSoup server is listening on port ${port}!`));
// MediaSoup server
const mediaServer = mediasoup.Server({
numWorkers: null, // Use as many CPUs as available.
logLevel: config.mediasoup.logLevel,
logTags: config.mediasoup.logTags,
rtcIPv4: config.mediasoup.rtcIPv4,
rtcIPv6: config.mediasoup.rtcIPv6,
rtcAnnouncedIPv4: config.mediasoup.rtcAnnouncedIPv4,
rtcAnnouncedIPv6: config.mediasoup.rtcAnnouncedIPv6,
rtcMinPort: config.mediasoup.rtcMinPort,
rtcMaxPort: config.mediasoup.rtcMaxPort
});
// Handle socket connection and its messages
io.on('connection', (socket) => {
console.log('New socket connection:', socket.handshake.query);
// Used for mediaSoup room
let room = null;
// Used for mediaSoup peer
let mediaPeer = null;
const { roomId, peerName } = socket.handshake.query;
if (rooms.has(roomId)) {
room = rooms.get(roomId);
} else {
room = mediaServer.Room(config.mediasoup.mediaCodecs);
rooms.set(roomId, room);
room.on('close', () => {
rooms.delete(roomId);
});
}
socket.on('mediasoup-request', (request, cb) => {
switch (request.method) {
case 'queryRoom':
room.receiveRequest(request)
.then((response) => cb(null, response))
.catch((error) => cb(error.toString()));
break;
case 'join':
room.receiveRequest(request)
.then((response) => {
// Get the newly created mediasoup Peer
mediaPeer = room.getPeerByName(peerName);
handleMediaPeer(mediaPeer);
// Send response back
cb(null, response);
})
.catch((error) => cb(error.toString()));
break;
default:
if (mediaPeer) {
mediaPeer.receiveRequest(request)
.then((response) => cb(null, response))
.catch((error) => cb(error.toString()));
}
}
});
socket.on('mediasoup-notification', (notification) => {
console.debug('Got notification from client peer', notification);
// NOTE: mediasoup-client just sends notifications with target 'peer'
if (!mediaPeer) {
console.error('Cannot handle mediaSoup notification, no mediaSoup Peer');
return;
}
mediaPeer.receiveNotification(notification);
});
// Invokes when connection lost on a client side
socket.on('disconnect', () => {
if (mediaPeer) {
mediaPeer.close();
}
});
/**
* Handles all mediaPeer events
*
* @param mediaPeer
*/
const handleMediaPeer = (mediaPeer) => {
mediaPeer.on('notify', (notification) => {
console.log('New notification for mediaPeer received:', notification);
socket.emit('mediasoup-notification', notification);
});
mediaPeer.on('newtransport', (transport) => {
console.log('New mediaPeer transport:', transport.direction);
transport.on('close', (originator) => {
console.log('Transport closed from originator:', originator);
});
});
mediaPeer.on('newproducer', (producer) => {
console.log('New mediaPeer producer:', producer.kind);
producer.on('close', (originator) => {
console.log('Producer closed from originator:', originator);
});
});
mediaPeer.on('newconsumer', (consumer) => {
console.log('New mediaPeer consumer:', consumer.kind);
consumer.on('close', (originator) => {
console.log('Consumer closed from originator', originator);
});
});
// Also handle already existing Consumers.
mediaPeer.consumers.forEach((consumer) => {
console.log('mediaPeer existing consumer:', consumer.kind);
consumer.on('close', (originator) => {
console.log('Existing consumer closed from originator', originator);
});
});
}
});