Skip to content

Commit dadff18

Browse files
committed
feat: 데이터 채널 시그널링
1 parent 843eefb commit dadff18

File tree

4 files changed

+211
-167
lines changed

4 files changed

+211
-167
lines changed

frontend/views/examples/data-channel/css/main.css

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,6 @@ video.effect {
6969
#file-wrap {
7070
margin: 10px 0;
7171
padding: 30px 0;
72-
border-top: solid 1px #000;
7372
text-align: left;
7473
}
7574

frontend/views/examples/data-channel/index.ejs

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,25 @@
77
<a href="#" id="unique-token">Share this room link</a>
88
</section>
99

10-
<section id="enter-wrap">
11-
<div id="create-wrap">
12-
<p>파일 전송 채널 입장하기</p>
13-
<button id="btn-start">입장</button>
14-
</div>
15-
<div id="wait-wrap"></div>
16-
</section>
17-
1810
<section id="file-wrap">
1911
<div class="buttons">
20-
<!-- <button id="btn-camera">Camera Pause</button>
21-
<button id="btn-mic">Mic Mute</button> -->
22-
<input type="file" /><br />
12+
<input type="file" id="file" /><br />
2313
<button id="btn-send">Send</button>
2414
</div>
15+
16+
<div class="progress">
17+
<div class="label">Send progress: </div>
18+
<progress id="sendProgress" max="0" value="0"></progress>
19+
</div>
20+
21+
<div class="progress">
22+
<div class="label">Receive progress: </div>
23+
<progress id="receiveProgress" max="0" value="0"></progress>
24+
</div>
25+
26+
<div id="bitrate"></div>
27+
<a id="download"></a>
28+
<span id="status"></span>
2529
</section>
2630
</div>
2731
</div>

frontend/views/examples/data-channel/js/main.js

Lines changed: 56 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -12,31 +12,10 @@ const mediaHandler = new MediaHandler();
1212
const peerHandler = new PeerHandler({ send });
1313
const isSafari = DetectRTC.browser.isSafari;
1414
const isMobile = DetectRTC.isMobileDevice;
15-
const mediaConstraints = {
16-
audio: true,
17-
video: {
18-
width: {
19-
ideal: 1280,
20-
min: 640,
21-
max: 1920,
22-
},
23-
height: {
24-
ideal: 720,
25-
min: 360,
26-
max: 1080,
27-
},
28-
frameRate: {
29-
ideal: 25,
30-
},
31-
// Select the front/user facing camera or the rear/environment facing camera if available (on Phone)
32-
facingMode: 'user',
33-
},
34-
};
3515

3616
let roomId;
3717
let userId;
3818
let remoteUserId;
39-
let isOffer;
4019

4120
// DOM
4221
const $body = document.body;
@@ -45,9 +24,25 @@ const $waitWrap = document.querySelector('#wait-wrap');
4524
const $videoWrap = document.querySelector('#file-wrap');
4625
const $uniqueToken = document.querySelector('#unique-token');
4726

48-
async function getUserMedia() {
49-
const stream = await peerHandler.getUserMedia(mediaConstraints, isOffer);
50-
onLocalStream(stream);
27+
const bitrateDiv = document.querySelector('#bitrate');
28+
const downloadAnchor = document.querySelector('#download');
29+
const sendProgress = document.querySelector('#sendProgress');
30+
const receiveProgress = document.querySelector('#receiveProgress');
31+
const statusMessage = document.querySelector('#status');
32+
33+
const $fileInput = document.querySelector('#file');
34+
const $btnSend = document.querySelector('#btn-send');
35+
36+
$fileInput.addEventListener('change', handleFileInputChange, false);
37+
38+
function handleFileInputChange() {
39+
const file = $fileInput.files[0];
40+
41+
if (!file) {
42+
console.log('No file chosen');
43+
} else {
44+
$btnSend.disabled = false;
45+
}
5146
}
5247

5348
/**
@@ -56,33 +51,39 @@ async function getUserMedia() {
5651
function onDetectUser() {
5752
console.log('onDetectUser');
5853

59-
$waitWrap.innerHTML = `
60-
<div class="room-info">
61-
<p>당신을 기다리고 있어요. 참여 하실래요?</p>
62-
<button id="btn-join">Join</button>
63-
</div>
64-
`;
65-
66-
document.querySelector('#btn-join').addEventListener('click', (e) => {
67-
e.target.disabled = true;
68-
isOffer = true;
69-
getUserMedia();
70-
});
71-
72-
$createWrap.classList.add('slideup');
54+
// TODO: 연결 UI 처리
55+
56+
// $waitWrap.innerHTML = `
57+
// <div class="room-info">
58+
// <p>당신을 기다리고 있어요. 참여 하실래요?</p>
59+
// <button id="btn-join">Join</button>
60+
// </div>
61+
// `;
62+
63+
// document.querySelector('#btn-join').addEventListener('click', (e) => {
64+
// e.target.disabled = true;
65+
// isOffer = true;
66+
// getUserMedia();
67+
// });
68+
// $createWrap.classList.add('slideup');
7369
}
7470

7571
/**
7672
* 참석자 핸들링
7773
* @param roomId
7874
* @param userList
7975
*/
80-
function onJoin(roomId, userList) {
81-
console.log('onJoin', roomId, userList);
76+
function onJoin(roomId, { userId: joinedUserId, participants }) {
77+
console.log('onJoin', roomId, userId, participants);
8278

83-
if (Object.size(userList) > 1) {
79+
if (Object.size(participants) >= 2) {
8480
onDetectUser();
8581
}
82+
83+
if (userId !== joinedUserId) {
84+
console.log('상대방 들어옴 :>> ', joinedUserId);
85+
peerHandler.startRtcConnection();
86+
}
8687
}
8788

8889
/**
@@ -219,19 +220,21 @@ function onRemoteStream(stream) {
219220
* DOM 이벤트 바인딩
220221
*/
221222
function bindDomEvent() {
222-
document.querySelector('#btn-start').addEventListener('click', getUserMedia);
223-
document.querySelector('#btn-camera')?.addEventListener('click', (e) => {
224-
const $this = e.target;
225-
$this.classList.toggle('active');
226-
mediaHandler[$this.className === 'active' ? 'pauseVideo' : 'resumeVideo']();
227-
});
228-
document.querySelector('#btn-mic')?.addEventListener('click', (e) => {
229-
const $this = e.target;
230-
$this.classList.toggle('active');
231-
mediaHandler[$this.className === 'active' ? 'muteAudio' : 'unmuteAudio']();
223+
// document.querySelector('#btn-start').addEventListener('click', getUserMedia);
224+
// document.querySelector('#btn-camera')?.addEventListener('click', (e) => {
225+
// const $this = e.target;
226+
// $this.classList.toggle('active');
227+
// mediaHandler[$this.className === 'active' ? 'pauseVideo' : 'resumeVideo']();
228+
// });
229+
// document.querySelector('#btn-mic')?.addEventListener('click', (e) => {
230+
// const $this = e.target;
231+
// $this.classList.toggle('active');
232+
// mediaHandler[$this.className === 'active' ? 'muteAudio' : 'unmuteAudio']();
233+
// });
234+
235+
$btnSend.addEventListener('click', () => {
236+
peerHandler.sendData($fileInput.files[0]);
232237
});
233-
234-
document.querySelector('#btn-change-resolution')?.addEventListener('click', peerHandler.changeResolution);
235238
}
236239

237240
/**

0 commit comments

Comments
 (0)