-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.js
More file actions
80 lines (65 loc) · 2.84 KB
/
server.js
File metadata and controls
80 lines (65 loc) · 2.84 KB
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
// server.js
// import modules
const fs = require('fs');
const https = require('https');
const express = require('express');
const socketIO = require('socket.io');
const app = express();
// SSL 인증서 설정 (https를 사용하기 위한 권한)
const options = {
key: fs.readFileSync(process.env.SSL_KEY_FILE || 'C:\\Windows\\System32\\key.pem'),
cert: fs.readFileSync(process.env.SSL_CRT_FILE || 'C:\\Windows\\System32\\cert.pem'),
};
const PORT = 8080;
const server = https.createServer(options, app);
const io = socketIO(server);
app.use(express.static(__dirname)); // 디렉토리에 있는 정적 파일 제공
// 클라이언트가 접속하면 자동으로 'connection' 이벤트 발생
io.on('connection', socket => {
console.log('[0] New client connected:', socket.id);
socket.on('join', () => {
const room = 'room1';
let origin = false;
const roomClients = io.sockets.adapter.rooms.get(room) || new Set(); // room에 속한 소켓 ID들의 집합
let last_peer = roomClients.size > 0 ? Array.from(roomClients)[roomClients.size - 1] : null;
// 방에 50명 이상 있다면 방 참여 거부
if (roomClients.size >= 50) {
socket.emit('room_full', room);
console.log(`[0-2] Client ${socket.id} failed to join Room ${room}: room_full`);
return;
} else if (roomClients.size === 0) {
origin = true;
}
socket.join(room);
socket.emit('room_joined', {room, origin})
console.log(`[0-1] ${socket.id} joined ${room}`);
io.to(last_peer).emit('new_peer', socket.id); // 새 피어가 왔다고 알림
// sdp(offer)를 전달
socket.on('offer', ({to, offer}) => {
io.to(to).emit('offer', {from: socket.id, offer});
console.log(`[1] Offer sent from ${socket.id} to ${to}`);
});
// sdp(answer)를 전달
socket.on('answer', ({to, answer}) => {
io.to(to).emit('answer', {from: socket.id, answer});
console.log(`[2] Answer sent from ${socket.id} to ${to}`);
});
// ICE candidate를 전달
socket.on('candidate', ({to, candidate}) => {
io.to(to).emit('candidate', {from: socket.id, candidate});
console.log(`[1-1] Candidate sent from ${socket.id} to ${to}`);
});
// Peer Connection이 완료되면 로그 출력
socket.on('peer_connected', peerId => {
console.log(`[3] Peer ${peerId} connected to ${socket.id}`);
});
// 피어가 연결을 끊었을 때 나머지 피어에게 알림
socket.on('disconnect', () => {
console.log(`${socket.id} disconnected`);
socket.to(room).emit('peer_disconnect');
});
});
});
server.listen(PORT, '0.0.0.0', () => {
console.log(`Signaling server running at ${PORT}`);
});