A progressive Node.js framework for building efficient and scalable server-side applications.
Nest framework TypeScript starter repository.
$ yarn install
# development
$ yarn run start
# watch mode
$ yarn run start:dev
# production mode
$ yarn run start:prod
# unit tests
$ yarn run test
# e2e tests
$ yarn run test:e2e
# test coverage
$ yarn run test:cov
Nest is an MIT-licensed open source project. It can grow thanks to the sponsors and support by the amazing backers. If you'd like to join them, please read more here.
- Author - Kamil Myśliwiec
- Website - https://nestjs.com
- Twitter - @nestframework
Nest is MIT licensed.
// {
// "access_token": "발급받은토큰"
// }
{
}
socket.on('createChatss', chat);
chat : {
"name": "이름",
"type": string ("public | private | protected" 셋 중 하나),
"password" : string (nullable)
}
socket.emit('single:chat:joinChat', data);
data: {
"public": {
"chatId" : number,
"ownerId" : number,
"adminId" : number,
"type" : string ("public | private | protected" 셋 중 하나),
"name" : string
},
"private" : {
"room" : string,
"password" : '' (nullable),
"users" : <int>[],
"kicked" : [
{
"userId": number,
"expiredAt": number
}
],
"muted" : [
{
"userId": number,
"expiredAt": number
}
],
}
};
socket.emit('broad:chat:joinChat', data);
data: {
"public": {
"chatId" : number,
"ownerId" : number,
"adminId" : number,
"type" : "public | private | protected",
"name" : string
},
"private" : {
"room" : string,
"password" : '' (nullable),
"users" : <int>[],
"kicked" : [
{
"userId": number,
"expiredAt": number
}
],
"muted" : [
{
"userId": number,
"expiredAt": number
}
],
}
};
socket.on('updateChat', chat);
chat : {
"name": "이름",
"type": "public | private | protected",
"password" : " " (nullable)
}
socket.emit('broadcast:chat:updateChat', data);
data: {
"chatId" : number,
"ownerId" : number,
"adminId" : number,
"type" : "public | private | protected",
"name" : string
};
socket.on('setAdmin', data);
data : {
"userId": number
}
socket.emit('broadcast:chat:setAdmin', data);
data: {
"chatId": number,
"adminId": number,
};
socket.on('joinChat', chat);
chat : {
"chatId": number,
"password" : string (nullable)
}
socket.emit('single:chat:joinChat', data);
data: {
"public": {
"chatId" : number,
"ownerId" : number,
"adminId" : number,
"type" : "public | private | protected",
"name" : string
},
"private" : {
"room" : string,
"password" : '' (nullable),
"users" : <int>[],
"kicked" : [
{
"userId": number,
"expiredAt": number
}
],
"muted" : [
{
"userId": number,
"expiredAt": number
}
],
}
};
socket.emit('group:chat:joinChat', data);
data : {
"userId": number
}
socket.on('setleaveChatAdmin');
socket.emit('single:chat:leaveChat');
// 채팅방 나가기를 했다고 클라이언트에서 바로 나가기 처리하지말고,
// 이 리스폰스를 받아야 방을 나갈 수 있게 구현합시다
// ex, irc 논블로킹
//아래는 상황에 따라 추가로 받는 이벤트
socket.emit('broadcast:chat:deleteChat', data);
data: {
"chatId": number
};
socket.emit('broadcast:chat:setAdmin', data);
data: {
"chatId": client.chat.id,
"ownerId": chatState.ownerId, (undifinedable)
"adminId": chatState.adminId (undifinedable)
};
socket.emit('group:chat:leaveChat', data);
data: {
"chatId": number
};
socket.on('sendMessage', data);
data: {
"message" : string
}
socket.emit('group:chat:sendMessage', data);
data: {
"sourceId": number (보낸사람),
"message": string,
"direct": false,
};
socket.on('kickUser', data);
data : {
"userId": number
}
socket.emit('group:chat:kickUser', data);
data : {
"userId": number
}
socket.on('muteUser', data);
data : {
"userId": number
}
socket.emit('group:chat:muteUser', data);
data : {
"userId": number
}
socket.on('sendDirectMessage', data);
data : {
"userId" : number,
"message" : string
}
socket.emit('single:chat:sendMessage', data);
data: {
"sourceId": number (보낸사람),
"message": string,
"direct": false,
};
socket.on('sendDirectMessage', data);
data: {
"userId" : number
}
socket.emit('single:chat:inviteUser', data);
data: {
"chatId":number,
"sourceId": number
};
socket.on('updateDisplayName', data);
data: {
"name" : string
}
socket.emit('broadcast:user:updateDisplayName', data);
data: {
"userId": number,
"name": string,
};
socket.on('updateImage', data);
data: {
"userId" : number,
"mimeType": string
}
socket.emit('broadcast:user:updateImage', data);
data: {
"userId": number,
"imageUrl": string,
};
socket.on('followUser', data);
data : {
"userId" : number
}
socket.emit('single:user:followUser', data);
data: {
"userId": number
};
socket.on('unFollowUser', data);
data : {
"userId" : number
}
socket.emit('single:user:unFollowUser', data);
data: {
"userId": number
};
socket.on('blockUser', data);
data : {
"userId" : number
}
socket.emit('single:user:blockUser', data);
data: {
"userId": number
};
socket.on('createGame', data);
data : {
"speed" : number
}
socket.emit('broadcast:game:createGame', data);
data: {
"gameId": number;
"ownerId": number;
"name": string;
"speed": number;
};
socket.emit('single:game:createGame', data);
data: {
//GameSession
"public": {
"gameId": number,
"ownerId": number,
"name": string,
"speed": number
},
"private": {
"room": string,
"players": [ // 총 2개 길이의 배열이 날라감
{//GamePlayerDto
"userId": number,
"score": number = 0,
"position": number[]
},
{
"userId": number,
"score": number = 0,
"position": number[]
}
],
"watcher": int[],
"ball": {
//GameBallDto
"speed": number,
"position": number,
"deltaX": number,
"deltaY": number
},
"totalScore": number,
"round": number,
"pause": boolean,
"onGame": boolean,
"onRound": boolean,
"gameInterval": boolean, //무시하셈
"roundInterval": boolean, //무시하셈
}
};
socket.on('joinGame', data);
data : {
"gameId" : number
}
socket.emit('group:game:joinGame', data);
data: { //GamePlayerDto
"userId": number;
"score": number = 0;
"position": number[];
};
socket.emit('single:game:joinGame', data);
data: {
//GameSession
"public": {
"gameId": number,
"ownerId": number,
"name": string,
"speed": number
},
"private": {
"room": string,
"players": [ // 총 2개 길이의 배열이 날라감
{//GamePlayerDto
"userId": number,
"score": number = 0,
"position": number[]
},
{
"userId": number,
"score": number = 0,
"position": number[]
}
],
"watcher": int[],
"ball": {
//GameBallDto
"speed": number,
"position": number,
"deltaX": number,
"deltaY": number
},
"totalScore": number,
"round": number,
"pause": boolean,
"onGame": boolean,
"onRound": boolean,
"gameInterval": boolean, //무시하셈
"roundInterval": boolean, //무시하셈
}
};
socket.on('watchGame', data);
data : {
"gameId" : number
}
socket.emit('group:game:watchGame', data);
data: {
"userId": number;
};
socket.emit('single:game:watchGame', data);
data: {
//GameSession
"public": {
"gameId": number,
"ownerId": number,
"name": string,
"speed": number
},
"private": {
"room": string,
"players": [ // 총 2개 길이의 배열이 날라감
{//GamePlayerDto
"userId": number,
"score": number = 0,
"position": number[]
},
{
"userId": number,
"score": number = 0,
"position": number[]
}
],
"watcher": int[],
"ball": {
//GameBallDto
"speed": number,
"position": number,
"deltaX": number,
"deltaY": number
},
"totalScore": number,
"round": number,
"pause": boolean,
"onGame": boolean,
"onRound": boolean,
"gameInterval": boolean, //무시하셈
"roundInterval": boolean, //무시하셈
}
};
socket.on('leaveGame', data);
data : {
"gameId" : number
}
socket.emit('broadcast:game:deleteGame', data);
data: {
"gameId": number;
};
socket.emit('group:game:deleteGame', data);
data: {
"gameId": number;
};
socket.emit('group:game:leaveGame', data);
data: {
"userId": number;
};
socket.on('startGame');
socket.emit('group:game:startGame');
socket.emit('group:game:endGame', data);
data:{
"winner" :{
//GamePlayerDto
"userId": number,
"score": number,
"position": number[]
},
"looser" :{
//GamePlayerDto
"userId": number,
"score": number,
"position": number[]
},
}
socket.on('movePaddle', data);
data = {
"keyCode" : number
}
socket.emit('group:game:movePaddle', data);
data= {
"userId": number,
"position": number[]
}