[mirotalksfu] - server refactoring, improve readability, update dep

هذا الالتزام موجود في:
Miroslav Pejic
2024-10-24 08:44:17 +02:00
الأصل 60a1e383b7
التزام f58b0f3a2d
4 ملفات معدلة مع 129 إضافات و98 حذوفات

عرض الملف

@@ -55,7 +55,7 @@ dev dependencies: {
* @license For commercial or closed source, contact us at license.mirotalk@gmail.com or purchase directly via CodeCanyon
* @license CodeCanyon: https://codecanyon.net/item/mirotalk-sfu-webrtc-realtime-video-conferences/40769970
* @author Miroslav Pejic - miroslav.pejic.85@gmail.com
* @version 1.5.98
* @version 1.5.99
*
*/
@@ -1230,7 +1230,7 @@ function startServer() {
});
socket.on('join', async (dataObject, cb) => {
if (!roomList.has(socket.room_id)) {
if (!roomExists(socket)) {
return cb({
error: 'Room does not exist',
});
@@ -1253,7 +1253,7 @@ function startServer() {
return cb('invalid');
}
const room = roomList.get(socket.room_id);
const room = getRoom(socket);
const { peer_name, peer_id, peer_uuid, peer_token, os_name, os_version, browser_name, browser_version } =
data.peer_info;
@@ -1415,7 +1415,7 @@ function startServer() {
});
socket.on('getRouterRtpCapabilities', (_, callback) => {
if (!roomList.has(socket.room_id)) {
if (!roomExists(socket)) {
return callback({ error: 'Room not found' });
}
@@ -1440,7 +1440,7 @@ function startServer() {
});
socket.on('createWebRtcTransport', async (_, callback) => {
if (!roomList.has(socket.room_id)) {
if (!roomExists(socket)) {
return callback({ error: 'Room not found' });
}
@@ -1465,7 +1465,7 @@ function startServer() {
});
socket.on('connectTransport', async ({ transport_id, dtlsParameters }, callback) => {
if (!roomList.has(socket.room_id)) {
if (!roomExists(socket)) {
return callback({ error: 'Room not found' });
}
@@ -1490,11 +1490,11 @@ function startServer() {
});
socket.on('restartIce', async ({ transport_id }, callback) => {
if (!roomList.has(socket.room_id)) {
if (!roomExists(socket)) {
return callback({ error: 'Room not found' });
}
const { peer } = getRoomAndPeer(socket);
const peer = getPeer(socket);
if (!peer) {
return callback({ error: 'Peer not found' });
@@ -1525,7 +1525,7 @@ function startServer() {
});
socket.on('produce', async ({ producerTransportId, kind, appData, rtpParameters }, callback, errback) => {
if (!roomList.has(socket.room_id)) {
if (!roomExists(socket)) {
return callback({ error: 'Room not found' });
}
@@ -1586,7 +1586,7 @@ function startServer() {
});
socket.on('consume', async ({ consumerTransportId, producerId, rtpCapabilities }, callback) => {
if (!roomList.has(socket.room_id)) {
if (!roomExists(socket)) {
return callback({ error: 'Room not found' });
}
@@ -1615,7 +1615,7 @@ function startServer() {
});
socket.on('producerClosed', (data) => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
const { room, peer } = getRoomAndPeer(socket);
@@ -1627,9 +1627,9 @@ function startServer() {
});
socket.on('pauseProducer', async ({ producer_id }, callback) => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
const { peer } = getRoomAndPeer(socket);
const peer = getPeer(socket);
if (!peer) {
return callback({
@@ -1657,9 +1657,9 @@ function startServer() {
});
socket.on('resumeProducer', async ({ producer_id }, callback) => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
const { peer } = getRoomAndPeer(socket);
const peer = getPeer(socket);
if (!peer) {
return callback({
@@ -1687,9 +1687,9 @@ function startServer() {
});
socket.on('resumeConsumer', async ({ consumer_id }, callback) => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
const { peer } = getRoomAndPeer(socket);
const peer = getPeer(socket);
if (!peer) {
return callback({
@@ -1717,7 +1717,7 @@ function startServer() {
});
socket.on('getProducers', () => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
const { room, peer } = getRoomAndPeer(socket);
@@ -1732,9 +1732,9 @@ function startServer() {
});
socket.on('getPeerCounts', async ({}, callback) => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
const room = roomList.get(socket.room_id);
const room = getRoom(socket);
const peerCounts = room.getPeersCount();
@@ -1744,13 +1744,13 @@ function startServer() {
});
socket.on('cmd', async (dataObject) => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
const data = checkXSS(dataObject);
log.debug('cmd', data);
const room = roomList.get(socket.room_id);
const room = getRoom(socket);
switch (data.type) {
case 'privacy':
@@ -1771,13 +1771,13 @@ function startServer() {
});
socket.on('roomAction', async (dataObject) => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
const data = checkXSS(dataObject);
const isPresenter = await isPeerPresenter(socket.room_id, socket.id, data.peer_name, data.peer_uuid);
const room = roomList.get(socket.room_id);
const room = getRoom(socket);
log.debug('Room action:', data);
@@ -1846,11 +1846,11 @@ function startServer() {
});
socket.on('roomLobby', (dataObject) => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
const data = checkXSS(dataObject);
const room = roomList.get(socket.room_id);
const room = getRoom(socket);
data.room = room.toJson();
@@ -1872,7 +1872,7 @@ function startServer() {
});
socket.on('peerAction', async (dataObject) => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
const data = checkXSS(dataObject);
@@ -1900,7 +1900,7 @@ function startServer() {
if (!isPresenter) return;
}
const room = roomList.get(socket.room_id);
const room = getRoom(socket);
if (data.action === 'ban') room.addBannedPeer(data.to_peer_uuid);
@@ -1910,7 +1910,7 @@ function startServer() {
});
socket.on('updatePeerInfo', (dataObject) => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
const { room, peer } = getRoomAndPeer(socket);
@@ -1927,11 +1927,11 @@ function startServer() {
});
socket.on('updateRoomModerator', async (dataObject) => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
const data = checkXSS(dataObject);
const room = roomList.get(socket.room_id);
const room = getRoom(socket);
const isPresenter = await isPeerPresenter(socket.room_id, socket.id, data.peer_name, data.peer_uuid);
@@ -1955,11 +1955,11 @@ function startServer() {
});
socket.on('updateRoomModeratorALL', async (dataObject) => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
const data = checkXSS(dataObject);
const room = roomList.get(socket.room_id);
const room = getRoom(socket);
const isPresenter = await isPeerPresenter(socket.room_id, socket.id, data.peer_name, data.peer_uuid);
@@ -1973,7 +1973,7 @@ function startServer() {
});
socket.on('getRoomInfo', async (_, cb) => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
const { room, peer } = getRoomAndPeer(socket);
@@ -1985,7 +1985,7 @@ function startServer() {
});
socket.on('fileInfo', (dataObject) => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
const data = checkXSS(dataObject);
@@ -1996,37 +1996,41 @@ function startServer() {
log.debug('Send File Info', data);
const room = roomList.get(socket.room_id);
const room = getRoom(socket);
data.broadcast ? room.broadCast(socket.id, 'fileInfo', data) : room.sendTo(data.peer_id, 'fileInfo', data);
});
socket.on('file', (data) => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
const room = roomList.get(socket.room_id);
const room = getRoom(socket);
data.broadcast ? room.broadCast(socket.id, 'file', data) : room.sendTo(data.peer_id, 'file', data);
});
socket.on('fileAbort', (dataObject) => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
const data = checkXSS(dataObject);
roomList.get(socket.room_id).broadCast(socket.id, 'fileAbort', data);
const room = getRoom(socket);
room.broadCast(socket.id, 'fileAbort', data);
});
socket.on('receiveFileAbort', (dataObject) => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
const data = checkXSS(dataObject);
roomList.get(socket.room_id).broadCast(socket.id, 'receiveFileAbort', data);
const room = getRoom(socket);
room.broadCast(socket.id, 'receiveFileAbort', data);
});
socket.on('shareVideoAction', (dataObject) => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
const data = checkXSS(dataObject);
@@ -2037,7 +2041,7 @@ function startServer() {
log.debug('Share video: ', data);
const room = roomList.get(socket.room_id);
const room = getRoom(socket);
data.peer_id == 'all'
? room.broadCast(socket.id, 'shareVideoAction', data)
@@ -2045,11 +2049,11 @@ function startServer() {
});
socket.on('wbCanvasToJson', (dataObject) => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
const data = checkXSS(dataObject);
const room = roomList.get(socket.room_id);
const room = getRoom(socket);
// const objLength = bytesToSize(Object.keys(data).length);
@@ -2059,44 +2063,44 @@ function startServer() {
});
socket.on('whiteboardAction', (dataObject) => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
const data = checkXSS(dataObject);
const room = roomList.get(socket.room_id);
const room = getRoom(socket);
log.debug('Whiteboard', data);
room.broadCast(socket.id, 'whiteboardAction', data);
});
socket.on('setVideoOff', (dataObject) => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
const data = checkXSS(dataObject);
log.debug('Video off data', data.peer_name);
const room = roomList.get(socket.room_id);
const room = getRoom(socket);
room.broadCast(socket.id, 'setVideoOff', data);
});
socket.on('recordingAction', async (dataObject) => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
const data = checkXSS(dataObject);
log.debug('Recording action', data);
const room = roomList.get(socket.room_id);
const room = getRoom(socket);
room.broadCast(socket.id, 'recordingAction', data);
});
socket.on('refreshParticipantsCount', () => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
const room = roomList.get(socket.room_id);
const room = getRoom(socket);
const peerCounts = room.getPeers().size;
@@ -2109,7 +2113,7 @@ function startServer() {
});
socket.on('message', (dataObject) => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
const data = checkXSS(dataObject);
@@ -2137,8 +2141,10 @@ function startServer() {
});
socket.on('getChatGPT', async ({ time, room, name, prompt, context }, cb) => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
if (!config.chatGPT.enabled) return cb({ message: 'ChatGPT seems disabled, try later!' });
// https://platform.openai.com/docs/api-reference/completions/create
try {
// Add the prompt to the context
@@ -2229,7 +2235,8 @@ function startServer() {
// https://docs.heygen.com/reference/new-session
socket.on('streamingNew', async ({ quality, avatar_id, voice_id }, cb) => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
if (!config.videoAI.enabled || !config.videoAI.apiKey)
return cb({ error: 'Video AI seems disabled, try later!' });
try {
@@ -2265,7 +2272,8 @@ function startServer() {
// https://docs.heygen.com/reference/start-session
socket.on('streamingStart', async ({ session_id, sdp }, cb) => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
if (!config.videoAI.enabled || !config.videoAI.apiKey)
return cb({ error: 'Video AI seems disabled, try later!' });
@@ -2294,7 +2302,8 @@ function startServer() {
// https://docs.heygen.com/reference/submit-ice-information
socket.on('streamingICE', async ({ session_id, candidate }, cb) => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
if (!config.videoAI.enabled || !config.videoAI.apiKey)
return cb({ error: 'Video AI seems disabled, try later!' });
@@ -2323,7 +2332,8 @@ function startServer() {
// https://docs.heygen.com/reference/send-task
socket.on('streamingTask', async ({ session_id, text }, cb) => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
if (!config.videoAI.enabled || !config.videoAI.apiKey)
return cb({ error: 'Video AI seems disabled, try later!' });
try {
@@ -2353,7 +2363,8 @@ function startServer() {
});
socket.on('talkToOpenAI', async ({ text, context }, cb) => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
if (!config.videoAI.enabled || !config.videoAI.apiKey)
return cb({ error: 'Video AI seems disabled, try later!' });
try {
@@ -2380,7 +2391,8 @@ function startServer() {
// https://docs.heygen.com/reference/close-session
socket.on('streamingStop', async ({ session_id }, cb) => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
if (!config.videoAI.enabled || !config.videoAI.apiKey)
return cb({ error: 'Video AI seems disabled, try later!' });
try {
@@ -2409,14 +2421,17 @@ function startServer() {
});
socket.on('getRTMP', async ({}, cb) => {
if (!roomList.has(socket.room_id)) return;
const room = roomList.get(socket.room_id);
if (!roomExists(socket)) return;
const room = getRoom(socket);
const rtmpFiles = await room.getRTMP(rtmpDir);
cb(rtmpFiles);
});
socket.on('startRTMP', async (dataObject, cb) => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
if (rtmpCfg && rtmpFileStreamsCount >= rtmpCfg.maxStreams) {
log.warn('RTMP max file streams reached', rtmpFileStreamsCount);
@@ -2428,7 +2443,7 @@ function startServer() {
const isPresenter = await isPeerPresenter(socket.room_id, socket.id, peer_name, peer_uuid);
if (!isPresenter) return cb(false);
const room = roomList.get(socket.room_id);
const room = getRoom(socket);
const host = config.ngrok.enabled ? 'localhost' : socket.handshake.headers.host.split(':')[0];
const rtmp = await room.startRTMP(socket.id, room, host, 1935, `../${rtmpDir}/${file}`);
@@ -2440,9 +2455,9 @@ function startServer() {
});
socket.on('stopRTMP', async () => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
const room = roomList.get(socket.room_id);
const room = getRoom(socket);
rtmpFileStreamsCount--;
@@ -2452,13 +2467,15 @@ function startServer() {
});
socket.on('endOrErrorRTMP', async () => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
rtmpFileStreamsCount--;
log.debug('endRTMP - rtmpFileStreamsCount ---->', rtmpFileStreamsCount);
});
socket.on('startRTMPfromURL', async (dataObject, cb) => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
if (rtmpCfg && rtmpUrlStreamsCount >= rtmpCfg.maxStreams) {
log.warn('RTMP max Url streams reached', rtmpUrlStreamsCount);
@@ -2470,7 +2487,7 @@ function startServer() {
const isPresenter = await isPeerPresenter(socket.room_id, socket.id, peer_name, peer_uuid);
if (!isPresenter) return cb(false);
const room = roomList.get(socket.room_id);
const room = getRoom(socket);
const host = config.ngrok.enabled ? 'localhost' : socket.handshake.headers.host.split(':')[0];
const rtmp = await room.startRTMPfromURL(socket.id, room, host, 1935, inputVideoURL);
@@ -2482,9 +2499,9 @@ function startServer() {
});
socket.on('stopRTMPfromURL', async () => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
const room = roomList.get(socket.room_id);
const room = getRoom(socket);
rtmpUrlStreamsCount--;
@@ -2494,7 +2511,7 @@ function startServer() {
});
socket.on('endOrErrorRTMPfromURL', async () => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
rtmpUrlStreamsCount--;
@@ -2502,13 +2519,13 @@ function startServer() {
});
socket.on('createPoll', (dataObject) => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
const data = checkXSS(dataObject);
const { question, options } = data;
const room = roomList.get(socket.room_id);
const room = getRoom(socket);
const newPoll = {
question: question,
@@ -2524,7 +2541,7 @@ function startServer() {
});
socket.on('vote', (dataObject) => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
const data = checkXSS(dataObject);
@@ -2543,9 +2560,9 @@ function startServer() {
});
socket.on('updatePoll', () => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
const room = roomList.get(socket.room_id);
const room = getRoom(socket);
const roomPolls = room.getPolls();
@@ -2556,13 +2573,13 @@ function startServer() {
});
socket.on('editPoll', (dataObject) => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
const data = checkXSS(dataObject);
const { index, question, options } = data;
const room = roomList.get(socket.room_id);
const room = getRoom(socket);
const roomPolls = room.getPolls();
@@ -2575,7 +2592,7 @@ function startServer() {
});
socket.on('deletePoll', async (data) => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
const { index, peer_name, peer_uuid } = checkXSS(data);
@@ -2583,7 +2600,7 @@ function startServer() {
// const isPresenter = await isPeerPresenter(socket.room_id, socket.id, peer_name, peer_uuid);
// if (!isPresenter) return;
const room = roomList.get(socket.room_id);
const room = getRoom(socket);
const roomPolls = room.getPolls();
@@ -2597,22 +2614,22 @@ function startServer() {
// Room collaborative editor
socket.on('editorChange', (dataObject) => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
//const data = checkXSS(dataObject);
const data = dataObject;
const room = roomList.get(socket.room_id);
const room = getRoom(socket);
room.broadCast(socket.id, 'editorChange', data);
});
socket.on('editorActions', (dataObject) => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
const data = checkXSS(dataObject);
const room = roomList.get(socket.room_id);
const room = getRoom(socket);
log.debug('editorActions', data);
@@ -2620,18 +2637,18 @@ function startServer() {
});
socket.on('editorUpdate', (dataObject) => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
//const data = checkXSS(dataObject);
const data = dataObject;
const room = roomList.get(socket.room_id);
const room = getRoom(socket);
room.broadCast(socket.id, 'editorUpdate', data);
});
socket.on('disconnect', async () => {
if (!roomList.has(socket.room_id)) return;
if (!roomExists(socket)) return;
const { room, peer } = getRoomAndPeer(socket);
@@ -2670,7 +2687,7 @@ function startServer() {
});
socket.on('exitRoom', async (_, callback) => {
if (!roomList.has(socket.room_id)) {
if (!roomExists(socket)) {
return callback({
error: 'Not currently in a room',
});
@@ -2717,13 +2734,27 @@ function startServer() {
// common
function getRoomAndPeer(socket) {
const room = roomList.get(socket.room_id) || {};
const room = getRoom(socket);
const peer = room.getPeer ? room.getPeer(socket.id) || {} : {};
const peer = getPeer(socket);
return { room, peer };
}
function getRoom(socket) {
return roomList.get(socket.room_id) || {};
}
function getPeer(socket) {
const room = getRoom(socket); // Reusing getRoom to retrieve the room
return room.getPeer ? room.getPeer(socket.id) || {} : {};
}
function roomExists(socket) {
return roomList.has(socket.room_id);
}
function isValidFileName(fileName) {
const invalidChars = /[\\\/\?\*\|:"<>]/;
return !invalidChars.test(fileName);