Algorithm
X기술적 고민
상대방과 나를 둘 다 멀어짐의 주체로 판단해서 누가 나간건지 판단 불가
closer : Arr→int로 변경 (when leaveGroup)
나-상대방 모두 멀어지는 것으로 인식
→ 그룹을 떠난 유저를 특정하기 위해 client 내부에서 자신과 인접한 유저의 수를 개인별로(?) 관리하는 기능을 구현해, 타 유저가 멀어졌을 경우 인접 유저의 수를 감소하는 방식으로 나간 유저를 특정하여, 수가 감소했을 때 서버에 요청을 보내 그 유저를 그룹에서 제외하는 방법으로 오류를 수정
코드 수정
// overworld.js
let closer = 0;
socket.on("update_closer", ()=> {
closer -= 1;
if (closer < 0) {
closer = 0;
}
});
socket.on("update_closer", ()=> {
closer -= 1;
if (closer < 0) {
closer = 0;
}
});
Object.values(charMap).forEach((object) => {
if (object.id === socket.id) {
...
if (
// 기존 !object.isUserCalling에서 아래로 대체함
// (전에 groupName 고정되어있을때 사용했었음)
//그룹이
!object.isUserCalling &&
Math.abs(player?.x - object.x) < 64 &&
Math.abs(player?.y - object.y) < 96
) {
//화상 통화 연결
**closer += 1;**
console.log("가까워짐 closer: ", closer);
player.isUserCalling = true;
object.isUserCalling = true;
socket.emit("user_call", {
caller: player.id,
callee: object.id,
});
}
if (
//그룹이 같다.
object.isUserCalling &&
// object.groupName &&
(Math.abs(player?.x - object.x) > 96 ||
Math.abs(player?.y - object.y) > 128)
) {
**closer -= 1;**
console.log("멀어짐 closer: ", closer);
object.isUserCalling = false;
object.isUserJoin = false;
}
const playercheck = player ? player.isUserCalling : false;
// console.log("멀어짐 로직 player.socketId", player.socketId,"근처에 있는",closer)
if (playercheck && **closer === 0**) {
// 나가는 사람 기준
const streamContainer = document.querySelector(".streams-container");
while (streamContainer.hasChildNodes()) {
// 내가 가지고있는 다른 사람의 영상을 전부 삭제
streamContainer.removeChild(streamContainer.firstChild);
}
거리가 멀어져도 disconnect되지 않는 에러 1
여러 사람끼리 왔다갔다하면서 그룹 생성-해체를 반복하다보니 transport를 사용할 수 없다는 오류 메시지가 떴다.
사용할 수 있는 transport가 999개(2000~2999)로 제한적인데, 유저끼리 그룹에 들어가고 나가는 과정에서 커넥션을 연결만 해주고, 끊어주지 않아서 문제가 발생한 것 으로 추측된다.
transport를 제대로 끊어주는지 확인해보자.
해당 클라이언트에서 produce를 close()해보자.
→ 실패. 내 스트림까지 꺼지고, transport도 사라짐. 다음 커넥트 불가능
그럼 transport만 꺼보자.
→ 실패. 2번째와 같은 결과가 나옴.
(내일 이어서)
공부 진행 상황
[리허설 준비]
Algorithm
X기술적 고민
// overworld.js
socket.on("leave_succ", function (data) {
...
// removePeerFace(data.removeSid); 주석 처리
---
// socket.on("leave_user", function (data) {
// removePeerFace(data.id);
// });
---
// producer_audio.emit("producerclose");
producer.emit("producerclose");
[팀 수정할 부분]
static associate(db) {
db.Aim_board.belongsTo(db.Aim_user_room, {
foreignKey: "roomId",
primaryKey: "id",
});
{
“msg”: “방명록 불러오기 성공.“,
“data”: [
{
“id”: 4,
“roomId”: 40,
“userId”: 65,
“contents”: “새로운 내용“,
“status”: 1,
“createdAt”: “2022-03-08T16:25:53.000Z”,
“updatedAt”: “2022-03-08T16:25:53.000Z”,
“Aim_user_info”: { // 여기부터 조인된 테이블
“id”: 65,
“accessToken”: “eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6IndvbmpvbmcwNzAxQG5hdmVyLmNvbSIsImluZm8iOiJBY2Nlc3NUb2tlbiIsImlhdCI6MTY0Njc1MTA2NCwiZXhwIjoxNjQ3NjE1MDY0fQ.b4ohNgN1Vd4ghiZh18qu_6hNlKIpDrgWmc31vWVfUIs”,
“refreshToken”: “eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6IndvbmpvbmcwNzAxQG5hdmVyLmNvbSIsImluZm8iOiJSZWZyZXNoVG9rZW4iLCJpYXQiOjE2NDY3NTEwNjQsImV4cCI6MTY0NzYxNTA2NH0.ef1Vvf5-ZzJXB5CWrXh76WKt7d1gdwUohpD_DdtuGMk”,
“email”: “000@naver.com”,
“password”: “$2a$10$.ydipRLn4gHlUuQXiijxc.9Jpy49FWiZaJqAOaFtv95SjwZesgqFW”,
“nickname”: “직원1”,
“character”: “https://dynamic-assets.gather.town/sprite/avatar-M8h5xodUHFdMzyhLkcv9-XJBZpqmKhGvW3haxYtJO-I7vkRzijl8vBGm5LRwQT-uBxqrmbWQ15ykHxtWAi5-VztAi3oJnxQHhHU1sWpH-WW1GTt4cFIfI7aG4zd1o.png”,
“createdAt”: “2022-02-28T13:16:09.000Z”,
“updatedAt”: “2022-03-08T14:51:04.000Z”
},
“Aim_user_room”: null // 해당 방이 없어서
}
]
}
해당 방이 있을 경우 "Aim_user_room": {
"id": 32,
"hostId": 62,
"mapId": 21,
"title": "Claude Monet",
"description": "모네 작품 전시관",
"status": 1,
"createdAt": "2022-03-08T08:28:25.000Z",
"updatedAt": "2022-03-08T08:28:25.000Z"
}
진행 상황
[프로젝트 완성도를 높이기 위한 보완 작업]
Algorithm
X진행 상황
[리허설]
Algorithm
X// 음성 connect
async function setAudio(peerStream, socketId) {
console.log(`socketID ${socketId} peer의 audio 태그 생성`);
const streamContainer = document.querySelector(".streams-container");
try {
// const div = document.querySelector(`#${socketId}`);
const div = document.getElementById(`${socketId}`);
console.log(div, "audio 넣을 div 찾았다");
const elem = document.createElement("audio");
elem.srcObject = await peerStream;
elem.playsinline = true;
elem.autoplay = true;
setTimeout(() => {
div.appendChild(elem);
streamContainer.appendChild(div);
}, 0);
await activeSpeaker(peerStream, socketId);
} catch (e) {
console.log(e);
}
}
const activeSpeaker = async (stream, socketId) => {
try {
const speechEvents = await hark(stream);
const streamVideo = document.getElementById(`${socketId}`);
const videoTag = streamVideo.getElementsByTagName("video");
console.log(videoTag);
speechEvents.on("speaking", () => {
videoTag[0].style.outline = "4px solid green";
console.log("start", videoTag[0]);
// setSpeakingUser(true);
// console.log("speaking", socket?.id);
});
speechEvents.on("stopped_speaking", () => {
videoTag[0].style.outline = "none";
console.log("stop", videoTag[0]);
// setSpeakingUser(false);
// console.log("stopped_speaking");
});
} catch (e) {
console.log(e);
}
};
const getUserMedia = async (stream, socketId) => {
try {
const speechEvents = await hark(stream);
const streamVideo = await document.querySelector(
`#${socketId} > video`
);
speechEvents.on("speaking", () => {
streamVideo.style.outline = "3px solid green";
console.log("start", streamVideo);
// setSpeakingUser(true);
// console.log("speaking", socket?.id);
});
speechEvents.on("stopped_speaking", () => {
streamVideo.style.outline = "none";
console.log("stop", streamVideo);
// setSpeakingUser(false);
// console.log("stopped_speaking");
});
} catch (e) {
console.log(e);
}
};
Algorithm
X